* probe_s13_refcursor.prg * Ce anume nu poate materializa VFP la statement-ul {call pack_facturare.scrie_factura2(...)}: * rezultatul lui este REF CURSOR-ul OUT V_CURSOR_VERIFICARE (parametrul 17, nedat in apel, legat * automat de driverul ODBC ca result set). Doua ramuri posibile in pachet (liniile 4877/4881, * 5113/5126 din PACKAGE BODY): * a) pack_facturare.cursor_verificare(...) - SELECT cu ~75 coloane si 17 JOIN-uri pe ACT_TEMP * b) SELECT * FROM ACT_TEMP WHERE 1 = 2 - doar coloanele lui ACT_TEMP * Probam ambele forme direct prin SQLExec, in aceeasi sesiune, FARA nicio scriere: * cursor_verificare are un singur parametru, OUT REF CURSOR, deci nu modifica nimic. SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_refcursor_log_' + ; STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-REFCURSOR' + 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 DO Incearca WITH 'A. select direct din ACT_TEMP', [select * from act_temp where 1 = 2], 'c_a' DO Incearca WITH 'B. {call} cu REF CURSOR OUT (cursor_verificare)', [{call pack_facturare.cursor_verificare}], 'c_b' DO Incearca WITH 'C. select cu 300 de coloane din dual', ConstruiesteSelectLarg(300), 'c_c' DO Incearca WITH 'D. select cu 254 de coloane din dual', ConstruiesteSelectLarg(254), 'c_d' DO Incearca WITH 'E. select cu 255 de coloane din dual', ConstruiesteSelectLarg(255), 'c_e' DO Incearca WITH 'F. select cu 256 de coloane din dual', ConstruiesteSelectLarg(256), 'c_f' STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT *============================================================================================== FUNCTION ConstruiesteSelectLarg LPARAMETERS tnN LOCAL lcS, lnI lcS = 'select ' FOR lnI = 1 TO tnN lcS = lcS + IIF(lnI > 1, ',', '') + '1 as c' + TRANSFORM(lnI) ENDFOR RETURN lcS + ' from dual' ENDFUNC PROCEDURE Incearca LPARAMETERS tcEticheta, tcSql, tcCursor LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF IF USED(tcCursor) USE IN (tcCursor) ENDIF STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ; ' SQL(len=' + TRANSFORM(LEN(tcSql)) + ')=[' + LEFT(tcSql, 400) + IIF(LEN(tcSql) > 400, '...', '') + ']' + CHR(13) + CHR(10), gcErrLog, 1) lnRet = -999 TRY lnRet = SQLExec(gnHandle, tcSql, tcCursor) STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1) IF lnRet < 0 IF AERROR(laE) > 0 STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1) ENDIF ELSE IF USED(tcCursor) lnF = AFIELDS(laF, tcCursor) lnLatime = 0 FOR lnI = 1 TO lnF lnLatime = lnLatime + laF[lnI, 3] ENDFOR STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti, ' + ; TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) USE IN (tcCursor) ELSE STRTOFILE(' (niciun cursor creat)' + 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