中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [已结]关于日历竖向排班 上一主题 | 下一主题
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『楼 主』:  [已结]关于日历竖向排班

大家好,我遇到麻烦事了,我需要作一个班表,是读取系统日期自动生成的。
我已经用批处理生成了一个和WIN系统日历一样的BAT,但我这个BAT他没有明确指明 当月日期和星期的关系。
他生成的表和WIN的一样,但我需要的班表,需要是竖向的日期
如下:

N年N月      | 上班时间一 |上班时间二 |上班时间三 | 上班时间四|
日期星期几 |名一           |名二          |名三          |名四          |

例:
2009年01月| 上班时间一 |上班时间二 |上班时间三 | 上班时间四|
01星期四    |名一           |名二          |名三          |名四          |
02星期五    |名二           |名三          |名四          |名一          |
03星期六    |名三           |名四          |名一          |名二          |
04星期日    |名四           |名一          |名二          |名三          |




31星期六    |名三           |名四          |名一          |名二          |

我要生成的是这样的表,直接读取机器的日期生成,方便查询

但我找到的是和WIN一样的日历,找不到日期和星期的关联。
请帮忙想一样,如何能把日期和星期关联在一起,按上边的格式打出
日期+星期,后边再打排班的名称

我改写成的日历表代码如下:

   日   一   二   三     四    五   六
                              1     2     3
     4    5     6     7    8     9    10
   11   12   13   14   15   16   17
   18   19   20   21   22   23   24
   25   26   27   28   29   30   31
@echo off

setlocal enabledelayedexpansion

:::::::::::定义s1~s12,为每个月的天数
for %%b in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a y+=1
set s!y!=%%b
)

:::::::::::判断输入年份是否为闰年,更改2月的天数
set /a year=%DATE:~0,4%
set /a year_chk1=year%%400
set /a year_chk2=year%%4
set /a year_chk3=year%%100
if %year_chk1% equ 0 set s2=29
if %year_chk2% equ 0 if %year_chk3% neq 0 set s2=29

::::::::::输入月份,并计算当年的第一天到上月月底的天数
set /a m=%DATE:~5,2%
set n=%m%
set /a n-=1
for /l %%c in (1,1,%n%) do (
set /a day+=!s%%c!)


::::::::::判断这一年的第一天是星期几?再判断所要查询月份的第一天是星期几?
set /a yearflag=(%year%+(%year%-1)/4-(%year%-1)/100+(%year%-1)/400)%%7
if %m%==1 (set  monthflag=%yearflag% ) else (set /a monthflag=%yearflag%+!day!%%7 )

if %monthflag% geq 7 (set /a monthflag-=7)

echo    日   一   二   三   四   五   六   

:::::::::输入月份1号前的空日期
for /l %%d in (1,1,%monthflag%) do (
set /p=     <nul)
:::::::::找出要换行的日期(第一个,后每7个一换),显示当月日期并换行
set /a cl=7-%monthflag%

for /l %%e in (1 1 !s%m%!) do (
if %%e lss 10 (set /p=    %%e<nul) else (set /p=   %%e<nul)
if %%e==!cl! (echo.&set /a cl+=7)
)
pause
自动日历出来了,就是不会把他写成我需要的方式。。
班表有四个人,还要把日期和班表的某一个人的名称关联在一起。
我就是在这里想了半天,没办法实现了。。
请大家帮帮忙。

[ Last edited by HAT on 2009-2-3 at 05:39 ]

2009-1-24 17:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  


@echo off

setlocal enabledelayedexpansion

:::::::::::定义s1~s12,为每个月的天数
for %%b in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a y+=1
set s!y!=%%b
)

:::::::::::判断输入年份是否为闰年,更改2月的天数
set /a year=%DATE:~0,4%
set /a year_chk1=year%%400
set /a year_chk2=year%%4
set /a year_chk3=year%%100
if %year_chk1% equ 0 set s2=29
if %year_chk2% equ 0 if %year_chk3% neq 0 set s2=29

::::::::::输入月份,并计算当年的第一天到上月月底的天数
set /a m=%DATE:~5,2%
set n=%m%
set /a n-=1
for /l %%c in (1,1,%n%) do (
set /a day+=!s%%c!)


::::::::::判断这一年的第一天是星期几?再判断所要查询月份的第一天是星期几?
set /a yearflag=(%year%+(%year%-1)/4-(%year%-1)/100+(%year%-1)/400)%%7
if %m%==1 (set  monthflag=%yearflag% ) else (set /a monthflag=%yearflag%+!day!%%7 )

if %monthflag% geq 7 (set /a monthflag-=7)

set weekday=日一二三四五六
set /a monthflag-=0
for /l %%e in (1 1 !s%m%!) do (
call set wd=星期%%weekday:~!monthflag!,1%%
if %%e lss 10 (Call echo 0%%e!wd!) else (Call echo %%e!wd!)
set /a monthflag+=1
set /a monthflag%%=7
)
pause




S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-1-24 20:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『第 3 楼』:  

先谢谢楼上的生成了竖向日历
还是想不通,要怎样把名字和日期关联起来
我要 set workers=名字一名字二名字三名字四名字一名字二名字三
然后每次读取四个,在 %%e!wd! 后输出。
geq 4 超过时再读第一个名字
名字要怎样和时间关联起来呢?

[ Last edited by andison625 on 2009-1-28 at 11:20 ]

2009-1-28 11:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 4 楼』:  

::名字重复一次,用作循环

set "names=|名一           |名二          |名三          |名四          |名一           |名二          |名三          |名四          "
. . .
::nn+15除60取余;具体排版自己改下,只提供方法
set /a nn=(nn+15)%%60
...%%e!wd!!names:~%nn%,60!

[ Last edited by netbenton on 2009-2-1 at 18:23 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-28 13:53
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 5 楼』:  

这样试行不?
取一遍后  set 名字一=名字二 set 名字二=名字三。。。



简单!简单!再简单!
2009-1-28 17:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 6 楼』:  

参考

set weekday=日一二三四五六



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-1-28 19:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 7 楼』:  


@echo off
set "xq=日一二三四五六"
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a Y=%%i,M=1%%j%%100,D=1%%k%%100,M1=M
set/a PN="!(Y%%4) & !(!(Y%%100)) | !(Y%%400)+28",n=0,_a=0,_b=1,_c=2,_d=3
echo %Y%年%M%月     ^|上班时间一^|上班时间二^|上班时间三^|上班时间四^|
for %%i in  (名一 名二 名三 名四)do call set "_%%n%%=%%i"&set/a n+=1
if %M% leq 2 set/a Y-=1,M+=12
set/a W1=(1+2*M+3*(M+1)/5+Y+Y/4-Y/100+Y/400+1)%%7
   for /F "tokens=%M1%" %%i in ("31 %PN% 31 30 31 30 31 31 30 31 30 31") do set/a W=w1+%%i-1
      for /l %%j in (0 1 %w%) do (
         if %%j geq %W1% (
         set/a T=%%j%%7,DD+=1
         call set D=0%%DD%%
         call call echo %%D:~-2%% 星期%%%%xq:~%%t%%,1%%%%      %%%%_%%_a%%%%%%        %%%%_%%_b%%%%%%       %%%%_%%_c%%%%%%       %%%%_%%_d%%%%%%
         set/a _a=^(_a+1^)%%4,_b=^(_b+1^)%%4,_c=^(_c+1^)%%4,_d=^(_d+1^)%%4
))
pause


   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2009-2-3 05:39




简单!简单!再简单!
2009-1-28 21:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『第 8 楼』:  

谢谢各位了。。。
七楼的朋友,解决了名字输出的问题。
但还是没有把四个名字和日期关联起来。。
把日期改了一下,还是按自定义的名字,由第一个输出,
就等于每个月的班都一样了。。先谢谢了。。

2009-2-1 15:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『第 9 楼』:  

以前我用C++编日历时,是找到某一天,指定的日子,
例:2007-1-4 星期一,名一,
这样,把这些都关联在一起,然后算,某一个月的第一天,
和那天隔了多少天,再把这个数N,分别除 7,4,
这样,把后边的都一起算出来。

但我在批处理中缺少函数上的认识,不是很会设定这个关联。。

2009-2-1 15:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『第 10 楼』:  

基本上解决了。。。。
最后想要在每个名字前加 “|”
用于生成文本导入EXCEL。。。。

这个。。。我试过用  ^| 这样,不行,
下边是我改好后的代码,
请帮我改一下,
在名字前加多一个竖条。
@echo off
color f2
set "xq=日一二三四五六"
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a Y=%%i,M=1%%j%%100,D=1%%k%%100,M1=M
if %M% leq 2 set/a Y-=1,M+=12
set/a n1=(1+2*M+3*(M+1)/5+Y+Y/4-Y/100+Y/400+1)%%4
set/a PN="!(Y%%4) & !(!(Y%%100)) | !(Y%%400)+28",n=0,_a=0+n1,_b=1+n1,_c=2+n1,_d=3+n1
echo %Y%年%M%月    ^|08:30-17:30 ^|08:30-17:30 ^|17:30-21:00 ^|   休息   ^|
for %%i in  (名字一 名字二 名字三 名字四 名字一 名字二 名字三)do call set "_%%n%%=%%i"&set/a n+=1
set/a W1=(1+2*M+3*(M+1)/5+Y+Y/4-Y/100+Y/400+1)%%7
   for /F "tokens=%M1%" %%i in ("31 %PN% 31 30 31 30 31 31 30 31 30 31") do set/a W=w1+%%i-1
      for /l %%j in (0 1 %w%) do (
         if %%j geq %W1% (
         set/a T=%%j%%7,DD+=1
         call set D=0%%DD%%
         call call echo %%D:~-2%% 星期%%%%xq:~%%t%%,1%%%%      %%%%_%%_a%%%%%%        %%%%_%%_b%%%%%%       %%%%_%%_c%%%%%%       %%%%_%%_d%%%%%%
         set/a _a=^(_a+3^)%%4,_b=^(_b+3^)%%4,_c=^(_c+3^)%%4,_d=^(_d+3^)%%4
))
pause
[ Last edited by andison625 on 2009-2-2 at 17:42 ]

2009-2-2 15:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
andison625
初级用户





积分 70
发帖 36
注册 2008-5-21
状态 离线
『第 11 楼』:  

弄好了,,,非常谢谢各位。

2009-2-2 17:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: