Files
comun/utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

414 lines
19 KiB
Plaintext

* test_s5_benzi2_ui.prg
* UI VIZIBIL: capturi + geometrie pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) dupa
* restructurarea S7 - cele 30 de controale de sub grila mutate in ct_document / ct_contabilitate /
* ct_livrare / ct_incasare, iar comutarea mutata pe casetele chk_alte_date / chk_incasare.
* Masoara cele patru combinatii de casete: 0/0, 1/0, 0/1, 1/1.
*
* Enumerarea e RECURSIVA (vezi DumpSiAnalizeaza): o parcurgere plata a lui Thisform.Objects nu mai
* vede controalele mutate in containere si ar raporta tacut "lipsa".
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s5_benzi2_ui.ps1 (timeout >= 300s)
* Log: facturare_unificat\test_s5_benzi2_ui_log.txt ; capturi in screenshots_benzi2_S7_28_08\ ;
* geometrie in out\geom_benzi2_S7_28_08_<eticheta>.tsv (baseline nou, sect. 10.3 - nu atinge
* familia geom_benzi2_27_08_* / geom_grila_benzi2_27_08_*, criteriu inca valabil)
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcUILog, gcSyncDir, gnFail, gnPass
gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_benzi2_ui_log.txt"
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_benzi2_S7_28_08\"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
gnFail = 0
gnPass = 0
PUBLIC gcRaport
gcRaport = ""
* arii pentru dump-ul recursiv; gnTrunc semnaleaza depasirea plafonului (altfel truncherea e tacuta)
PUBLIC gnN, gnTrunc, gnHGrila00, gnHGrila11
PUBLIC ARRAY gaN[600], gaC[600], gaL[600], gaT[600], gaW[600], gaH[600], gaV[600], gaAL[600], gaAT[600], gaSk[600]
gnN = 0
gnTrunc = 0
gnHGrila00 = 0
gnHGrila11 = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ""
gnMockUltimTip = 0
DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna)
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
gnScadereStoc = 0
* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc)
* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
IF USED('crscursuri')
USE IN crscursuri
ENDIF
CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6))
DO creeaza_facturacrs WITH 'crsfactura'
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel -
* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist"
IF !USED('saft_tip_facturi')
update_saft_tip_facturi()
ENDIF
PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile
lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_raport.txt"
* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.nIdTipDoc = 5
poDate.totalctva = 1000
DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poGeneratorNumere.ResetNumere()
DO ProbaSerii WITH poDate.nIdTipDoc
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
* ObjExists e recursiv: opt_incasat traieste acum in ct_incasare, nu la nivel de formular
DO Assert WITH ObjExists(loForm, 'ct_incasare'), "ct_incasare prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)"
DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (in ct_incasare)"
DO Assert WITH ObjExists(loForm, 'Ct_clb_agent'), "Ct_clb_agent prezent (in ct_livrare) - dovada ca enumerarea coboara in containere"
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DOEVENTS FORCE
* pas0: stare initiala dupa Createobject - ambele casete nebifate (Value=0 design-time).
* Nu se comuta nimic aici: pasul masoara exact starea de dupa construire + maximizare.
DO AfLog WITH "PAS0 stare initiala: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 0, 0, "PAS0 ambele inchise"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_stare_initiala.tsv"
DO DumpSiAnalizeaza WITH loForm, "ambele inchise (0/0)", lcTsv
DO HarnessStep WITH 0, 'stare_initiala', 6
* pas1: doar "Alte date" - caseta se seteaza INAINTE de comutare (metoda citeste caseta, nu invers)
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS1 doar alte date: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 1, 0, "PAS1 doar alte date"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_alte_date.tsv"
DO DumpSiAnalizeaza WITH loForm, "doar alte date (1/0)", lcTsv
DO HarnessStep WITH 1, 'alte_date_deschis', 6
* pas2: doar "Incasare" - alte date se inchide la loc, incasarea se deschide.
* Bifarea aloca o incasare reala (chitanta) in MARIUSM_AUTO - vezi curatenia de la final.
loForm.chk_alte_date.Value = 0
loForm.do_comuta_alte_date()
loForm.chk_incasare.Value = 1
loForm.do_comuta_incasare()
DOEVENTS FORCE
DO AfLog WITH "PAS2 doar incasare: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) + " nmod=" + TRANSFORM(loForm.nmod_incasare())
DO VerificaStare WITH loForm, 0, 1, "PAS2 doar incasare"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_incasare.tsv"
DO DumpSiAnalizeaza WITH loForm, "doar incasare (0/1)", lcTsv
DO HarnessStep WITH 2, 'incasare_deschis', 6
* pas3: ambele deschise
loForm.chk_alte_date.Value = 1
loForm.do_comuta_alte_date()
DOEVENTS FORCE
DO AfLog WITH "PAS3 ambele deschise: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value)
DO VerificaStare WITH loForm, 1, 1, "PAS3 ambele deschise"
lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_ambele.tsv"
DO DumpSiAnalizeaza WITH loForm, "ambele deschise (1/1)", lcTsv
DO HarnessStep WITH 3, 'ambele_deschise', 6
* grila e maxima cu ambele casete inchise si minima cu ambele deschise
DO Assert WITH gnHGrila00 > gnHGrila11, "grd_factura.Height: maxim la 0/0 (" + TRANSFORM(gnHGrila00) + ") > minim la 1/1 (" + TRANSFORM(gnHGrila11) + ")"
DO Assert WITH gnTrunc = 0, "dump recursiv fara truncare (plafon 600 obiecte)"
STRTOFILE(gcRaport, lcRaportFile)
DO AfLog WITH "Raport geometrie scris in " + lcRaportFile
* Curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala (sect. 8.3 punctul 2).
* Debifarea ruleaza ramura "fara incasare" din actualizeaza_tipincasare, care dezaloca 16/3/26.
loForm.chk_incasare.Value = 0
loForm.do_comuta_incasare()
DO AfLog WITH "curatenie: chk_incasare=0, nmod=" + TRANSFORM(loForm.nmod_incasare()) + " poDate.incasat=" + TRANSFORM(poDate.incasat)
DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)"
DO Assert WITH poDate.incasat = 0, "dupa curatenie: poDate.incasat=0 (numarul de chitanta dezalocat)"
loForm.Release()
RELEASE loForm
DO Final
*----------------------------------------------------------------------------------------
PROCEDURE VerificaStare
* Asertiile sect. 10.4 pentru o combinatie de casete. Inaltimile/offseturile sunt constantele
* design-time ale containerelor (ct_incasare 96, ct_document->ct_livrare 268, decalaje 96/176),
* nu valori citite din oasezareoffset - altfel testul s-ar verifica pe sine.
LPARAMETERS toForm, tnAlte, tnInc, tcEticheta
LOCAL llAlte, llInc, lnHLinie, lnHInc, lnHAlte, lnGap, lnLinieTop, lnAlteTop
llAlte = (tnAlte = 1)
llInc = (tnInc = 1)
DO Assert WITH toForm.chk_alte_date.Value = tnAlte, tcEticheta + ": chk_alte_date.Value=" + TRANSFORM(tnAlte)
DO Assert WITH toForm.chk_incasare.Value = tnInc, tcEticheta + ": chk_incasare.Value=" + TRANSFORM(tnInc)
DO Assert WITH toForm.lalte_date_deschis = llAlte, tcEticheta + ": lalte_date_deschis sincronizat cu caseta"
DO Assert WITH toForm.lincasare_deschis = llInc, tcEticheta + ": lincasare_deschis sincronizat cu caseta"
DO Assert WITH toForm.ct_contabilitate.Visible = llAlte, tcEticheta + ": ct_contabilitate.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_livrare.Visible = llAlte, tcEticheta + ": ct_livrare.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_document.Objects.Count > 2, tcEticheta + ": ct_document are continut util (Objects.Count=" + TRANSFORM(toForm.ct_document.Objects.Count) + ")"
DO Assert WITH toForm.ct_document.Visible = llAlte, tcEticheta + ": ct_document.Visible=" + TRANSFORM(llAlte)
DO Assert WITH toForm.ct_incasare.Visible = llInc, tcEticheta + ": ct_incasare.Visible=" + TRANSFORM(llInc)
lnHLinie = toForm.chk_alte_date.Height
lnHInc = IIF(llInc, 96, 0)
lnHAlte = IIF(llAlte, 268, 0)
lnGap = IIF(lnHInc > 0 AND lnHAlte > 0, 8, 0)
lnLinieTop = toForm.Height - 66 - (lnHLinie + lnHInc + lnGap + lnHAlte) - 4
DO Assert WITH toForm.chk_incasare.Top = lnLinieTop, tcEticheta + ": linia de casete la Top=" + TRANSFORM(lnLinieTop)
DO Assert WITH toForm.chk_alte_date.Top = lnLinieTop, tcEticheta + ": chk_alte_date pe aceeasi linie"
DO Assert WITH toForm.grd_factura.Height = MAX(60, lnLinieTop - 4 - toForm.grd_factura.Top), tcEticheta + ": grd_factura.Height pana la 4px sub linia de casete"
IF llInc
DO Assert WITH toForm.ct_incasare.Top = lnLinieTop + lnHLinie, tcEticheta + ": ct_incasare imediat sub linia de casete"
DO Assert WITH toForm.ct_incasare.Height = 96, tcEticheta + ": ct_incasare.Height=96"
DO Assert WITH toForm.nmod_incasare() = 2, tcEticheta + ": nmod_incasare()=2 (chitanta, opt_incasat.Value=1)"
ELSE
DO Assert WITH toForm.nmod_incasare() = 1, tcEticheta + ": nmod_incasare()=1 (fara incasare)"
ENDIF
IF llAlte
lnAlteTop = lnLinieTop + lnHLinie + lnHInc + lnGap
DO Assert WITH toForm.ct_document.Top = lnAlteTop, tcEticheta + ": ct_document la lnAlteTop=" + TRANSFORM(lnAlteTop)
DO Assert WITH toForm.ct_contabilitate.Top - toForm.ct_document.Top = 96, tcEticheta + ": ct_contabilitate decalat 96 fata de ct_document"
DO Assert WITH toForm.ct_livrare.Top - toForm.ct_document.Top = 176, tcEticheta + ": ct_livrare decalat 176 fata de ct_document"
ENDIF
IF llInc AND llAlte
DO Assert WITH toForm.ct_document.Top - (toForm.ct_incasare.Top + toForm.ct_incasare.Height) = 8, tcEticheta + ": gap de 8px intre ct_incasare si ct_document"
ENDIF
IF !llAlte AND !llInc
gnHGrila00 = toForm.grd_factura.Height
ENDIF
IF llAlte AND llInc
gnHGrila11 = toForm.grd_factura.Height
ENDIF
ENDPROC
PROCEDURE DumpSiAnalizeaza
* Enumerare RECURSIVA prin .Objects (ColectGrila): dupa S7 cele 30 de controale de sub grila
* stau in ct_document / ct_contabilitate / ct_livrare / ct_incasare, iar o parcurgere plata a
* lui Thisform.Objects nu le mai vede deloc. Scrie .tsv cu Name ca traseu punctat de la
* formular, geometria proprie, vizibilitatea EFECTIVA (proprie AND a parintilor) si
* AbsLeft/AbsTop acumulate pe coborare. Analiza (suprapuneri 2D, iesire din forma, perechi
* lipite <4px) lucreaza pe coordonate ABSOLUTE, doar intre controale efectiv vizibile.
* Perechile parinte-copil se sar (copilul e prin definitie in parinte), la fel shape-urile
* decorative de grup, care acopera tot containerul lor.
LPARAMETERS toForm, tcEticheta, tcTsvPath
LOCAL i, j, lcOut
gnN = 0
lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10)
lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.)
STRTOFILE(lcOut, tcTsvPath)
DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(gnN) + " controale cu geometrie (recursiv, " + TRANSFORM(toForm.Objects.Count) + " la nivel de formular) -> " + tcTsvPath
IF gnTrunc > 0
DO AfLog WITH "ATENTIE: dump truncat, " + TRANSFORM(gnTrunc) + " obiecte peste plafonul de 600"
ENDIF
LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap
LOCAL lcSectiune
lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ", " + TRANSFORM(gnN) + " obiecte) ===" + CHR(13) + CHR(10)
FOR i = 1 TO gnN
IF !gaV[i] OR gaSk[i]
LOOP
ENDIF
lnAL = gaAL[i]
lnAT = gaAT[i]
lnAR = gaAL[i] + gaW[i]
lnAB = gaAT[i] + gaH[i]
IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height
lcSectiune = lcSectiune + "IESIT: " + gaN[i] + " (" + gaC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10)
ENDIF
FOR j = i + 1 TO gnN
IF !gaV[j] OR gaSk[j]
LOOP
ENDIF
IF LEFT(gaN[j], LEN(gaN[i]) + 1) == gaN[i] + "." OR LEFT(gaN[i], LEN(gaN[j]) + 1) == gaN[j] + "."
LOOP
ENDIF
lnBL = gaAL[j]
lnBT = gaAT[j]
lnBR = gaAL[j] + gaW[j]
lnBB = gaAT[j] + gaH[j]
lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL)
lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT)
IF lnOvX > 0 AND lnOvY > 0
lcSectiune = lcSectiune + "SUPRAPUNERE: " + gaN[i] + " (" + gaC[i] + ") x " + gaN[j] + " (" + gaC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10)
ELSE
IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4
lnGap = -lnOvX
lcSectiune = lcSectiune + "LIPIT-ORIZ: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4
lnGap = -lnOvY
lcSectiune = lcSectiune + "LIPIT-VERT: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10)
ENDIF
ENDIF
ENDFOR
ENDFOR
gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10)
ENDPROC
FUNCTION ColectGrila
* Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru
* are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects).
* Umple ariile ga* pentru analiza si intoarce randurile TSV. gaSk marcheaza obiectele scoase
* din analiza de suprapuneri: shape-urile, care sunt chenare decorative peste continutul lor.
LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff
LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut
IF tnDepth > 15
RETURN ""
ENDIF
lcOut = ""
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N'
lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name)
lnAbsL = tnParentAbsLeft + loO.Left
lnAbsT = tnParentAbsTop + loO.Top
lcCaption = ""
IF TYPE('loO.Caption') = 'C'
lcCaption = loO.Caption
ELSE
IF TYPE('loO.Value') = 'C'
lcCaption = loO.Value
ENDIF
ENDIF
lcCaption = STRTRAN(lcCaption, CHR(9), " ")
lcCaption = LEFT(lcCaption, 40)
llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff
lcVisTxt = TRANSFORM(llVisEff)
IF gnN < 600
gnN = gnN + 1
gaN[gnN] = lcName
gaC[gnN] = loO.Class
gaL[gnN] = loO.Left
gaT[gnN] = loO.Top
gaW[gnN] = loO.Width
gaH[gnN] = loO.Height
gaV[gnN] = llVisEff
gaAL[gnN] = lnAbsL
gaAT[gnN] = lnAbsT
gaSk[gnN] = (UPPER(loO.BaseClass) == "SHAPE")
ELSE
gnTrunc = gnTrunc + 1
ENDIF
lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10)
IF TYPE('loO.Objects.Count') = 'N'
lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff)
ENDIF
ENDIF
ENDFOR
RETURN lcOut
ENDFUNC
PROCEDURE ProbaSerii
* apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor
* ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului
LPARAMETERS tnIdTipDoc
LOCAL lnOk, laErr[1], i, lcSql
PRIVATE pnIdTipDoc, pnRezultat
pnIdTipDoc = tnIdTipDoc
pnRezultat = 0
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
FOR i = 1 TO 3
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii")
IF lnOk > 0
DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii"))
USE IN (SELECT("crsprobaserii"))
EXIT
ELSE
AERROR(laErr)
DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5])
ENDIF
ENDFOR
ENDPROC
FUNCTION ObjExists
* Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in
* containerele lor - o cautare plata ar raporta tacut "lipseste".
LPARAMETERS toContainer, tcName
LOCAL i, loO
FOR i = 1 TO toContainer.Objects.Count
loO = toContainer.Objects(i)
IF UPPER(loO.Name) == UPPER(tcName)
RETURN .T.
ENDIF
IF TYPE('loO.Objects.Count') = 'N'
IF ObjExists(loO, tcName)
RETURN .T.
ENDIF
ENDIF
ENDFOR
RETURN .F.
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC