Achizitie import unificata (ROAGEST): ointroduceri, teste UI, documentatie
- import_nota / import_adauga_factura: flux unificat note contabile + articole, sincronizare automata, total factura automat, TVA impartit pe conturile creditoare ale notelor (rundele 1-31) - runda 32: totalurile import_nota pe _label/_textbox din _baza.vcx (Arial 10), fara containerele clb_tx_simplu si fara bifa "Recalculeaza TVA" (recalcul mereu automat); "Sincronizeaza facturile secundare" mutata sub butoane - utile/Teste: harness UI VFP headless (vfp_ui_harness.ps1, ui_harness.prg, precompilare, mock-uri) in radacina; suitele e2e pentru achizitia din import grupate in utile/Teste/achizitie_import/ - docs: flux editare text vcx/scx, testare-ui-vfp si testare-vfp-mcp (mutate din ROAGEST, general valabile), inventar comun, orchestrare subagenti, conventie GO recno, depanare testare VFP Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019DGibQKa5uK4P2TNSFFQNh
This commit is contained in:
@@ -18,6 +18,9 @@ max o linie, modificari minime).
|
||||
- `COMUN\utile\Teste\test_repro_cnrcrt_footer.prg` - exemplu complet de harness:
|
||||
init mediu -> replicare flux (cursoarele din modificanote) -> instantiere forma reala ->
|
||||
executie pas cu pas cu logare -> verdict OK/BUG. Copiaza-i structura pentru bug-uri noi.
|
||||
- `COMUN\utile\Teste\test_repro_import_nota.prg` - harness instantiere import_nota
|
||||
(ROAGEST) fara Oracle: cursori dummy + goExecutor dummy; parametrul LPARAMETERS
|
||||
incarca o copie de clasa din scratchpad in loc de cea reala (bisectie A/B).
|
||||
- `COMUN\utile\Teste\teste_roacont.prg` si `COMUN\utile\Teste\test.prg` - teste ad hoc istorice.
|
||||
- Mediu de test standard: server `CENTRAL`, schema `MARIUSM_AUTO`, parola schemei
|
||||
`ROMFASTSOFT`; utilizator de aplicatie "MARIUS M" / parola "123" (unde e nevoie de login).
|
||||
@@ -76,6 +79,15 @@ Cand un bug apare "de azi", compara comportamentul cu clasa veche fara a atinge
|
||||
4. cand difera rezultatul, cauza e in diff-ul acelei clase (sau intr-un defect latent
|
||||
pe care noul cod il activeaza - vezi capcanele de mai jos).
|
||||
|
||||
Varianta pe backup-uri de runda (fara git): copiaza `*.vc2.pre_rundaN.bak` din cache
|
||||
intr-un folder temp ca `ointroduceri.vc2`, regenereaza binarul direct cu
|
||||
`FoxBin2Prg.EXE "<temp>\fisier.vc2" "" "" "" 1 0 1` (pune `..\include\foxpro.h` langa,
|
||||
altfel .ERR), apoi in harness incarca DOAR copia (nu ADDITIVE peste cea reala -
|
||||
rezolvarea intre doua classlib-uri cu aceeasi clasa nu e garantata => fals negativ).
|
||||
Bisectie in interiorul unei runde: neutralizeaza valori IN LOC (ControlSource ->
|
||||
camp simplu, sterge linii de proprietate din mijlocul blocului) - NU sterge
|
||||
obiecte/coloane din ADD OBJECT (strica structura: "Cannot add this object to a Grid").
|
||||
|
||||
## 5. Capcane VFP descoperite (de verificat la bug-uri asemanatoare)
|
||||
|
||||
- `SELECT ... INTO CURSOR` NU mosteneste indecsii cursorului sursa. Orice
|
||||
@@ -93,8 +105,64 @@ Cand un bug apare "de azi", compara comportamentul cu clasa veche fara a atinge
|
||||
- Fix-ul unui typo intr-o clasa partajata poate activa defecte latente in aval
|
||||
(codul care nu rulase niciodata incepe sa ruleze). La regresii dupa fix-uri
|
||||
"inofensive" in COMUN, cauta defectul latent, nu doar diff-ul.
|
||||
- **Coloana de grid cu ControlSource EXPRESIE (nu camp) cere `Bound = .F.`**.
|
||||
Fara el: eroare 9 "Data type mismatch" la CREATEOBJECT-ul formei (faza de
|
||||
constructie, raportata la linia apelanta, Details gol). Caz: import_nota.GridArt
|
||||
Column7/8/9 cu `round(...)` (ROAGEST 16.07.2026); model corect: Grid1.cTaxCode
|
||||
(`Bound = .F.` + expresie, functional de ani).
|
||||
|
||||
## 6. Studiu de caz: "Property CNRCRT is not found" (15.07.2026)
|
||||
## 6. Capcane la SCRIEREA scriptului de test (nu ale bug-ului investigat)
|
||||
|
||||
Descoperite depanand harness-ul pentru "Data type mismatch" la `CREATEOBJECT('IMPORT_nota',...)`
|
||||
(ROAGEST, 16.07.2026) - de verificat oricand un script de test nou pare "agatat".
|
||||
|
||||
- **`DEFINE CLASS ... ENDDEFINE` NU poate sta la mijlocul programului principal.**
|
||||
Daca il pui intre alte instructiuni de top-level (ex. clasa dummy pentru un
|
||||
`goExecutor` de test, definita devreme "ca sa fie la indemana"), VFP compileaza
|
||||
gresit: TOATE liniile de DUPA `ENDDEFINE` dau "Statement is not in a procedure"
|
||||
(vezi `<script>.ERR` generat la compilare). Simptom in productie: `vfp9.exe`
|
||||
pare agatat la nesfarsit - CPU ~0, nicio fereastra de dialog vizibila (verificat
|
||||
si prin enumerare Win32 a ferestrelor procesului), pentru ca de fapt a rulat
|
||||
doar liniile de dinaintea `DEFINE CLASS` si s-a oprit silentios dupa eroarea de
|
||||
compilare, fara sa ajunga la `QUIT`. Fix: muta orice `DEFINE CLASS` auxiliar
|
||||
(dummy executor, helpere) la FINALUL fisierului, dupa `QUIT`, langa celelalte
|
||||
`PROCEDURE` - e locul standard pentru cod suport intr-un script de test.
|
||||
- **Diagnostic rapid compilare vs blocaj real**: cand un script "nu se termina",
|
||||
verifica INTAI daca a aparut `<script>.ERR` langa `.prg` (log de compilare,
|
||||
vezi si `roagest.ERR`/`log.txt` in radacina proiectului) - inseamna ca s-a
|
||||
oprit la compilare, nu ca ruleaza/asteapta ceva. Daca nu exista `.ERR`, verifica
|
||||
CPU-ul procesului (`Get-Process | select CPU`): ~0 dupa cateva secunde inseamna
|
||||
ca asteapta un dialog modal (foloseste enumerarea Win32 de ferestre de mai jos
|
||||
ca sa confirmi), nu ca proceseaza ceva lent.
|
||||
- **Enumerare ferestre Win32 pentru un proces "agatat"** (utila cand nu esti sigur
|
||||
daca exista un dialog modal ascuns): `Add-Type` cu `EnumWindows`/`GetWindowText`/
|
||||
`GetWindowThreadProcessId` din `user32.dll`, filtrat pe PID-ul lui `vfp9.exe`.
|
||||
Daca vezi doar fereastra principala + "Command", nu e dialog - cauta alta cauza
|
||||
(vezi punctul de mai sus).
|
||||
- **`STRTOFILE` inainte de `SET SAFETY OFF` = dialog modal "Overwrite?"** daca
|
||||
fisierul de log exista deja (sub `-A`, SAFETY porneste ON). Pune `SET SAFETY OFF`
|
||||
PRIMA linie sau sterge log-ul inainte de fiecare rulare.
|
||||
- **`-A -T` sunt obligatorii impreuna** la lansare headless (`-A` ignora config.fpw,
|
||||
`-T` sare peste splash screen-ul de start) - fara `-T` procesul ramane agatat pe
|
||||
ecranul de intampinare, identic ca simptom cu o eroare de compilare (CPU ~0,
|
||||
fara log). Confirma mereu care e cauza inainte de a schimba scriptul.
|
||||
- **`goExecutor`/alte dependinte "dummy"**: `CREATEOBJECT('Custom')` + `AddProperty()`
|
||||
poate adauga doar PROPRIETATI, nu METODE. Daca clasa testata apeleaza
|
||||
`goExecutor.oExecute(...)`/`oExecuta(...)`, dummy-ul trebuie sa fie o clasa
|
||||
proprie (`DEFINE CLASS dummyexecutor AS Custom` cu `PROCEDURE oExecute`/
|
||||
`oExecuta` reale), nu un `Custom` cu proprietati adaugate.
|
||||
- **Erorile de instantiere (`CREATEOBJECT`) raportate la linia CREATEOBJECT, nu la
|
||||
`.Init`**: cand `ON ERROR`/`CATCH` arata `Procedure` = scriptul apelant (nu
|
||||
`NUMECLASA.INIT`), inseamna ca eroarea vine din evaluarea proprietatilor/
|
||||
obiectelor din DEFINITIA clasei (`ADD OBJECT ... WITH RowSource = ...`,
|
||||
`ControlSource` de coloana grid evaluat ca expresie, etc.) - controale native
|
||||
VFP (ex. combobox cu `RowSourceType=6` Fields) isi rezolva bind-ul la
|
||||
CONSTRUCTIE, inainte sa apuce sa ruleze `PROCEDURE Init` a formei. Cand
|
||||
reproduci un astfel de bug cu un mediu minimal, o "Alias is not found" pe un
|
||||
cursor pe care nu l-ai deschis tu confirma mecanismul (faza de instantiere),
|
||||
chiar daca nu e mesajul EXACT din bug-ul original.
|
||||
|
||||
## 7. Studiu de caz: "Property CNRCRT is not found" (15.07.2026)
|
||||
|
||||
Lant complet: `frm_import_extrase_banca.modificanote` copia `crsJTVATemp` fara index
|
||||
(defect latent) -> coloana `cExplicatieTVA` din `frm_modific2024.grdRulaje` face
|
||||
|
||||
Reference in New Issue
Block a user