ייעוץ עסקי בקרה וניהול סיכונים

ACL Script vs VBA

יצוע תחקור נתונים מורכב בצורה פשוטה באמצעות תוכנת ACL לעיתים קרובות אנו מקבלים משותפינו העסקיים ממדינות שונות, דוגמאות לדרכים הפשוטות בהן ניתן לבצע ביקורות וניתוחים מורכבים על נתונים.

לאחרונה, קיבלנו דוגמא מאוד מעניינת הממחישה את ההבדל המשמעותי בין ביצוע בדיקה באמצעות תוכנתACL לבין ביצוע בדיקה בתוכנות אשר משתמשות בשפות אחרות כגון SQL (Structured Query Language) או VBA (Visual Basic).

בדוגמא ניתן לראות בבירור כי כאשר מדובר ביצירת בדיקות אוטומטיות ומורכבות, קוד התוכנה של ACL נותן מענה פשוט, קצר ונגיש גם למי שאינו יודע לכתוב או לקרוא שפות תכנות וזהו אחד היתרונות הבולטים של תוכנת ACL.

מטרת המופיע לפניכם הינה היא בדיקת חפיפה בזמני התחלה וסיום של עובדים כחלק מלולאה הבודקת כל עובד בנפרד.

בשפה בה משתמשת תוכנת ACLACL SCRIPTS זה נראה כך:

COM *** Sorting the user data table ***

OPEN Users

SORT ON USER_ID START_DATE START_TIME END_DATE END_TIME  D  TO "TEST_SORT" OPEN

DEFINE FIELD Start_Hour COMPUTED VALUE( SUBSTR( START_TIME , 1 ,2 ) , 0 )

DEFINE FIELD End_Hour COMPUTED VALUE( SUBSTR( END_TIME , 1 ,2 ) , 0 )

COM *** The hours check condition ***

DELETE FIELD EXCEPTION OK

DEFINE FIELD EXCEPTION COMPUTED

 

"Y" IF (START_DATE = RECOFFSET(START_DATE, 1 )) AND RECOFFSET(Start_Hour , 1 ) – End_Hour<=0

"Y" IF RECOFFSET(( START_DATE = RECOFFSET( START_DATE, 1 )) AND RECOFFSET( Start_Hour , 1 ) – End_Hour<=0, -1)

" "

COM *** Extract the excption ***

EXTRACT ALL IF EXCEPTION= "Y" TO "Output"

קוד המבצע את אותה פעולה בדיוק בשפת VBA, זה נראה כך:

Private Sub cmdAnalyzeTime_Click()

'Nested loop to look at each employee's time and see if the start/stop times overlap

'Declare variables

Dim dbTime As Database, rstOuter As Recordset, rstInner As Recordset, vstrOuterSQL As String, vstrInnerSQL As String, vdtmEndTime

As Date, vlngUserID As Long

 

'Reset all overlaps to a 'NO'

DoCmd.SetWarnings False

DoCmd.RunSQL "UPDATE [Time] SET [Time].OVERLAP = 'NO';"

DoCmd.SetWarnings True

 

'SQL statement to control the outer loop

vstrOuterSQL = "SELECT User.USER_ID FROM [User] ORDER BY User.USER_ID;"

 

'Create recordset in memory

Set dbTime = CurrentDb()

Set rstOuter = dbTime.OpenRecordset(vstrOuterSQL, dbOpenSnapshot)

rstOuter.MoveFirst

 

'Initate the outer loop

Do Until rstOuter.EOF

'Set the Employee ID variable to the first employee to use as a parameter in the inner loop

vlngUserID = rstOuter![USER_ID]

 

'Set the Inner SQL statement using the User ID from the outer loop

vstrInnerSQL = "SELECT Time.USER_ID, Time.DATE_WORKED, Time.START_TIME, Time.END_TIME, Time.END_TIME,

Time.OVERLAP FROM [Time] WHERE (((Time.USER_ID)=" &vlngUserID& ")) ORDER BY Time.START_TIME;"

 

'Create the recordset in memory for the inner loop

Set rstInner = dbTime.OpenRecordset(vstrInnerSQL, dbOpenDynaset)

rstInner.MoveFirst

 

'Set the End Time variable first End Time in the recordset, then move to the second record

vdtmEndTime = rstInner![END_TIME]

rstInner.MoveNext

 

'Set the inner loop in motion comparing the prior end time to the current start time and marking the overlap field if it is found to be an overlap

Do Until rstInner.EOF

If rstInner![START_TIME] <vdtmEndTime Then

rstInner.Edit

rstInner![OVERLAP] = "YES"

rstInner.Update

End If

 

'Set the end time variable to the new end time and move to the next record

vdtmEndTime = rstInner![END_TIME]

rstInner.MoveNext

Loop

 

'Close the inner recordset, increment the outer loop

rstInner.Close

rstOuter.MoveNext

Loop

 

'Close the outer recordset and database, let the user know the process is complete

rstOuter.Close

dbTime.Close

MsgBox "Done."

End Sub

יצירת קשר