Files
comun/utile/Teste/editare_factura/emite_document_stoc_s93.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

455 lines
17 KiB
Plaintext

* emite_document_stoc_s93.prg
* Reumple rezervorul lui test_s9_3_stergere.prg (candidat eligibil: STERS=0, in luna activa,
* fara referinte/urmasi, cu randuri REALE in vact_tot SI vrul_tot). Emite UN document REAL
* in MARIUSM_AUTO@ROA_CENTRAL prin fluxul de productie (docs\raport_datoria4_stergere.md).
*
* Baza: COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg (tnTip=22, AVIZ din lista
* de preturi, client RAJA id_part=463, forma veche frm_facturare_articole, tip_incasare=1) -
* singura combinatie confirmata ca scrie in VANZARI in acest mediu. DOUA modificari fata de acel
* fisier, ambele necesare ca sa apara randuri in RUL (nu doar in ACT):
*
* 1) NU se mai reseteaza gnIdUtil la -3 inainte de cursor_preturi (acolo ramane doar pentru
* alocarea numarului). Cu gnIdUtil=8 lista de preturi FACT_VPRETURI_UTILIZATOR intoarce
* articole GESTIONABILE cu stoc real (verificat read-only); cu -3 intoarce un singur articol
* negestionabil, cantitate 0 - de-asta suita S3b/creeaza_documente_s8 nu producea niciodata
* randuri vrul_tot (docs\raport_s13b_fixturi.md §6.1).
* 2) V_FILTRU_COD = '11.00003' (id_articol=315554536, ACOPERIRE FAR VOLVO FH12) restrange
* cursor_preturi la UN singur articol gestionabil cu stoc mare (>11000 bucati la data
* scrierii acestui fisier), ca sa nu intre in document toata lista de preturi a utilizatorului 8.
*
* Rulare: vfp9.exe -A -T "D:\ROA\...\emite_document_stoc_s93.prg" (headless, cateva secunde)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log
* Rezultat: STRTOFILE cu 'id_vanzare=<n>' la succes, sau 'ESEC' - vezi raportul pentru numerele arse.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out"
ENDIF
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO EmiteErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO EmiteLog WITH 'EROARE: conectare Oracle esuata'
DO EmiteFinal
ENDIF
DO EmiteLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
IF !actualizeaza_optiuni_program()
DO EmiteLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO EmiteFinal
ENDIF
*-- gnScadereStoc=1 (nu 0, spre deosebire de test_s3b_emitere_reala.prg): cu 0, do_adauga_articol
*-- ocoleste mereu do_alege_stoc (ofacturare.vc2:13021), deci ID_GESTIUNE ramane null pe linie si
*-- nu apare niciun rand in vrul_tot, indiferent de cantitate/stoc. Cu 1 si UN singur candidat de
*-- gestiune (Reccount(crsgestarticol)=1) + tlImplicit=.T., do_alege_stoc(ofacturare.vc2:13478)
*-- alege automat gestiunea, FARA sa arate modalul (frm_articol_gest_factura.inainte_de_do_termin
*-- se autoconfirma cand nu exista nicio eroare de validare).
gnScadereStoc = 1
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
DO EmiteLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateEmite')
_SCREEN.AddObject('tmrDrvEmite', 'Timer')
_SCREEN.tmrDrvEmite.Interval = 200
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvEmite.Enabled = .T.
*-- driverGestArticol: acelasi timer, un al doilea BINDEVENT - conduce modalul per-linie
*-- FRM_ARTICOL_GEST_FACTURA (do_alege_stoc, ofacturare.vc2:13518/13526/13540)
PUBLIC goDriverGest, glDlgTratatGest, goUltimulFormGest
glDlgTratatGest = .F.
goUltimulFormGest = .NULL.
goDriverGest = CREATEOBJECT('driverGestArticol')
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverGest, 'Executa')
_SCREEN.Caption = 'emite_document_stoc_s93 - reumplere pool S9-3'
LOCAL lnIdVz
lnIdVz = CreeazaDocumentStoc()
_SCREEN.tmrDrvEmite.Enabled = .F.
DO Assert WITH lnIdVz > 0, 'documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
DO EmiteLog WITH 'id_vanzare=' + TRANSFORM(lnIdVz)
ELSE
DO EmiteLog WITH 'ESEC'
ENDIF
DO EmiteFinal
CATCH TO loExc
DO EmiteLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO EmiteFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE EmiteLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE EmiteErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO EmiteLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE EmiteFinal
DO EmiteLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO EmiteLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO EmiteLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO EmiteLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
*==================================================================================
* CreeazaDocumentStoc: emite un document REAL (tnTip=22, cursor_preturi filtrat pe UN articol
* gestionabil cu stoc), tip_incasare=1 (Fara incasare), forma veche. Intoarce id_vanzare (>0
* succes) sau 0.
FUNCTION CreeazaDocumentStoc
*-- lcFiltruCod PRIVATE, nu LOCAL: goExecutor.oExecute leaga parametrii dupa numele
*-- variabilei (ca poDate.* mai jos), deci trebuie vizibila din metoda apelata, nu doar aici.
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, lcFiltruCod
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
tnTip = 22
tnIdClient = 463
tnIdDelegat = 256
*-- 4294507796 / MOTOREDUCTOR 20SEC: UN singur lot in gestiunea 1 (Reccount(crsgestarticol)=1,
*-- verificat read-only) - conditia lui do_alege_stoc pentru autoselectie fara modal.
lcFiltruCod = '0V2549'
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25900
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 6 && AVIZ - plaja globala
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
*-- gestiune reala (nu NULL): fara ea cursor_preturi arata articolul gestionabil dar
*-- scrierea documentului nu are de unde sa scada stocul - primul document emis (id_vanzare=1474)
*-- a iesit cu 0 randuri in vrul_tot desi articolul era gestionabil, cu stoc.
poDate.id_gestiune_init = 1
IF poDate.rezultat_serii = 3
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
ENDIF
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
*-- gnIdUtil ramane 8 (NU -3, spre deosebire de test_s3b_emitere_reala.prg): cu -3
*-- cursor_preturi intoarce un singur articol negestionabil, cantitate 0 - fara asta
*-- documentul nu ar avea nicio sansa de rand in RUL.
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO EmiteLog WITH 'poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?lcFiltruCod)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO EmiteLog WITH 'EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO EmiteLog WITH 'Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO EmiteLog WITH 'crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
SELECT crscursuri
poDate.Curs = Curs
poDate.multiplicator = multiplicator
ELSE
citeste_cursuri_zi(poDate.zi_curs)
IF RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
ENDIF
PUBLIC goFrmEmite
goFrmEmite = CREATEOBJECT('frm_facturare_articole')
goFrmEmite.WindowType = 0
goFrmEmite.Show()
DOEVENTS FORCE
DO EmiteLog WITH 'formular afisat modeless (VECHI frm_facturare_articole)'
glDlgTratatGest = .F.
goFrmEmite.do_adauga_tot()
DOEVENTS FORCE
DO EmiteLog WITH 'do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ;
' glDlgTratatGest=' + TRANSFORM(glDlgTratatGest)
*-- do_initializeaza_articol zeroeste cantitatea la adaugare (ca la tip 1, ofacturare.vc2:13890) -
*-- se scrie explicit dupa adaugare, ca in test_s6_1_lista_preturi.prg (SeteazaCantitati):
*-- fara asta VANZARI_DETALII.CANTITATE ramane 0 si nu apare niciun rand in vrul_tot.
LOCAL loArtCant
SELECT crsfactura
SCAN
REPLACE cantitate WITH 1
SCATTER NAME loArtCant MEMO
loArtCant = calculeaza_totaluri(loArtCant)
GATHER NAME loArtCant MEMO
ENDSCAN
DO EmiteLog WITH 'cantitate setata explicit pe crsfactura'
goFrmEmite.do_calculeaza_totaluri()
DOEVENTS FORCE
LOCAL lnScris
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
lnScris = goFrmEmite.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
DO EmiteLog WITH 'do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO EmiteLog WITH 'verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmEmite') = 'O' AND !ISNULL(goFrmEmite)
goFrmEmite.Release()
ENDIF
goFrmEmite = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE CurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*==================================================================================
*-- driverAlteDateEmite: identic cu driverAlteDateAD din test_s3b_emitere_reala.prg - cauta
* FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value INAINTE de do_termin().
DEFINE CLASS driverAlteDateEmite AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO EmiteLog WITH '[diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO EmiteLog WITH 'driverAlteDateEmite: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverGestArticol: acelasi mecanism (poll _SCREEN.Forms + apel direct do_termin(), fara input
* real) ca driverAlteDateAD/driverAlteDateEmite, dar pentru FRM_ARTICOL_GEST_FACTURA - modalul
* per-linie al lui do_alege_stoc (ofacturare.vc2:13518/13526/13540), aratat neconditionat cand
* inainte_de_do_termin() esueaza pe randul curent din crsgestarticol (chiar si pe ramura cu un
* singur lot + tlImplicit, ofacturare.vc2:13495-13524, pentru ca poArticol.cantitate a fost deja
* zeroit de do_initializeaza_articol - ofacturare.vc2:13922, tip 22 fara opt_facturare 1/2).
* Copiaza pe poArticol campurile randului curent din crsgestarticol (ce ar face si navigarea in
* grid_gestiuni.AfterRowColChange, ofacturare.vc2:4227-4239) plus o cantitate nenula, apoi cheama
* do_termin() direct pe formular.
*-- do_adauga_tot() SCANeaza crsarticole (aici 2 randuri, acelasi articol pe doua liste de preturi
* ale utilizatorului 8) si cheama do_alege_stoc() o data PE RAND - modalul poate aparea de mai multe
* ori, secvential, in aceeasi rulare. De-asta flagul de "tratat" nu e global (ca la frm_alte_date,
* aratat o singura data): retine INSTANTA de formular deja tratata (goUltimulFormGest) - o instanta
* noua (formular urmator) tot se trateaza, aceeasi instanta nu se retrateaza daca timer-ul mai apuca
* un tick inainte sa se inchida.
DEFINE CLASS driverGestArticol AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit
llGasit = .F.
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ARTICOL_GEST_FACTURA'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
ENDFOR
IF !llGasit OR loForm = goUltimulFormGest
RETURN
ENDIF
TRY
SELECT crsgestarticol
GO TOP
poArticol.cantitate = 1
poArticol.pret_achizitie = Pret
poArticol.lot = NVL(lot, [])
poArticol.serie = NVL(serie, [])
poArticol.id_gestiune = id_gestiune
poArticol.Cont = ALLTRIM(Cont)
poArticol.id_lucrare_rez = id_lucrare_rez
poArticol.id_part_rez = id_part_rez
poArticol.pretv_orig = pretv
poArticol.id_valuta_d = NVL(id_valuta, 0)
poArticol.pretd = pretd
DO EmiteLog WITH ' driverGestArticol: id_gestiune=' + TRANSFORM(poArticol.id_gestiune) + ;
' pret_achizitie=' + TRANSFORM(poArticol.pret_achizitie) + ' cantitate=' + TRANSFORM(poArticol.cantitate)
loForm.do_termin()
glDlgTratatGest = .T.
goUltimulFormGest = loForm
CATCH TO loExcDrv
DO EmiteLog WITH 'driverGestArticol: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatGest = .T.
goUltimulFormGest = loForm
ENDTRY
ENDPROC
ENDDEFINE