* test_grid_albit_stack.prg - dovada prin rulare (nu analiza statica) a CE declanseaza deschiderea * cautarii partenerului cand se paraseste celula Partener Credit (Grid1.Column10) goala, in * frm_modific2024 (COMUN\clase\omodificari.vc2:6375), ecranul de verificare dupa import. * Instrumentare: mock_cauta_alfa_capture.prg inlocuieste cauta_alfa cu o capturare de stare * (ASTACKINFO/LockScreen/USED/RECCOUNT/RecordSource), fara sa deschida vreun formular - restul * lantului (do_cauta/CautPartenerContabilitate/alege_partener/LostFocus/AfterRowColChange) e REAL. * tact e construit din structura REALA de productie (vact_tot -> ales/Cu_tva/tipnota, exact ca in * Programe\ocont2003.prg::note_fara_predefinire), cu doua randuri: randul 1 cont 4111 (are * config_cont_ireg+coresp_tip_cont) cu partener CREDIT gol, randul 2 cu partener deja completat. * * Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\grid_albit\test_grid_albit_stack.prg" * Iesire: D:\ROA\ROACONT\COMUN\utile\Teste\grid_albit\test_grid_albit_stack_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, gcSyncDir, gnCaptureN, gcCaptureSyncStep, goFormTest gcSyncDir = 'D:\ROA\ROACONT\COMUN\utile\Teste\grid_albit\uisync\' gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\grid_albit\test_grid_albit_stack_log.txt' STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) gnCaptureN = 0 gcCaptureSyncStep = 0 ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT *-- cai complete: la lansare vfp9 -A -T directorul curent NU e cel al scriptului, deci nume goale *-- de PRG nu se gasesc (era cauza dialogului "Program Error: harnesslog.prg does not exist") SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg" ADDITIVE *-- mock-ul cauta_alfa TREBUIE incarcat inaintea test_init_env_auto (care face *-- SET PROCEDURE TO cauta_alfa ADDITIVE) - la nume duplicat VFP tine fisierul incarcat PRIMUL SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\grid_albit\mock_cauta_alfa_capture.prg" ADDITIVE TRY DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9 IF gnHandle <= 0 DO HarnessLog WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')' DO HarnessDone WITH 'error' QUIT ENDIF DO HarnessLog WITH 'mediu initializat gnHandle=' + TRANSFORM(gnHandle) DO BuildTact DO HarnessLog WITH 'tact construit, reccount=' + TRANSFORM(RECCOUNT('tact')) + ' campuri=' + TRANSFORM(FCOUNT('tact')) DO HarnessLog WITH ' rand1: scc=' + ALLTRIM(tact.scc) + ' partc=[' + ALLTRIM(NVL(tact.partc,'')) + ']' GO 2 IN tact DO HarnessLog WITH ' rand2: scc=' + ALLTRIM(tact.scc) + ' partc=[' + ALLTRIM(NVL(tact.partc,'')) + ']' GO 1 IN tact SELECT tact GO TOP goFormTest = CREATEOBJECT('frm_modific2024', 90023, .T., NULL) goFormTest.lActivExtrase = .T. goFormTest.WindowType = 0 goFormTest.Show() DO HarnessLog WITH 'form afisat: LockScreen=' + TRANSFORM(goFormTest.LockScreen) + ' Grid1.RecordSource=[' + goFormTest.Grid1.RecordSource + '] Grid1.RecordSourceType=' + TRANSFORM(goFormTest.Grid1.RecordSourceType) + ' Visible=' + TRANSFORM(goFormTest.Visible) *===================================================================== * SCENARIU A: parasirea celulei Partener Credit (goala) prin LostFocus, urmat de Click pe * butonul "Partener Credit" - tiparul exact din log.txt (dubla cautare) *===================================================================== DO HarnessLog WITH '' DO HarnessLog WITH '=== SCENARIU A: Column10.Text1.LostFocus (partc gol) apoi Command2.Click ===' SELECT tact GO 1 LOCAL lnCapturiA0, lnCapturiA1 lnCapturiA0 = gnCaptureN DO HarnessLog WITH 'A: inainte - LockScreen=' + TRANSFORM(goFormTest.LockScreen) + ' recno=' + TRANSFORM(RECNO('tact')) + ' partc=[' + ALLTRIM(NVL(tact.partc,'')) + ']' *-- incearca intai focus REAL (poate declansa evenimente native suplimentare), apoi apelul direct *-- garanteaza deterministic reproducerea, indiferent daca SetFocus a functionat headless TRY goFormTest.Grid1.SetFocus() goFormTest.Grid1.Column10.Text1.SetFocus() DO HarnessLog WITH 'A: SetFocus real pe Column10.Text1 - OK, ActiveColumn=' + TRANSFORM(goFormTest.Grid1.ActiveColumn) CATCH TO loExFocus DO HarnessLog WITH 'A: SetFocus real a esuat (' + loExFocus.Message + ') - continui cu apelul direct al metodei' ENDTRY goFormTest.Grid1.Column10.Text1.LostFocus() lnCapturiA1 = gnCaptureN DO HarnessLog WITH 'A1 (LostFocus): capturi noi=' + TRANSFORM(lnCapturiA1 - lnCapturiA0) + ' LockScreen dupa=' + TRANSFORM(goFormTest.LockScreen) + ' partc=[' + ALLTRIM(NVL(tact.partc,'')) + ']' goFormTest.Command2.Click() DO HarnessLog WITH 'A2 (Command2.Click): capturi noi=' + TRANSFORM(gnCaptureN - lnCapturiA1) + ' LockScreen dupa=' + TRANSFORM(goFormTest.LockScreen) DO HarnessLog WITH 'A: TOTAL capturi scenariu=' + TRANSFORM(gnCaptureN - lnCapturiA0) + ' (asteptat 2 daca ipoteza H1 se confirma: LostFocus + Click deschid ambele cautarea)' *===================================================================== * SCENARIU B: schimbare de rand, cu randul PARASIT avand partc gol - testeaza (B1) daca un GO * brut pe cursorul legat declanseaza singur vreun eveniment, si (B2) dansul LockScreen din * AfterRowColChange (16083-16097) cand randul recalculat (nRecLipsuri) are partc gol *===================================================================== DO HarnessLog WITH '' DO HarnessLog WITH '=== SCENARIU B: schimbare de rand, randul cu partc gol e cel reverificat de AfterRowColChange ===' SELECT tact GO 1 LOCAL lnCapturiB0, lnCapturiB1 lnCapturiB0 = gnCaptureN TRY goFormTest.Grid1.Column10.Text1.SetFocus() CATCH TO loExFocus ENDTRY GO 2 IN tact lnCapturiB1 = gnCaptureN DO HarnessLog WITH 'B1 (GO 2 brut, fara apel explicit): capturi noi=' + TRANSFORM(lnCapturiB1 - lnCapturiB0) + ' LockScreen=' + TRANSFORM(goFormTest.LockScreen) goFormTest.nRecLipsuri = 1 && "randul parasit" pe care AfterRowColChange il reverifica e randul 1 (partc gol) goFormTest.cSemnLipsuri = 'FORTAT-DIFERIT-CA-SA-INTRE-PE-RAMURA' DO HarnessLog WITH 'B2: inainte de AfterRowColChange - LockScreen=' + TRANSFORM(goFormTest.LockScreen) + ' recno curent=' + TRANSFORM(RECNO('tact')) + ' nRecLipsuri=' + TRANSFORM(goFormTest.nRecLipsuri) goFormTest.Grid1.AfterRowColChange(10) DO HarnessLog WITH 'B2 (AfterRowColChange explicit): capturi noi=' + TRANSFORM(gnCaptureN - lnCapturiB1) + ' LockScreen dupa=' + TRANSFORM(goFormTest.LockScreen) + ' recno curent=' + TRANSFORM(RECNO('tact')) DO HarnessLog WITH 'B: TOTAL capturi scenariu=' + TRANSFORM(gnCaptureN - lnCapturiB0) *===================================================================== * SCENARIU C: Click direct pe buton, FARA ca focusul sa fi trecut prin celula (fara LostFocus) *===================================================================== DO HarnessLog WITH '' DO HarnessLog WITH '=== SCENARIU C: Command2.Click direct, focus pe alt control (nu in celula Partener Credit) ===' SELECT tact GO 1 LOCAL lnCapturiC0 lnCapturiC0 = gnCaptureN TRY goFormTest.but_renunt1.SetFocus() CATCH TO loExFocus ENDTRY goFormTest.Command2.Click() DO HarnessLog WITH 'C (Command2.Click direct): capturi noi=' + TRANSFORM(gnCaptureN - lnCapturiC0) + ' LockScreen dupa=' + TRANSFORM(goFormTest.LockScreen) DO HarnessLog WITH '' DO HarnessLog WITH '=== REZULTAT: total capturi cauta_alfa=' + TRANSFORM(gnCaptureN) + ' ===' DO HarnessDone WITH 'done' DO HarnessLog WITH 'TOTAL: test terminat fara exceptie' CATCH TO loEx DO HarnessLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure DO HarnessDone WITH 'error' ENDTRY QUIT ********************************************************** * tact - structura REALA de productie (vact_tot -> ales/Cu_tva/tipnota), ca in * Programe\ocont2003.prg::note_fara_predefinire (liniile 1007-1082). Doua randuri: primul cu * cont 4111 (config_cont_ireg + coresp_tip_cont populate pe schema de test) si partener CREDIT * gol - tinta bugului; al doilea cu partener deja completat, doar ca sa existe "schimbare de rand". PROCEDURE BuildTact LOCAL llSucces IF USED('tact') USE IN tact ENDIF IF USED('actactan') USE IN actactan ENDIF IF USED('crsJtvaTemp') USE IN crsJtvaTemp ENDIF *-- Init/Load (frm_modific2024) citesc crsJtvaTemp - exact apelul din ocont2003.prg:997 update_jtva_coloane("", "crsJtvaTemp", 1) llSucces = goExecutor.oExecuta("select * from vact_tot where 1=2", "v_act") IF !llSucces DO HarnessLog WITH 'FAIL: vact_tot inaccesibil - ' + goExecutor.cEroare RETURN .F. ENDIF SELECT * FROM v_act INTO CURSOR actactan READWRITE USE IN v_act SELECT .F. AS ales, IIF(EMPTY(NVL(a.id_jtva_coloana,0)),0,1) AS Cu_tva, CAST(0 AS N(2)) AS tipnota, a.* FROM actactan a INTO CURSOR tact READWRITE USE IN actactan *-- trul/trul_obinv - formularul le foloseste (pgfArticole) chiar daca randurile de tact nu au *-- rulaje; goale, aceeasi structura ca in ocont2003.prg::note_fara_predefinire (1017-1044) IF USED('trul') USE IN trul ENDIF llSucces = goExecutor.oExecuta("select * from vrul_tot where 1=2", "v_rul") IF !llSucces DO HarnessLog WITH 'FAIL: vrul_tot inaccesibil - ' + goExecutor.cEroare RETURN .F. ENDIF SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva FROM v_rul INTO CURSOR trul READWRITE USE IN v_rul IF USED('trul_obinv') USE IN trul_obinv ENDIF llSucces = goExecutor.oExecuta("select * from vrul_obinv_tot where 1=2", "v_rul_obinv") IF !llSucces DO HarnessLog WITH 'FAIL: vrul_obinv_tot inaccesibil - ' + goExecutor.cEroare RETURN .F. ENDIF SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva FROM v_rul_obinv INTO CURSOR trul_obinv READWRITE USE IN v_rul_obinv SELECT tact APPEND BLANK REPLACE dataireg WITH DATETIME(), dataact WITH DATETIME(), datascad WITH DATETIME() + 30 * 86400 REPLACE id_sucursala WITH NVL(gnIdSucursala, 0), sters WITH 0, an WITH gnAn, luna WITH gnLuna REPLACE scd WITH '628', scc WITH '4111', partd WITH 'CHELTUIALA TEST', id_partd WITH 0 REPLACE partc WITH '', id_partc WITH 0, suma WITH 100.00, nract WITH 1, cod WITH 1 APPEND BLANK REPLACE dataireg WITH DATETIME(), dataact WITH DATETIME(), datascad WITH DATETIME() + 30 * 86400 REPLACE id_sucursala WITH NVL(gnIdSucursala, 0), sters WITH 0, an WITH gnAn, luna WITH gnLuna REPLACE scd WITH '5121', scc WITH '4111', partd WITH '', id_partd WITH 0 REPLACE partc WITH 'PARTENER DEJA ALES', id_partc WITH 1, suma WITH 50.00, nract WITH 2, cod WITH 1 GO TOP RETURN .T. ENDPROC ********************************************************** PROCEDURE PrErrLocal LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo LOCAL lcMsg lcMsg = 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo) IF TYPE('gcUILog') = 'C' AND !EMPTY(gcUILog) SET SAFETY OFF STRTOFILE(IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + lcMsg + CHR(13) + CHR(10), gcUILog) ENDIF ENDPROC