2.1 KiB
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, clasafrm_introducere, metodainainte_de_do_termin. - Declansat cand
Thisform.ntipmodificare = 4. - Cursor
crslista3contine 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)
pack_imob.adauga_mf(...)— creeaza activul NOU (corporal/necorporal); genereaza si prima operatie a acestuia, cuEXPLICATIA = "TRANSFORMARE IN MF".pack_imob.inreg_transformare_in_mf(...)— "inchide" imobilizarea in curs veche (v_id_mf): actualizeazaIMOB_NOM_MF, adauga operatiaid_tip_operatie=3pe activul vechi, leaga operatia noua de cea veche prinpack_imob.adauga_la_transformare.
Legatura intre activul nou si cel vechi
IMOB_TRANSFORMARE_MF(insert facut depack_imob.adauga_la_transformare) tine perecheaid_mf_nou/id_operatie_nou<->id_mf_vechi/id_operatie_vechi.inreg_transformare_in_mfgasesteid_operatie_nouprinselect 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.