* test_nnir_sincronizare.prg * Test e2e (fluxul real): NNIR editabil in Registru Jurnal, cu sincronizare in tact/trul/trul_obinv * si in ACT/RUL/RUL_OBINV (Oracle). Vezi cerinta initiala (todos.txt pct. 9) si * date_test_nnir.md (datele de test alese, an/luna/cod, stare implementare la data scrierii). * * Instantiaza frm_modific2024 direct (ca test_repro_cnrcrt_footer.prg din achizitie_import), * cu cursoarele tact/trul/trul_obinv construite exact ca afisjurcom.do_modifica (comun.vc2:2352- * 2434), dar pe AN/LUNA proprii notei - do_modifica limiteaza editarea la luna curenta de lucru * (comun.vc2:2265-2268), iar notele de test nu sunt toate in luna curenta. * * Editarea NNIR se simuleaza ca un utilizator: pozitionare pe rand, declansarea evenimentelor * reale ale coloanei (When la intrare, LostFocus la iesire - textboxul nu comite valoarea in * ControlSource inainte de Valid, de-aia implementarea sincronizeaza pe LostFocus), NU apel * direct al metodei de sincronizare. Salvarea (Termin) replica blocul din * afisjurcom.do_modifica (comun.vc2:2456-2487): oscrie_in_fisiere + pack_contafin. * finalizeaza_modificare_nota. Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune * curenta - nu pastreaza COD-ul original; verificarea si curatenia de dupa salvare se fac dupa * valoarea NNIR marcaj (nu poate coincide cu date reale), marcand sters=1 (conventia aplicatiei) * orice a ajuns sub acea valoare - nota originala (COD/NNIR vechi) ramane intacta. * * Rulare headless (nu tine VFP IDE deschis; nu rula cu roagest.exe pornit): * & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ; * "D:\ROA\ROAGEST\COMUN\utile\Teste\nnir_registru_jurnal\test_nnir_sincronizare.prg" * Timeout recomandat: minim 220s. Log: %TEMP%\test_nnir_sincronizare_log.txt (PASS/FAIL pe linie). * STERGE .FXP-ul inainte de rulare: VFP nu recompileaza automat si ruleaza tacut versiunea * veche a scriptului - scenariile adaugate intre timp lipsesc cu totul din log. LPARAMETERS tcMode tcMode = IIF(EMPTY(tcMode), 'ALL', UPPER(ALLTRIM(tcMode))) SET SAFETY OFF SET TALK OFF PUBLIC gcLogFile, gnFail, gnPass gcLogFile = ADDBS(SYS(2023)) + 'test_nnir_sincronizare_log.txt' gnFail = 0 gnPass = 0 STRTOFILE('START ' + tcMode + ' ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile) ON ERROR DO NnirErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT * mock amessagebox incarcat INAINTE de mediul aplicatiei: optiuni_firma (in mediul de test) * poate afisa un dialog real daca SCRIE_OPTIUNI raporteaza eroare SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE DO D:\ROA\ROAGEST\COMUN\utile\Teste\test_init_env_auto_roagest.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF gnHandle <= 0 DO NnirLog WITH 'EROARE: conectare Oracle esuata' DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT' QUIT ENDIF DO NnirLog WITH 'mediu OK, gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) * garda anti-blocaj: o variabila lipsa folosita ca ?param intr-un SQL pass-through NU da eroare * catchabila - VFP deschide dialogul modal nativ "Enter the value for ", care blocheaza * headless-ul la nesfarsit si nu lasa nimic in log (vezi date_test_nnir.md). Verificare * explicita INAINTE de orice apel care le foloseste, opreste testul cu FAIL clar daca lipseste ceva. IF !NnirGardaVariabile() DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT (garda variabile a picat)' QUIT ENDIF * mock amessagebox - se incarca ULTIMUL (dupa fisierele aplicatiei), vezi antetul mock-ului SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE * Grid1.Column63 (explicatie TVA pe rulaje) face Seek pe alias 'crsJtvaTemp' la CONSTRUCTIA * formularului (inainte de Init) - fara cursorul deschis, CREATEOBJECT('frm_modific2024',...) * pica cu "File 'crsjtvatemp.dbf' does not exist" update_jtva_coloane('', 'crsJtvaTemp', 6) LOCAL Omodif, lcCallWhen, lcCallLostFocus, lcCall *===================================================================================== * Scenariul 1: NIR/achizitie, cu rulaje in RUL, cu salvare (Termin) + verificare Oracle *===================================================================================== IF INLIST(tcMode, 'ALL', 'NIR') LOCAL lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou LOCAL lnCntTactVechi, lnCntTrulVechi, lnCntTactNou, lnCntTrulNou LOCAL i, llGasit, lnColOrder, llReadOnly, lnColCheck, lcColName lnCod = 1140841 lnAn = 2026 lnLuna = 7 lnIdSet = 209 lnNnirVechi = 3 lnNnirNou = lnNnirVechi + 90000000 DO NnirConstruiesteCursoare WITH lnCod, lnAn, lnLuna SELECT tact lnCntTactVechi = 0 COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTactVechi SELECT trul lnCntTrulVechi = 0 COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTrulVechi Omodif = CREATEOBJECT('frm_modific2024', lnIdSet) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'NIR', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() llGasit = .F. lnColOrder = 0 llReadOnly = .T. lnColCheck = 0 FOR i = 1 TO Omodif.grid1.ColumnCount lcColName = 'Omodif.grid1.Columns(' + TRANSFORM(i) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColName + '.ControlSource')) llGasit = .T. lnColOrder = EVALUATE(lcColName + '.ColumnOrder') llReadOnly = EVALUATE(lcColName + '.ReadOnly') lnColCheck = i ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'NIR', llGasit, 'ControlSource=nnir gasit=' + ; TRANSFORM(llGasit) + ' ColumnOrder=' + TRANSFORM(lnColOrder) + ' ReadOnly=' + TRANSFORM(llReadOnly) IF llGasit DO NnirAssert WITH 'coloana_editabila', 'NIR', !llReadOnly, 'nota normala: ReadOnly asteptat .F.' SELECT tact LOCATE FOR NVL(nnir,0) = lnNnirVechi IF FOUND() lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.When' &lcCallWhen REPLACE nnir WITH lnNnirNou lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.LostFocus' &lcCallLostFocus SELECT tact lnCntTactNou = 0 COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTactNou DO NnirAssert WITH 'sync_tact', 'NIR', lnCntTactNou = lnCntTactVechi, ; TRANSFORM(lnCntTactNou) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi) + ')' * trul = cursorul legat de pgfArticole.page1.grdRulaje (RecordSource) - verificare * explicita ca propagarea se vede in cursorul de rulaje, nu doar in tact SELECT trul lnCntTrulNou = 0 COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTrulNou DO NnirAssert WITH 'sync_trul', 'NIR', lnCntTrulNou = lnCntTrulVechi, ; TRANSFORM(lnCntTrulNou) + ' randuri trul (grid rulaje) cu nnir nou (asteptat ' + TRANSFORM(lnCntTrulVechi) + ')' ELSE DO NnirAssert WITH 'locate_rand_vechi', 'NIR', .F., 'nu s-a gasit randul cu nnir vechi in tact' ENDIF ENDIF DO NnirVerificaOracleNeschimbat WITH lnCod, lnNnirVechi, 'NIR' Omodif.Release() Omodif = NULL DO NnirSalveazaSiVerifica WITH lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou, 'NIR' ENDIF DO NnirCurataCursoare ENDIF *===================================================================================== * Scenariul 2: obiecte de inventar, cu rulaje in RUL_OBINV, cu salvare + verificare Oracle *===================================================================================== IF INLIST(tcMode, 'ALL', 'OBINV') LOCAL lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2 LOCAL lnCntTactVechi2, lnCntRobinvVechi2, lnCntTactNou2, lnCntRobinvNou2 LOCAL i2, llGasit2, lnColOrder2, llReadOnly2, lnColCheck2, lcColName2 lnCod2 = 1140835 lnAn2 = 2026 lnLuna2 = 6 lnIdSet2 = 211 lnNnirVechi2 = 2026060001 lnNnirNou2 = lnNnirVechi2 + 90000000 DO NnirConstruiesteCursoare WITH lnCod2, lnAn2, lnLuna2 SELECT tact lnCntTactVechi2 = 0 COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntTactVechi2 SELECT trul_obinv lnCntRobinvVechi2 = 0 COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntRobinvVechi2 Omodif = CREATEOBJECT('frm_modific2024', lnIdSet2) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'OBINV', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() llGasit2 = .F. lnColOrder2 = 0 llReadOnly2 = .T. lnColCheck2 = 0 FOR i2 = 1 TO Omodif.grid1.ColumnCount lcColName2 = 'Omodif.grid1.Columns(' + TRANSFORM(i2) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColName2 + '.ControlSource')) llGasit2 = .T. lnColOrder2 = EVALUATE(lcColName2 + '.ColumnOrder') llReadOnly2 = EVALUATE(lcColName2 + '.ReadOnly') lnColCheck2 = i2 ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'OBINV', llGasit2, 'ControlSource=nnir gasit=' + ; TRANSFORM(llGasit2) + ' ColumnOrder=' + TRANSFORM(lnColOrder2) + ' ReadOnly=' + TRANSFORM(llReadOnly2) IF llGasit2 SELECT tact LOCATE FOR NVL(nnir,0) = lnNnirVechi2 IF FOUND() lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.When' &lcCallWhen REPLACE nnir WITH lnNnirNou2 lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.LostFocus' &lcCallLostFocus SELECT tact lnCntTactNou2 = 0 COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntTactNou2 DO NnirAssert WITH 'sync_tact', 'OBINV', lnCntTactNou2 = lnCntTactVechi2, ; TRANSFORM(lnCntTactNou2) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi2) + ')' SELECT trul_obinv lnCntRobinvNou2 = 0 COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntRobinvNou2 DO NnirAssert WITH 'sync_trul_obinv', 'OBINV', lnCntRobinvNou2 = lnCntRobinvVechi2, ; TRANSFORM(lnCntRobinvNou2) + ' randuri trul_obinv cu nnir nou (asteptat ' + TRANSFORM(lnCntRobinvVechi2) + ')' ELSE DO NnirAssert WITH 'locate_rand_vechi', 'OBINV', .F., 'nu s-a gasit randul cu nnir vechi in tact' ENDIF ENDIF Omodif.Release() Omodif = NULL DO NnirSalveazaSiVerificaObinv WITH lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2 ENDIF DO NnirCurataCursoare ENDIF *===================================================================================== * Scenariul 3: nota fara rulaje - regresie (nu crapa), cu salvare + verificare Oracle *===================================================================================== IF INLIST(tcMode, 'ALL', 'FARARUL') LOCAL lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3 LOCAL lnCntTactVechi3, lnCntTactNou3 LOCAL i3, llGasit3, lnColCheck3, lcColName3 lnCod3 = 1140848 lnAn3 = 2026 lnLuna3 = 7 lnIdSet3 = 209 lnNnirVechi3 = 124 lnNnirNou3 = lnNnirVechi3 + 90000000 DO NnirConstruiesteCursoare WITH lnCod3, lnAn3, lnLuna3 SELECT tact lnCntTactVechi3 = 0 COUNT FOR NVL(nnir,0) = lnNnirVechi3 TO lnCntTactVechi3 Omodif = CREATEOBJECT('frm_modific2024', lnIdSet3) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'FARARUL', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() llGasit3 = .F. lnColCheck3 = 0 FOR i3 = 1 TO Omodif.grid1.ColumnCount lcColName3 = 'Omodif.grid1.Columns(' + TRANSFORM(i3) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColName3 + '.ControlSource')) llGasit3 = .T. lnColCheck3 = i3 ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'FARARUL', llGasit3, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit3) IF llGasit3 SELECT tact LOCATE FOR NVL(nnir,0) = lnNnirVechi3 IF FOUND() lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.When' &lcCallWhen REPLACE nnir WITH lnNnirNou3 lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.LostFocus' &lcCallLostFocus SELECT tact lnCntTactNou3 = 0 COUNT FOR NVL(nnir,0) = lnNnirNou3 TO lnCntTactNou3 DO NnirAssert WITH 'sync_tact', 'FARARUL', lnCntTactNou3 = lnCntTactVechi3, ; TRANSFORM(lnCntTactNou3) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi3) + ')' DO NnirAssert WITH 'nu_crapa', 'FARARUL', .T., 'editarea pe nota fara rulaje nu a generat eroare' ELSE DO NnirAssert WITH 'locate_rand_vechi', 'FARARUL', .F., 'nu s-a gasit randul cu nnir vechi in tact' ENDIF ENDIF Omodif.Release() Omodif = NULL DO NnirSalveazaSiVerifica WITH lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3, 'FARARUL' ENDIF DO NnirCurataCursoare ENDIF *===================================================================================== * Scenariul 4: nota de inventar (id_set=90101) - regresie blocare editare NNIR *===================================================================================== IF INLIST(tcMode, 'ALL', 'INVENTAR') LOCAL lnCod4, lnAn4, lnLuna4, lnIdSet4 LOCAL i4, llGasit4, llReadOnly4, lcColName4 lnCod4 = 1140716 lnAn4 = 2026 lnLuna4 = 3 lnIdSet4 = 90101 DO NnirConstruiesteCursoare WITH lnCod4, lnAn4, lnLuna4 Omodif = CREATEOBJECT('frm_modific2024', lnIdSet4) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'INVENTAR', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() llGasit4 = .F. llReadOnly4 = .F. FOR i4 = 1 TO Omodif.grid1.ColumnCount lcColName4 = 'Omodif.grid1.Columns(' + TRANSFORM(i4) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColName4 + '.ControlSource')) llGasit4 = .T. llReadOnly4 = EVALUATE(lcColName4 + '.ReadOnly') ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'INVENTAR', llGasit4, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit4) IF llGasit4 * nu se incearca editarea - doar se verifica blocarea, ca sa nu se altereze o nota * reala de inventar cat timp blocarea nu e implementata DO NnirAssert WITH 'coloana_blocata', 'INVENTAR', llReadOnly4, ; 'id_set=90101: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly4) ENDIF Omodif.Release() Omodif = NULL ENDIF DO NnirCurataCursoare ENDIF *===================================================================================== * Scenariul 5: stergere NNIR (-> 0) pe randul unei note cu rulaje - propagare la 0. * Comportament nou (runda 4): garda EMPTY(NVL(tnNnirNou,0)) eliminata din sincronizeaza_nnir, * ramane doar egalitatea - stergerea celulei (0 scris pe rand inainte de LostFocus) trebuie sa * se propage la toate liniile cu valoarea veche, nu doar schimbarile intre doua valori nenule. * Doar la nivel de cursoare (tact/trul) - nu se salveaza in Oracle. *===================================================================================== IF INLIST(tcMode, 'ALL', 'ZERO') LOCAL lnCodZ, lnAnZ, lnLunaZ, lnIdSetZ, lnNnirVechiZ LOCAL lnCntTactVechiZ, lnCntTrulVechiZ, lnCntTactRamasVechiZ, lnCntTrulRamasVechiZ LOCAL lnCntTactZeroZ, lnCntTrulZeroZ LOCAL iz, llGasitZ, lnColCheckZ, lcColNameZ lnCodZ = 1140841 lnAnZ = 2026 lnLunaZ = 7 lnIdSetZ = 209 lnNnirVechiZ = 3 DO NnirConstruiesteCursoare WITH lnCodZ, lnAnZ, lnLunaZ SELECT tact lnCntTactVechiZ = 0 COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactVechiZ SELECT trul lnCntTrulVechiZ = 0 COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulVechiZ Omodif = CREATEOBJECT('frm_modific2024', lnIdSetZ) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'ZERO', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() llGasitZ = .F. lnColCheckZ = 0 FOR iz = 1 TO Omodif.grid1.ColumnCount lcColNameZ = 'Omodif.grid1.Columns(' + TRANSFORM(iz) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColNameZ + '.ControlSource')) llGasitZ = .T. lnColCheckZ = iz ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'ZERO', llGasitZ, 'ControlSource=nnir gasit=' + TRANSFORM(llGasitZ) IF llGasitZ SELECT tact LOCATE FOR NVL(nnir,0) = lnNnirVechiZ IF FOUND() lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.When' &lcCallWhen * simuleaza stergerea celulei: utilizatorul goleste campul, valoarea ajunge 0 REPLACE nnir WITH 0 lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.LostFocus' &lcCallLostFocus SELECT tact lnCntTactRamasVechiZ = 0 COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactRamasVechiZ lnCntTactZeroZ = 0 COUNT FOR NVL(nnir,0) = 0 TO lnCntTactZeroZ DO NnirAssert WITH 'sync_tact_zero', 'ZERO', lnCntTactRamasVechiZ = 0 AND lnCntTactZeroZ >= lnCntTactVechiZ, ; TRANSFORM(lnCntTactRamasVechiZ) + ' randuri tact au ramas pe valoarea veche (asteptat 0), ' + ; TRANSFORM(lnCntTactZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTactVechiZ) + ')' * verificare explicita in cursorul legat de grid-ul de rulaje (pgfArticole.page1.grdRulaje) SELECT trul lnCntTrulRamasVechiZ = 0 COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulRamasVechiZ lnCntTrulZeroZ = 0 COUNT FOR NVL(nnir,0) = 0 TO lnCntTrulZeroZ DO NnirAssert WITH 'sync_trul_zero', 'ZERO', lnCntTrulRamasVechiZ = 0 AND lnCntTrulZeroZ >= lnCntTrulVechiZ, ; TRANSFORM(lnCntTrulRamasVechiZ) + ' randuri trul au ramas pe valoarea veche (asteptat 0), ' + ; TRANSFORM(lnCntTrulZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTrulVechiZ) + ')' ELSE DO NnirAssert WITH 'locate_rand_vechi', 'ZERO', .F., 'nu s-a gasit randul cu nnir vechi in tact' ENDIF ENDIF Omodif.Release() Omodif = NULL ENDIF DO NnirCurataCursoare ENDIF *===================================================================================== * Scenariul 6: nota de inventar (id_set=90101) pe sucursala CURENTA - blocarea NNIR trebuie sa * vina din regula 90101, nu din blocarea pe sucursala din AfterRowColChange. Scenariul 4 ruleaza * pe o nota din alta sucursala, unde SetAll("ReadOnly",.T.) blocheaza oricum tot gridul, deci ar * trece si fara implementare. Aici gnIdSucursala se aliniaza la id_sucursala notei (llReadOnly * iese .F.), se declanseaza AfterRowColChange (care face SetAll dupa Init) si se verifica ca * Column44 ramane blocata cat timp restul coloanelor sunt editabile. *===================================================================================== IF INLIST(tcMode, 'ALL', 'INVENTAR2') LOCAL lnCod6, lnAn6, lnLuna6, lnIdSet6 LOCAL i6, llGasit6, llReadOnly6, lnEditabile6, lnSucVechi6, llMamaVechi6 LOCAL lnIdSucNota6, lcColName6 lnCod6 = 1140716 lnAn6 = 2026 lnLuna6 = 3 lnIdSet6 = 90101 DO NnirConstruiesteCursoare WITH lnCod6, lnAn6, lnLuna6 SELECT tact GO TOP lnIdSucNota6 = NVL(tact.id_sucursala, 0) lnSucVechi6 = gnIdSucursala llMamaVechi6 = glEMama gnIdSucursala = lnIdSucNota6 glEMama = .F. Omodif = CREATEOBJECT('frm_modific2024', lnIdSet6) IF VARTYPE(Omodif) <> 'O' DO NnirAssert WITH 'instantiere', 'INVENTAR2', .F., 'frm_modific2024 nu s-a instantiat' ELSE SELECT tact GO TOP Omodif.grid1.SetFocus Omodif.gridextra1.setup() Omodif.CalculeazaTotal() * AfterRowColChange face SetAll("ReadOnly", llReadOnly) peste blocarea pusa in Init Omodif.grid1.AfterRowColChange(1) llGasit6 = .F. llReadOnly6 = .F. lnEditabile6 = 0 FOR i6 = 1 TO Omodif.grid1.ColumnCount lcColName6 = 'Omodif.grid1.Columns(' + TRANSFORM(i6) + ')' IF NnirEsteColoanaNnir(EVALUATE(lcColName6 + '.ControlSource')) llGasit6 = .T. llReadOnly6 = EVALUATE(lcColName6 + '.ReadOnly') ELSE IF !EVALUATE(lcColName6 + '.ReadOnly') lnEditabile6 = lnEditabile6 + 1 ENDIF ENDIF ENDFOR DO NnirAssert WITH 'coloana_grid', 'INVENTAR2', llGasit6, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit6) * control: daca gridul e blocat integral, testul de blocare NNIR nu dovedeste nimic DO NnirAssert WITH 'grid_editabil', 'INVENTAR2', lnEditabile6 > 0, ; 'coloane editabile (fara nnir): ' + TRANSFORM(lnEditabile6) + ' (asteptat > 0, ' + ; 'gnIdSucursala=' + TRANSFORM(lnIdSucNota6) + ')' IF llGasit6 DO NnirAssert WITH 'coloana_blocata', 'INVENTAR2', llReadOnly6, ; 'id_set=90101 pe sucursala curenta: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly6) ENDIF Omodif.Release() Omodif = NULL ENDIF gnIdSucursala = lnSucVechi6 glEMama = llMamaVechi6 DO NnirCurataCursoare ENDIF DO NnirLog WITH 'REZULTAT SUITA: ' + TRANSFORM(gnPass) + ' PASS, ' + TRANSFORM(gnFail) + ' FAIL' QUIT *===================================================================================== * proceduri ajutatoare (fara CREATEOBJECT - vezi depanare_testare_vfp.md / capcana l: * CREATEOBJECT apelat dintr-o procedura se comporta gresit in acest runtime headless) *===================================================================================== PROCEDURE NnirLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLogFile, 1) ENDPROC PROCEDURE NnirAssert LPARAMETERS tcPas, tcCaz, llOk, tcDetaliu LOCAL lcRez lcRez = IIF(llOk, 'PASS', 'FAIL') IF llOk gnPass = gnPass + 1 ELSE gnFail = gnFail + 1 ENDIF DO NnirLog WITH lcRez + ' [' + tcCaz + '/' + tcPas + '] ' + tcDetaliu ENDPROC PROCEDURE NnirErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO NnirLog WITH 'ERR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg ENDPROC * verifica ca toate variabilele folosite ca ?param in SQL pass-through pe calea de test (env-init, * optiuni_firma, oscrie_in_fisiere, pack_contafin/pack_sesiune) sunt definite - o variabila * PUBLIC lipsa/umbrita da direct dialogul modal "Enter the value for ", nu o eroare catchabila FUNCTION NnirGardaVariabile LOCAL laVar(9), i, llOk laVar(1) = 'gnIdUtil' laVar(2) = 'gnAn' laVar(3) = 'gnLuna' laVar(4) = 'gnIdFirma' laVar(5) = 'gnIdSucursala' laVar(6) = 'gcS' laVar(7) = 'gnIdProgram' laVar(8) = 'gnId_Prg_Owner' laVar(9) = 'gnHandle' llOk = .T. FOR i = 1 TO ALEN(laVar) IF TYPE(laVar(i)) == 'U' DO NnirLog WITH 'FAIL [garda_variabile] ' + laVar(i) + ' nu exista (TYPE U) - ar fi dat dialog modal "Enter the value"' llOk = .F. ENDIF ENDFOR RETURN llOk ENDFUNC * VFP calificat automat ControlSource-ul unui camp simplu cu aliasul cursorului (RecordSource) - * "nnir" definit in sursa apare la runtime ca "tact.nnir" - se accepta ambele forme FUNCTION NnirEsteColoanaNnir LPARAMETERS tcControlSource LOCAL lcCs lcCs = UPPER(ALLTRIM(TRANSFORM(tcControlSource))) RETURN lcCs == 'NNIR' OR RIGHT(lcCs, 5) == '.NNIR' ENDFUNC * construieste tact/trul/trul_obinv exact ca afisjurcom.do_modifica (comun.vc2:2352-2434), * dar pe AN/LUNA proprii notei (nu gnAn/gnLuna) - vezi antetul fisierului PROCEDURE NnirConstruiesteCursoare LPARAMETERS tnCod, tnAn, tnLuna LOCAL lcSql, lnSucces DO NnirCurataCursoare lcSql = [select * from vact_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ; [ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_act] lnSucces = goExecutor.oExecute(lcSql, 'v_act') goExecutor.oReset() IF lnSucces < 0 DO NnirLog WITH 'EROARE construire tact: ' + goExecutor.cEroare RETURN .F. ENDIF SELECT * FROM v_act INTO CURSOR actactan SELECT .F. AS ales, T.*, CAST(0 AS N(2)) AS tipnota FROM actactan T INTO CURSOR tact READWRITE USE IN v_act lcSql = [select * from vrul_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ; [ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul] goExecutor.oExecute(lcSql, 'v_rul') goExecutor.oReset() SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ; FROM v_rul INTO CURSOR RUL_TEMP READWRITE SELECT * FROM RUL_TEMP INTO CURSOR trul READWRITE USE IN v_rul lcSql = [select * from vrul_obinv_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ; [ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul_obinv] goExecutor.oExecute(lcSql, 'v_rul_obinv') goExecutor.oReset() SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ; FROM v_rul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE SELECT * FROM RUL_TEMP_OBINV INTO CURSOR trul_obinv READWRITE USE IN v_rul_obinv SELECT a.*, IIF(NVL(a.id_jtva_coloana,0)=0,0,1) AS cu_tva FROM tact a INTO CURSOR tact READWRITE SELECT tact GO TOP RETURN .T. ENDPROC PROCEDURE NnirCurataCursoare IF USED('tact') USE IN tact ENDIF IF USED('trul') USE IN trul ENDIF IF USED('trul_obinv') USE IN trul_obinv ENDIF IF USED('actactan') USE IN actactan ENDIF IF USED('rul_temp') USE IN rul_temp ENDIF IF USED('rul_temp_obinv') USE IN rul_temp_obinv ENDIF ENDPROC FUNCTION NnirOraCount LPARAMETERS tcSql LOCAL lnVal, llOk lnVal = -1 llOk = goExecutor.oExecuta(tcSql, 'cNnirOraCnt') IF llOk AND USED('cNnirOraCnt') AND RECCOUNT('cNnirOraCnt') > 0 lnVal = cNnirOraCnt.cnt ENDIF IF USED('cNnirOraCnt') USE IN cNnirOraCnt ENDIF RETURN lnVal ENDFUNC * verifica ca in Oracle nu s-a scris nimic dupa editarea DOAR in cursoare (echivalent Renunt) PROCEDURE NnirVerificaOracleNeschimbat LPARAMETERS tnCod, tnNnirVechi, tcCaz LOCAL lnCnt, lcSql lcSql = [select count(*) cnt from act where cod = ] + TRANSFORM(tnCod) + ; [ and nnir = ] + TRANSFORM(tnNnirVechi) lnCnt = NnirOraCount(lcSql) DO NnirAssert WITH 'renunt_neschimbat', tcCaz, lnCnt > 0, ; 'ACT.NNIR in Oracle inainte de Termin ramane ' + TRANSFORM(tnNnirVechi) + ' (' + TRANSFORM(lnCnt) + ' randuri)' ENDPROC * replica blocul de salvare din afisjurcom.do_modifica (comun.vc2:2456-2487): scrie tact/trul/ * trul_obinv in ACT/RUL/RUL_OBINV prin oscrie_in_fisiere + pack_contafin.finalizeaza_modificare_ * nota, verifica in Oracle, apoi reface valoarea originala (revert - baza de test ramane * neschimbata pentru rulari repetate) PROCEDURE NnirSalveazaSiVerifica LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou, tcCaz PRIVATE pnAn, pnLuna, pdDataOra LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql pnAn = tnAn pnLuna = tnLuna pdDataOra = NULL SELECT tact LOCATE FOR NVL(nnir,0) = tnNnirNou lnIdFact = NVL(id_fact, 0) lnIdfactd = NVL(id_factd, 0) llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0) * thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252- * 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct, * fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto SQLSetProp(gnHandle, 'Transactions', 2) * replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul * original, din actactan neatins de editare), abia apoi SCRIE varianta editata SELECT actactan lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul) DO NnirAssert WITH 'oscrie_in_fisiere_sterge', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) IF lnSuccesSalvare > 0 SELECT * FROM tact INTO CURSOR actactan READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan IF llRul SELECT * FROM trul INTO CURSOR rul_temp READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv ENDIF lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul) DO NnirAssert WITH 'oscrie_in_fisiere', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) ENDIF IF lnSuccesSalvare > 0 lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ; TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ; TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;] lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1) DO NnirAssert WITH 'finalizeaza_modificare_nota', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) ENDIF IF lnSuccesSalvare > 0 SQLCOMMIT(gnHandle) ELSE SQLROLLBACK(gnHandle) ENDIF SQLSetProp(gnHandle, 'Transactions', 1) * Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza * COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj * (distincta, nu poate coincide cu date reale), nu dupa COD-ul original. lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou) lnCnt = NnirOraCount(lcSql) DO NnirAssert WITH 'oracle_act_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle' IF RECCOUNT('trul') > 0 lcSql = [select count(*) cnt from rul where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou) lnCnt = NnirOraCount(lcSql) DO NnirAssert WITH 'oracle_rul_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL cu nnir nou in Oracle' ENDIF * curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL - * readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns * sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere) goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta('commit') ENDPROC * varianta pt. scenariul RUL_OBINV (verifica RUL_OBINV in loc de RUL) PROCEDURE NnirSalveazaSiVerificaObinv LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou PRIVATE pnAn, pnLuna, pdDataOra LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql pnAn = tnAn pnLuna = tnLuna pdDataOra = NULL SELECT tact LOCATE FOR NVL(nnir,0) = tnNnirNou lnIdFact = NVL(id_fact, 0) lnIdfactd = NVL(id_factd, 0) llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0) * thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252- * 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct, * fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto SQLSetProp(gnHandle, 'Transactions', 2) * replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul * original, din actactan neatins de editare), abia apoi SCRIE varianta editata SELECT actactan lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul) DO NnirAssert WITH 'oscrie_in_fisiere_sterge', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) IF lnSuccesSalvare > 0 SELECT * FROM tact INTO CURSOR actactan READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan IF llRul SELECT * FROM trul INTO CURSOR rul_temp READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv ENDIF lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul) DO NnirAssert WITH 'oscrie_in_fisiere', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) ENDIF IF lnSuccesSalvare > 0 lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ; TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ; TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;] lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1) DO NnirAssert WITH 'finalizeaza_modificare_nota', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare) ENDIF IF lnSuccesSalvare > 0 SQLCOMMIT(gnHandle) ELSE SQLROLLBACK(gnHandle) ENDIF SQLSetProp(gnHandle, 'Transactions', 1) * Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza * COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj * (distincta, nu poate coincide cu date reale), nu dupa COD-ul original. lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou) lnCnt = NnirOraCount(lcSql) DO NnirAssert WITH 'oracle_act_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle' lcSql = [select count(*) cnt from rul_obinv where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou) lnCnt = NnirOraCount(lcSql) DO NnirAssert WITH 'oracle_rul_obinv_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL_OBINV cu nnir nou in Oracle' * curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL - * readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns * sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere) goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod)) goExecutor.oExecuta('commit') ENDPROC