#6 editare factura emisa: S4b - comparatia rulaje/articole si aplicarea ei
Rulajele contabile si articolele facturii sunt doua reprezentari independente ale aceluiasi document, editabile separat. Helperele noi construiesc enumerarea diferentelor dintre ele si o pot aplica, la cererea utilizatorului. - ConstruiestePropunereSincronizare: potrivire pe id_articol, singura cheie comuna - nu exista corespondent la nivel de linie intre rulaj si articol. Agregarea RUL foloseste pretul mediu ponderat cand un articol are mai multe randuri. Articolele nestocate, documentele in valuta si articolele cu mai multe randuri RUL active raman N-A, cu motiv afisat: propunerea ar fi o presupunere, nu un calcul. - AplicaSincronizareArticole: scrie doar in tvd/trul, in memorie. Nu adauga randuri de rulaj (conturile nu se deduc din articol) si nu sterge linii in nicio directie - divergenta se semnaleaza, stergerea ramane manuala. Scrierea reala in Oracle ramane calea existenta, la salvare. - test_s4b_sincronizare: headless, fara Oracle, pe cursoare construite in test. Butonul, dialogul si verificarea la salvare vin separat. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
*** ofacturare_editare
|
||||
|
||||
*!* 10.08.2026
|
||||
*!* 11.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,
|
||||
@@ -9,7 +9,9 @@
|
||||
*!* 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
|
||||
*!* cand acesta e in valuta), scrierea in VANZARI_DETALII a liniilor editate/adaugate/sterse, si
|
||||
*!* compararea/aplicarea sincronizarii cantitate/pret intre rulaje (trul) si articolele facturii (tvd),
|
||||
*!* agregate pe id_articol, in ambele sensuri (documentele in valuta raman doar semnalate, neaplicate)
|
||||
|
||||
|
||||
*!* parametru: id_fact
|
||||
@@ -554,3 +556,367 @@ FUNCTION ScrieArticoleFacturaEditate
|
||||
|
||||
RETURN m.llSucces
|
||||
ENDFUNC && ScrieArticoleFacturaEditate
|
||||
|
||||
|
||||
*!* parametru: tcDirectie - 'RUL_SURSA' (implicit, rulajul actualizeaza articolele) sau 'ARTICOLE_SURSA'
|
||||
*!* (articolele actualizeaza rulajul); orice alta valoare cade pe 'RUL_SURSA'
|
||||
*!* compara rulajele (trul) cu articolele facturii (tvd), agregate pe id_articol (singura cheie comuna,
|
||||
*!* fara FK la nivel de linie), si produce cursorul propunere_sincronizare (READWRITE, lasat deschis pe
|
||||
*!* seama apelantului): id_articol, denumire, codmat, cantitate_veche/noua, pret_vechi/nou, actiune
|
||||
*!* (Modificare/Adaugare/Semnalare/N-A), motiv. "vechi" = cursorul-tinta curent, "nou" = cursorul-sursa
|
||||
*!* calculat (agregare formula E.3: SUM(cant*pretvtva) + SUM(cante*pretvtva) pe randurile id_tip_rulaj<>3,
|
||||
*!* pret mediu ponderat); articolele identice intre sursa si tinta nu apar in cursor. N-A pe: articol
|
||||
*!* nestocat (fara randuri RUL posibile), articol cu mai multe randuri RUL active (niciodata alegere
|
||||
*!* automata a randului) sau document in valuta (conversia RUL<->valuta nu e acoperita de aceasta functie)
|
||||
*!* retur logic: .F. daca tvd/trul nu sunt deschise (cursorul iese oricum creat, gol)
|
||||
FUNCTION ConstruiestePropunereSincronizare
|
||||
LPARAMETERS tcDirectie
|
||||
|
||||
LOCAL lcDirectie, lnAreaOrigine, lnCantLinie, lnValLinie, llDocInValuta
|
||||
LOCAL lnCantRul, lnValRul, lnNrandRul, lnPretRul, lcDenumireRul, lcCodmatRul
|
||||
LOCAL lnCantTvd, lnValTvd, lnNrandTvd, lnPretTvd, lcDenumireTvd, lcCodmatTvd, llInStoc
|
||||
LOCAL llGasitSursa, llGasitTinta, lnCantSursa, lnPretSursa, lnCantTinta, lnPretTinta
|
||||
LOCAL lnCantVechi, lnCantNou, lnPretVechi, lnPretNou, lcActiune, lcMotiv, lcDenumire, lcCodmat
|
||||
|
||||
lcDirectie = IIF(Upper(Alltrim(Nvl(m.tcDirectie,''))) == 'ARTICOLE_SURSA', 'ARTICOLE_SURSA', 'RUL_SURSA')
|
||||
lnAreaOrigine = Select()
|
||||
|
||||
IF Used('propunere_sincronizare')
|
||||
Use In propunere_sincronizare
|
||||
ENDIF
|
||||
CREATE CURSOR propunere_sincronizare (id_articol I, denumire C(100), codmat C(30), ;
|
||||
cantitate_veche N(12,3), cantitate_noua N(12,3), pret_vechi N(14,4), pret_nou N(14,4), ;
|
||||
actiune C(12), motiv C(80))
|
||||
|
||||
IF !Used('tvd') OR !Used('trul')
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
llDocInValuta = (Used('tvanz') AND Reccount('tvanz') = 1 AND Nvl(tvanz.in_valuta,0) <> 0)
|
||||
|
||||
*!* agregare RUL pe articol (formula E.3) - cant/val insumate, nrand = randuri active distincte
|
||||
IF Used('agg_rul')
|
||||
Use In agg_rul
|
||||
ENDIF
|
||||
CREATE CURSOR agg_rul (id_articol I, denumire C(100), codmat C(30), cant N(12,3), val N(16,4), nrand I)
|
||||
|
||||
SELECT trul
|
||||
SCAN FOR Nvl(sters,0) <> 1
|
||||
lnCantLinie = Nvl(cant,0) + IIF(Nvl(id_tip_rulaj,0) <> 3, Nvl(cante,0), 0)
|
||||
lnValLinie = Nvl(cant,0) * Nvl(pretvtva,0) + IIF(Nvl(id_tip_rulaj,0) <> 3, Nvl(cante,0) * Nvl(pretvtva,0), 0)
|
||||
lcDenumireRul = Nvl(trul.denumire,'')
|
||||
lcCodmatRul = Nvl(trul.codmat,'')
|
||||
SELECT agg_rul
|
||||
LOCATE FOR id_articol = trul.id_articol
|
||||
IF Found()
|
||||
REPLACE cant WITH cant + m.lnCantLinie, val WITH val + m.lnValLinie, nrand WITH nrand + 1 IN agg_rul
|
||||
ELSE
|
||||
INSERT INTO agg_rul (id_articol, denumire, codmat, cant, val, nrand) ;
|
||||
VALUES (trul.id_articol, m.lcDenumireRul, m.lcCodmatRul, m.lnCantLinie, m.lnValLinie, 1)
|
||||
ENDIF
|
||||
SELECT trul
|
||||
ENDSCAN
|
||||
|
||||
*!* agregare articole factura pe articol - val se ia din tvd.valoare (deja calculata, cu TVA, la incarcare/editare)
|
||||
IF Used('agg_tvd')
|
||||
Use In agg_tvd
|
||||
ENDIF
|
||||
CREATE CURSOR agg_tvd (id_articol I, denumire C(100), codmat C(30), cant N(12,3), val N(16,4), nrand I, in_stoc I)
|
||||
|
||||
SELECT tvd
|
||||
SCAN FOR Nvl(sters,0) <> 1
|
||||
lcDenumireTvd = Nvl(tvd.denumire,'')
|
||||
lcCodmatTvd = Nvl(tvd.codmat,'')
|
||||
SELECT agg_tvd
|
||||
LOCATE FOR id_articol = tvd.id_articol
|
||||
IF Found()
|
||||
REPLACE cant WITH cant + Nvl(tvd.cantitate,0), val WITH val + Nvl(tvd.valoare,0), nrand WITH nrand + 1 IN agg_tvd
|
||||
ELSE
|
||||
INSERT INTO agg_tvd (id_articol, denumire, codmat, cant, val, nrand, in_stoc) ;
|
||||
VALUES (tvd.id_articol, m.lcDenumireTvd, m.lcCodmatTvd, Nvl(tvd.cantitate,0), Nvl(tvd.valoare,0), 1, Nvl(tvd.in_stoc,1))
|
||||
ENDIF
|
||||
SELECT tvd
|
||||
ENDSCAN
|
||||
|
||||
IF Used('crs_articole_unite')
|
||||
Use In crs_articole_unite
|
||||
ENDIF
|
||||
SELECT id_articol FROM agg_rul ;
|
||||
UNION ;
|
||||
SELECT id_articol FROM agg_tvd ;
|
||||
INTO CURSOR crs_articole_unite READWRITE
|
||||
|
||||
SELECT crs_articole_unite
|
||||
SCAN
|
||||
lcDenumire = ''
|
||||
lcCodmat = ''
|
||||
|
||||
SELECT agg_rul
|
||||
LOCATE FOR id_articol = crs_articole_unite.id_articol
|
||||
llGasitSursa = .F. && folosit mai jos doar dupa mapare pe directie
|
||||
IF Found()
|
||||
lnCantRul = cant
|
||||
lnValRul = val
|
||||
lnNrandRul = nrand
|
||||
lcDenumire = denumire
|
||||
lcCodmat = codmat
|
||||
ELSE
|
||||
lnCantRul = 0
|
||||
lnValRul = 0
|
||||
lnNrandRul = 0
|
||||
ENDIF
|
||||
lnPretRul = IIF(m.lnCantRul <> 0, m.lnValRul / m.lnCantRul, 0)
|
||||
|
||||
SELECT agg_tvd
|
||||
LOCATE FOR id_articol = crs_articole_unite.id_articol
|
||||
IF Found()
|
||||
lnCantTvd = cant
|
||||
lnValTvd = val
|
||||
lnNrandTvd = nrand
|
||||
llInStoc = (Nvl(in_stoc,1) <> 0)
|
||||
IF !Empty(Nvl(denumire,''))
|
||||
lcDenumire = denumire
|
||||
lcCodmat = codmat
|
||||
ENDIF
|
||||
ELSE
|
||||
lnCantTvd = 0
|
||||
lnValTvd = 0
|
||||
lnNrandTvd = 0
|
||||
llInStoc = .T.
|
||||
ENDIF
|
||||
lnPretTvd = IIF(m.lnCantTvd <> 0, m.lnValTvd / m.lnCantTvd, 0)
|
||||
|
||||
IF m.lcDirectie == 'RUL_SURSA'
|
||||
llGasitSursa = (m.lnNrandRul > 0)
|
||||
llGasitTinta = (m.lnNrandTvd > 0)
|
||||
lnCantSursa = m.lnCantRul
|
||||
lnPretSursa = m.lnPretRul
|
||||
lnCantTinta = m.lnCantTvd
|
||||
lnPretTinta = m.lnPretTvd
|
||||
ELSE
|
||||
llGasitSursa = (m.lnNrandTvd > 0)
|
||||
llGasitTinta = (m.lnNrandRul > 0)
|
||||
lnCantSursa = m.lnCantTvd
|
||||
lnPretSursa = m.lnPretTvd
|
||||
lnCantTinta = m.lnCantRul
|
||||
lnPretTinta = m.lnPretRul
|
||||
ENDIF
|
||||
lnCantVechi = m.lnCantTinta
|
||||
lnPretVechi = m.lnPretTinta
|
||||
lnCantNou = m.lnCantSursa
|
||||
lnPretNou = m.lnPretSursa
|
||||
|
||||
lcActiune = ''
|
||||
lcMotiv = ''
|
||||
DO CASE
|
||||
CASE m.llDocInValuta
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Documentul e in valuta - sincronizarea automata a preturilor nu e suportata, verificati manual'
|
||||
CASE m.lnNrandRul > 1
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Mai multe randuri RUL active pe acelasi articol, verificati manual'
|
||||
CASE m.lnNrandTvd > 0 AND !m.llInStoc
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Articol nestocat, fara corespondent in rulaje'
|
||||
CASE m.llGasitSursa AND !m.llGasitTinta
|
||||
lcActiune = 'Adaugare'
|
||||
lcMotiv = IIF(m.lcDirectie == 'ARTICOLE_SURSA', ;
|
||||
'Articol prezent doar in articolele facturii - adaugarea unui rand nou in rulaje nu se aplica automat', '')
|
||||
CASE !m.llGasitSursa AND m.llGasitTinta
|
||||
lcActiune = 'Semnalare'
|
||||
lcMotiv = 'Articol fara corespondent in sursa - stergerea nu se face automat'
|
||||
OTHERWISE
|
||||
IF Abs(m.lnCantVechi - m.lnCantNou) < 0.0005 AND Round(m.lnPretVechi, m.gnPC) == Round(m.lnPretNou, m.gnPC)
|
||||
lcActiune = ''
|
||||
ELSE
|
||||
lcActiune = 'Modificare'
|
||||
ENDIF
|
||||
ENDCASE
|
||||
|
||||
IF !Empty(m.lcActiune)
|
||||
INSERT INTO propunere_sincronizare (id_articol, denumire, codmat, cantitate_veche, cantitate_noua, ;
|
||||
pret_vechi, pret_nou, actiune, motiv) VALUES (crs_articole_unite.id_articol, m.lcDenumire, m.lcCodmat, ;
|
||||
m.lnCantVechi, m.lnCantNou, Round(m.lnPretVechi,4), Round(m.lnPretNou,4), m.lcActiune, m.lcMotiv)
|
||||
ENDIF
|
||||
SELECT crs_articole_unite
|
||||
ENDSCAN
|
||||
|
||||
IF Used('agg_rul')
|
||||
Use In agg_rul
|
||||
ENDIF
|
||||
IF Used('agg_tvd')
|
||||
Use In agg_tvd
|
||||
ENDIF
|
||||
IF Used('crs_articole_unite')
|
||||
Use In crs_articole_unite
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN .T.
|
||||
ENDFUNC && ConstruiestePropunereSincronizare
|
||||
|
||||
|
||||
*!* parametri: tcDirectie (ca la ConstruiestePropunereSincronizare), toForm (obiectul frm_modific2024,
|
||||
*!* opus/reutilizat pentru calculeaza_valori_articol/AdaugaLinieTvdDinArticol - fara el, liniile
|
||||
*!* Modificare/Adaugare pe tvd nu se aplica, doar cele pe trul, care nu au nevoie de metode de formular)
|
||||
*!* reconstruieste propunerea (ConstruiestePropunereSincronizare) si aplica tot ce nu e N-A/Semnalare,
|
||||
*!* DOAR in cursoarele din memorie (tvd/trul) - niciun INSERT/UPDATE Oracle; RUL_SURSA scrie in tvd
|
||||
*!* (cantitate/pret, pastrand pret_cu_tva existent pe rand), ARTICOLE_SURSA scrie doar cant/pretvtva pe
|
||||
*!* randul RUL deja existent (niciodata rand RUL nou - lipsesc contul/gestiunea sigure din articol)
|
||||
*!* retur numeric: cate linii au fost efectiv aplicate (ca apelantul sa poata reface bara de totaluri)
|
||||
FUNCTION AplicaSincronizareArticole
|
||||
LPARAMETERS tcDirectie, toForm
|
||||
|
||||
LOCAL lcDirectie, lnAplicate, lnAreaOrigine, lnIdArticol, lcActiune, lnCantitateNoua, lnPretNou
|
||||
|
||||
lcDirectie = IIF(Upper(Alltrim(Nvl(m.tcDirectie,''))) == 'ARTICOLE_SURSA', 'ARTICOLE_SURSA', 'RUL_SURSA')
|
||||
lnAplicate = 0
|
||||
lnAreaOrigine = Select()
|
||||
|
||||
IF !ConstruiestePropunereSincronizare(m.lcDirectie)
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN 0
|
||||
ENDIF
|
||||
|
||||
SELECT propunere_sincronizare
|
||||
SCAN FOR Inlist(Alltrim(actiune), 'Modificare', 'Adaugare')
|
||||
lnIdArticol = id_articol
|
||||
lcActiune = Alltrim(actiune)
|
||||
lnCantitateNoua = cantitate_noua
|
||||
lnPretNou = pret_nou
|
||||
|
||||
DO CASE
|
||||
CASE m.lcDirectie == 'RUL_SURSA' AND m.lcActiune == 'Modificare'
|
||||
IF AplicaModificareTvd(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou, m.toForm)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
CASE m.lcDirectie == 'RUL_SURSA' AND m.lcActiune == 'Adaugare'
|
||||
IF AplicaAdaugareTvd(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou, m.toForm)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
CASE m.lcDirectie == 'ARTICOLE_SURSA' AND m.lcActiune == 'Modificare'
|
||||
IF AplicaModificareTrul(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
*!* ARTICOLE_SURSA + Adaugare: fara scriere, un rand RUL nou nu se poate crea sigur din articol
|
||||
ENDCASE
|
||||
SELECT propunere_sincronizare
|
||||
ENDSCAN
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.lnAplicate
|
||||
ENDFUNC && AplicaSincronizareArticole
|
||||
|
||||
|
||||
*!* parametri: id_articol, cantitate/pret noi (pret_nou e intotdeauna cu TVA - formula E.3 din RUL),
|
||||
*!* toForm (opus, cu metoda calculeaza_valori_articol - fara el se scrie doar REPLACE-ul, fara recalcul
|
||||
*!* de valoare/bara totaluri, pe seama apelantului)
|
||||
*!* scrie in tvd (primul rand activ gasit pe articol) cantitatea si pretul propuse, pastrand pret_cu_tva
|
||||
*!* existent pe rand (converteste pret_nou la conventia fara TVA a randului daca era asa dinainte);
|
||||
*!* discount_unitar se reseteaza la 0 - pretul propus e deja pretul mediu ponderat efectiv din rulaje
|
||||
FUNCTION AplicaModificareTvd
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva, toForm
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, lnPretDeScris, lnProcTvav
|
||||
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Used('tvd')
|
||||
SELECT tvd
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
lnProcTvav = Nvl(proc_tvav,1)
|
||||
IF m.lnProcTvav = 0
|
||||
lnProcTvav = 1
|
||||
ENDIF
|
||||
lnPretDeScris = IIF(Nvl(pret_cu_tva,0) = 0, m.tnPretNouCuTva / m.lnProcTvav, m.tnPretNouCuTva)
|
||||
REPLACE cantitate WITH m.tnCantitateNoua, pret WITH m.lnPretDeScris, discount_unitar WITH 0, ;
|
||||
lmodificat WITH .T. IN tvd
|
||||
IF Vartype(m.toForm) == 'O' AND Pemstatus(m.toForm, 'calculeaza_valori_articol', 5)
|
||||
m.toForm.calculeaza_valori_articol()
|
||||
ENDIF
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaModificareTvd
|
||||
|
||||
|
||||
*!* parametri: id_articol (existent doar in trul), cantitate/pret noi (pret_nou cu TVA), toForm (obligatoriu,
|
||||
*!* cu metoda AdaugaLinieTvdDinArticol - fara el functia nu are cum sa adauge linia, intoarce .F.)
|
||||
*!* construieste obiectul poArticol (tiparul din CreeazaPoArticolNouTvd, cont/id_gestiune/um preluate din
|
||||
*!* randul RUL al articolului) si il preda lui toForm.AdaugaLinieTvdDinArticol - linia noua intra in tvd
|
||||
*!* cu pret_cu_tva=1 (pretul propus e deja cu TVA) si discount_unitar=0; document RON (tip_valuta=0),
|
||||
*!* documentele in valuta sunt deja excluse la nivelul propunerii
|
||||
FUNCTION AplicaAdaugareTvd
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva, toForm
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, loArticol
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Vartype(m.toForm) == 'O' AND Pemstatus(m.toForm, 'AdaugaLinieTvdDinArticol', 5) AND Used('trul')
|
||||
SELECT trul
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
loArticol = CreeazaPoArticolNouTvd(trul.id_articol, Nvl(trul.codmat,''), Nvl(trul.denumire,''), ;
|
||||
Nvl(trul.um,''), Nvl(trul.cont,''), .F., 1, 1, '', 0)
|
||||
loArticol.id_gestiune = Nvl(trul.id_gestiune, -1000)
|
||||
loArticol.cantitate = m.tnCantitateNoua
|
||||
loArticol.preturi_cu_tva = 1
|
||||
loArticol.pretctva = m.tnPretNouCuTva
|
||||
loArticol.proc_tvav = Nvl(trul.proc_tvav, 1)
|
||||
loArticol.discount_unitar_ctva = 0
|
||||
|
||||
m.toForm.AdaugaLinieTvdDinArticol(loArticol)
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaAdaugareTvd
|
||||
|
||||
|
||||
*!* parametri: id_articol, cantitate/pret noi (pret_nou cu TVA)
|
||||
*!* scrie in trul (singurul rand activ gasit pe articol - garantat unic, altfel propunerea a marcat N-A)
|
||||
*!* doar cant/cante (dupa care din ele era deja folosit pe rand) si pretvtva; nu atinge id_tip_rulaj,
|
||||
*!* conturi (scd/scc) sau alte campuri derivate (valoare/tva/etc.) - raman de recalculat de apelant daca e nevoie
|
||||
FUNCTION AplicaModificareTrul
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, lcCampCant
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Used('trul')
|
||||
SELECT trul
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
lcCampCant = IIF(Nvl(cant,0) <> 0, 'cant', 'cante')
|
||||
REPLACE (m.lcCampCant) WITH m.tnCantitateNoua, pretvtva WITH m.tnPretNouCuTva IN trul
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaModificareTrul
|
||||
|
||||
Reference in New Issue
Block a user