Borderoul tine per factura ce mai are de completat si daca are articole de gestiune (camp gest, coloana si filtru), coada contabilizeaza in serie facturile bifate si incheie cu un rezumat, iar contul de furnizor/client se alege din planul de conturi. Cheia normalizata de articol, rezolvarea automata a partenerului si anularea in bloc intra tot aici. Pozitia in lista se pastreaza peste reaplicarea filtrului. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aroafxp4z8bmM5oVECZRXY
155 lines
7.5 KiB
Plaintext
155 lines
7.5 KiB
Plaintext
* 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
|