2024-07-21|閱讀時間 ‧ 約 42 分鐘

志工服務時數累計自動化

前言:

某單位之志工別服務時數記入於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---------

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.