前言:
某單位之志工別服務時數記入於EXCEL檔內,需再匯入衛福部志工系統,內容含有每個月志工服務時數,因志工多,檔案多,筆數多,人工作業費時又常累計算錯,故提此法改善,提高效率。
1. 作業流程
<1> 輸入志工名或不輸入
<2>輸入年份
<3>讀取檔案 ,選取所需項目
<3.1> 判斷名字若不是則跳走
<3.2> 判斷年份若不是則跳走
<3.3>若志工名不同. 列出累計
<3.4>對象rec. 列出項目
<3.5>對象rec. 計算時數
<4>檔案讀取終了,列出累計
<5>JOB是否繼續,不是終了
2. 作業說明
2.0 先判斷志工檔案之資料夾是否存在,不存在結束JOB
2.1 輸入欲查志工名或不輸入直接enter,此時代表欲查詢所有志工
輸入欲查詢志工名字,判斷是否存在,不存在需再輸入
2.2 輸入欲查查詢民國年份,或不輸入直接enter,此時轉換為今年之民國年數
若輸入值 需< 140 and > 100,否則錯誤
2.3 讀取對象目錄內所有檔案,對檔案內的每一筆rec內容,尋找對象項目,若 找到,則執行動作指令
1> 依據 輸入之參數當作引數,將符合之檔案找出
2> 再判斷檔案內容是否有欲查詢之志工內容,若有將該筆Rec.之所需項目取出
3> 判斷志工名,若與前筆不同時, 列出服務時數之累計
4> 將志工服務時數等項目列出
5> 依志工別將每個月之服務時數合計,並換算服務分數之合計,換算為時數單位
2.4 查詢結果顯示於瑩幕外,也產出檔案可供參考確認
2.5 查詢完後,可再繼續查詢其他志工
3. 實例說明 cmd name : VolH_Cal.cmd
3.1 來源檔案即是志工別時數紀錄檔,inputfile樣本之內容如下:
姓名,身分證字號,服務日期起,服務日期迄,服務項目,服務內容,服務時數-小時,服務時數-分鐘,受服務人次,交通費,誤餐費,服務區域,備註,匯入動作,序號,國外參與服務人次,國內參與服務人次
劉孟陽,XXXXX90432,1080101,1080131,60,3,6,0,10,0,0,,,A,,,
劉孟陽,XXXXX90432,1080201,1080228,60,3,6,0,10,0,0,,,A,,,
劉孟陽,XXXXX90432,1080301,1080331,60,3,8,0,10,0,0,,,A,,,
劉孟陽,XXXXX90432,1080401,1080430,60,3,6,0,10,0,0,,,A,,,
劉孟陽,XXXXX90432,1080501,1080531,60,3,2,0,0,0,0,,,A,,,
劉孟陽,XXXXX90432,1080601,1080630,60,3,6,0,10,0,0,,,A,,,
3.2 cmd執行時,輸入欲查詢之志工,年份
如下志工名:未輸入;
年份輸入 112
*** Inquiry of volunteer service hours ***
***
**1 Enter 志工名字:
***
**2 Enter 民國年(yyy) :112
*** Volunteer service time process 執行中...
執行結果顯示如下 :
*** Volunteer service time process 執行完了
* ** Inquiry of Volunteer志工:? 年份:112 ** * 查詢日:2024/07/21 週日 10:22:14
--- 姓名 服務日起 服務日迄 時數 分鐘 ---
* 劉孟陽 1120102 1120131 2 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 邱鳳英 1120601 1120630 14 0
* 邱鳳英 1120701 1120731 10 30
* 邱鳳英 1120801 1120831 24 30
* 邱鳳英 1120901 1120930 17 30
* 邱鳳英 1121001 1121031 13 30
* 邱鳳英 1121101 1121130 14 0
* 邱鳳英 1121201 1121231 10 30
--------------- Sum Hours: 183 270 4.5 邱鳳英
* **-------------------------------------- 執行終了 on 2024/07/21 週日 10:22:15
**3 Do you inquire other Volunteer ? (Y/N) :
3.3 查詢產出之訊息內容,除了顯示於螢幕外,同時存入txt file
txt檔名: Inquiry_Volunteer_time.txt
本例 txt檔,只查詢四名志工,內容如下
* ** Inquiry of Volunteer志工:? 年份:112 ** * 查詢日:2024/07/21 週日 10:22:14
--- 姓名 服務日起 服務日迄 時數 分鐘 ---
* 劉孟陽 1120102 1120131 2 0
* 劉孟陽 1120201 1120227 9 30
* 劉孟陽 1120301 1120331 8 0
* 劉孟陽 1120401 1120430 8 0
* 劉孟陽 1120501 1120531 4 0
* 劉孟陽 1120601 1120630 4 0
* 劉孟陽 1120701 1120731 4 0
* 劉孟陽 1120801 1120831 8 0
* 劉孟陽 1120901 1120930 8 0
* 劉孟陽 1121001 1121031 2 0
* 劉孟陽 1121101 1121130 8 0
* 劉孟陽 1121201 1121231 8 0
--------------- Sum Hours: 73 30 .5 劉孟陽
* 王瑛瑛 1120102 1120131 5 0
* 王瑛瑛 1120201 1120227 12 0
* 王瑛瑛 1120301 1120331 12 30
* 王瑛瑛 1120401 1120430 10 0
* 王瑛瑛 1120501 1120531 10 0
* 王瑛瑛 1120601 1120630 10 0
* 王瑛瑛 1120701 1120731 7 30
* 王瑛瑛 1120801 1120831 17 30
* 王瑛瑛 1120901 1120930 11 0
* 王瑛瑛 1121001 1121031 11 0
* 王瑛瑛 1121101 1121130 10 0
* 王瑛瑛 1121201 1121231 13 30
--------------- Sum Hours: 128 120 2.0 王瑛瑛
* 趙羅秀英 1120102 1120131 4 0
* 趙羅秀英 1120201 1120227 5 30
* 趙羅秀英 1120301 1120331 10 0
* 趙羅秀英 1120401 1120430 8 0
* 趙羅秀英 1120501 1120531 4 0
* 趙羅秀英 1120601 1120630 6 0
* 趙羅秀英 1120701 1120731 6 0
* 趙羅秀英 1120801 1120831 10 0
* 趙羅秀英 1120901 1120930 8 0
* 趙羅秀英 1121001 1121031 10 0
* 趙羅秀英 1121101 1121130 15 0
* 趙羅秀英 1121201 1121231 8 0
--------------- Sum Hours: 94 30 .5 趙羅秀英
* 邱鳳英 1120102 1120131 15 30
* 邱鳳英 1120201 1120227 16 0
* 邱鳳英 1120301 1120331 20 30
* 邱鳳英 1120401 1120430 10 30
* 邱鳳英 1120501 1120531 20 30
* 邱鳳英 1120601 1120630 14 0
* 邱鳳英 1120701 1120731 10 30
* 邱鳳英 1120801 1120831 24 30
* 邱鳳英 1120901 1120930 17 30
* 邱鳳英 1121001 1121031 13 30
* 邱鳳英 1121101 1121130 14 0
* 邱鳳英 1121201 1121231 10 30
--------------- Sum Hours: 183 270 4.5 邱鳳英
* **-------------------------------------- 執行終了 on 2024/07/21 週日 10:22:15
4. 改善前後
4.1 改善前 :
(1)須於資料夾內,尋找志工別檔案,手動一一打開檔案
(2) 開啟檔案後,找出該年度的筆數,一年12筆,人工計算整年度的服務時數,分數累計後換算為時單位
(3)多數個志工檔案,因人工作業,易手誤算錯,耗時費工,業務效率差
4.2 改善後:
(1) 執行後,將資料夾內所有志工檔案,一個一個檔案開啟讀取資料,快速列出志工別服務時數明細及累計
(2) 查詢後的結果 螢幕顯示外,可產出txt檔案 ,提供問題原因查明確認用,或再轉作其他用途使用
(3) 可一次查詢出全部志工,或志工個別查詢,亦能查詢過去年度之志工服務訊息,精準快速,效率佳
5. 展開運用
(1) 志工服務時數若有誤植問題發生時,可快速查詢了解現況
(2) 其他單為各系統之資料檔案組,若有多檔或多筆資料,經常須找出資料利用場合時,可應用此法
6.設計編寫
6.1 cmd 語法使用說明
<1> 判斷資料夾是否存在
IF NOT EXIST D:\CSV ( echo ### ERROR : D:\CSV is not exist )
<2> FOR 指令內引數之運用,參考本件如下2種寫法寫法
For /f " tokens=3 delims=:," %%i in ('findstr /S /C:%PAR1% "%PARPath%\CSV\* " ') do (
IF %%i==%PAR1% SET ERRY=0)
IF NOT %ERRY%==0 ( echo ### 找不到志工名:%PAR1%\CSV ,請再輸入 )
說明:
讀取CSV資料夾內所有檔案,讀取該筆rec.內若有與定數%PAR1%相同值,則選出該筆rec,並將該REC內容以"," 作分隔之第三項目取出,以%%i 作變數名取出,提供 DO ()內之指令應用。
For /f " tokens=3,5-6,9-10 delims=:," %%i in ('findstr /S /C:A "%PARPath%\CSV\* " ') do (
CALL :ListSeleRec %%i %%j %%k %%l %%m)
說明:
讀取CSV資料夾內所有檔案,讀取該筆rec.內若有與定數相同之A值,則選出該筆rec,並將該REC內容以","或":" 作分隔之第3,5-6,9-10 共5項目取出,以%%i %%j %%k %%l %%m依序作變數名取出,提供 DO ()內之CALL指令應用,各引數值說明 i=志工姓名 j=服務日起 k=服務日迄 l=服務時數 m=服務分鐘。
<3> IF 可多層判斷,參考如下3種寫法
if A1==A1R (
cmd1-------
) else (
if A2==A2R (
cmd2-------
) else (
if A3==A3R (
cmd3-------
) else (
echo ###ERROR rec. )))
if %a% LSS 150 (echo 11) else ( if %a% GTR 100 ( echo 00 ))
if %a% LSS 150 ( if %a% GTR 100 (echo 00) )
6. 2 本例cmd 設計如下
cmd 檔名: VolH_Cal.cmd
@echo off
setlocal
SET PARPath=D:\志工\志工EXCEL
rem CD C:\Users\admin\Desktop\衛福部志工系統-志工時數
if not EXIST %PARPath%\CSV ( echo ###ERROR : %PARPath%\CSV is not exist & Goto EJob )
D:
CD %PARPath%
rem C:
echo.
echo *** Inquiry of volunteer service hours ***
:Enter_par1
:: --- PAR1 for 志工名字, PAR2 for 服務年分
set PAR1=?
set PAR2=?
echo ***
set /p PAR1="**1 Enter 志工名字:"
if %PAR1% == ? goto Enter_par2
SET ERRY=1
For /f " tokens=3 delims=:," %%i in ('findstr /S /C:%PAR1% "%PARPath%\CSV\* " ') do (
IF %%i==%PAR1% SET ERRY=0)
IF NOT %ERRY%==0 ( echo ### 找不到志工名:%PAR1%\CSV ,請再輸入
Goto Enter_par1 )
:Enter_par2
echo ***
set /p PAR2="**2 Enter 民國年(yyy) :"
if %PAR2% == ? ( SET /a PAR2=%DATE:~,4%-1911 )
set ERRY=0
if %PAR2% GTR 140 (set ERRY=1 ) else ( if %PAR2% LSS 100 ( set ERRY=1 ))
if %ERRY%==1 (
echo ###ERROR 輸入 %PAR2% ,民國年度不正確,請再輸入
goto Enter_par2 )
:Process_Begin
::----出力txt之表頭設定
echo. > Inquiry_Volunteer_time.txt
echo * ** Inquiry of Volunteer志工:%PAR1% 年份:%PAR2% ** * 查詢日:%DATE% %TIME:~,8% >> Inquiry_Volunteer_time.txt
echo --- 姓名 服務日起 服務日迄 時數 分鐘 --- >> Inquiry_Volunteer_time.txt
echo *** Volunteer service time process 執行中...
set B_VName=INIT_VName
SET /a SumH=0
SET /a SumM=0
rem ---Read rec. 無輸入志工名以 "."代替全部讀取
::-----讀取%PARPath%\CSV\* 內所有檔案,檢查檔案內有 A 的該筆資料列出,帶出5個引數----
::---i=姓名 j=服務日起 k=服務日迄 l=時數 m=分鐘
For /f " tokens=3,5-6,9-10 delims=:," %%i in ('findstr /S /C:A "%PARPath%\CSV\* " ') do (
CALL :ListSeleRec %%i %%j %%k %%l %%m)
::----列出合計志工別之服務時數
CALL :Sum_List
echo. >> Inquiry_Volunteer_time.txt
echo *** Volunteer service time process 執行完了
echo * **-------------------------------------- 執行終了 on %DATE% %TIME:~,8% >> Inquiry_Volunteer_time.txt
type Inquiry_Volunteer_time.txt
::----可再次重複執行
set /p PAR3="**3 Do you inquire other Volunteer ? (Y/N) :"
if /i %PAR3% == Y goto Enter_par1
pause ----
:EJob
:: end job
endlocal
exit
:ListSeleRec
::---讀取之年分判斷 yyy = PAR2
SET SByyy=%2
SET SEyyy=%3
IF %SByyy:~0,3% NEQ %PAR2% GOTO Exit_ListSeleRec
::---judg VName is PAR1=? or specify
IF NOT %PAR1%==? (IF NOT %PAR1%==%1 GOTO Exit_ListSeleRec)
::---judg B_Name NEQ C_Name
IF NOT %B_VName%==INIT_VName (IF NOT %B_VName%==%1 CALL :Sum_List)
::---judg S-yyymm and E-yyymm-----
IF %SByyy:~0,5% NEQ %SEyyy:~0,5% ( set ERRym=## ERRyyymm
) ELSE ( set ERRym= )
::---List out correct rec.
echo * %1 %2 %3 %4 %5 %ERRym%>>Inquiry_Volunteer_time.txt
::---時數合計
SET /a VH=%4
SET /a VM=%5
SET /a SumH=SumH+VH
SET /a SumM=SumM+VM
::---Move %1 to B_VName
SET B_VName=%1
:Exit_ListSeleRec
rem pause 2.5 list exit -----
EXIT /B
::-----讀取志工名變化時,列印出時數合計
:Sum_List
SET /a SumM_H=0
SET /a SumM_H=(SumM * 10) / 60
SET SumM_H=%SumM_H:~0,-1%.%SumM_H:~-1,1%
echo --------------- Sum Hours: %SumH% %SumM% %SumM_H% %B_VName%>>Inquiry_Volunteer_time.txt
SET /a SumH=0
SET /a SumM=0
rem pause 3.5 sum list---------
EXIT /B
--------by linct---------