V príklade sa predpokladá existencia objektu SD.StrojVyrabal a je definované DSN na databázu Database potrebnej štruktúry. Ďalej musí byť spustený proces D2000 DBManager s menom SELF.DBM.
Štruktúra databázy:
Tabuľky:
Meno tabuľky |
Štruktúra tabuľky |
|||||||||
| Stroje |
|
|||||||||
| Vyrobky |
|
|||||||||
| StrojVyrabal |
|
V tabuľke Stroje je evidencia strojov, pričom stroj je reprezentovaný jednoznačným identifikátorom Stroj.ID a ľubovolným menom Stroj.Meno. V tabuľke Vyrobky je evidencia druhov výrobkov, pričom výrobok je reprezentovaný jednoznačným identifikátorom Vyrobok.ID a ľubovolným menom Vyrobok.Meno. V tabuľke StrojVyrabal je evidencia o tom, že stroj StrojVyrabal.ID_STROJ vyrábal výrobok StrojVyrabal.ID_VYROBOK.
Príklad najprv naplní tabuľky Stroj a Vyrobok. Potom náhodne generuje záznamy o vyrábaní výrobkov na strojoch.
Následne zisťuje 3-mi rôznymi spôsobmi, aké výrobky a množstvá sa vyrobili na stroji 1.
INT _handle ; handle na databázu
INT _retCode ; návratový kód
; Procedúra vykoná SQL príkaz. Neúspech zaznamená do Monitorovacej databázy
PROCEDURE ExecSql(IN TEXT _sql)
TEXT _errorMsg
SQL_EXEC_DIRECT _handle, _retCode, _sql
IF _retCode # _ERR_NO_ERROR THEN
_errorMsg := &"Error SQL_EXEC_DIRECT "; + _sql
LOG _errorMsg PRIORITY _LOG_PRTY_ERROR
ENDIF
END ExecSql
; Vloží do tabuľky definíciu stroja
PROCEDURE Vloz_Stroj(IN INT _id, IN TEXT _meno)
TEXT _sql
_sql := "INSERT INTO Stroje VALUES (" + %IToStr(_id) + ", '" + _meno + "')"
CALL ExecSql(_sql)
END Vloz_Stroj
; Vloží do tabuľky definíciu výrobku
PROCEDURE Vloz_Vyrobok(IN INT _id, IN TEXT _meno)
TEXT _sql
_sql := "INSERT INTO Vyrobky VALUES (" + %IToStr(_id) + ", '" + _meno + "')"
CALL ExecSql(_sql)
END Vloz_Vyrobok
; Naplním tabuľku Strojov
PROCEDURE Napln_Stroje
INT _id
TEXT _meno
TEXT _sql
_sql := "DELETE FROM STROJE"
CALL ExecSql(_sql)
_id := 1
_meno := "Stroj 1"
CALL Vloz_Stroj(_id, _meno)
_id := 2
_meno := "Stroj 2"
CALL Vloz_Stroj(_id, _meno)
_id := 3
_meno := "Stroj 3"
CALL Vloz_Stroj(_id, _meno)
_id := 4
_meno := "Stroj 4"
CALL Vloz_Stroj(_id, _meno)
_id := 5
_meno := "Stroj 5"
CALL Vloz_Stroj(_id, _meno)
END Napln_Stroje
; Naplním tabuľku Výrobkov
PROCEDURE Napln_Vyrobky
INT _id
TEXT _meno
TEXT _sql
_sql := "DELETE FROM VYROBKY"
CALL ExecSql(_sql)
_id := 1
_meno := "Vyrobok 1"
CALL Vloz_Vyrobok(_id, _meno)
_id := 2
_meno := "Vyrobok 2"
CALL Vloz_Vyrobok(_id, _meno)
_id := 3
_meno := "Vyrobok 3"
CALL Vloz_Vyrobok(_id, _meno)
_id := 4
_meno := "Vyrobok 4"
CALL Vloz_Vyrobok(_id, _meno)
_id := 5
_meno := "Vyrobok 5"
CALL Vloz_Vyrobok(_id, _meno)
END Napln_Vyrobky
; Vloží do tabuľky záznam o tom, že stroj vyrábal výrobok
PROCEDURE StrojVyrabal(IN INT _idStroj, IN INT _idVyrobok)
TEXT _sql
_sql := "INSERT INTO StrojVyrabal VALUES (" + %IToStr(_idStroj) + ", " + %IToStr(_idVyrobok) + ")"
CALL ExecSql(_sql)
END StrojVyrabal
; Procedúra generuje náhodné záznamy o tom,
; že stroj vyrábal výrobok
PROCEDURE Napln_StrojVyrabal
INT _idStroj
INT _idVyrobok
INT _idx
TEXT _sql
_sql := "DELETE FROM StrojVyrabal"
CALL ExecSql(_sql)
_idx := 1
DO_LOOP
EXIT_LOOP _idx = 100
_idStroj := %Rnd() * 4.0 + 1.0
_idVyrobok := %Rnd() * 4.0 + 1.0
CALL StrojVyrabal(_idStroj, _idVyrobok)
_idx := _idx + 1
END_LOOP
END Napln_StrojVyrabal
; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1"
; prostredníctvom SQL_PREPARE - verzia 1 alebo 4
PROCEDURE Stroj_1_LocVarList
BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN?
TEXT _sql
TEXT _errorMsg
TEXT _vyrobok
INT _pocet
IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 4)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrobok, _pocet
SQL_BINDIN _handle, _retCode, "Stroj 1" ; nastav hodnotu vstupneho parametra
ELSE ; alternativa bez SQL_BINDIN (verzia 1)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BIND _vyrobok, _pocet
ENDIF
IF _retCode # _ERR_NO_ERROR THEN
_errorMsg := "Error SQL_PREPARE " + _sql
LOG _errorMsg PRIORITY _LOG_PRTY_ERROR
RETURN
ENDIF
DO_LOOP
SQL_FETCH _handle, _retCode ; načítanie 1 riadku výsledku SQL príkazu SELECT do premenných _vyrobok a _pocet
EXIT_LOOP _retCode # _ERR_NO_ERROR
END_LOOP
END Stroj_1_LocVarList
; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1"
; prostredníctvom SQL_PREPARE - verzia 2 alebo 5
PROCEDURE Stroj_1_LocRowIdent
BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN?
TEXT _par = "Stroj 1" ; hodnota parametra
TEXT _sql
TEXT _errorMsg
RECORD NOALIAS (SD.StrojVyrabal) _vyrabal
IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 5)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrabal[1]
SQL_BINDIN _handle, _retCode, _par ; nastav hodnotu vstupneho parametra
ELSE ; alternativa bez SQL_BINDIN (verzia 2)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BIND _vyrabal[1]
ENDIF
IF _retCode # _ERR_NO_ERROR THEN
_errorMsg := "Error SQL_PREPARE " + _sql
LOG _errorMsg PRIORITY _LOG_PRTY_ERROR
RETURN
ENDIF
DO_LOOP
SQL_FETCH _handle, _retCode ; načítanie 1 riadku výsledku SQL príkazu SELECT do riadku č.1 premennej _vyrabal
EXIT_LOOP _retCode # _ERR_NO_ERROR
END_LOOP
END Stroj_1_LocRowIdent
; Zoznam výrobkov a ich počet pre stroj s menom "Stroj 1"
; prostredníctvom SQL_PREPARE - verzia 3 a 6
PROCEDURE Stroj_1_LocRecIdent
BOOL _useBinding = @TRUE ; pouzit SQL_BINDIN?
TEXT _par = "Stroj 1" ; hodnota parametra
TEXT _sql
TEXT _errorMsg
INT _maxRows
RECORD NOALIAS (SD.StrojVyrabal) _vyrabal
IF _useBinding THEN ; alternativa s SQL_BINDIN (verzia 6)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = #PAR# "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BINDOUT _vyrabal
SQL_BINDIN _handle, _retCode, _par ; nastav hodnotu vstupneho parametra
ELSE ; alternativa bez SQL_BINDIN (verzia 3)
_sql := "SELECT Vyrobky.Meno, Count(*) FROM Vyrobky, Stroje, StrojVyrabal WHERE Stroje.Meno = 'Stroj 1' "
_sql := _sql + "AND Stroje.ID=StrojVyrabal.ID_STROJ AND Vyrobky.ID=StrojVyrabal.ID_VYROBOK GROUP BY Vyrobky.Meno"
SQL_PREPARE _handle, _retCode, _sql BIND _vyrabal
ENDIF
IF _retCode # _ERR_NO_ERROR THEN
_errorMsg := "Error SQL_PREPARE " + _sql
LOG _errorMsg PRIORITY _LOG_PRTY_ERROR
RETURN
ENDIF
_maxRows := 10
DO_LOOP
SQL_FETCH _handle, _retCode, _maxRows ; načítanie maximálne 10 riadkov výsledku SQL príkazu SELECT do premennej _vyrabal
EXIT_LOOP _retCode # _ERR_NO_ERROR
END_LOOP
END Stroj_1_LocRecIdent
BEGIN
; Napojím sa na databázu
SQL_CONNECT "UID=dba;PWD=sql;DSN=Database", _handle, _retCode ON SELF.DBM
IF _retCode # _ERR_NO_ERROR THEN
LOG "Chyba pri konektovaní databázy" PRIORITY _LOG_PRTY_ERROR
END
ENDIF
; Naplním Tabuľku Stroje
CALL Napln_Stroje
; Naplním Tabuľku Vyrobky
CALL Napln_Vyrobky
; Naplním Tabuľku StrojVyrabal
CALL Napln_StrojVyrabal
; Zistím, aké výrobky vyrábal "Stroj 1"
CALL Stroj_1_LocVarList
; Zistím, aké výrobky vyrábal "Stroj 1"
CALL Stroj_1_LocRowIdent
; Zistím, aké výrobky vyrábal "Stroj 1"
CALL Stroj_1_LocRecIdent
END
Poznámka
Pri ukončení skriptu akciou END (alebo iným ľubovoľným spôsobom), sú automaticky zatvorené všetky spojenia s databázou.
Súvisiace stránky:
0 komentárov