*** ofacturare_editare *!* 09.08.2026 *!* marius.mutu *!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor, *!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val), *!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc si id_vanzare_set/pret_achizitie, *!* pentru corectia verdictului RUL pe liniile nestocate si pentru liniile din seturi), pregatirea *!* cursorului de articole inainte de Createobject(frm_modific2024), construirea obiectului poArticol *!* pentru adaugarea unei linii noi prin dialogul frm_articol_factura (populat cu valuta documentului *!* cand acesta e in valuta) si scrierea in VANZARI_DETALII a liniilor editate/adaugate/sterse *!* parametru: id_fact *!* verifica daca factura cu id_fact dat a fost deja trimisa in eFactura (anaf_efactura) FUNCTION EsteInEFactura LPARAMETERS tnIdFact LOCAL lcSql, lnEFactura, llSucces lnEFactura = 0 lcSql = [select count(*) as lneFactura from anaf_efactura where id_fact = ] + Alltrim(Str(Nvl(m.tnIdFact,0))) llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @lnEFactura) RETURN (Nvl(m.lnEFactura,0) > 0) ENDFUNC && EsteInEFactura *!* parametri: cod, an, luna, arata si randurile sterse (implicit .F.) *!* incarca cursoarele notei (tact) si ale rulajelor (trul, trul_obinv), cu recalculul de *!* valoare/valtva/valoarev/valtvav pe randurile goale; raman deschise READWRITE pe seama apelantului *!* pe eroare Oracle intoarce .F. si inchide ce a deschis pana atunci FUNCTION IncarcaCursoareModificareNota LPARAMETERS tnCod, tnAn, tnLuna, tlAratasterse LOCAL lcConditieSters, lcSql, lcCursor, lnSucces IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF IF Used('rul_temp') Use In rul_temp ENDIF IF Used('trul') Use In trul ENDIF IF Used('rul_temp_obinv') Use In rul_temp_obinv ENDIF IF Used('trul_obinv') Use In trul_obinv ENDIF lcConditieSters = IIF(m.tlAratasterse, [ ], [ STERS = 0 AND ]) lcSql = [select * from vact_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_act] lcCursor = [v_act] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") RETURN .F. ENDIF SELECT * FROM v_act INTO CURSOR actactan SELECT .F. AS ales, T.*, CAST(0 AS N(2)) AS tipnota FROM actactan T INTO CURSOR tact READWRITE USE IN v_act IF lnSucces > 0 lcSql = [select * from vrul_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul] lcCursor = [v_rul] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF RETURN .F. ENDIF IF lnSucces > 0 UPDATE v_rul SET valoare = ROUND(IIF(cant<>0, cant, cante)*pret,m.gnPC) WHERE EMPTY(NVL(valoare,0)) UPDATE v_rul SET valtva = ROUND(IIF(cant<>0, cant, cante)*pret * (IIF(!EMPTY(NVL(proc_tva,0)), proc_tva, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtva,0)) UPDATE v_rul SET valoarev = ROUND(IIF(cant<>0, cant, cante)*pretv,m.gnPC) WHERE EMPTY(NVL(valoarev,0)) UPDATE v_rul SET valtvav = ROUND(IIF(cant<>0, cant, cante)*pretv * (IIF(!EMPTY(NVL(proc_tvav,0)), proc_tvav, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtvav,0)) SELECT *, ; valoare + valtva AS valoarectva, ; valoarev + valtvav AS valoarevctva ; FROM v_rul ; INTO CURSOR RUL_TEMP READWRITE SELECT * FROM RUL_TEMP INTO CURSOR trul READWRITE USE IN v_rul lcSql = [select * from vrul_obinv_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul_obinv] lcCursor = [v_rul_obinv] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF IF Used('rul_temp') Use In rul_temp ENDIF IF Used('trul') Use In trul ENDIF RETURN .F. ENDIF ENDIF IF lnSucces > 0 UPDATE v_rul_obinv SET valoare = ROUND(IIF(cant<>0, cant, cante)*pret,m.gnPC) WHERE EMPTY(NVL(valoare,0)) UPDATE v_rul_obinv SET valtva = ROUND(IIF(cant<>0, cant, cante)*pret * (IIF(!EMPTY(NVL(proc_tva,0)), proc_tva, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtva,0)) UPDATE v_rul_obinv SET valoarev = ROUND(IIF(cant<>0, cant, cante)*pretv,m.gnPC) WHERE EMPTY(NVL(valoarev,0)) UPDATE v_rul_obinv SET valtvav = ROUND(IIF(cant<>0, cant, cante)*pretv * (IIF(!EMPTY(NVL(proc_tvav,0)), proc_tvav, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtvav,0)) SELECT *, ; valoare + valtva AS valoarectva, ; valoarev + valtvav AS valoarevctva ; FROM v_rul_obinv ; INTO CURSOR RUL_TEMP_OBINV READWRITE SELECT * FROM RUL_TEMP_OBINV INTO CURSOR trul_obinv READWRITE USE IN v_rul_obinv ENDIF ENDIF RETURN .T. ENDFUNC && IncarcaCursoareModificareNota *!* creeaza cursorul tvanz gol (structura VANZARI redusa) - fallback la eroare Oracle sau cod/data lipsa FUNCTION CreeazaCursorTvanzGol IF Used('tvanz') Use In tvanz ENDIF CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4), ; in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL) ENDFUNC && CreeazaCursorTvanzGol *!* parametri: cod, nract, serie_act, dataact (din cursorul notei, ex. tact) *!* incarca in tvanz randul din VANZARI al notei; cod singur nu e unic, de aceea filtrul cere tot setul *!* tvanz ramane deschis READWRITE, cu 0 randuri daca nu s-a gasit sau la eroare Oracle FUNCTION IncarcaVanzareNota LPARAMETERS tnCod, tnNract, tcSerieAct, tdDataAct LOCAL lcSql, lnSucces, lcSerieAct IF Used('v_vanz') Use In v_vanz ENDIF IF Empty(m.tnCod) OR Empty(m.tdDataAct) CreeazaCursorTvanzGol() RETURN .T. ENDIF lcSerieAct = Alltrim(Nvl(m.tcSerieAct,"")) lcSql = [select v.id_vanzare, v.tip, v.discount, v.total_fara_tva, v.total_tva, v.total_cu_tva, v.curs, v.multiplicator, ] + ; [v.in_valuta, v.id_valuta, nv.nume_val from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ; [ and Nvl(v.numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ; [ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0] lnSucces = goExecutor.oExecute(lcSql,[v_vanz]) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") CreeazaCursorTvanzGol() RETURN .T. ENDIF IF Used('tvanz') Use In tvanz ENDIF SELECT * FROM v_vanz INTO CURSOR tvanz READWRITE USE IN v_vanz RETURN .T. ENDFUNC && IncarcaVanzareNota *!* parametru: alias cu randurile notei (tact), cu campurile cod/nract/serie_act/dataact/sters *!* incearca toate combinatiile distincte (cod, nract, serie_act, dataact) din alias (sters=0) pana *!* gaseste un rand in VANZARI; lasa workarea si pozitia curenta neschimbate, .F. cu tvanz gol daca nu gaseste FUNCTION IncarcaVanzareDinNota LPARAMETERS tcAliasAct LOCAL lnAreaOrigine, lnRecnoOrigine, llGasit lnAreaOrigine = Select() llGasit = .F. IF Empty(m.tcAliasAct) OR !Used(m.tcAliasAct) OR Reccount(m.tcAliasAct) = 0 CreeazaCursorTvanzGol() IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN .F. ENDIF lnRecnoOrigine = Recno(m.tcAliasAct) IF Used('tmp_triplete_pozvanz') Use In tmp_triplete_pozvanz ENDIF *!* cod se ia tot din cursor, nu de pe randul curent - acesta poate fi la EOF dupa CalculeazaTotal SELECT DISTINCT cod, nract, serie_act, dataact FROM (m.tcAliasAct) WHERE sters = 0 INTO CURSOR tmp_triplete_pozvanz READWRITE SELECT tmp_triplete_pozvanz SCAN IncarcaVanzareNota(cod, nract, serie_act, dataact) IF Reccount('tvanz') = 1 llGasit = .T. EXIT ENDIF ENDSCAN IF Used('tmp_triplete_pozvanz') Use In tmp_triplete_pozvanz ENDIF IF !m.llGasit CreeazaCursorTvanzGol() ENDIF IF Used(m.tcAliasAct) IF m.lnRecnoOrigine > 0 AND m.lnRecnoOrigine <= Reccount(m.tcAliasAct) Go (m.lnRecnoOrigine) In (m.tcAliasAct) ELSE *!* pozitia initiala era EOF (Recno() peste Reccount()) - se restaureaza tot la EOF Go Bottom In (m.tcAliasAct) Skip In (m.tcAliasAct) ENDIF ENDIF IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN m.llGasit ENDFUNC && IncarcaVanzareDinNota *!* parametru: alias destinatie (implicit tvd) *!* creeaza gol, sub acel alias, un cursor cu structura view-ului VVANZARI_ARTICOLE FUNCTION CreeazaCursorArticoleGol LPARAMETERS tcAlias LOCAL lcAlias lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'tvd') IF Used(m.lcAlias) Use In (m.lcAlias) ENDIF CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol I NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ; discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ; taxcode I NULL, lot C(20) NULL, sters I NULL, id_vanzare_set I NULL, pret_achizitie N(14,4) NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ; lmodificat L, valoare N(14,2), in_stoc I NULL) ENDFUNC && CreeazaCursorArticoleGol *!* creeaza cursorul tvd gol, cu structura view-ului VVANZARI_ARTICOLE FUNCTION CreeazaCursorTvdGol CreeazaCursorArticoleGol('tvd') ENDFUNC && CreeazaCursorTvdGol *!* parametri: id_vanzare, alias destinatie (implicit tvd) *!* incarca in alias liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE *!* aliasul ramane deschis READWRITE, cu 0 randuri la eroare Oracle FUNCTION IncarcaArticoleFactura LPARAMETERS tnIdVanzare, tcAliasDestinatie LOCAL lcSql, lnSucces, lcAlias lcAlias = IIF(Type('tcAliasDestinatie') = 'C' AND !Empty(m.tcAliasDestinatie), m.tcAliasDestinatie, 'tvd') IF Used('v_vd') Use In v_vd ENDIF *!* in_stoc vine din NOM_ARTICOLE (viewul nu-l expune) - corectia verdictului RUL pe liniile nestocate lcSql = [select v.*, na.in_stoc from vvanzari_articole v left join nom_articole na on na.id_articol = v.id_articol ] + ; [where v.id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and v.sters = 0 order by v.id_vanzare_det] lnSucces = goExecutor.oExecute(lcSql,[v_vd]) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") CreeazaCursorArticoleGol(m.lcAlias) RETURN .T. ENDIF IF Used(m.lcAlias) Use In (m.lcAlias) ENDIF *!* valoarea cu TVA pe linie, cu discountul unitar scazut: pret_cu_tva e flag (0/1), nu pret - *!* formula difera dupa el, ca la calculeaza_valori_articol SELECT *, .F. AS lmodificat, ; ROUND(NVL(cantitate,0) * IIF(NVL(pret_cu_tva,0) = 0, (NVL(pret,0) - NVL(discount_unitar,0)) * NVL(proc_tvav,1), ; NVL(pret,0) - NVL(discount_unitar,0)), gnPC) AS valoare ; FROM v_vd INTO CURSOR (m.lcAlias) READWRITE USE IN v_vd RETURN .T. ENDFUNC && IncarcaArticoleFactura *!* parametru: alias cu randurile notei (tact) *!* descopera randul din VANZARI corespunzator notei (IncarcaVanzareDinNota) si, daca il gaseste, *!* pre-incarca liniile in crsArticoleFactura - apelat inainte de Createobject([frm_modific2024]), *!* ca Load() sa lege grid-ul o singura data pe cursorul deja plin; daca nu gaseste randul nu *!* creeaza crsArticoleFactura, Show() ramane fallback-ul; nu strica workarea/pozitia apelantului FUNCTION PregatesteArticoleFacturaEditare LPARAMETERS tcAliasAct LOCAL lnAreaOrigine, llGasit lnAreaOrigine = Select() llGasit = IncarcaVanzareDinNota(m.tcAliasAct) IF m.llGasit IncarcaArticoleFactura(tvanz.id_vanzare, 'crsArticoleFactura') ENDIF IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN m.llGasit ENDFUNC && PregatesteArticoleFacturaEditare *!* parametri: id_articol/codmat/denumire/um/cont, alese din nomenclator (caut_articol, fara stoc); *!* optional, cand documentul e in valuta: in_valuta/curs/multiplicator/nume_val/id_valuta *!* construieste obiectul poArticol gol, cu toate proprietatile citite de frm_articol_factura *!* (Createobject/Init/inainte_de_do_termin) - articol nou, cantitate implicita 1, fara TVA aleasa *!* (proc_tvav ramane NULL, ca Init sa aleaga singur cota standard curenta); daca in_valuta e adevarat, *!* tip_valuta/Curs/multiplicator/nume_val/id_valuta se populeaza cu valorile documentului FUNCTION CreeazaPoArticolNouTvd LPARAMETERS tnIdArticol, tcCodmat, tcDenumire, tcUm, tcCont, tlInValutaDoc, tnCursDoc, tnMultDoc, tcNumeValDoc, tnIdValutaDoc LOCAL loArticol, lnI LOCAL ARRAY laPropN(49) laPropN( 1)='id_articol' laPropN( 2)='Id_Pol' laPropN( 3)='id_gestiune' laPropN( 4)='id_c' laPropN( 5)='id_ctr' laPropN( 6)='id_valuta' laPropN( 7)='id_valuta_d' laPropN( 8)='id_lucrare_rez' laPropN( 9)='id_part_rez' laPropN(10)='id_jtva_coloana' laPropN(11)='taxcode' laPropN(12)='opt_facturare' laPropN(13)='gestionabil' laPropN(14)='tip_valuta' laPropN(15)='cantitate' laPropN(16)='Curs' laPropN(17)='multiplicator' laPropN(18)='pret_achizitie' laPropN(19)='pretv_orig' laPropN(20)='pretd' laPropN(21)='proc_tvav' laPropN(22)='preturi_cu_tva' laPropN(23)='pretftva' laPropN(24)='pretftva_val' laPropN(25)='pretctva' laPropN(26)='pretctva_val' laPropN(27)='tva' laPropN(28)='tva_val' laPropN(29)='discount_unitar' laPropN(30)='discount_unitar_val' laPropN(31)='discount_unitar_ctva' laPropN(32)='discount_unitar_ctva_val' laPropN(33)='valftva' laPropN(34)='valtva' laPropN(35)='valctva' laPropN(36)='valdiscountftva' laPropN(37)='valdiscounttva' laPropN(38)='valdiscountctva' laPropN(39)='valdiminuatftva' laPropN(40)='valdiminuattva' laPropN(41)='valdiminuatctva' laPropN(42)='vvalftva' laPropN(43)='vvaltva' laPropN(44)='vvalctva' laPropN(45)='vvaldiscountftva' laPropN(46)='vvaldiscounttva' laPropN(47)='vvaldiscountctva' laPropN(48)='vvaldiminuatftva' laPropN(49)='vvaldiminuattva' LOCAL ARRAY laPropC(11) laPropC( 1)='codmat' laPropC( 2)='codmatf' laPropC( 3)='denumire' laPropC( 4)='um' laPropC( 5)='serie' laPropC( 6)='lot' laPropC( 7)='explicatie' laPropC( 8)='numar_contract' laPropC( 9)='codbare' laPropC(10)='nume_val' laPropC(11)='Cont' loArticol = Createobject('Empty') FOR lnI = 1 TO ALEN(laPropN) =AddProperty(loArticol, laPropN(lnI), 0) ENDFOR =AddProperty(loArticol, 'vvaldiminuatctva', 0) FOR lnI = 1 TO ALEN(laPropC) =AddProperty(loArticol, laPropC(lnI), '') ENDFOR loArticol.id_articol = Nvl(m.tnIdArticol, 0) loArticol.id_ctr = .Null. loArticol.id_gestiune = -1000 loArticol.gestionabil = 0 loArticol.tip_valuta = 0 loArticol.Curs = 1 loArticol.multiplicator = 1 loArticol.cantitate = 1 loArticol.codmat = Nvl(m.tcCodmat, '') loArticol.denumire = Nvl(m.tcDenumire, '') loArticol.um = Nvl(m.tcUm, '') loArticol.Cont = Nvl(m.tcCont, '') loArticol.preturi_cu_tva = 0 loArticol.proc_tvav = .Null. IF m.tlInValutaDoc loArticol.tip_valuta = 1 loArticol.Curs = m.tnCursDoc loArticol.multiplicator = m.tnMultDoc loArticol.nume_val = Nvl(m.tcNumeValDoc, '') loArticol.id_valuta = m.tnIdValutaDoc ENDIF RETURN loArticol ENDFUNC && CreeazaPoArticolNouTvd *!* parametri: id_vanzare (din tvanz.id_vanzare), alias articole (implicit tvd), alias vanzare (implicit tvanz) *!* scrie in VANZARI_DETALII liniile editate ale notei, ca diferenta fata de starea persistata: marcheaza *!* sters tot documentul, invie/actualizeaza liniile pastrate din alias, insereaza liniile noi, apoi *!* recalculeaza totalurile documentului (cu discountul din alias vanzare, ca sa nu poata diverge de *!* liniile scrise); ruleaza in tranzactia manuala deja deschisa de apelant, dupa finalizeaza_modificare_nota *!* - nu da COMMIT/ROLLBACK, nu inchide cursoare, salveaza si restaureaza workarea/pozitia curenta *!* retur logic: .T. daca a mers tot sau nu era nimic de facut, .F. la primul esec Oracle (se opreste acolo) FUNCTION ScrieArticoleFacturaEditate LPARAMETERS tnIdVanzare, tcAliasArticole, tcAliasVanzare LOCAL lcAliasArt, lcAliasVanz, lnAreaOrigine, lnRecnoArt, llSucces, lcSql, lnDiscount, llDiscountNul lcAliasArt = IIF(Type('tcAliasArticole') = 'C' AND !Empty(m.tcAliasArticole), m.tcAliasArticole, 'tvd') lcAliasVanz = IIF(Type('tcAliasVanzare') = 'C' AND !Empty(m.tcAliasVanzare), m.tcAliasVanzare, 'tvanz') *!* cursor gol de articole nu inseamna "document fara linii" - poate fi si un esec de incarcare (IncarcaArticoleFactura intoarce .T. cu cursor gol la eroare Oracle); fara ancora, ar goli tacut factura IF Nvl(m.tnIdVanzare,0) <= 0 OR !Used(m.lcAliasArt) OR !Used(m.lcAliasVanz) OR Reccount(m.lcAliasVanz) <> 1 OR Reccount(m.lcAliasArt) = 0 RETURN .T. ENDIF lnAreaOrigine = Select() llSucces = .T. SELECT (m.lcAliasVanz) GO TOP llDiscountNul = Isnull(discount) lnDiscount = Nvl(discount,0) *!* marcheaza sters tot documentul - perechea reset-ului STERS=0 din actualizeaza_vanzari lcSql = [update vanzari_detalii set sters = 1, id_utils = ] + Alltrim(Str(gnIdUtil)) + [, dataoras = sysdate ] + ; [where id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) + [ and sters = 0] llSucces = goExecutor.oExecuta(m.lcSql) *!* invie si actualizeaza liniile pastrate - toate cele active din alias, nu doar lmodificat, pasul de mai sus le-a marcat pe toate IF m.llSucces SELECT (m.lcAliasArt) lnRecnoArt = Recno() SCAN FOR id_vanzare_det > 0 AND Nvl(sters,0) <> 1 lcSql = [update vanzari_detalii set sters = 0, cantitate = ] + Alltrim(Str(Nvl(cantitate,0),18,3)) + ; [, pret = ] + Alltrim(Str(Nvl(pret,0),18,4)) + [, pret_cu_tva = ] + Alltrim(Str(Nvl(pret_cu_tva,0))) + ; [, id_utils = ] + Alltrim(Str(gnIdUtil)) + [, dataoras = sysdate ] + ; [where id_vanzare_det = ] + Alltrim(Str(id_vanzare_det)) + [ and id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) llSucces = goExecutor.oExecuta(m.lcSql) IF !m.llSucces EXIT ENDIF ENDSCAN TRY GO m.lnRecnoArt IN (m.lcAliasArt) CATCH GO TOP IN (m.lcAliasArt) ENDTRY ENDIF *!* insereaza liniile noi - fara id_vanzare_det, il genereaza trigger-ul TRG_VANZARI_DET_BEFOINS IF m.llSucces SELECT (m.lcAliasArt) lnRecnoArt = Recno() SCAN FOR id_vanzare_det = 0 AND Nvl(sters,0) <> 1 lcSql = [insert into vanzari_detalii (id_vanzare, id_articol, cantitate, pret, pret_cu_tva, proc_tvav, discount_unitar, ] + ; [id_gestiune, cont, id_valuta, id_jtva_coloana, serie, explicatie, taxcode, lot, pret_achizitie, id_utils, dataoras) values (] + ; Alltrim(Str(m.tnIdVanzare)) + [,] + Alltrim(Str(Nvl(id_articol,0))) + [,] + Alltrim(Str(Nvl(cantitate,0),18,3)) + [,] + ; Alltrim(Str(Nvl(pret,0),18,4)) + [,] + Alltrim(Str(Nvl(pret_cu_tva,0))) + [,] + Alltrim(Str(Nvl(proc_tvav,0),18,4)) + [,] + ; Alltrim(Str(Nvl(discount_unitar,0),18,4)) + [,] + Iif(Isnull(id_gestiune),[NULL],Alltrim(Str(id_gestiune))) + [,] + ; Iif(Empty(Nvl(cont,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(cont,''))) + [']) + [,] + ; Iif(Isnull(id_valuta),[NULL],Alltrim(Str(id_valuta))) + [,] + Iif(Isnull(id_jtva_coloana),[NULL],Alltrim(Str(id_jtva_coloana))) + [,] + ; Iif(Empty(Nvl(serie,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(serie,''))) + [']) + [,] + ; Iif(Empty(Nvl(explicatie,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(explicatie,''))) + [']) + [,] + ; Iif(Isnull(taxcode),[NULL],Alltrim(Str(taxcode))) + [,] + ; Iif(Empty(Nvl(lot,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(lot,''))) + [']) + [,] + ; Alltrim(Str(Nvl(pret_achizitie,0),18,4)) + [,] + Alltrim(Str(gnIdUtil)) + [, sysdate)] llSucces = goExecutor.oExecuta(m.lcSql) IF !m.llSucces EXIT ENDIF ENDSCAN TRY GO m.lnRecnoArt IN (m.lcAliasArt) CATCH GO TOP IN (m.lcAliasArt) ENDTRY ENDIF *!* recalculul totalurilor, cu discountul documentului dat ca parametru - .NULL. pastreaza discountul curent IF m.llSucces lcSql = [begin pack_facturare.recalculeaza_totaluri_vanzari(] + Alltrim(Str(m.tnIdVanzare)) + [,] + ; Iif(m.llDiscountNul,[NULL],Alltrim(Str(m.lnDiscount,18,4))) + [); end;] llSucces = goExecutor.oExecuta(m.lcSql) ENDIF IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN m.llSucces ENDFUNC && ScrieArticoleFacturaEditate