#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
This commit is contained in:
99
utile/Teste/editare_factura/probe_s13_callshape.prg
Normal file
99
utile/Teste/editare_factura/probe_s13_callshape.prg
Normal file
@@ -0,0 +1,99 @@
|
||||
* probe_s13_callshape.prg
|
||||
* Forma apelului care cade: {call proc(...argumente..., ?@obiect.proprietate)} unde procedura are
|
||||
* si un ultim parametru OUT REF CURSOR nedat in apel (legat automat de driver ca result set).
|
||||
* Reproducem forma pe pack_facturare.cursor_avize (V_LISTAID IN, V_ID_UTIL IN, V_DISCOUNT OUT
|
||||
* NUMBER, V_CURSOR OUT REF CURSOR) - aceeasi forma ca scrie_factura2, dar procedura NU scrie nimic
|
||||
* (initializeaza_facturare seteaza doar variabile de pachet; cursorul se deschide pe lista goala).
|
||||
*
|
||||
* Trei variante, ca sa izolam ce declanseaza VFP 1872:
|
||||
* 1) ?@ legat de o variabila PUBLIC simpla
|
||||
* 2) ?@ legat de o proprietate de obiect (exact ca ?@poDate.nid_vanzare)
|
||||
* 3) acelasi cursor, dar chemat fara {call} (control)
|
||||
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
|
||||
PUBLIC gcErrLog, pnDisc, poX
|
||||
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_callshape_log_' + ;
|
||||
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
|
||||
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-CALLSHAPE' + CHR(13) + CHR(10), gcErrLog)
|
||||
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
|
||||
IF gnHandle <= 0
|
||||
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
QUIT
|
||||
ENDIF
|
||||
|
||||
pnDisc = 0
|
||||
poX = CREATEOBJECT('Empty')
|
||||
ADDPROPERTY(poX, 'nid_vanzare', 0)
|
||||
|
||||
DO Incearca WITH '1. {call cursor_avize(...,?@pnDisc)} - variabila PUBLIC', [{call pack_facturare.cursor_avize('',8,?@pnDisc)}], 'c_1'
|
||||
DO Incearca WITH '2. {call cursor_avize(...,?@poX.nid_vanzare)} - proprietate de obiect', [{call pack_facturare.cursor_avize('',8,?@poX.nid_vanzare)}], 'c_2'
|
||||
DO Incearca WITH '3. {call cursor_verificare} - fara parametru OUT scalar (control)', [{call pack_facturare.cursor_verificare}], 'c_3'
|
||||
|
||||
*!* CONTROLUL care conteaza: aceeasi procedura (are OUT REF CURSOR), dar cu un argument care
|
||||
*!* face Oracle sa arunce INAINTE de OPEN-ul cursorului. Daca VFP raporteaza 1872 in loc de
|
||||
*!* eroarea Oracle, atunci "Too many columns." e MASCA unei erori Oracle, nu un defect de coloane.
|
||||
DO Incearca WITH '4. {call cursor_avize} cu lista invalida - Oracle arunca inainte de OPEN', [{call pack_facturare.cursor_avize('abc',8,?@pnDisc)}], 'c_4'
|
||||
DO Incearca WITH '5. {call cursor_avize} cu id_util inexistent', [{call pack_facturare.cursor_avize('',-987654,?@pnDisc)}], 'c_5'
|
||||
DO Incearca WITH '6. begin ... end; care arunca (fara REF CURSOR) - control', [begin raise_application_error(-20000,'proba s13'); end;], 'c_6'
|
||||
DO Incearca WITH '7. {call} pe procedura inexistenta', [{call pack_facturare.procedura_inexistenta_s13(1)}], 'c_7'
|
||||
|
||||
*!* Argumentul 11 al lui scrie_factura2 e o EXPRESIE cu virgula in ea:
|
||||
*!* to_date('20090518121908','YYYYMMDDHH24MISS'). Driverul ODBC construieste blocul anonim din
|
||||
*!* lista de argumente (vezi testul 7: foloseste DBMS_DESCRIBE), deci virgula dinauntru poate fi
|
||||
*!* citita ca separator si numarul de argumente iese gresit.
|
||||
DO Incearca WITH '8. {call cursor_avize} cu expresie ce contine virgula ca argument', [{call pack_facturare.cursor_avize(to_char(sysdate,'YYYYMMDD'),8,?@pnDisc)}], 'c_8'
|
||||
DO Incearca WITH '9. {call cursor_avize} cu NULL ca argument text', [{call pack_facturare.cursor_avize(NULL,8,?@pnDisc)}], 'c_9'
|
||||
DO Incearca WITH '10. {call cursor_avize} cu to_date(...) ca argument', [{call pack_facturare.cursor_avize(to_char(to_date('20090518','YYYYMMDD'),'DD'),8,?@pnDisc)}], 'c_10'
|
||||
|
||||
*!* Statement-ul EXACT care cade in flux, dar intr-o sesiune curata: VANZARI_DETALII_TEMP (tabela
|
||||
*!* temporara de sesiune) e goala, deci procedura arunca FACT-004 la linia 4974 INAINTE sa deschida
|
||||
*!* REF CURSOR-ul si inainte de orice scriere reala. Daca VFP raporteaza eroarea Oracle -> 1872
|
||||
*!* apare doar pe drumul de succes. Daca raporteaza tot 1872 -> e defect de descriere, nu de date.
|
||||
DO Incearca WITH '11. statement-ul REAL al doc 360, sesiune curata (temp goale)', ;
|
||||
[{call pack_facturare.scrie_factura2(300.00,57.00,0.00,'',0,NULL,NULL,NULL,NULL,0,to_date('20090518121908','YYYYMMDDHH24MISS'),NULL,'',1,0,?@poX.nid_vanzare)}], 'c_11'
|
||||
|
||||
STRTOFILE('pnDisc dupa apel = ' + TRANSFORM(pnDisc) + ' poX.nid_vanzare = ' + TRANSFORM(poX.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
QUIT
|
||||
|
||||
|
||||
PROCEDURE Incearca
|
||||
LPARAMETERS tcEticheta, tcSql, tcCursor
|
||||
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF, lcAlte, lnJ
|
||||
|
||||
IF USED(tcCursor)
|
||||
USE IN (tcCursor)
|
||||
ENDIF
|
||||
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ' SQL=[' + tcSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
|
||||
TRY
|
||||
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
|
||||
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
IF lnRet >= 0
|
||||
FOR lnJ = 0 TO 3
|
||||
lcAlte = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
|
||||
IF USED(lcAlte)
|
||||
lnF = AFIELDS(laF, lcAlte)
|
||||
lnLatime = 0
|
||||
FOR lnI = 1 TO lnF
|
||||
lnLatime = lnLatime + laF[lnI, 3]
|
||||
ENDFOR
|
||||
STRTOFILE(' cursor [' + lcAlte + ']: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + ;
|
||||
TRANSFORM(lnLatime) + ' octeti, ' + TRANSFORM(RECCOUNT(lcAlte)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
USE IN (lcAlte)
|
||||
ENDIF
|
||||
ENDFOR
|
||||
ELSE
|
||||
IF AERROR(laE) > 0
|
||||
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
ENDIF
|
||||
ENDIF
|
||||
CATCH TO loEx
|
||||
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
|
||||
ENDTRY
|
||||
ENDPROC
|
||||
Reference in New Issue
Block a user