* test_repro_gridprefs_cales.prg * Reproducere IZOLATA (fara Oracle, fara formularul real - instanta ROA_CENTRAL plina, vezi * COMUN\docs\progres.md) a capcanei GridExtras (COMUN\utile\GridExtras\gridextras.vc2, * restoregridpreferences ~1051-1080) pe grdFacturi din frm_import_efactura * (COMUN\clase\anaf_efactura.vc2): un grid de test cu 5 coloane in ACELEASI pozitii relative ca * in clasa reala (cAles=Columns(1), cSemafor=Columns(ColumnCount), la fel ca in grdFacturi - * vezi COMUN\clase\anaf_efactura.vc2:10600 si :10814) + un gridprefs.tmp vechi (3 coloane, * salvat inainte ca ultimele doua sa existe). Corpul lui restoregridpreferences si blocul de * garda de azi (Init, anaf_efactura.vc2:13904-13916) sunt copiate LITERAL aici (nu reimplementate), * aplicate pe grid-ul de test in loc de pe formularul real, ca sa masoare mecanismul fara sa * atinga Oracle. * * Rulare: powershell -ExecutionPolicy Bypass -File test_repro_gridprefs_cales.ps1 SET SAFETY OFF SET TALK OFF CLOSE DATABASES ALL PUBLIC gcUILog, gnPass, gnFail gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_repro_gridprefs_cales_log.txt' gnPass = 0 gnFail = 0 STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT * cursor local, fara Oracle - grid-ul de test nu are nevoie de campuri reale (coloanele sunt * ADD OBJECT/redenumite manual, ca in clasa reala) CREATE CURSOR crsTest (id I) loForm = CREATEOBJECT('Form') loForm.AddObject('grd1', 'grid') loForm.grd1.RecordSourceType = 1 loForm.grd1.RecordSource = 'crsTest' loForm.grd1.ColumnCount = 5 loForm.grd1.Columns(1).Name = 'cAles' loForm.grd1.Columns(2).Name = 'cB' loForm.grd1.Columns(3).Name = 'cC' loForm.grd1.Columns(4).Name = 'cD' loForm.grd1.Columns(5).Name = 'cSemafor' * latimea implicita din clasa reala pentru cAles (COMUN\clase\anaf_efactura.vc2:10603) - 26 loForm.grd1.cAles.Width = 26 DO TLog WITH 'BASELINE ColumnOrder inainte de restore: cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder) lcPrefFile = ADDBS(SYS(2023)) + 'test_repro_gridprefs_cales_prefs.tmp' IF FILE(m.lcPrefFile) DELETE FILE (m.lcPrefFile) ENDIF lcKey = SYS(1272, loForm.grd1) DO TLog WITH 'lcKey=' + m.lcKey * ---------- gridprefs.tmp vechi: 3 coloane, salvate inainte ca ultimele doua (cD/cSemafor) * sa existe. Pozitia 1 = cAles (ColumnOrder=1, Width=26 - identic cu azi, cAles a existat * dintotdeauna primul in grdFacturi) ---------- lcOldPrefs = '1,26,2,90,3,60,' STRTOFILE(m.lcKey + '(' + m.lcOldPrefs + ')' + CHR(13) + CHR(10), m.lcPrefFile, 0) DO TLog WITH 'gridprefs vechi (3 coloane): ' + m.lcOldPrefs * ---------- restoregridpreferences, copiat LITERAL din gridextras.vc2:1058-1077 ---------- Local lcPrefFileContents, lcGridHierarchy, lcPrefs, lcBeginPrefs, lcEndPrefs, loColumn, lnCounter, lnMax, loExc as Exception Local Array laPrefs(1) m.lcPrefFileContents = "" If File(m.lcPrefFile) Try m.lcPrefFileContents = Filetostr(m.lcPrefFile) m.lcGridHierarchy = Sys(1272, loForm.grd1) m.lcBeginPrefs = m.lcGridHierarchy + "(" m.lcEndPrefs = ")" m.lcPrefs = Strextract(m.lcPrefFileContents,m.lcBeginPrefs,m.lcEndPrefs,1,1) If !Empty(m.lcPrefs) =Alines(laPrefs, m.lcPrefs, 7, ",") m.lnMax = Min(loForm.grd1.ColumnCount * 2, Alen(laPrefs)) For m.lnCounter = 1 To m.lnMax Step 2 m.loColumn = loForm.grd1.Columns((m.lnCounter + 1)/2) If Type("m.loColumn.columnorder") = "N" m.loColumn.ColumnOrder = Val(laPrefs(m.lnCounter)) m.loColumn.Width = Val(laPrefs(m.lnCounter + 1)) Endif Endfor Endif CATCH TO m.loExc DO TLog WITH 'EXCEPTIE restoregridpreferences: ' + m.loExc.Message + ' | lnMax=' + TRANSFORM(m.lnMax) + ' Alen(laPrefs)=' + TRANSFORM(Alen(laPrefs)) + ' lnCounter=' + TRANSFORM(m.lnCounter) Endtry ENDIF DO TLog WITH 'DUPA restoregridpreferences (toate): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cAles.Width) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cB.Width) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cC.Width) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cD.Width) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cSemafor.Width) * ---------- blocul de garda EXISTENT azi in Init (anaf_efactura.vc2:13904-13916), copiat * literal, aplicat pe grid-ul de test ---------- Local lcPrefFileContentsSem, lcKeySem, lcPrefsSem Local Array laPrefsSem(1) lcPrefFileContentsSem = "" If File(m.lcPrefFile) lcPrefFileContentsSem = Filetostr(m.lcPrefFile) Endif lcKeySem = Sys(1272, loForm.grd1) + "(" lcPrefsSem = Strextract(m.lcPrefFileContentsSem, m.lcKeySem, ")", 1, 1) IF Empty(m.lcPrefsSem) Or Alines(laPrefsSem, m.lcPrefsSem, 7, ",") < loForm.grd1.ColumnCount * 2 loForm.grd1.cSemafor.ColumnOrder = 1 ENDIF DO TLog WITH 'DUPA garda (toate coloanele): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder) lnOrdAles = loForm.grd1.cAles.ColumnOrder lnWidAles = loForm.grd1.cAles.Width lnOrdSem = loForm.grd1.cSemafor.ColumnOrder lnWidSem = loForm.grd1.cSemafor.Width DO TLog WITH 'MASURAT dupa garda EXISTENTA (doar cSemafor tratat): cAles.ColumnOrder=' + TRANSFORM(lnOrdAles) + ' cAles.Width=' + TRANSFORM(lnWidAles) + ' | cSemafor.ColumnOrder=' + TRANSFORM(lnOrdSem) + ' cSemafor.Width=' + TRANSFORM(lnWidSem) DO TVerdict WITH lnWidAles > 0, 'A1 cAles.Width > 0 (coloana nu e latime 0)', TRANSFORM(lnWidAles) DO TVerdict WITH lnOrdSem = 1, 'A2 cSemafor.ColumnOrder = 1 (garda existenta)', TRANSFORM(lnOrdSem) DO TVerdict WITH lnOrdAles = loForm.grd1.ColumnCount, 'A3 BUG: cAles ajunge ULTIMA coloana (ColumnOrder=ColumnCount) - ColumnOrder e swap, nu set brut: cSemafor.ColumnOrder=1 ii ia locul lui cAles si il trimite la coada', 'cAles=' + TRANSFORM(lnOrdAles) + ' ColumnCount=' + TRANSFORM(loForm.grd1.ColumnCount) * ---------- CAZ B: reparare - aceeasi garda, plus o linie care repozitioneaza cAles pe 2 ---------- loForm.grd1.cAles.ColumnOrder = 2 lnOrdAlesFix = loForm.grd1.cAles.ColumnOrder lnOrdSemFix = loForm.grd1.cSemafor.ColumnOrder DO TLog WITH 'CAZ B (dupa reparare, +cAles.ColumnOrder=2): cAles=' + TRANSFORM(lnOrdAlesFix) + ' cSemafor=' + TRANSFORM(lnOrdSemFix) DO TVerdict WITH lnOrdSemFix = 1, 'B1 cSemafor.ColumnOrder = 1 dupa reparare', TRANSFORM(lnOrdSemFix) DO TVerdict WITH lnOrdAlesFix = 2, 'B2 cAles.ColumnOrder = 2 dupa reparare', TRANSFORM(lnOrdAlesFix) loForm.Release() IF FILE(m.lcPrefFile) DELETE FILE (m.lcPrefFile) ENDIF IF USED('crsTest') USE IN crsTest ENDIF DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) QUIT *********************** PROCEDURE TLog LPARAMETERS tcMsg STRTOFILE(TTOC(DATETIME()) + ' ' + tcMsg + CHR(13) + CHR(10), gcUILog, 1) ENDPROC *********************** PROCEDURE TVerdict LPARAMETERS tlOk, tcNume, tcDetalii IF tlOk gnPass = gnPass + 1 ELSE gnFail = gnFail + 1 ENDIF DO TLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii) ENDPROC *********************** PROCEDURE TErr LPARAMETERS tnError, tcMessage, tcProgram, tnLine DO TLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine) ENDPROC