home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / demo / rec_lock / globals.bas < prev    next >
BASIC Source File  |  1995-02-27  |  39KB  |  879 lines

  1. '============================================================
  2. ' Projekt        : Record Locking Pro
  3. ' Modulname      : GLOBALS.BAS
  4. ' Aufgabe        : Deklarationen der DLL-Funktionen (intern)
  5. '                  und darauf basierend wesentlich vereinfach-
  6. '                  ten Routinen zur Datensatzsperrung sowie
  7. '                  globalen Variablen und Konstanten
  8. ' Copyright      : Arthur Burda
  9. ' Compiler       : Visual Basic 3.0 fⁿr Windows
  10. ' Info           : Das Modul enthΣlt auch Routinen zur Ansteue-
  11. '                  rung der Steuerelemente (Sperren und Entsper-
  12. '                  ren der Editierfelder in einer Form).
  13. '============================================================
  14. ' l. ─nderung am : 10.09.1994
  15. ' Version        : 1.01
  16. ' Bemerkungen    : Erste Implementierung
  17. '------------------------------------------------------------
  18.  
  19. Option Explicit
  20.  
  21. ' DLL-Deklarationen
  22.  
  23. Declare Function int_Init_Locking Lib "REC_LOCK.DLL" Alias "Init_Locking" (ByVal File_Name As String, ByVal User_Name As String, ByVal Lock_Mode As Integer, DOS_Error As Integer) As Integer
  24. Declare Function int_Done_Locking Lib "REC_LOCK.DLL" Alias "Done_Locking" (ByVal File_Name As String, ByVal User_Name As String, DOS_Error As Integer) As Integer
  25. Declare Function int_Login_DateTime Lib "REC_LOCK.DLL" Alias "Login_DateTime" (ByVal File_Name As String, ByVal User_Name As String, Day_ As Integer, Month_ As Integer, Year_ As Integer, Hour_ As Integer, Min_ As Integer, Sec_ As Integer, DOS_Error As Integer) As Integer
  26. Declare Function int_Login_Seconds Lib "REC_LOCK.DLL" Alias "Login_Seconds" (ByVal File_Name As String, ByVal User_Name As String, Seconds As Long, DOS_Error As Integer) As Integer
  27. Declare Function int_What_Lock_Mode Lib "REC_LOCK.DLL" Alias "What_Lock_Mode" (ByVal File_Name As String, ByVal User_Name As String, Lock_Mode As Integer, DOS_Error As Integer) As Integer
  28. Declare Function int_Clear_Table Lib "REC_LOCK.DLL" Alias "Clear_Table" (ByVal File_Name As String, ByVal Table_Name As String, DOS_Error As Integer) As Integer
  29. Declare Function int_Lock_Record Lib "REC_LOCK.DLL" Alias "Lock_Record" (ByVal File_Name As String, ByVal User_Name As String, ByVal Table_Name As String, ByVal Record_ID As Long, ByVal Lock_Timeout As Integer, DOS_Error As Integer) As Integer
  30. Declare Function int_Is_Record_Locked Lib "REC_LOCK.DLL" Alias "Is_Record_Locked" (ByVal File_Name As String, ByVal User_Name As String, ByVal Table_Name As String, ByVal Record_ID As Long, ByVal Lock_User As String, Lock_Day As Integer, Lock_Month As Integer, Lock_Year As Integer, Lock_Hour As Integer, Lock_Min As Integer, Lock_Sec As Integer, Lock_Seconds As Long, Lock_Timeout As Integer, DOS_Error As Integer) As Integer
  31. Declare Function int_Unlock_Record Lib "REC_LOCK.DLL" Alias "Unlock_Record" (ByVal File_Name As String, ByVal Table_Name As String, ByVal Record_ID As Long, DOS_Error As Integer) As Integer
  32.  
  33. ' Status-Konstanten
  34.  
  35. Global Const st_No_Error = 0            ' kein Fehler
  36. Global Const st_Record_Not_Locked = 0   ' Datensatz ist nicht gesperrt
  37. Global Const st_DOS_Error = 1           ' DOS-Fehler (Details -> globale Variable glb_Last_DOS_Error)
  38. Global Const st_No_File_Name = 2        ' Name der Record-Locking-Verwaltungsdatei fehlt
  39. Global Const st_No_User_Name = 3        ' Username fehlt
  40. Global Const st_Max_Users = 4           ' max. Anzahl User erreicht
  41. Global Const st_File_Destroyed = 5      ' Record-Locking-Verwaltungsdatei ist zerst÷rt
  42. Global Const st_User_Not_Found = 6      ' User nicht gefunden
  43. Global Const st_No_Table_Name = 7       ' Name der Datenbank-Tabelle bzw. Abfrage fehlt
  44. Global Const st_Max_Tables = 8          ' max. Anzahl Tabellen erreicht
  45. Global Const st_Lock_By_Same = 9        ' Datensatz vom akt. Benutzer gesperrt; keine automatische Entsperrⁿberwachung oder Zeitmarke noch nicht ⁿberschritten
  46. Global Const st_Lock_By_Others = 10     ' Datensatz von einem anderem User gesperrt; keine automatische Entsperrⁿberwachung oder Zeitmarke noch nicht ⁿberschritten
  47. Global Const st_Lock_By_Same_Out = 11   ' Datensatz vom akt. Benutzer gesperrt; Zeitmarke fⁿr die Sperrung ⁿberschritten, Entsperrung wird empfohlen
  48. Global Const st_Lock_By_Others_Out = 12 ' Datensatz von einem anderem User gesperrt; Zeitmarke fⁿr die Sperrung ⁿberschritten, Entsperrung wird empfohlen
  49. Global Const st_Max_Records = 13        ' max. Anzahl sperrbarer DatensΣtze erreicht
  50. Global Const st_Table_Not_Found = 14    ' Datenbank-Tabelle bzw. Abfrage nicht gefunden
  51. Global Const st_Record_Not_Found = 15   ' Datensatz nicht gefunden
  52.  
  53. ' Sperrmethoden-Konstanten
  54.  
  55. Global Const lock_by_Select = 0 ' Lock-by-Select (Sperren bei Datensatz-Selektion)
  56. Global Const lock_by_Edit = 1   ' Lock-by-Edit (Sperren bei Beginn des Editiervorgangs eines Datensatzes)
  57.  
  58. ' Globale Variablen
  59.  
  60. Global glb_Last_Status As Integer    ' letzter Status eines DLL-Funktionsaufrufes
  61. Global glb_Last_DOS_Error As Integer ' Code des letzten DOS-Fehlers
  62.  
  63. Global glb_Lock_File_Name As String  ' Name der Record-Locking-Verwaltungsdatei inkl. Pfad
  64. Global glb_User_Name As String       ' Name des akt. Benutzers in Mehrbenutzer-Umgebung
  65. Global glb_Lock_Mode As Integer      ' Sperrmethode: 0 = Lock-by-Select (Sperren bei Datensatz-Selektion), 1 = Lock-by-Edit (Sperren bei Beginn des Editiervorgangs eines Datensatzes)
  66.  
  67. '============================================================
  68. ' Routine : Center_Form
  69. '============================================================
  70. ' Aufgabe : Stellt eine Form zentriert auf dem Bildschirm dar.
  71. ' Eingabe : F = Form
  72. ' Ausgabe : keine
  73. '------------------------------------------------------------
  74. '
  75. Sub Center_Form (F As Form)
  76.  
  77.     F.Top = Screen.Height / 2 - F.Height / 2
  78.     F.Left = Screen.Width / 2 - F.Width / 2
  79.  
  80. End Sub
  81.  
  82. '============================================================
  83. ' Routine : Clear_Table
  84. '============================================================
  85. ' Aufgabe : L÷scht einen Tabellen/Abfragen-Eintrag aus der Re-
  86. '           cord-Locking-Verwaltungsdatei inkl. aller zugeh÷ri-
  87. '           gen gesperrten DatensΣtze
  88. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  89. '                        (max. 40 Zeichen)
  90. ' Ausgabe : keine
  91. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  92. '           tion wird die globale Variable glb_Lock_File_Name
  93. '           benutzt.
  94. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  95. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  96. '           abgefragt werden.
  97. '------------------------------------------------------------
  98. '
  99. Sub Clear_Table (Table_Name As String)
  100.  
  101.     glb_Last_Status = int_Clear_Table(glb_Lock_File_Name, Table_Name, glb_Last_DOS_Error)
  102.  
  103. End Sub
  104.  
  105. '============================================================
  106. ' Routine : Done_Locking
  107. '============================================================
  108. ' Aufgabe : Beendet das Record-Locking-System. Alle vom akt.
  109. '           Benutzer gesperrten DatensΣtze werden entsperrt.
  110. ' Eingabe : keine
  111. ' Ausgabe : keine
  112. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  113. '           tion werden die globalen Variablen glb_Lock_File_Name
  114. '           und glb_User_Name benutzt.
  115. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  116. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  117. '           abgefragt werden.
  118. '------------------------------------------------------------
  119. '
  120. Sub Done_Locking ()
  121.  
  122.     glb_Last_Status = int_Done_Locking(glb_Lock_File_Name, glb_User_Name, glb_Last_DOS_Error)
  123.  
  124.     If glb_Last_Status = st_No_Error Then
  125.         glb_Lock_File_Name = ""
  126.         glb_User_Name = ""
  127.         glb_Lock_Mode = -1
  128.     End If
  129.  
  130. End Sub
  131.  
  132. '============================================================
  133. ' Routine : Draw_Form_Frame
  134. '============================================================
  135. ' Aufgabe : Zeichnet einen Rahmen um die ⁿbergebene Form.
  136. ' Eingabe : F           = Form
  137. '           X_Thickness = horizontale Dicke des Rahmens
  138. '           Y_Thickness = vertikale Dicke des Rahmens
  139. ' Ausgabe : keine
  140. '------------------------------------------------------------
  141. '
  142. Sub Draw_Form_Frame (F As Form, X_Thickness As Long, Y_Thickness As Long)
  143.  
  144.     Dim ulx As Long         ' obere linke Ecke in Twips
  145.     Dim uly As Long         ' obere linke Ecke in Twips
  146.     Dim brx As Long         ' untere rechte Ecke in Twips
  147.     Dim bry As Long         ' untere rechte Ecke in Twips
  148.     Dim ulcolor As Long     ' Farbe oben und links
  149.     Dim brcolor As Long     ' Farbe unten und rechts
  150.     Dim stepsize As Integer
  151.     Dim n As Integer
  152.  
  153.     ulcolor = 16777215
  154.     brcolor = 8421504
  155.     ulx = F.ScaleLeft + X_Thickness
  156.     uly = F.ScaleTop + Y_Thickness
  157.     brx = F.ScaleWidth - X_Thickness
  158.     bry = F.ScaleHeight - Y_Thickness
  159.  
  160.     F.AutoRedraw = True
  161.  
  162.     stepsize = 2
  163.     If stepsize > X_Thickness Then X_Thickness = stepsize
  164.     For n = stepsize To X_Thickness Step stepsize
  165.         F.Line (ulx - n, uly - n)-(ulx - n, bry + n), ulcolor
  166.         F.Line (brx + n, uly - n)-(brx + n, bry + n), brcolor
  167.     Next
  168.  
  169.     stepsize = 2
  170.     If stepsize > Y_Thickness Then Y_Thickness = stepsize
  171.     For n = stepsize To Y_Thickness Step stepsize
  172.         F.Line (ulx - n, uly - n)-(brx + n, uly - n), ulcolor
  173.         F.Line (ulx - n, bry + n)-(brx + n, bry + n), brcolor
  174.     Next
  175.  
  176.     F.AutoRedraw = False
  177.  
  178. End Sub
  179.  
  180. '============================================================
  181. ' Routine : Get_Lock_Date
  182. '============================================================
  183. ' Aufgabe : Liefert das Sperrdatum eines Datensatzes in Form
  184. '           eines formatierten Strings zurⁿck, falls der Daten-
  185. '           satz gesperrt ist. Ist der Datensatz nicht gesperrt
  186. '           oder ein Fehler aufgetreten, so wird ein leerer
  187. '           String zurⁿckgeliefert.
  188. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  189. '                        (max. 40 Zeichen)
  190. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  191. ' Ausgabe : keine
  192. ' Return  : Sperrdatum; Format: "DD.MM.YYYY" bzw. leerer String
  193. ' Info    : Eine Sperrung liegt auch vor, wenn die evtl. ein-
  194. '           gestellte Zeitmarke (Lock-Timeout) fⁿr die automa-
  195. '           tische Entsperrⁿberwachung bereits ⁿberschritten
  196. '           ist. Dies jedoch kann mit Hilfe der Funktion
  197. '           Is_Record_Locked abgefragt werden.
  198. '           Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  199. '           tion werden die globalen Variablen glb_Lock_File_Name
  200. '           und glb_User_Name benutzt.
  201. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  202. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  203. '           abgefragt werden.
  204. '------------------------------------------------------------
  205. '
  206. Function Get_Lock_Date (Table_Name As String, Record_ID As Long) As String
  207.  
  208.     Dim Lock_User As String
  209.     Dim Lock_Day As Integer
  210.     Dim Lock_Month As Integer
  211.     Dim Lock_Year As Integer
  212.     Dim Lock_Hour As Integer
  213.     Dim Lock_Min As Integer
  214.     Dim Lock_Sec As Integer
  215.     Dim Lock_Seconds As Long
  216.     Dim Lock_Timeout As Integer
  217.     Dim Str_Day As String
  218.     Dim Str_Month As String
  219.     Dim Str_Year As String
  220.  
  221.     Get_Lock_Date = ""
  222.  
  223.     Lock_User = String$(255, 32)
  224.  
  225.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  226.  
  227.     Select Case glb_Last_Status
  228.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  229.             Str_Day = LTrim$(RTrim$(Str$(Lock_Day)))
  230.             If Lock_Day < 10 Then Str_Day = "0" & Str_Day
  231.             Str_Month = LTrim$(RTrim$(Str$(Lock_Month)))
  232.             If Lock_Month < 10 Then Str_Month = "0" & Str_Month
  233.             Str_Year = LTrim$(RTrim$(Str$(Lock_Year)))
  234.             Get_Lock_Date = Str_Day & "." & Str_Month & "." & Str_Year
  235.     End Select
  236.  
  237. End Function
  238.  
  239. '============================================================
  240. ' Routine : Get_Lock_Mode
  241. '============================================================
  242. ' Aufgabe : Liefert das Sperrmethode, die fⁿr den akt. Benutzer
  243. '           gilt. Ist ein Fehler aufgetreten, so wird der Wert
  244. '           -1 zurⁿckgeliefert.
  245. ' Eingabe : keine
  246. ' Ausgabe : keine
  247. ' Return  : Sperrmethode: 0 = Lock-by-Select (Sperren bei Daten-
  248. '                             satz-Selektion)
  249. '                         1 = Lock-by-Edit (Sperren bei Beginn des
  250. '                             Editiervorgangs eines Datensatzes)
  251. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  252. '           tion werden die globalen Variablen glb_Lock_File_Name
  253. '           und glb_User_Name benutzt.
  254. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  255. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  256. '           abgefragt werden.
  257. '------------------------------------------------------------
  258. '
  259. Function Get_Lock_Mode () As Integer
  260.  
  261.     Dim Lock_Mode As Integer
  262.  
  263.     glb_Last_Status = int_What_Lock_Mode(glb_Lock_File_Name, glb_User_Name, Lock_Mode, glb_Last_DOS_Error)
  264.     
  265.     Get_Lock_Mode = Lock_Mode
  266.  
  267. End Function
  268.  
  269. '============================================================
  270. ' Routine : Get_Lock_Seconds
  271. '============================================================
  272. ' Aufgabe : Liefert die Sperrzeit fⁿr einen gesperrten Datensatz
  273. '           in Sekunden (wird ab dem Zeitpunkt der Sperrung ge-
  274. '           rechnet). Ist der Datensatz nicht gesperrt oder
  275. '           Fehler aufgetreten, so wird der Wert 0 zurⁿckgelie-
  276. '           fert.
  277. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  278. '                        (max. 40 Zeichen)
  279. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  280. ' Ausgabe : keine
  281. ' Return  : Sperrzeit in Sekunden
  282. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  283. '           tion werden die globalen Variablen glb_Lock_File_Name
  284. '           und glb_User_Name benutzt.
  285. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  286. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  287. '           abgefragt werden.
  288. '------------------------------------------------------------
  289. '
  290. Function Get_Lock_Seconds (Table_Name As String, Record_ID As Long) As Long
  291.  
  292.     Dim Lock_User As String
  293.     Dim Lock_Day As Integer
  294.     Dim Lock_Month As Integer
  295.     Dim Lock_Year As Integer
  296.     Dim Lock_Hour As Integer
  297.     Dim Lock_Min As Integer
  298.     Dim Lock_Sec As Integer
  299.     Dim Lock_Seconds As Long
  300.     Dim Lock_Timeout As Integer
  301.  
  302.     Get_Lock_Seconds = 0
  303.  
  304.     Lock_User = String$(255, 32)
  305.  
  306.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  307.  
  308.     Select Case glb_Last_Status
  309.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  310.             Get_Lock_Seconds = Lock_Seconds
  311.     End Select
  312.  
  313. End Function
  314.  
  315. '============================================================
  316. ' Routine : Get_Lock_Time
  317. '============================================================
  318. ' Aufgabe : Liefert die Sperrzeit eines Datensatzes in Form
  319. '           eines formatierten Strings zurⁿck, falls der Daten-
  320. '           satz gesperrt ist. Ist der Datensatz nicht gesperrt
  321. '           oder ein Fehler aufgetreten, so wird ein leerer
  322. '           String zurⁿckgeliefert.
  323. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  324. '                        (max. 40 Zeichen)
  325. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  326. ' Ausgabe : keine
  327. ' Return  : Sperrzeit; Format: "HH:MM:SS" bzw. leerer String
  328. ' Info    : Eine Sperrung liegt auch vor, wenn die evtl. ein-
  329. '           gestellte Zeitmarke (Lock-Timeout) fⁿr die automa-
  330. '           tische Entsperrⁿberwachung bereits ⁿberschritten
  331. '           ist. Dies jedoch kann mit Hilfe der Funktion
  332. '           Is_Record_Locked abgefragt werden.
  333. '           Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  334. '           tion werden die globalen Variablen glb_Lock_File_Name
  335. '           und glb_User_Name benutzt.
  336. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  337. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  338. '           abgefragt werden.
  339. '------------------------------------------------------------
  340. '
  341. Function Get_Lock_Time (Table_Name As String, Record_ID As Long) As String
  342.  
  343.     Dim Lock_User As String
  344.     Dim Lock_Day As Integer
  345.     Dim Lock_Month As Integer
  346.     Dim Lock_Year As Integer
  347.     Dim Lock_Hour As Integer
  348.     Dim Lock_Min As Integer
  349.     Dim Lock_Sec As Integer
  350.     Dim Lock_Seconds As Long
  351.     Dim Lock_Timeout As Integer
  352.     Dim Str_Hour As String
  353.     Dim Str_Min As String
  354.     Dim Str_Sec As String
  355.  
  356.     Get_Lock_Time = ""
  357.  
  358.     Lock_User = String$(255, 32)
  359.  
  360.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  361.  
  362.     Select Case glb_Last_Status
  363.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  364.             Str_Hour = LTrim$(RTrim$(Str$(Lock_Hour)))
  365.             If Lock_Hour < 10 Then Str_Hour = "0" & Str_Hour
  366.             Str_Min = LTrim$(RTrim$(Str$(Lock_Min)))
  367.             If Lock_Min < 10 Then Str_Min = "0" & Str_Min
  368.             Str_Sec = LTrim$(RTrim$(Str$(Lock_Sec)))
  369.             If Lock_Sec < 10 Then Str_Sec = "0" & Str_Sec
  370.             Get_Lock_Time = Str_Hour & ":" & Str_Min & ":" & Str_Sec
  371.     End Select
  372.  
  373. End Function
  374.  
  375. '============================================================
  376. ' Routine : Get_Lock_Timeout
  377. '============================================================
  378. ' Aufgabe : Liefert die fⁿr einen gesperrten Datensatz einge-
  379. '           stellte Zeitmarke fⁿr die automatische Entsperrⁿber-
  380. '           wachung zurⁿck. Der Wert 0 bedeutet keine automati-
  381. '           sche Entsperrⁿberwachung. Ist der Datensatz nicht
  382. '           gesperrt oder Fehler aufgetreten, so wird der Wert
  383. '           -1 zurⁿckgeliefert.
  384. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  385. '                        (max. 40 Zeichen)
  386. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  387. ' Ausgabe : keine
  388. ' Return  : Lock-Timeout in Sekunden
  389. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  390. '           tion werden die globalen Variablen glb_Lock_File_Name
  391. '           und glb_User_Name benutzt.
  392. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  393. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  394. '           abgefragt werden.
  395. '------------------------------------------------------------
  396. '
  397. Function Get_Lock_Timeout (Table_Name As String, Record_ID As Long) As Integer
  398.  
  399.     Dim Lock_User As String
  400.     Dim Lock_Day As Integer
  401.     Dim Lock_Month As Integer
  402.     Dim Lock_Year As Integer
  403.     Dim Lock_Hour As Integer
  404.     Dim Lock_Min As Integer
  405.     Dim Lock_Sec As Integer
  406.     Dim Lock_Seconds As Long
  407.     Dim Lock_Timeout As Integer
  408.  
  409.     Get_Lock_Timeout = -1
  410.  
  411.     Lock_User = String$(255, 32)
  412.  
  413.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  414.  
  415.     Select Case glb_Last_Status
  416.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  417.             Get_Lock_Timeout = Lock_Timeout
  418.     End Select
  419.  
  420. End Function
  421.  
  422. '============================================================
  423. ' Routine : Get_Lock_User
  424. '============================================================
  425. ' Aufgabe : Liefert den Namen des Benutzers zurⁿck, der den an-
  426. '           gegebenen Datensatz gesperrt hat. Ist der Datensatz
  427. '           nicht gesperrt oder ein Fehler aufgetreten, so wird
  428. '           ein leerer String zurⁿckgeliefert.
  429. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  430. '                        (max. 40 Zeichen)
  431. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  432. ' Ausgabe : keine
  433. ' Return  : Benutzername (String) bzw. leerer String
  434. ' Info    : Eine Sperrung liegt auch vor, wenn die evtl. ein-
  435. '           gestellte Zeitmarke (Lock-Timeout) fⁿr die automa-
  436. '           tische Entsperrⁿberwachung bereits ⁿberschritten
  437. '           ist. Dies jedoch kann mit Hilfe der Funktion
  438. '           Is_Record_Locked abgefragt werden.
  439. '           Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  440. '           tion werden die globalen Variablen glb_Lock_File_Name
  441. '           und glb_User_Name benutzt.
  442. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  443. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  444. '           abgefragt werden.
  445. '------------------------------------------------------------
  446. '
  447. Function Get_Lock_User (Table_Name As String, Record_ID As Long) As String
  448.  
  449.     Dim Lock_User As String
  450.     Dim Lock_Day As Integer
  451.     Dim Lock_Month As Integer
  452.     Dim Lock_Year As Integer
  453.     Dim Lock_Hour As Integer
  454.     Dim Lock_Min As Integer
  455.     Dim Lock_Sec As Integer
  456.     Dim Lock_Seconds As Long
  457.     Dim Lock_Timeout As Integer
  458.  
  459.     Get_Lock_User = ""
  460.  
  461.     Lock_User = String$(255, 32)
  462.  
  463.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  464.  
  465.     Lock_User = LTrim$(RTrim$(Lock_User))
  466.     If Lock_User <> "" Then
  467.         Get_Lock_User = Lock_User
  468.     End If
  469.  
  470. End Function
  471.  
  472. '============================================================
  473. ' Routine : Get_Login_Date
  474. '============================================================
  475. ' Aufgabe : Liefert das Login-Datum des akt. Benutzers in Form
  476. '           eines formatierten Strings. Ist der Benutzer nicht
  477. '           im System eingeloggt oder ist ein Fehler aufgetreten,
  478. '           so wird ein leerer String zurⁿckgeliefert.
  479. ' Eingabe : keine
  480. ' Ausgabe : keine
  481. ' Return  : Login-Datum; Format: "DD.MM.YYYY" bzw. leerer String
  482. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  483. '           tion werden die globalen Variablen glb_Lock_File_Name
  484. '           und glb_User_Name benutzt.
  485. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  486. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  487. '           abgefragt werden.
  488. '------------------------------------------------------------
  489. '
  490. Function Get_Login_Date () As String
  491.  
  492.     Dim Day_ As Integer
  493.     Dim Month_ As Integer
  494.     Dim Year_ As Integer
  495.     Dim Hour_ As Integer
  496.     Dim Min_ As Integer
  497.     Dim Sec_ As Integer
  498.     Dim Str_Day As String
  499.     Dim Str_Month As String
  500.     Dim Str_Year As String
  501.  
  502.     Get_Login_Date = ""
  503.  
  504.     glb_Last_Status = int_Login_DateTime(glb_Lock_File_Name, glb_User_Name, Day_, Month_, Year_, Hour_, Min_, Sec_, glb_Last_DOS_Error)
  505.  
  506.     If glb_Last_Status = st_No_Error Then
  507.         Str_Day = LTrim$(RTrim$(Str$(Day_)))
  508.         If Day_ < 10 Then Str_Day = "0" & Str_Day
  509.         Str_Month = LTrim$(RTrim$(Str$(Month_)))
  510.         If Month_ < 10 Then Str_Month = "0" & Str_Month
  511.         Str_Year = LTrim$(RTrim$(Str$(Year_)))
  512.         Get_Login_Date = Str_Day & "." & Str_Month & "." & Str_Year
  513.     End If
  514.  
  515. End Function
  516.  
  517. '============================================================
  518. ' Routine : Get_Login_Seconds
  519. '============================================================
  520. ' Aufgabe : Liefert die Login-Zeit des akt. Benutzers in Sekun-
  521. '           den. Ist der Benutzer nicht im System eingeloggt
  522. '           oder ist ein Fehler aufgetreten, so wird 0 zurⁿck-
  523. '           geliefert.
  524. ' Eingabe : keine
  525. ' Ausgabe : keine
  526. ' Return  : Login-Zeit in Sekunden
  527. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  528. '           tion werden die globalen Variablen glb_Lock_File_Name
  529. '           und glb_User_Name benutzt.
  530. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  531. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  532. '           abgefragt werden.
  533. '------------------------------------------------------------
  534. '
  535. Function Get_Login_Seconds () As Long
  536.  
  537.     Dim Seconds As Long
  538.  
  539.     Get_Login_Seconds = 0
  540.  
  541.     glb_Last_Status = int_Login_Seconds(glb_Lock_File_Name, glb_User_Name, Seconds, glb_Last_DOS_Error)
  542.     
  543.     If glb_Last_Status = st_No_Error Then
  544.         Get_Login_Seconds = Seconds
  545.     End If
  546.  
  547. End Function
  548.  
  549. '============================================================
  550. ' Routine : Get_Login_Time
  551. '============================================================
  552. ' Aufgabe : Liefert die Login-Zeit des akt. Benutzers in Form
  553. '           eines formatierten Strings. Ist der Benutzer nicht
  554. '           im System eingeloggt oder ist ein Fehler aufgetreten,
  555. '           so wird ein leerer String zurⁿckgeliefert.
  556. ' Eingabe : keine
  557. ' Ausgabe : keine
  558. ' Return  : Login-Zeit; Format: "HH:MM:SS" bzw. leerer String
  559. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  560. '           tion werden die globalen Variablen glb_Lock_File_Name
  561. '           und glb_User_Name benutzt.
  562. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  563. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  564. '           abgefragt werden.
  565. '------------------------------------------------------------
  566. '
  567. Function Get_Login_Time () As String
  568.  
  569.     Dim Day_ As Integer
  570.     Dim Month_ As Integer
  571.     Dim Year_ As Integer
  572.     Dim Hour_ As Integer
  573.     Dim Min_ As Integer
  574.     Dim Sec_ As Integer
  575.     Dim Str_Hour As String
  576.     Dim Str_Min As String
  577.     Dim Str_Sec As String
  578.  
  579.     Get_Login_Time = ""
  580.  
  581.     glb_Last_Status = int_Login_DateTime(glb_Lock_File_Name, glb_User_Name, Day_, Month_, Year_, Hour_, Min_, Sec_, glb_Last_DOS_Error)
  582.  
  583.     If glb_Last_Status = st_No_Error Then
  584.         Str_Hour = LTrim$(RTrim$(Str$(Hour_)))
  585.         If Hour_ < 10 Then Str_Hour = "0" & Str_Hour
  586.         Str_Min = LTrim$(RTrim$(Str$(Min_)))
  587.         If Min_ < 10 Then Str_Min = "0" & Str_Min
  588.         Str_Sec = LTrim$(RTrim$(Str$(Sec_)))
  589.         If Sec_ < 10 Then Str_Sec = "0" & Str_Sec
  590.         Get_Login_Time = Str_Hour & ":" & Str_Min & ":" & Str_Sec
  591.     End If
  592.  
  593. End Function
  594.  
  595. '============================================================
  596. ' Routine : Init_Locking
  597. '============================================================
  598. ' Aufgabe : Initialisiert das Record-Locking-System.
  599. ' Eingabe : File_Name = Name der Record-Locking-Verwaltungsdatei
  600. '           User_Name = Benutzername (max. 20 Zeichen)
  601. '           Lock_Mode = Sperrmethode: 0 = Lock-by-Select (Sper-
  602. '                                         ren bei Datensatz-Se-
  603. '                                         lektion)
  604. '                                     1 = Lock-by-Edit (Sperren
  605. '                                         bei Beginn des Editier-
  606. '                                         vorgangs eines Daten-
  607. '                                         satzes)
  608. ' Ausgabe : keine
  609. ' Info    : File_Name, User_Name und Lock_Mode werden nach Auf-
  610. '           ruf dieser Routine in entsprechenden globalen Va-
  611. '           riablen gespeichert, die dann in anderen Routinen
  612. '           benutzt werden. Auf diese Weise bleiben dem Prog-
  613. '           rammierer Eingabeparameter erspart.
  614. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  615. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  616. '           abgefragt werden.
  617. '------------------------------------------------------------
  618. '
  619. Sub Init_Locking (File_Name As String, User_Name As String, Lock_Mode As Integer)
  620.  
  621.     If Lock_Mode < lock_by_Select Then Lock_Mode = lock_by_Select
  622.     If Lock_Mode > lock_by_Edit Then Lock_Mode = lock_by_Edit
  623.  
  624.     glb_Last_Status = int_Init_Locking(File_Name, User_Name, Lock_Mode, glb_Last_DOS_Error)
  625.     
  626.     If glb_Last_Status = st_No_Error Then
  627.         glb_Lock_File_Name = File_Name
  628.         glb_User_Name = User_Name
  629.         glb_Lock_Mode = Lock_Mode
  630.     End If
  631.  
  632. End Sub
  633.  
  634. '============================================================
  635. ' Routine : Is_Data_Changed
  636. '============================================================
  637. ' Aufgabe : Liefert True zurⁿck, wenn Daten innerhalb einer Form
  638. '           geΣndert wurden (d.h. der Datensatz editiert wurde),
  639. '           sonst False.
  640. ' Eingabe : F = Form
  641. ' Ausgabe : keine
  642. ' Return  : True bzw. False
  643. '------------------------------------------------------------
  644. '
  645. Function Is_Data_Changed (F As Form) As Integer
  646.  
  647.     Dim i
  648.  
  649.     Is_Data_Changed = False
  650.  
  651.     If F.Controls.Count > 0 Then ' prⁿfen, ob Form Steuerelemente enthΣlt
  652.         For i = 0 To F.Controls.Count - 1 ' alle Steuerelemente durchlaufen
  653.             If Is_Edit_Control(F.Controls(i)) Then ' prⁿfen, ob es sich um ein Editierfeld handelt
  654.                 If F.Controls(i).DataChanged Then ' prⁿfen, ob Daten geΣndert wurden
  655.                     Is_Data_Changed = True
  656.                     Exit Function ' Funktion verlassen
  657.                 End If
  658.             End If
  659.         Next i
  660.     End If
  661.  
  662. End Function
  663.  
  664. '============================================================
  665. ' Routine : Is_Edit_Control
  666. '============================================================
  667. ' Aufgabe : Liefert True zurⁿck, wenn das angegebene Steuerelement
  668. '           ein Editierfeld ist, sonst False.
  669. ' Eingabe : C = Steuerelement
  670. ' Ausgabe : keine
  671. ' Return  : True bzw. False
  672. '------------------------------------------------------------
  673. '
  674. Function Is_Edit_Control (C As Control) As Integer
  675.  
  676.     Is_Edit_Control = False
  677.  
  678.     If TypeOf C Is TextBox Then ' Textfeld?
  679.         Is_Edit_Control = True 'ist ein Eingabefeld
  680.     ElseIf TypeOf C Is ComboBox Then ' Kombinationslistenfeld?
  681.         Is_Edit_Control = True
  682.     ElseIf TypeOf C Is CheckBox Then ' Kontrollfeld?
  683.         Is_Edit_Control = True
  684.     ElseIf TypeOf C Is OptionButton Then ' Optionsfeld?
  685.         Is_Edit_Control = True
  686.     End If
  687.  
  688. End Function
  689.  
  690. '============================================================
  691. ' Routine : Is_Record_Locked
  692. '============================================================
  693. ' Aufgabe : Liefert st_Record_Not_Locked zurⁿck, wenn der an-
  694. '           gegebene Datensatz nicht gesperrt ist. Ist der Da-
  695. '           tensatz gesperrt, so wird einer der folgenden Wer-
  696. '           te zurⁿckgeliefert:
  697. '           st_Lock_By_Same, st_Lock_By_Others,
  698. '           st_Lock_By_Same_Out, st_Lock_By_Others_Out
  699. '           Die Bedeutung der Konstanten ist im Deklarations-
  700. '           teil dieses Moduls erlΣutert.
  701. '           Tritt ein Fehler auf, so wird der entsprechende
  702. '           Fehlerstatus in der Variablen glb_Last_Status
  703. '           gespeichert. Handelt es sich sogar um einen DOS-
  704. '           Fehler, so wird dessen Code in der globalen Va-
  705. '           riablen glb_Last_DOS_Error vermerkt.
  706. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  707. '                        (max. 40 Zeichen)
  708. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  709. ' Ausgabe : keine
  710. ' Return  : Status (wie oben beschrieben)
  711. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  712. '           tion werden die globalen Variablen glb_Lock_File_Name
  713. '           und glb_User_Name benutzt.
  714. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  715. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  716. '           abgefragt werden.
  717. '------------------------------------------------------------
  718. '
  719. Function Is_Record_Locked (Table_Name As String, Record_ID As Long) As Integer
  720.  
  721.     Dim Lock_User As String
  722.     Dim Lock_Day As Integer
  723.     Dim Lock_Month As Integer
  724.     Dim Lock_Year As Integer
  725.     Dim Lock_Hour As Integer
  726.     Dim Lock_Min As Integer
  727.     Dim Lock_Sec As Integer
  728.     Dim Lock_Seconds As Long
  729.     Dim Lock_Timeout As Integer
  730.  
  731.     Is_Record_Locked = st_Record_Not_Locked
  732.  
  733.     Lock_User = String$(255, 32)
  734.  
  735.     glb_Last_Status = int_Is_Record_Locked(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Lock_User, Lock_Day, Lock_Month, Lock_Year, Lock_Hour, Lock_Min, Lock_Sec, Lock_Seconds, Lock_Timeout, glb_Last_DOS_Error)
  736.  
  737.     Select Case glb_Last_Status
  738.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  739.             Is_Record_Locked = glb_Last_Status
  740.     End Select
  741.  
  742. End Function
  743.  
  744. '============================================================
  745. ' Routine : Is_Record_Locked_Gen
  746. '============================================================
  747. ' Aufgabe : Prⁿft, ob ein Datensatz generell gesperrt ist, d.h.
  748. '           unabhΣngig davon, welcher Benutzer ihn gesperrt
  749. '           hat und ob die Zeitmarke fⁿr die evtl. eingestell-
  750. '           te Entsperrⁿberwachung bereits ⁿberschritten ist
  751. '           oder nicht. Es wird True bzw. False (Datensatz nicht
  752. '           gesperrt) zurⁿckgeliefert.
  753. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  754. '                        (max. 40 Zeichen)
  755. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  756. ' Ausgabe : keine
  757. ' Return  : True bzw. False
  758. '------------------------------------------------------------
  759. '
  760. Function Is_Record_Locked_Gen (Table_Name As String, Record_ID As Long) As Integer
  761.  
  762.     Dim Result As Integer
  763.  
  764.     Is_Record_Locked_Gen = False
  765.  
  766.     Result = Is_Record_Locked(Table_Name, Record_ID)
  767.  
  768.     Select Case Result
  769.         Case st_Lock_By_Same, st_Lock_By_Others, st_Lock_By_Same_Out, st_Lock_By_Others_Out
  770.             Is_Record_Locked_Gen = True
  771.     End Select
  772.  
  773. End Function
  774.  
  775. '============================================================
  776. ' Routine : Lock_Edit_Controls
  777. '============================================================
  778. ' Aufgabe : Sperrt alle Editierfelder innerhalb einer Form.
  779. ' Eingabe : F = Form
  780. ' Ausgabe : keine
  781. '------------------------------------------------------------
  782. '
  783. Sub Lock_Edit_Controls (F As Form)
  784.  
  785.     Dim i
  786.  
  787.     If F.Controls.Count > 0 Then ' prⁿfen, ob Form Steuerelemente enthΣlt
  788.         For i = 0 To F.Controls.Count - 1 ' alle Steuerelemente durchlaufen
  789.             If Is_Edit_Control(F.Controls(i)) Then ' prⁿfen, ob es sich um ein Editierfeld handelt
  790.                 F.Controls(i).Enabled = False ' Feld deaktivieren
  791.             End If
  792.         Next i
  793.     End If
  794.  
  795. End Sub
  796.  
  797. '============================================================
  798. ' Routine : Lock_Record
  799. '============================================================
  800. ' Aufgabe : Sperrt einen Datensatz in einer Datenbank-Tabelle
  801. '           bzw. Abfrage. Ist der zu sperrende Datensatz bereits
  802. '           gesperrt und ist fⁿr den Datensatz eine automati-
  803. '           sche Entsperrⁿberwachung eingeschaltet, so wird ge-
  804. '           prⁿft, ob die eingestellte Zeitmarke ⁿberschritten
  805. '           ist; ggf. wird in der Variablen glb_Last_Status ver-
  806. '           merkt, da▀ der Datensatz zu entsperren ist
  807. '           (st_Lock_By_Same_Out, st_Lock_By_Others_Out). Ist
  808. '           der Datensatz gesperrt und entweder keine Entsperr-
  809. '           ⁿberwachung eingestellt oder die Zeitmarke noch
  810. '           nicht ⁿberschritten, so hat die Variable glb_Last_Status
  811. '           den Wert st_Lock_By_Same bzw. st_Lock_By_Others.
  812. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  813. '                        (max. 40 Zeichen)
  814. '           Record_ID  = Datensatz_ID (mu▀ >= 0 sein)
  815. '           Timeout    = Zeitvorgabe fⁿr die automatische Ent-
  816. '                        sperrⁿberwachung (in Sekunden; 0 bedeu-
  817. '                        tet keine automatische Entsperrⁿberwa-
  818. '                        chung)
  819. ' Ausgabe : keine
  820. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  821. '           tion werden die globalen Variablen glb_Lock_File_Name
  822. '           und glb_User_Name benutzt.
  823. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  824. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  825. '           abgefragt werden.
  826. '------------------------------------------------------------
  827. '
  828. Sub Lock_Record (Table_Name As String, Record_ID As Long, Timeout As Integer)
  829.  
  830.     glb_Last_Status = int_Lock_Record(glb_Lock_File_Name, glb_User_Name, Table_Name, Record_ID, Timeout, glb_Last_DOS_Error)
  831.  
  832. End Sub
  833.  
  834. '============================================================
  835. ' Routine : Unlock_Edit_Controls
  836. '============================================================
  837. ' Aufgabe : Entsperrt alle Editierfelder innerhalb einer Form.
  838. ' Eingabe : F = Form
  839. ' Ausgabe : keine
  840. '------------------------------------------------------------
  841. '
  842. Sub Unlock_Edit_Controls (F As Form)
  843.  
  844.     Dim i
  845.  
  846.     If F.Controls.Count > 0 Then ' prⁿfen, ob Form Steuerelemente enthΣlt
  847.         For i = 0 To F.Controls.Count - 1 ' alle Steuerelemente durchlaufen
  848.             If Is_Edit_Control(F.Controls(i)) Then ' prⁿfen, ob es sich um ein Editierfeld handelt
  849.                 F.Controls(i).Enabled = True ' Feld aktivieren
  850.             End If
  851.         Next i
  852.     End If
  853.  
  854. End Sub
  855.  
  856. '============================================================
  857. ' Routine : Unlock_Record
  858. '============================================================
  859. ' Aufgabe : Entsperrt den angegebenen Datensatz unabhΣngig da-
  860. '           von, welcher Benutzer ihn gesperrt hat.
  861. ' Eingabe : Table_Name = Name der Datenbank-Tabelle bzw. Abfrage
  862. '                        (max. 40 Zeichen)
  863. '           Record_ID  = Datensatz-ID (mu▀ >= 0 sein)
  864. ' Ausgabe : keine
  865. ' Info    : Fⁿr den internen Aufruf der entsprechenden DLL-Funk-
  866. '           tion wird die globale Variable glb_Lock_File_Name
  867. '           benutzt.
  868. '           Status und evtl. DOS-Fehler k÷nnen ⁿber die globalen
  869. '           Variablen glb_Last_Status und glb_Last_DOS_Error
  870. '           abgefragt werden.
  871. '------------------------------------------------------------
  872. '
  873. Sub Unlock_Record (Table_Name As String, Record_ID As Long)
  874.  
  875.     glb_Last_Status = int_Unlock_Record(glb_Lock_File_Name, Table_Name, Record_ID, glb_Last_DOS_Error)
  876.  
  877. End Sub
  878.  
  879.