* test_repro_lipsuri_ui.prg * Repro pe formularul real frm_import_efactura: coloana "De completat" nu se umple la cautare (D1), * nu se actualizeaza dupa alegerea gestiunii pe linie (D2), completarea manuala e suprascrisa de o * cautare ulterioara (M1), lista e goala la deschidere pana la prima cautare (M2), avertismentul * de partener inactiv nu mai blocheaza definitiv un rand cu lipsuri completate ulterior (T1), si * filtrul local "De completat" + contorul lui nu se lasa pacalite de propriul filtru (T2). * Ruleaza pe fixtura ZZTEST semanata de seed_test_import_efactura.prg (MARIUSM_AUTO@ROA_CENTRAL, 09/2026). * * Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui.prg" * Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui_log.txt SET SAFETY OFF SET TALK OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET NULLDISPLAY TO '' CLOSE DATABASES PUBLIC gcUILog, gnPass, gnFail gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui_log.txt" gnPass = 0 gnFail = 0 STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT PRIVATE poFacturi, poFacturiDetalii poFacturi = NULL poFacturiDetalii = NULL TRY DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9 IF gnHandle <= 0 DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')' QUIT ENDIF SET PROCEDURE TO import_efactura.prg ADDITIVE SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle) DO BuildCursoare DO PrLogLocal WITH 'crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) + ' dupa BuildCursoare, TYPE(poFacturi)=' + TYPE('poFacturi') IF RECCOUNT('crsFacturi') = 0 DO PrLogLocal WITH 'FAIL: nicio factura ZZTEST gasita - a rulat seed_test_import_efactura.prg?' DO PrFinal QUIT ENDIF DO BuildCursoareHelper DO PrLogLocal WITH 'cursoare helper construite, TYPE(poFacturi)=' + TYPE('poFacturi') + ' cGestiuni reccount=' + TRANSFORM(RECCOUNT('cGestiuni')) + ' cGestiuni2 reccount=' + TRANSFORM(RECCOUNT('cGestiuni2')) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) * gnIdUtil=-3 (utilizatorul de test) nu are gestiuni configurate in vgest_gestiuni_util - * cGestiuni2 (RowSource-ul real al combobox-ului) ramane doar cu randul gol; completez cu o * gestiune reala a schemei, direct din NOM_GESTIUNI, ca D2 sa poata alege o valoare valida SELECT cGestiuni2 LOCATE FOR NVL(id_gestiune,0) # 0 IF !FOUND() LOCAL loGestFallback goExecutor.oExecuta("select id_gestiune, nume_gestiune from NOM_GESTIUNI where sters = 0 and inactiv = 0 and rownum = 1 order by id_gestiune", 'cGestFallback') IF USED('cGestFallback') AND RECCOUNT('cGestFallback') > 0 SELECT cGestFallback loGestFallback = NULL SCATTER NAME loGestFallback USE IN (SELECT('cGestFallback')) * cGestiuni2 (din SELECT ... INTO CURSOR, fara READWRITE) nu accepta INSERT - o refac READWRITE SELECT nume_gestiune, id_gestiune FROM cGestiuni2 INTO CURSOR cGestiuni2Nou READWRITE USE IN (SELECT('cGestiuni2')) INSERT INTO cGestiuni2Nou (nume_gestiune, id_gestiune) VALUES (ALLTRIM(loGestFallback.nume_gestiune), loGestFallback.id_gestiune) SELECT * FROM cGestiuni2Nou INTO CURSOR cGestiuni2 READWRITE USE IN (SELECT('cGestiuni2Nou')) DO PrLogLocal WITH 'fallback cGestiuni2: adaugat id_gestiune=' + TRANSFORM(loGestFallback.id_gestiune) + ' (' + ALLTRIM(loGestFallback.nume_gestiune) + ') - gnIdUtil=-3 nu are gestiuni proprii pe schema de test' ENDIF ENDIF LOCAL loForm SELECT crsFacturi DO PrLogLocal WITH 'inainte de CREATEOBJECT, TYPE(poFacturi)=' + TYPE('poFacturi') loForm = CREATEOBJECT('frm_import_efactura', .T.) DO PrLogLocal WITH 'frm_import_efactura instantiat, lLotActiv=' + TRANSFORM(loForm.lLotActiv) + ' TYPE(poFacturi)=' + TYPE('poFacturi') *===================================================================== * D1: do_cauta pe filtrul facturilor ZZTEST curente, FARA sa ating grila *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== D1: do_cauta ===' loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'" loForm.do_cauta() DO PrLogLocal WITH 'do_cauta terminat, crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) LOCAL lnCuDeCompletat, lnTotalD1 lnCuDeCompletat = 0 lnTotalD1 = 0 SELECT crsFacturi SCAN lnTotalD1 = lnTotalD1 + 1 IF !EMPTY(ALLTRIM(NVL(de_completat,''))) lnCuDeCompletat = lnCuDeCompletat + 1 DO PrLogLocal WITH ' id=' + TRANSFORM(id) + ' de_completat=[' + ALLTRIM(NVL(de_completat,'')) + ']' ENDIF ENDSCAN DO PrLogLocal WITH 'D1: total=' + TRANSFORM(lnTotalD1) + ' cu de_completat nevid=' + TRANSFORM(lnCuDeCompletat) IF lnCuDeCompletat = 0 DO PrTest WITH 'D1 do_cauta umple de_completat pe lista', .F., 'GOL PESTE TOT dupa do_cauta - cauza (a) probabila: TRY/CATCH tacut a inghitit o eroare' DO PrLogLocal WITH '--- apel direct RecunoastereArticolEF.LipsuriLista in afara TRY, ca sa vedem eroarea reala ---' LOCAL loRecDirect, llSuccesDirect TRY loRecDirect = CREATEOBJECT('RecunoastereArticolEF') llSuccesDirect = loRecDirect.LipsuriLista('crsFacturi', .T.) DO PrLogLocal WITH 'LipsuriLista direct: retur=' + TRANSFORM(llSuccesDirect) + ' crsLipsuriLista reccount=' + TRANSFORM(IIF(USED('crsLipsuriLista'), RECCOUNT('crsLipsuriLista'), -1)) CATCH TO loExDirect DO PrLogLocal WITH 'LipsuriLista direct: EXCEPTIE ' + loExDirect.Message + ' (' + TRANSFORM(loExDirect.LineNo) + ') ' + loExDirect.Procedure ENDTRY ELSE DO PrTest WITH 'D1 do_cauta umple de_completat pe lista', .T., 'umplut pe ' + TRANSFORM(lnCuDeCompletat) + '/' + TRANSFORM(lnTotalD1) + ' facturi - daca ecranul real arata gol, cauza (b): lipseste grdFacturi.Refresh()' ENDIF *===================================================================== * D2: alegere gestiune pe linie prin combobox-ul real din grid *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== D2: cGestiune._combobox1.InteractiveChange ===' * gasesc factura + linia cu id_gestiune gol, articol stocabil, cont deja completat - * calea per-document (identica cu test_lipsuri_lista_echivalenta.prg), ca sa stiu ce factura are * cu adevarat "gest." de completat, indiferent de rezultatul D1 de mai sus LOCAL lnIdFacturaTinta, lnRecnoFacturaTinta, lcDeCompletatDinainte LOCAL lnIdFacturaTintaM1, lnRecnoFacturaTintaM1, lcDeCompletatDinainteM1 lnIdFacturaTinta = 0 lnIdFacturaTintaM1 = 0 SELECT crsFacturi SCAN LOCAL lnRecnoF, lnIdEF lnIdEF = id lnRecnoF = RECNO() GO lnRecnoF IN crsFacturi loForm.CompleteazaFactura() GO lnRecnoF IN crsFacturi loForm.actualizeaza_grid2() GO lnRecnoF IN crsFacturi loForm.CompleteazaDetaliiFactura() GO lnRecnoF IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoF IN crsFacturi IF lnIdFacturaTinta = 0 AND 'gest.' $ ALLTRIM(NVL(crsFacturi.de_completat,'')) lnIdFacturaTinta = lnIdEF lnRecnoFacturaTinta = lnRecnoF lcDeCompletatDinainte = ALLTRIM(NVL(crsFacturi.de_completat,'')) ENDIF IF lnIdFacturaTintaM1 = 0 AND !EMPTY(ALLTRIM(NVL(crsFacturi.de_completat,''))) lnIdFacturaTintaM1 = lnIdEF lnRecnoFacturaTintaM1 = lnRecnoF lcDeCompletatDinainteM1 = ALLTRIM(NVL(crsFacturi.de_completat,'')) ENDIF SELECT crsFacturi ENDSCAN IF lnIdFacturaTinta = 0 DO PrLogLocal WITH 'D2: nicio factura din fixtura nu are linie stocabila fara gestiune dupa completare - nu se poate reproduce pe acest set' ELSE DO PrLogLocal WITH 'D2: factura tinta id=' + TRANSFORM(lnIdFacturaTinta) + ' de_completat inainte=[' + lcDeCompletatDinainte + ']' GO lnRecnoFacturaTinta IN crsFacturi loForm.actualizeaza_grid2() GO lnRecnoFacturaTinta IN crsFacturi LOCAL lnRecnoLinieTinta, lnIdGestiuneVechi lnRecnoLinieTinta = 0 SELECT crsDetaliiFacturi SCAN IF NVL(in_stoc,0) = 1 AND EMPTY(NVL(id_gestiune,0)) lnRecnoLinieTinta = RECNO() EXIT ENDIF ENDSCAN IF lnRecnoLinieTinta = 0 DO PrLogLocal WITH 'D2: FAIL structural - de_completat mentioneaza gest. dar nicio linie din crsDetaliiFacturi nu se potriveste (in_stoc=1 si id_gestiune gol)' ELSE GO lnRecnoLinieTinta IN crsDetaliiFacturi lnIdGestiuneVechi = NVL(crsDetaliiFacturi.id_gestiune, 0) DO PrLogLocal WITH 'D2: linie tinta recno=' + TRANSFORM(lnRecnoLinieTinta) + ' id_gestiune inainte=' + TRANSFORM(lnIdGestiuneVechi) LOCAL lnIdGestiuneNou lnIdGestiuneNou = 0 SELECT cGestiuni2 LOCATE FOR NVL(id_gestiune,0) # 0 IF FOUND() lnIdGestiuneNou = id_gestiune ENDIF SELECT crsDetaliiFacturi IF lnIdGestiuneNou = 0 DO PrLogLocal WITH 'D2: FAIL structural - cGestiuni2 nu are nicio gestiune valida pe schema de test' ELSE DO PrLogLocal WITH 'D2: aleg id_gestiune=' + TRANSFORM(lnIdGestiuneNou) + ' din cGestiuni2' loForm.grdDetaliiFacturi.cGestiune._combobox1.Value = m.lnIdGestiuneNou DO PrLogLocal WITH 'D2: dupa setarea .Value, crsDetaliiFacturi.id_gestiune=' + TRANSFORM(NVL(crsDetaliiFacturi.id_gestiune,0)) + ' (arata daca simpla asignare de .Value scrie deja in ControlSource)' loForm.grdDetaliiFacturi.cGestiune._combobox1.InteractiveChange() SELECT crsDetaliiFacturi GO lnRecnoLinieTinta DO PrLogLocal WITH 'D2: dupa InteractiveChange, crsDetaliiFacturi.id_gestiune=' + TRANSFORM(NVL(id_gestiune,0)) SELECT crsFacturi GO lnRecnoFacturaTinta LOCAL lcDeCompletatDupa lcDeCompletatDupa = ALLTRIM(NVL(de_completat,'')) DO PrLogLocal WITH 'D2: de_completat dupa InteractiveChange=[' + lcDeCompletatDupa + ']' IF NVL(crsDetaliiFacturi.id_gestiune,0) # m.lnIdGestiuneNou DO PrLogLocal WITH 'D2: NEREPRODUS pe aceasta cale - setarea programatica a .Value nu a scris in ControlSource (crsDetaliiFacturi.id_gestiune a ramas neschimbat), deci InteractiveChange nu a avut ce sa citeasca diferit' DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .F., 'neconcludent - .Value programatic nu a scris in ControlSource, vezi log pentru dovada structurala' ELSE IF 'gest.' $ lcDeCompletatDupa DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .F., 'de_completat inca arata [' + lcDeCompletatDupa + '] desi id_gestiune a fost scris - ActualizeazaLipsuriRandCurent a recalculat pe valoarea veche' ELSE DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .T., 'de_completat=[' + lcDeCompletatDupa + '] dupa alegere' ENDIF ENDIF ENDIF ENDIF ENDIF *===================================================================== * M1: completare locala (cont/gestiune/acont) supravietuieste unei cautari ulterioare *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== M1: completarea locala nu e suprascrisa de do_cauta ===' IF lnIdFacturaTintaM1 = 0 DO PrLogLocal WITH 'M1: nicio factura din fixtura nu are ceva de completat dupa vizitare - nu se poate reproduce pe acest set' ELSE DO PrLogLocal WITH 'M1: factura tinta id=' + TRANSFORM(lnIdFacturaTintaM1) + ' de_completat inainte=[' + lcDeCompletatDinainteM1 + ']' GO lnRecnoFacturaTintaM1 IN crsFacturi loForm.actualizeaza_grid2() GO lnRecnoFacturaTintaM1 IN crsFacturi LOCAL lnGestiuneM1 lnGestiuneM1 = 0 SELECT cGestiuni2 LOCATE FOR NVL(id_gestiune,0) # 0 IF FOUND() lnGestiuneM1 = id_gestiune ENDIF * completez tot ce lipseste (cont/gestiune/acont) pe liniile facturii, doar in cursorul local SELECT crsDetaliiFacturi REPLACE cont WITH IIF(EMPTY(NVL(cont,'')), '628', cont) ALL REPLACE id_gestiune WITH IIF(NVL(in_stoc,0) = 1 AND EMPTY(NVL(id_gestiune,0)), m.lnGestiuneM1, id_gestiune) ALL REPLACE acont WITH IIF(!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,'')), '01', acont) ALL GO lnRecnoFacturaTintaM1 IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoFacturaTintaM1 IN crsFacturi LOCAL lcDeCompletatLocalM1 lcDeCompletatLocalM1 = ALLTRIM(NVL(crsFacturi.de_completat,'')) DO PrLogLocal WITH 'M1: de_completat dupa completarea locala (inainte de do_cauta)=[' + lcDeCompletatLocalM1 + ']' IF !EMPTY(m.lcDeCompletatLocalM1) DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', .F., 'neconcludent - completarea locala nu a golit de_completat, vezi log' ELSE loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'" loForm.do_cauta() SELECT crsFacturi LOCATE FOR id = m.lnIdFacturaTintaM1 IF !FOUND() DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', .F., 'factura tinta nu mai e in crsFacturi dupa do_cauta' ELSE LOCAL lcDeCompletatDupaM1 lcDeCompletatDupaM1 = ALLTRIM(NVL(de_completat,'')) DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', EMPTY(m.lcDeCompletatDupaM1), 'de_completat dupa do_cauta=[' + m.lcDeCompletatDupaM1 + ']' ENDIF ENDIF ENDIF *===================================================================== * M2: la deschidere (fara cautare) lista trebuie sa aiba de_completat pe toata lista *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== M2: ActualizeazaLipsuriLista pe cursor proaspat, fara do_cauta ===' DO BuildCursoare DO PrLogLocal WITH 'M2: crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) + ' dupa reconstructie' LOCAL loForm2, lnCuDeCompletatM2, lnTotalM2 loForm2 = CREATEOBJECT('frm_import_efactura', .T.) *!* Show() nu ruleaza headless (maximizeaza fereastra) - se cheama direct metoda pe care Show() o cheama loForm2.ActualizeazaLipsuriLista() lnCuDeCompletatM2 = 0 lnTotalM2 = 0 SELECT crsFacturi SCAN lnTotalM2 = lnTotalM2 + 1 IF !EMPTY(ALLTRIM(NVL(de_completat,''))) lnCuDeCompletatM2 = lnCuDeCompletatM2 + 1 ENDIF ENDSCAN DO PrLogLocal WITH 'M2: total=' + TRANSFORM(lnTotalM2) + ' cu de_completat nevid=' + TRANSFORM(lnCuDeCompletatM2) + ' (D1 avea ' + TRANSFORM(lnCuDeCompletat) + ')' DO PrTest WITH 'M2 lista completata fara cautare, direct dupa apelul pe care Show() il face', lnCuDeCompletatM2 = lnCuDeCompletat, 'nevid=' + TRANSFORM(lnCuDeCompletatM2) + ' vs. D1=' + TRANSFORM(lnCuDeCompletat) *===================================================================== * T1: rand cu lipsuri (cont gol) SI cu avertisment de partener inactiv (ZZT-C2-C) - dupa * completarea contului pe cursorul local, eligibil_lot trebuie sa devina 1, motiv_lot gol *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== T1: lipsuri + avertisment partener inactiv (ZZT-C2-C) ===' loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'" loForm.do_cauta() SELECT crsFacturi LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C2-C' IF !FOUND() DO PrTest WITH 'T1 eligibil_lot=1 si motiv_lot gol dupa completarea contului (lipsuri + partener inactiv)', .F., 'factura ZZT-C2-C nu e in fixtura - a rulat seed_test_import_efactura.prg?' ELSE LOCAL lnRecnoT1 lnRecnoT1 = RECNO() loForm.CompleteazaFactura() GO lnRecnoT1 IN crsFacturi loForm.actualizeaza_grid2() GO lnRecnoT1 IN crsFacturi loForm.CompleteazaDetaliiFactura() GO lnRecnoT1 IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoT1 IN crsFacturi DO PrLogLocal WITH 'T1: dupa vizitarea randului - part_inactiv=' + TRANSFORM(NVL(crsFacturi.part_inactiv,0)) + ' eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,1)) + ' motiv_lot=[' + ALLTRIM(NVL(crsFacturi.motiv_lot,'')) + ']' SELECT crsDetaliiFacturi REPLACE cont WITH '628' ALL SELECT crsFacturi GO lnRecnoT1 IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoT1 IN crsFacturi LOCAL llEligibilT1, lcMotivT1 llEligibilT1 = (NVL(crsFacturi.eligibil_lot,0) = 1) lcMotivT1 = ALLTRIM(NVL(crsFacturi.motiv_lot,'')) DO PrTest WITH 'T1 eligibil_lot=1 si motiv_lot gol dupa completarea contului (lipsuri + partener inactiv)', llEligibilT1 AND EMPTY(lcMotivT1), 'eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,0)) + ' motiv_lot=[' + lcMotivT1 + ']' ENDIF *===================================================================== * T2: bifa "De completat" - filtru local pe crsFacturi (ascunde randurile gata) + contorul * din caption trebuie sa numere TOATE randurile din ActualizeazaContoare/ContorBifate, nu doar * cele vizibile prin filtru (bug prins la code-review, guard SET FILTER TO/AplicaFiltruDeCompletat) *===================================================================== DO PrLogLocal WITH '' DO PrLogLocal WITH '=== T2: chkDeCompletat - filtru local + contor pe toate randurile ===' loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'" loForm.do_cauta() * baseline dinamic: alte sectiuni (T1) pot fi lasat deja o factura "gata" pe acelasi cursor * persistent - nu presupun un total fix, masor delta inainte/dupa completarea lui C1 SELECT crsFacturi SET FILTER TO LOCAL lnTotalNefiltratT2, lnGataInainteT2, lnGataDupaT2 lnTotalNefiltratT2 = RECCOUNT('crsFacturi') lnGataInainteT2 = 0 COUNT FOR EMPTY(ALLTRIM(NVL(de_completat,''))) TO lnGataInainteT2 LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C1-C' IF !FOUND() DO PrTest WITH 'T2 filtrul local + contorul vad toate randurile', .F., 'factura ZZT-C1-C nu e in fixtura' ELSE LOCAL lnRecnoT2 lnRecnoT2 = RECNO() loForm.CompleteazaFactura() GO lnRecnoT2 IN crsFacturi loForm.actualizeaza_grid2() GO lnRecnoT2 IN crsFacturi loForm.CompleteazaDetaliiFactura() GO lnRecnoT2 IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoT2 IN crsFacturi * completez tot ce lipseste, doar in cursorul local (ca la M1), ca sa devina "gata" SELECT crsDetaliiFacturi REPLACE cont WITH IIF(EMPTY(NVL(cont,'')), '628', cont) ALL REPLACE acont WITH IIF(!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,'')), '01', acont) ALL SELECT crsFacturi GO lnRecnoT2 IN crsFacturi loForm.ActualizeazaLipsuriRandCurent() GO lnRecnoT2 IN crsFacturi LOCAL lcDeCompletatT2Gata lcDeCompletatT2Gata = ALLTRIM(NVL(crsFacturi.de_completat,'')) DO PrLogLocal WITH 'T2: factura ZZT-C1-C dupa completare - de_completat=[' + lcDeCompletatT2Gata + '] eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,0)) IF !EMPTY(lcDeCompletatT2Gata) DO PrTest WITH 'T2 filtrul local + contorul vad toate randurile', .F., 'neconcludent - factura tinta nu a devenit gata dupa completare, vezi log' ELSE SELECT crsFacturi lnGataDupaT2 = 0 COUNT FOR EMPTY(ALLTRIM(NVL(de_completat,''))) TO lnGataDupaT2 LOCAL lnAsteptatVizibileT2 lnAsteptatVizibileT2 = lnTotalNefiltratT2 - lnGataDupaT2 loForm.chkDeCompletat.Value = .T. loForm.AplicaFiltruDeCompletat() SELECT crsFacturi LOCAL lnVizibileT2 lnVizibileT2 = 0 COUNT TO lnVizibileT2 LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C1-C' LOCAL llGasitaSubFiltruT2 llGasitaSubFiltruT2 = FOUND() loForm.ActualizeazaContoare() LOCAL lcCaptionT2, lnParStart, lnParEnd, lnNT2 lcCaptionT2 = loForm.chkDeCompletat.Caption lnParStart = AT('(', lcCaptionT2) lnParEnd = AT(')', lcCaptionT2) lnNT2 = IIF(lnParStart > 0 AND lnParEnd > lnParStart, VAL(SUBSTR(lcCaptionT2, lnParStart + 1, lnParEnd - lnParStart - 1)), -1) DO PrLogLocal WITH 'T2: gata inainte=' + TRANSFORM(lnGataInainteT2) + ' dupa=' + TRANSFORM(lnGataDupaT2) + ' din total=' + TRANSFORM(lnTotalNefiltratT2) + ' - cu filtrul pus vizibile=' + TRANSFORM(lnVizibileT2) + ' gasita sub filtru=' + TRANSFORM(llGasitaSubFiltruT2) + ' chkDeCompletat.Caption=[' + lcCaptionT2 + '] N=' + TRANSFORM(lnNT2) DO PrTest WITH 'T2 filtrul ascunde factura completata, restul raman vizibile', lnGataDupaT2 = lnGataInainteT2 + 1 AND lnVizibileT2 = lnAsteptatVizibileT2 AND !llGasitaSubFiltruT2, 'vizibile=' + TRANSFORM(lnVizibileT2) + '/' + TRANSFORM(lnAsteptatVizibileT2) + ' gasita sub filtru=' + TRANSFORM(llGasitaSubFiltruT2) DO PrTest WITH 'T2 ActualizeazaContoare numara TOATE randurile, nu doar cele vizibile prin filtru', lnNT2 = lnAsteptatVizibileT2, 'N=' + TRANSFORM(lnNT2) + ' asteptat=' + TRANSFORM(lnAsteptatVizibileT2) + ' (daca N=' + TRANSFORM(lnTotalNefiltratT2) + ' inseamna ca numaratoarea a fost pacalita de filtru)' loForm.chkDeCompletat.Value = .F. loForm.AplicaFiltruDeCompletat() ENDIF ENDIF DO PrLogLocal WITH '' DO PrLogLocal WITH '=== REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) + ' ===' IF USED('crsLipsuriLista') USE IN (SELECT('crsLipsuriLista')) ENDIF DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie' CATCH TO loEx DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure ENDTRY DO PrFinal QUIT ********************************************************** * crsFacturi/crsDetaliiFacturi pentru toate facturile ZZTEST 'curente' - copie de schema din * test_lipsuri_lista_echivalenta.prg::BuildCursoare, cu PRIVATE poFacturi/poFacturiDetalii mutat * la nivelul testului (do_cauta -> actualizeaza_grid1 le foloseste nedeclarate, prin lantul de apel) PROCEDURE BuildCursoare LOCAL lcSchema, lcSelect, lcOrder, lcGroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza IF USED('crsFacturi') USE IN crsFacturi ENDIF IF USED('crsDetaliiFacturi') USE IN crsDetaliiFacturi ENDIF IF USED('crsDetaliiFacturiTemp') USE IN crsDetaliiFacturiTemp ENDIF TEXT TO lcSchema NOSHOW ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), gest c(1), part_inactiv N(1) ENDTEXT TEXT TO lcSelect TEXTMERGE NOSHOW SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat, '' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA, '' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr, '' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, '' as gest, 0 as part_inactiv FROM anaf_vefactura_primit ENDTEXT lcOrder = [data_act,numar_act,data_raspuns] lcGroup = [] lcFiltru = [cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. poFacturi = NULL poFacturiDetalii = NULL gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal) poFacturi.ca_baza1.afisare() TEXT TO lcSchema NOSHOW distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6) ENDTEXT TEXT TO lcSelect NOSHOW select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii ENDTEXT lcOrder = [id_efactura,nr] lcGroup = [] lcFiltru = [id_efactura in (select id from anaf_efactura where cod_fiscal_emitent LIKE '9999700%' and xnumar_act LIKE '%-C')] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal) poFacturiDetalii.ca_baza1.afisare() SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE USE IN (SELECT('crsDetaliiFacturiTemp')) ENDPROC ********************************************************** * copie fidela din test_lipsuri_lista_echivalenta.prg::BuildCursoareHelper PROCEDURE BuildCursoareHelper LOCAL llSucces IF USED('cTipArticoleP') USE IN cTipArticoleP ENDIF CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I) INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0) INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12) INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (15, 'Marfuri','371', 1, 15) SELECT cTipArticoleP GO TOP IN cTipArticoleP INDEX on ordine TAG ordine IF USED('cTipArticoleE') USE IN cTipArticoleE ENDIF CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I) INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0) INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6) SELECT cTipArticoleE GO TOP IN cTipArticoleE INDEX on ordine TAG ordine IF USED('cTip') USE IN cTip ENDIF SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip SELECT cTip INDEX on id TAG id IF USED('cGestiuni') USE IN cGestiuni ENDIF llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni') SELECT cGestiuni APPEND BLANK INDEX on id_gestiune TAG id_gest IF USED('cGestiuni2') USE IN cGestiuni2 ENDIF SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2 IF USED('cUMISO') USE IN cUMISO ENDIF llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO') SELECT cUMISO INDEX on cod_um_iso TAG cod_um_iso IF USED('cUM') USE IN cUM ENDIF llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM') SELECT cUM INDEX on id TAG id ENDPROC ********************************************************** PROCEDURE PrTest LPARAMETERS tcEticheta, tlOk, tcDetaliu IF tlOk gnPass = gnPass + 1 ELSE gnFail = gnFail + 1 ENDIF DO PrLogLocal WITH ' ' + IIF(tlOk, 'PASS', 'FAIL') + ' ' + tcEticheta + ': ' + TRANSFORM(tcDetaliu) ENDPROC ********************************************************** PROCEDURE PrLogLocal LPARAMETERS tcMsg LOCAL lcL SET SAFETY OFF lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog) ENDPROC ********************************************************** PROCEDURE PrErrLocal LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo) ENDPROC ********************************************************** PROCEDURE PrFinal DO PrLogLocal WITH 'DONE ' + TTOC(DATETIME()) ENDPROC