* probe_12b_s8_calea_2.prg * Plan 12b, S8-4a: proba headless a caii 2 (do_adauga_articol_cautat) din frm_facturare_articole2 * (COMUN\clase\ofacturare.vc2) pentru verificarea prietenoasa D10 a contului de venit (S8-3/S8-4a). * * PAS 0 (dovada): pe aceasta cale, obiectul toArticol vine dintr-un Scatter Name pe crsCodmat/ * crsDenumire. Analiza statica din raportul S8-3 a citat proprietatile design-time csourcesql/ * csourcewhere de pe combosql_cautare (:17528/:17564, doar 7 coloane, fara id_pol) - dar acelea NU * sunt folosite la rulare: refreshdata/selectdata (ofacturare.vc2:463-529) ignora total csourcesql * si cheama This.cursor_preturi_call() (:446-461), adica {call pack_facturare.cursor_preturi(...)} * (sau cursor_gestiune pentru tip=41) - acelasi mecanism ca la crsarticole (calea 1). Structura reala * a cursorului (creeaza_cursor_gol :426-444, reordoneaza :498-512) INCLUDE id_pol. Asadar in cazul * normal Type('toArticol.Id_Pol')='N' e adevarat, iar linia scrisa in crsfactura (Gather la * ofacturare.vc2:19018) primeste chiar politica reala rezolvata de cursor_preturi pentru articolul * respectiv - nu politica de stoc. * * Fix S8-4a (ofacturare.vc2:18968-18972): confirmat empiric (probe separat, Gather Name cu * proprietate lipsa NU arunca eroare si LASA campul destinatie neschimbat, adica linia ar fi ramas * cu Id_Pol vechi/implicit daca toArticol nu are proprietatea) ca fallback-ul gnId_pol_pret_stoc * calculat pentru verificare (lnIdPolLinie) nu ajungea niciodata in linia scrisa cand proprietatea * lipsea din toArticol - AddProperty(toArticol,'Id_Pol',lnIdPolLinie) inchide acest gol; e no-op * cand Type('toArticol.Id_Pol')='N' (cazul normal, politica reala). * * Cazuri (fara mock goExecutor, politica de stoc cu ID_NOTA NULL in tranzactie, ROLLBACK la final): * (a) toArticol FARA proprietatea Id_Pol, articol fara cont dedus -> do_adauga_articol_cautat = .F., * Reccount(crsfactura) neschimbat, spion amessagebox: mesaj continand denumirea articolului. * (b) toArticol FARA proprietatea Id_Pol, articol CU cont dedus -> linia se adauga (Reccount+1), * spion 0 apeluri, iar crsfactura.Id_Pol al liniei noi == gnId_pol_pret_stoc (fallback aplicat). * (c) toArticol CU Id_Pol = o politica reala (<> politica de stoc, cu nota proprie valida) -> linia * se adauga, crsfactura.Id_Pol al liniei noi == acea politica reala (Type='N', fix no-op, * politica ramane cea reala, nu cea de stoc). * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg" * Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log SET SAFETY OFF SET TALK OFF SET NOTIFY OFF SET DELETED ON SET EXACT ON SET CENTURY ON SET DATE DMY SET DECIMALS TO 4 SET NULLDISPLAY TO '' CLOSE DATABASES PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal PUBLIC gcSpionMesaje, gnSpionCount gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log" IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b") MD "D:\ROA\ROAFACTURARE\docs\loguri_12b" ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) gcCaz = "" gnPass = 0 gnFail = 0 gcSpionMesaje = "" gnSpionCount = 0 ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT *-- spion amessagebox: se incarca PRIMUL (inaintea aplicatiei), ca sa castige la nume duplicat LOCAL lcProcExistent, lcCmdProc lcProcExistent = SET("PROCEDURE") lcCmdProc = [SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg"] IF !EMPTY(lcProcExistent) lcCmdProc = lcCmdProc + ", " + lcProcExistent ENDIF &lcCmdProc 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 AfLog WITH "FAIL: conexiune Oracle esuata" DO Final ENDIF gnIdUtil = 8 DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) gnTransOriginal = SQLGETPROP(gnHandle, "Transactions") SQLSETPROP(gnHandle, "Transactions", 2) DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal) IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF DO AfLog WITH "actualizeaza_optiuni_program OK, gnScadereStoc=" + TRANSFORM(NVL(gnScadereStoc, -1)) SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE DO AfLog WITH "SET CLASSLIB suplimentar OK" update_jtva_coloane([JV], [jtva_coloane_temp]) *========================================================================================== * alegere date: politica de stoc curenta + articol OK (cont dedus) + articol problema (fara cont) * + o politica reala cu nota proprie valida (caz c) - acelasi tipar ca probe_12b_s8_cai_1_3.prg / * probe_12b_s8_verifica_linie.prg *========================================================================================== LOCAL lnOk, lnIdPolStoc, lnIdArtOk, lnIdArtProblema, lcDenOk, lcDenProblema, lnIdPolReal, lnIdArtReal LOCAL llGasitOk, llGasitProblema, llGasitPolReal, llGasitArtReal gcCaz = "[setup] " lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt") lnIdPolStoc = IIF(lnOk > 0 AND USED('crsopt') AND !ISNULL(crsopt.varvalue), VAL(ALLTRIM(crsopt.varvalue)), 0) IF USED('crsopt') USE IN crsopt ENDIF DO Verdict WITH lnIdPolStoc > 0, "politica de stoc citita din OPTIUNI, id_pol=" + TRANSFORM(lnIdPolStoc) IF lnIdPolStoc <= 0 DO Final ENDIF PUBLIC gnId_pol_pret_stoc gnId_pol_pret_stoc = lnIdPolStoc * articol OK: rand al politicii de stoc, ID_NOTA propriu NULL, cont_venit_articol_stoc rezolvat lnOk = SQLEXEC(gnHandle, ; "select a.id_articol from crm_politici_pret_art a " + ; "where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ; "and pack_facturare.cont_venit_articol_stoc(a.id_articol) is not null and rownum = 1", "crsok") llGasitOk = lnOk > 0 AND USED('crsok') AND RECCOUNT('crsok') = 1 lnIdArtOk = IIF(llGasitOk, crsok.id_articol, 0) IF USED('crsok') USE IN crsok ENDIF DO AfLog WITH "articol OK ales: id_articol=" + TRANSFORM(lnIdArtOk) * articol problema: alt rand al politicii de stoc, ID_NOTA propriu NULL, fara cont dedus lnOk = SQLEXEC(gnHandle, ; "select a.id_articol from crm_politici_pret_art a " + ; "where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ; "and a.id_articol <> " + TRANSFORM(lnIdArtOk) + " " + ; "and pack_facturare.cont_venit_articol_stoc(a.id_articol) is null and rownum = 1", "crsprob") llGasitProblema = lnOk > 0 AND USED('crsprob') AND RECCOUNT('crsprob') = 1 lnIdArtProblema = IIF(llGasitProblema, crsprob.id_articol, 0) IF USED('crsprob') USE IN crsprob ENDIF DO AfLog WITH "articol PROBLEMA ales: id_articol=" + TRANSFORM(lnIdArtProblema) * caz (c): o politica reala (<> politica de stoc) cu nota proprie valida (scc nenul) + un articol activ lnOk = SQLEXEC(gnHandle, ; "select p.id_pol from crm_politici_preturi p " + ; "join crm_note_vanzari v on v.id_nota = p.id_nota " + ; "join note_contabile n on n.id_set = v.id_set and n.scc is not null " + ; "where p.id_pol <> " + TRANSFORM(lnIdPolStoc) + " and rownum = 1", "crspolreal") llGasitPolReal = lnOk > 0 AND USED('crspolreal') AND RECCOUNT('crspolreal') = 1 lnIdPolReal = IIF(llGasitPolReal, crspolreal.id_pol, 0) IF USED('crspolreal') USE IN crspolreal ENDIF lnOk = SQLEXEC(gnHandle, "select id_articol from nom_articole where sters = 0 and rownum = 1", "crsartreal") llGasitArtReal = lnOk > 0 AND USED('crsartreal') AND RECCOUNT('crsartreal') = 1 lnIdArtReal = IIF(llGasitArtReal, crsartreal.id_articol, 0) IF USED('crsartreal') USE IN crsartreal ENDIF DO AfLog WITH "CAZ(c) ales: id_pol_real=" + TRANSFORM(lnIdPolReal) + " id_articol=" + TRANSFORM(lnIdArtReal) IF !llGasitOk OR !llGasitProblema OR !llGasitPolReal OR !llGasitArtReal DO AfLog WITH "FAIL: date insuficiente in baza vie, opresc proba" gnFail = gnFail + 1 DO Final ENDIF lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtOk), "crsden1") lcDenOk = IIF(lnOk > 0 AND USED('crsden1') AND RECCOUNT('crsden1') = 1, ALLTRIM(NVL(crsden1.denumire, [])), []) IF USED('crsden1') USE IN crsden1 ENDIF lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtProblema), "crsden2") lcDenProblema = IIF(lnOk > 0 AND USED('crsden2') AND RECCOUNT('crsden2') = 1, ALLTRIM(NVL(crsden2.denumire, [])), []) IF USED('crsden2') USE IN crsden2 ENDIF DO AfLog WITH "denumiri: OK=[" + lcDenOk + "] PROBLEMA=[" + lcDenProblema + "]" * politica de stoc cu ID_NOTA NULL (tranzactie, ROLLBACK la final) - fortez ramura "fara cont dedus" gcCaz = "[setup] " lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = " + TRANSFORM(lnIdPolStoc)) DO Verdict WITH lnOk > 0, "UPDATE politica de stoc ID_NOTA=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk) *========================================================================================== * mediu formular: poDate, jtva_coloane, crsfactura gol, Createobject *========================================================================================== PRIVATE poDate, poGeneratorNumere LOCAL lnIdSet lnIdSet = 25000 + 30 - 1 + NVL(gnScadereStoc, 0) * 10 poDate = CREATEOBJECT("oDateFactura", lnIdSet, 30) poDate.dataireg = DATE(gnAn, gnLuna, 10) poDate.dataact = poDate.dataireg poDate.zi_curs = poDate.dataireg poDate.id_client = 1 poDate.nIdTipDoc = 6 poGeneratorNumere = NULL DO AfLog WITH "poDate OK, tip=" + TRANSFORM(poDate.tip) + " id_pol=" + TRANSFORM(NVL(poDate.id_pol,-1)) + " in_valuta=" + TRANSFORM(poDate.in_valuta) IF USED('jtva_coloane') USE IN jtva_coloane ENDIF IF NVL(poDate.tva_incasare, 0) = 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 DO AfLog WITH "jtva_coloane Reccount=" + TRANSFORM(RECCOUNT('jtva_coloane')) DO PregatesteFacturaGoala LOCAL loForm loForm = CREATEOBJECT('frm_facturare_articole2') DO Verdict WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" IF VARTYPE(loForm) <> 'O' DO Final ENDIF DO AfLog WITH "formular creat, nu afisat (fara Show())" *========================================================================================== * CAZ (a): toArticol fara Id_Pol, articol fara cont dedus -> refuz *========================================================================================== gcCaz = "[a-calea2-refuz] " LOCAL loArticol, lnReccountInainte loArticol = PregatesteToArticol(lnIdArtProblema, lcDenProblema, .F., 0) lnReccountInainte = RECCOUNT('crsfactura') gnSpionCount = 0 gcSpionMesaje = "" LOCAL llRezA llRezA = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) DO Verdict WITH llRezA = .F., "do_adauga_articol_cautat = .F. (obtinut " + TRANSFORM(llRezA) + ")" DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte, ; "Reccount(crsfactura) neschimbat (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")" DO Verdict WITH gnSpionCount >= 1, "spion: cel putin 1 mesaj (obtinut " + TRANSFORM(gnSpionCount) + ")" DO Verdict WITH lcDenProblema $ gcSpionMesaje, "mesajul contine denumirea articolului [" + lcDenProblema + "] - mesaj: [" + gcSpionMesaje + "]" *========================================================================================== * CAZ (b): toArticol fara Id_Pol, articol CU cont dedus -> linia se adauga cu Id_Pol = politica de stoc *========================================================================================== gcCaz = "[b-calea2-cont-dedus] " loArticol = PregatesteToArticol(lnIdArtOk, lcDenOk, .F., 0) DO Verdict WITH TYPE('loArticol.Id_Pol') = 'U', "toArticol FARA proprietatea Id_Pol (Type=" + TYPE('loArticol.Id_Pol') + ")" SELECT crsfactura APPEND BLANK lnReccountInainte = RECCOUNT('crsfactura') gnSpionCount = 0 gcSpionMesaje = "" LOCAL llRezB llRezB = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) DO Verdict WITH llRezB = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezB) + ")" DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == gnId_pol_pret_stoc, ; "linia noua primeste Id_Pol = politica de stoc (" + TRANSFORM(gnId_pol_pret_stoc) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + ")" *========================================================================================== * CAZ (c): toArticol CU Id_Pol = politica reala (<> politica de stoc) -> linia pastreaza politica reala *========================================================================================== gcCaz = "[c-calea2-politica-reala] " loArticol = PregatesteToArticol(lnIdArtReal, "articol-real", .T., lnIdPolReal) DO Verdict WITH TYPE('loArticol.Id_Pol') = 'N' AND loArticol.Id_Pol == lnIdPolReal, ; "toArticol.Id_Pol = politica reala aleasa (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(loArticol.Id_Pol,-999)) + ")" SELECT crsfactura APPEND BLANK gnSpionCount = 0 gcSpionMesaje = "" LOCAL llRezC llRezC = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) DO Verdict WITH llRezC = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezC) + ")" DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == lnIdPolReal, ; "linia noua pastreaza Id_Pol = politica reala (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + "), nu politica de stoc" IF VARTYPE(loForm) = 'O' AND !ISNULL(loForm) loForm.Release() ENDIF loForm = NULL DO Final *================================================================================================== *-- spion amessagebox - contor + texte, incarcat PRIMUL (vezi SET PROCEDURE la inceput) FUNCTION amessagebox LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue gnSpionCount = gnSpionCount + 1 gcSpionMesaje = gcSpionMesaje + "[" + TRANSFORM(tcMessage) + "]" + CHR(13) + CHR(10) DO AfLog WITH " [spion amessagebox] " + TRANSFORM(tcMessage) RETURN 6 ENDFUNC *-- crsfactura gol, cu campul 'gestiune' suplimentar cerut de grd_factura.cGestiune (ca in *-- probe_12b_s8_cai_1_3.prg) - obligatoriu inainte de Createobject (legare ControlSource) PROCEDURE PregatesteFacturaGoala IF USED('crsfactura') USE IN crsfactura ENDIF creeaza_facturacrs([crsfactura]) SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE USE IN crsfactura SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE USE IN crsfact_tmp ENDPROC *-- toArticol: obiect echivalent unui Scatter Name pe crsCodmat/crsDenumire (structura reala, *-- creeaza_cursor_gol/reordoneaza din ofacturare.vc2, 20 coloane), fara/cu id_pol dupa caz FUNCTION PregatesteToArticol LPARAMETERS tnIdArticol, tcDenumire, tlCuIdPol, tnIdPol LOCAL lcCursor, loObj IF USED('crstoart') USE IN crstoart ENDIF IF m.tlCuIdPol CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ; nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ; id_pol N(20), gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ; multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; cantitate N(20,4), pret_val N(20,4)) INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ; id_articol, id_pol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ; discount_unitar, discount_unitar_val, cantitate, pret_val) ; VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ; tnIdPol, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0) ELSE CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ; nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ; gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ; multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; cantitate N(20,4), pret_val N(20,4)) INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ; id_articol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ; discount_unitar, discount_unitar_val, cantitate, pret_val) ; VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ; 0, 0, 0, 1, 1, 1, 0, 0, 1, 0) ENDIF SELECT crstoart GO TOP SCATTER NAME loObj MEMO RETURN loObj ENDFUNC PROCEDURE Verdict LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO AfLog WITH "PASS: " + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL: " + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE AfLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg gnFail = gnFail + 1 ENDPROC PROCEDURE Final LOCAL lnOk gcCaz = "[final] " IF TYPE('gnHandle') = 'N' AND gnHandle > 0 lnOk = SQLEXEC(gnHandle, "ROLLBACK") DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk) IF TYPE('gnTransOriginal') = 'N' SQLSETPROP(gnHandle, "Transactions", gnTransOriginal) ENDIF ENDIF DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC