Files
roaimob/docs/flux-transformare-in-mf.md

26 lines
2.1 KiB
Markdown

# Flux: transformare imobilizare in curs -> imobilizare corporala/necorporala
Cod operatie 3 (vezi enum in `Programe/oproceduri_operatii.prg`).
## UI
- Punct de intrare: `Clase/oimobilizari.vcx`, clasa `frm_introducere`, metoda `inainte_de_do_termin`.
- Declansat cand `Thisform.ntipmodificare = 4`.
- Cursor `crslista3` contine imobilizarile in curs selectate pentru transformare (SCAN peste ele — se pot transforma mai multe simultan intr-un singur activ nou).
## Pasi per imobilizare in curs (in SCAN)
1. `pack_imob.adauga_mf(...)` — creeaza activul NOU (corporal/necorporal); genereaza si prima operatie a acestuia, cu `EXPLICATIA = "TRANSFORMARE IN MF"`.
2. `pack_imob.inreg_transformare_in_mf(...)` — "inchide" imobilizarea in curs veche (`v_id_mf`): actualizeaza `IMOB_NOM_MF`, adauga operatia `id_tip_operatie=3` pe activul vechi, leaga operatia noua de cea veche prin `pack_imob.adauga_la_transformare`.
## Legatura intre activul nou si cel vechi
- `IMOB_TRANSFORMARE_MF` (insert facut de `pack_imob.adauga_la_transformare`) tine perechea `id_mf_nou/id_operatie_nou` <-> `id_mf_vechi/id_operatie_vechi`.
- `inreg_transformare_in_mf` gaseste `id_operatie_nou` prin `select min(id_operatie_mf) from imob_operatii_mf where id_mf = v_id_mf_nou` — presupune ca operatia noua a fost deja inserata (pasul 1) inainte sa ruleze pasul 2. Ordinea pasilor in cod conteaza.
## Capcana descoperita (fix 08/07/2026, v2.1.43)
Valorile numerice mari (NRACT/NRDOC, coloane Oracle `NUMBER(20)`) trebuie convertite explicit cu `STR(x, 20)` cand se construieste SQL ca text (nu parametru legat `?var`). `STR(x)` fara lungime foloseste implicitul VFP (10) si trunchiaza/corupe cifrele — fara eroare vizibila, insertul reuseste cu valoare gresita.
Verifica toate apelurile `STR()`/`ALLTRIM(STR())` dintr-un bloc SQL nou, nu doar unul — e usor sa repari un apel si sa ratezi altul identic in acelasi bloc. Asa a fost bug-ul aici: in acelasi bloc din `inainte_de_do_termin`, doua din trei apeluri (`Str(m.pnnract,20)` pt. `adauga_mf`, `Str(nract,20)` pt. `v_nract`) erau corecte; al treilea (`Str(pnnract)`, pt. `v_nrdoc`) nu avea lungime specificata.