Limbajul de scripting hMET2 se folosește împreuna cu sistemul hMET în
următoarele cazuri:
| - |
Implementare de comenzi complexe în aplicații Majoritatea aplicațiile HAMOR Soft suportă rularea unor comenzi complexe și generice definite la nivelul bazelor de date. Comenzile sunt menite să execute acțiuni complexe, compuse din mai multe operații și prezintă avantajul că pot fi definite la nivelul bazei de date. Comenzile generice asigură flexibilitatea aplicațiilor, permițând rezolvarea unor situații diverse, complexe și a cerințelor specifice la nivelul clienților, fără modificarea executabilului. |
| - |
Operații de întreținere a bazelor de date: -modificare de structuri în baza de date, -recalcul valori, -prelucrarea mai multor baze de date, |
Instrucțiunile limbajului de scripting
Instrucțiunea #IF
Sintaxa:
#IF <Conditie>
...
<Instructiuni>
...
[#ELSEIF] <Conditie>
...
<Instructiuni>
...
[#ELSE]
...
<Instructiuni>
...
[#ENDIF]
Pot exista un număr oarecare de clauze #ELSEIF.
Instrucțiunile pot fi imbricate. Nivelul de adâncime al imbricărilor nu este
limitat.
Cuvintele cheie #IF, #ELSE, #ELSEIF, #ENDIF intotdeauna trebuie să fie scrise cu majuscule !
Instrucțiunea #WHILE
Sintaxa:
#WHILE <Conditie>
...
<Instructiuni>
...
[#LOOP]
...
<Instructiuni>
...
[#EXIT]
...
<Instructiuni>
...
#ENDDO
Execută comenzile din ciclu până când <Conditie> returnează true.
#LOOP - întrerupe necondiționat executarea ciclului și face saltul la
început, evaluează <Conditie> și dacă acesta returnează true, reia executarea
ciclului, altfel continuă cu instrucțiunea imediat următoare ciclului.
#EXIT - întrerupe necondiționat executarea ciclului și face saltul la
comanda imediat următoare ciclului.
Cuvintele cheie #WHILE, #LOOP, #EXIT, #ENDDO intotdeauna trebuie să fie scrise cu majuscule !
Din programul scripting sunt accesibile fișierele din baza de date pentru care a
fost lansat programul, direct prin funcțiile hLIB.
Astfel, de exemplu dacă se execută script-ul pentru o baza de date HSALAR, vom
putea apela direct:
h_UseAlias("P_",x_open).
Variabile sistem
Scripturile hMET întodeauna sunt rulate în contextul hMET.
Acest lucru înseamnă că în momentul rulării sunt accesibile variabilele
sistem existente în mediul HAMOR și cele specifice ale aplicației care
rulează scriptul.
Pentru studierea variabilelor sistem existente in aplicațiile scrise în
hMET, consultați documentația hLIB.
Variabilele accesibile în momentul rulării scripturilor pot fi specifice
și aplicațiilor care rulează scriptul:
| - | aplicațiile scrise în hMET2 sunt caracterizate de un set suplimentar de variabile sistem, | - | aplicația hMARFA nefiind un program scris în hMET2, este caracterizată de un set proprii de variabile sistem, inaccesibile din aplicații hMET2. |
| h_ApplCode | codul aplicației pentru care a fost lansat scriptul, | hMET |
| Perioada | perioada curentă | hMET2 |
| NumePerioada | numele perioadei curente | hMET2 |
| fil_xxx | indicele fișierului. Ex. fil_p_; fil_s_; Corespunde cu numărul zonei de lucru în care va fi deschisă. |
hMET |
| h_FilePath[] | vector sistem. Conține calea de acces
către fișiere. Ex.Calea de acces către fișierul p_: h_FilePathes[fil_p_] |
hMET |
| X_1,...,X_2 | Variabile predefinite cu caracter general. Pot primi orice valoare. Sunt variabile globale, astfel valorile atribuite vor exista pe durata unei sesiuni de lucru, pot transmite date de la o operație la alta, dar atenție valoarea unei astfel de variabile poate fi modificată între timp de o instrucțiune sau de un script ! |
hMET2 |
Funcții utile
Limbajul scripting hMET2UP acceptă apelarea funcțiilor definite în limbajul
CLIPPER precum și a funcțiilor cele definite în mediul HAMOR.
În acest sens parcurgeți documentațiile Clipper, bibliotec hLIB precum și
funcțiile specifice ale aplicațiilor care rulează scripturile.
Funcții speciale
Sunt funcții special dezvoltate pentru scriptul hMET2UP.
Creează o fereastră de monitorizare.
În continuare pe parcursul executării programului se pot afișa mesaje, care de
obicei reprezintă etapele parcurse de program.
PutMsg(smsg)
Afișează mesajul smsg în fereastra de monitorizare.
Fereastra de mesaje trebuie să fie deja creată.
EndMsg()
Distruge fereastra de monitorizare creată.
De exemplu considerăm următorul script:
NewMsg()
PutMsg("Faza 1")
h_Inkey(0)
PutMsg("Faza 2")
h_Inkey(0)
PutMsg("Faza 3")
h_Inkey(0)
EndMsg()
După afișarea mesajului "Faza 3" vom avea următoarea fereastră:

h_GetParam(xParam,[sTitle],[sPrompt],[eHlp],[eVal],[sPict])
Afișează o fereastră de editare și așteaptă completarea unui câmp de către
utilizator.
xParam - parametru de intrare/ieșire. La intrare: conținutul cîmpului ce
urmează să fie completat de utilizator. La ieșire: valoarea introdusă de
utilizator.
Parametrul xParam poate fi un șir de caractere, o dată calandaristică, sau o valoare
logică
Înainte de apel parametrul poate fi inițializat. Dacă nu este inițializat, adică este
fără valoare (NIL), primește valoarea implicită de SPACE(20).
Pentru ca valoarea introdusă de utilizator să fie returnată de funcție, parametrul se
transmite cu operatorul @ în față.
sTitle - titlul ferestrei de editare ce se afișează.
sPrompt - șir de caractere ce se afișează înainte de câmpul de editare ce
urmează să fie completat de utilizator.
eHlp - expresie de ajutor. Se execută când utilizatorul tastează F1.
Trebuie transmis sub formă de șir de caractere (încadrat între " sau ') !
eVal - formula de validare. Se execută automat la părăsirea câmpului.
Dacă returnează true, câmpul este acceptat; dacă returnează false, câmpul nu
este acceptat.
În cadrul expresiei de validare prin variabila sistem xParam avem acces
la conținutul câmpului conpletat de utilizator.
Parametrul eVal trebuie transmis sub formă de șir de caractere (încadrat
între " sau ') !
Exemplu:
dData := DATE()
#IF ! h_GetParam(@dData,;
"Data de referinta",;
"Data [zz/ll/aa]",;
"h_Calendar()",;
"h_ValDate(xParam)",;
"99/99/99")
Abandon("C")
#ENDIF

| -R - | terminarea normală a scriptului și este valoarea implicită a
parametrului. Se consideră, că procedura implementată de script s-a terminat cu succes. | -A - | abandonarea scriptului. Procedura nu s-a putut executa corect. De exemplu nu s-a reușit deschiderea unei fișier și nu se poate continua algoritmul. |
-C - | abandonat prin Cancel (intrerupt de utilizator). Se afișează automat un mesajul: "Executie intrerupta" |
lEndMsg- Abandon fara acest parametru pus pe .F. face EndMsg
NIL - executa EndMsg, inchide fereastra doar daca exista
.T. - executa EndMsg, inchide fereastra doar daca exista
.F. - nu executa EndMsg
Exemplu: Aceasta este un apel tipic
NewMsg()
#IF h_FileEx
Abandon() - executa si EndMsg
#ENDIF
In cazul Q_ANAF si Q_ANAFC, se executa Abandon, dar nu trebuie inchisa fereastar Msg
se va apela in acestea Abandon(,,.F.)
Functional de la hMARFA V8.E0.4, hMARFT V4.E0.4
Secvențe de program utile
Prezentăm câteva secvențe de program utile, frecvent utilizate
în scripturile din comenzile generale.
x_open := {}
...
#IF ! h_UseAlias({"p_","s_"},x_open)
// daca deschiderea fisierului "s_" esueaza, atunci inchide "p_"
h_CloseAlias(,x_open)
// alte operatii necesare pt. terminarea scriptului
...
Abandon("C")
#ENDIF
// operatii de prelucrare
...
// inchide ambele fisiere deschise
h_CloseAlias(,x_open) |
| - | Pentru deschiderea fișierelor numai în regim de scriere, se va folosi h_UseAlias({"p_","s_"},x_open,"R") |
h_NetUse(sFile,sUse,NIL,sName,sAlias)
| - | sFile - numele fișierului extern | ||
| - |
| ||
| - | NIL - nu se completează - se va utiliza valoarea prestabilită | ||
| - | sName - numele utilizator al fișierului extern | ||
| - | sAlias - aliasul fișierului |
h_NewSelect()
// selecteaza o zona de lucru libera.
fil_man := SELECT()
// nr.zona de lucru nou selectat memorat in fil_man
#IF ! h_NetUse (FDName,,,"Fisier extern", "man")
// eroare deschidere fisier extern
// ... operatii necesare pentru inchidere, revenire
Abandon("C")
#ENDIF
... prelucrari
// inchidere fișier extern
DBSELECTAREA(fil_man)
#IF USED()
DBCLOSEAREA()
#ENDIF
|
Salt la sfârșitul fișierului
DBGOBOTTOM() - face saltul la ultimul articol conform indexului primar din fișierul de date.
Numărul articolului curent
Numărul articolului curent este returnat de RECNO()
DBGOTOP()
#WHILE ! EOF()
// ... operatii de prelucrare
DBSKIP()
#ENDDO
2.Rapid prin DBEVAL():
DBEVAL(bBlock, bForCondition, bWileCondition)Parcurge un fișier de date și execută acțiunea bBlock pentru fiecare articol care satisface condiția bForCondition și până când condiția bWhileCondition este îndeplinită.
Exemplu: Numărarea articolelor din grupa "MR". Presupunem că fișierul conține un câmp GR de tip caracter cu lungimea de 5 caractere, în care au fost înscrise grupele pentru articole. Aliasul pentru fișier este lotm.
ii := 1
DBEVAL({|| ii:=ii+1}, {|| lotm->GR = "MR "})
DBEVAL() este mult mai eficient în cea ce privește timpul de răspuns.
Acest lucru se explică prin faptul că interpretarea se face doar o dată la început,
față de algoritmul implementat prin instrucțiuni, unde înainte de executarea fiecărei instrucții
este necesară interpretarea acestuie.
Chiar și instrucțiunile Clipper de prelucrarea fișierelor sunt implementate prin DBEVAL().
DBEVAL() permite prelucrarea globală a fișierelor: actualizarea globală și condiționată ale
câmpurilor, ștergerea din articolele fișierelor.
| -sKey - | cheia căutată - se transmite doar dacă se implementează o căutare după index. La căutarea secvențială acest parametru nu se transmite. |
| -bVerif - | bloc de cod. La căutarea secvențială implementează condiția de căutare. La căutarea după index, validează dacă articolul găsit întradevă satisface condiția de căutare. | -nindex - | Numarul de ordine al indexului după care se face căutarea. Daca =0, implementează căutarea secvențială. |
DBCREATE(FDName,{{"NUME", "C", 20, 0}, ;
{"PRENUME", "C", 20, 0}, ;
{"DNAST", "D", 8, 0}, ;
{"VBRUT", "N", 12, 0}}) |
FName := h_FilePathes[fil_tmp]+"MAN.TXT"
// numele fisierului de text
sline := ""
// buffer pt. liniile citite
#IF ! h_OpenInp(FName)
// eroare deschidere fisier text
// ... operatii necesare pentru inchidere, revenire
Abandon("C")
#ENDIF
#WHILE h_GetLine(@sline)
// ... prelucrare linie citita
#ENDDO
// inchidere fisier text
h_CloseInp() |
// numele fisierului de text
FName := h_FilePathes[fil_tmp]+"MAN.TXT"
#IF ! h_OpenOut(FName)
// eroare creare
// ... operatii necesare pentru revenire
Abandon("C")
#ENDIF
h_PutLine("Linia 1")
h_PutLine("Linia 2")
h_PutLine("Linia 3")
h_CloseOut() | |
| h_ViewFile(FName,sTitle,pgwidth,pglen,mode) |
| - | FName - numele fișierului de vizualizat |
| - | sTitle - titlul ferestrei de vizualizare |
| - | pgwidth - lățimea paginii |
| - | pglen - lungimea paginii |
| - | mode - P - permite lansarea tipăririi din fereastra de vizualizare prin tasta <F10> |
i := sal_findex("E6")
#IF i>0
x_setfis(i)
op_sal("O","01",.T.)
#ENDIF
i := sal_findex("E7")
#IF i>0
x_setfis(i)
op_sal("O","02",.T.)
#ENDIF
... |
aMes := {}
AADD (aMes, "")
AADD (aMes, "Recalcularea datelor a fost executata cu succes.")
AADD (aMes, "Pentru siguranta va rugam reindexati baza de date")
AADD (aMes, "cu ajutorul utilitarului hUTIL")
AADD (aMes, "")
aMesHlp := h_NewMessage("",,,,,"Sfirsit prelucrare","HELP", aMes)
h_PopUpWindow (aMesHlp) |
Prin rularea exemplului de mai sus, se va afișa fereastra:

Tipul ferestrei va fi determinat de
primul parametrul, iar paleta de culori cu care se va afișa fereastra de parametrul 7.
Astfel se folosesc următoarele combinații: ajutor: "H", "HELP", avertizare: "W", "WARNING",
eroare: "E", "ERROR", informații: "", NIL (necompletat).
Crearea unei ferestre de decizie
Mai jos prezentăm modul în care se creează o fereastră de decizie pentru alegerea uneia dintre operațiile Op1, Op2 sau abandonarea prelucrării.
aMes := ARRAY(2) |
