Subject | "Invalid Cursor State" |
---|---|
Author | Jorge Andres Brugger |
Post date | 2017-10-17T18:12:07Z |
Please consider the following SP:
create or alter procedure SP_VAL_REGISTRAR_CANCELACION (
SUCURSAL smallint,
ID_SOLICITUD_A_CANCELAR numeric(8,0))
returns (
ID_SOLICITUD_CANCELACION numeric(8,0))
as
declare variable NUMERO_ITEM numeric(9,0);
declare variable IMPORTE_UNITARIO numeric(10,2);
declare variable CANTIDAD_SOLICITADA numeric(3,0);
declare variable CODIGO_ALFABETA numeric(5,0);
declare variable CODIGO_BARRAS numeric(15,2);
declare variable CODIGO_TROQUEL numeric(7,0);
declare variable GENERICO char(1);
declare variable CANTIDAD_APROBADA numeric(3,0);
declare variable CODIGO_AUTORIZACION varchar(20);
declare variable TIPO_COBERTURA char(1);
declare variable PORCENTAJE_COBERTURA numeric(6,2);
declare variable IMPORTE_COBERTURA numeric(15,2);
declare variable IMPORTE_A_CARGO_AFILIADO numeric(10,2);
begin
/*Genero el ID_SOLICITUD para la cancelación y lo guardo en una variable que utilizaré luego para insertar los items*/
:ID_SOLICITUD_CANCELACION = next value for GEN_VAL_SOLICITUDES_ID;
/*Copio los datos del encabezado de la solicitud pero asignándole el código de acción para la CANCELACIÓN de la solicitud*/
insert into VAL_SOLICITUDES (SUCURSAL, ID_SOLICITUD, NUMERO_REFERENCIA_SOLICITUD, FECHA, HORA, TIPO_TERMINAL,
TIPO_MENSAJE, CODIGO_ACCION, NUMERO_TERMINAL, NOMBRE_SOFTWARE, VERSION_SOFTWARE,
NOMBRE_VALIDADOR, CODIGO_PRESTADOR, CUIT_PRESTADOR, TIPO_MATRICULA_PRESCRIPTOR,
NUMERO_MATRICULA_PRESCRIPTOR, TIPO_PRESCRIPTOR, PROVINCIA_PRESCRIPTOR,
CODIGO_FINANCIADOR, TRACK_CREDENCIAL, NUMERO_CREDENCIAL, NOMBRE_AFILIADO,
MODO_INGRESO_CREDENCIAL, FECHA_RECETA, FECHA_DISPENSA, HORA_DISPENSA, NUMERO_FORMULARIO,
TIPO_TRATAMIENTO)
select SUCURSAL, :ID_SOLICITUD_CANCELACION, NUMERO_REFERENCIA_SOLICITUD, current_date, current_time, TIPO_TERMINAL,
TIPO_MENSAJE, 20010, NUMERO_TERMINAL, NOMBRE_SOFTWARE, VERSION_SOFTWARE, NOMBRE_VALIDADOR, CODIGO_PRESTADOR,
CUIT_PRESTADOR, TIPO_MATRICULA_PRESCRIPTOR, NUMERO_MATRICULA_PRESCRIPTOR, TIPO_PRESCRIPTOR,
PROVINCIA_PRESCRIPTOR, CODIGO_FINANCIADOR, TRACK_CREDENCIAL, NUMERO_CREDENCIAL, NOMBRE_AFILIADO,
MODO_INGRESO_CREDENCIAL, FECHA_RECETA, FECHA_DISPENSA, HORA_DISPENSA, NUMERO_FORMULARIO, TIPO_TRATAMIENTO
from VAL_SOLICITUDES
where ID_SOLICITUD = :ID_SOLICITUD_A_CANCELAR and
VAL_SOLICITUDES.SUCURSAL = :SUCURSAL;
/*Copio los items de la solicitud para asignárselos a la solicitud de cancelación*/
for select VAL_SOLICITUDES_ITEMS.NUMERO_ITEM, VAL_SOLICITUDES_ITEMS.IMPORTE_UNITARIO,
VAL_SOLICITUDES_ITEMS.CANTIDAD_SOLICITADA, VAL_SOLICITUDES_ITEMS.CODIGO_ALFABETA,
VAL_SOLICITUDES_ITEMS.CODIGO_BARRAS, VAL_SOLICITUDES_ITEMS.CODIGO_TROQUEL, VAL_SOLICITUDES_ITEMS.GENERICO,
VAL_SOLICITUDES_ITEMS.CANTIDAD_APROBADA, VAL_SOLICITUDES_ITEMS.CODIGO_AUTORIZACION,
VAL_SOLICITUDES_ITEMS.TIPO_COBERTURA, VAL_SOLICITUDES_ITEMS.PORCENTAJE_COBERTURA,
VAL_SOLICITUDES_ITEMS.IMPORTE_COBERTURA, VAL_SOLICITUDES_ITEMS.IMPORTE_A_CARGO_AFILIADO
from VAL_SOLICITUDES_ITEMS
where VAL_SOLICITUDES_ITEMS.ID_SOLICITUD = :ID_SOLICITUD_A_CANCELAR and
VAL_SOLICITUDES_ITEMS.SUCURSAL = :SUCURSAL
into :NUMERO_ITEM, :IMPORTE_UNITARIO, :CANTIDAD_SOLICITADA, :CODIGO_ALFABETA, :CODIGO_BARRAS, :CODIGO_TROQUEL,
:GENERICO, :CANTIDAD_APROBADA, :CODIGO_AUTORIZACION, :TIPO_COBERTURA, :PORCENTAJE_COBERTURA,
:IMPORTE_COBERTURA, :IMPORTE_A_CARGO_AFILIADO
do
insert into VAL_SOLICITUDES_ITEMS (SUCURSAL, ID_SOLICITUD, NUMERO_ITEM, IMPORTE_UNITARIO, CANTIDAD_SOLICITADA,
CODIGO_ALFABETA, CODIGO_BARRAS, CODIGO_TROQUEL, GENERICO, CANTIDAD_APROBADA,
CODIGO_AUTORIZACION, TIPO_COBERTURA, PORCENTAJE_COBERTURA, IMPORTE_COBERTURA,
IMPORTE_A_CARGO_AFILIADO)
values (:SUCURSAL, :ID_SOLICITUD_CANCELACION, :NUMERO_ITEM, :IMPORTE_UNITARIO, :CANTIDAD_SOLICITADA,
:CODIGO_ALFABETA, :CODIGO_BARRAS, :CODIGO_TROQUEL, :GENERICO, :CANTIDAD_APROBADA, :CODIGO_AUTORIZACION,
:TIPO_COBERTURA, :PORCENTAJE_COBERTURA, :IMPORTE_COBERTURA, :IMPORTE_A_CARGO_AFILIADO);
end
I´m calling it from Clarion by using ODBC, and getting "Invalid Cursor State". create or alter procedure SP_VAL_REGISTRAR_CANCELACION (
SUCURSAL smallint,
ID_SOLICITUD_A_CANCELAR numeric(8,0))
returns (
ID_SOLICITUD_CANCELACION numeric(8,0))
as
declare variable NUMERO_ITEM numeric(9,0);
declare variable IMPORTE_UNITARIO numeric(10,2);
declare variable CANTIDAD_SOLICITADA numeric(3,0);
declare variable CODIGO_ALFABETA numeric(5,0);
declare variable CODIGO_BARRAS numeric(15,2);
declare variable CODIGO_TROQUEL numeric(7,0);
declare variable GENERICO char(1);
declare variable CANTIDAD_APROBADA numeric(3,0);
declare variable CODIGO_AUTORIZACION varchar(20);
declare variable TIPO_COBERTURA char(1);
declare variable PORCENTAJE_COBERTURA numeric(6,2);
declare variable IMPORTE_COBERTURA numeric(15,2);
declare variable IMPORTE_A_CARGO_AFILIADO numeric(10,2);
begin
/*Genero el ID_SOLICITUD para la cancelación y lo guardo en una variable que utilizaré luego para insertar los items*/
:ID_SOLICITUD_CANCELACION = next value for GEN_VAL_SOLICITUDES_ID;
/*Copio los datos del encabezado de la solicitud pero asignándole el código de acción para la CANCELACIÓN de la solicitud*/
insert into VAL_SOLICITUDES (SUCURSAL, ID_SOLICITUD, NUMERO_REFERENCIA_SOLICITUD, FECHA, HORA, TIPO_TERMINAL,
TIPO_MENSAJE, CODIGO_ACCION, NUMERO_TERMINAL, NOMBRE_SOFTWARE, VERSION_SOFTWARE,
NOMBRE_VALIDADOR, CODIGO_PRESTADOR, CUIT_PRESTADOR, TIPO_MATRICULA_PRESCRIPTOR,
NUMERO_MATRICULA_PRESCRIPTOR, TIPO_PRESCRIPTOR, PROVINCIA_PRESCRIPTOR,
CODIGO_FINANCIADOR, TRACK_CREDENCIAL, NUMERO_CREDENCIAL, NOMBRE_AFILIADO,
MODO_INGRESO_CREDENCIAL, FECHA_RECETA, FECHA_DISPENSA, HORA_DISPENSA, NUMERO_FORMULARIO,
TIPO_TRATAMIENTO)
select SUCURSAL, :ID_SOLICITUD_CANCELACION, NUMERO_REFERENCIA_SOLICITUD, current_date, current_time, TIPO_TERMINAL,
TIPO_MENSAJE, 20010, NUMERO_TERMINAL, NOMBRE_SOFTWARE, VERSION_SOFTWARE, NOMBRE_VALIDADOR, CODIGO_PRESTADOR,
CUIT_PRESTADOR, TIPO_MATRICULA_PRESCRIPTOR, NUMERO_MATRICULA_PRESCRIPTOR, TIPO_PRESCRIPTOR,
PROVINCIA_PRESCRIPTOR, CODIGO_FINANCIADOR, TRACK_CREDENCIAL, NUMERO_CREDENCIAL, NOMBRE_AFILIADO,
MODO_INGRESO_CREDENCIAL, FECHA_RECETA, FECHA_DISPENSA, HORA_DISPENSA, NUMERO_FORMULARIO, TIPO_TRATAMIENTO
from VAL_SOLICITUDES
where ID_SOLICITUD = :ID_SOLICITUD_A_CANCELAR and
VAL_SOLICITUDES.SUCURSAL = :SUCURSAL;
/*Copio los items de la solicitud para asignárselos a la solicitud de cancelación*/
for select VAL_SOLICITUDES_ITEMS.NUMERO_ITEM, VAL_SOLICITUDES_ITEMS.IMPORTE_UNITARIO,
VAL_SOLICITUDES_ITEMS.CANTIDAD_SOLICITADA, VAL_SOLICITUDES_ITEMS.CODIGO_ALFABETA,
VAL_SOLICITUDES_ITEMS.CODIGO_BARRAS, VAL_SOLICITUDES_ITEMS.CODIGO_TROQUEL, VAL_SOLICITUDES_ITEMS.GENERICO,
VAL_SOLICITUDES_ITEMS.CANTIDAD_APROBADA, VAL_SOLICITUDES_ITEMS.CODIGO_AUTORIZACION,
VAL_SOLICITUDES_ITEMS.TIPO_COBERTURA, VAL_SOLICITUDES_ITEMS.PORCENTAJE_COBERTURA,
VAL_SOLICITUDES_ITEMS.IMPORTE_COBERTURA, VAL_SOLICITUDES_ITEMS.IMPORTE_A_CARGO_AFILIADO
from VAL_SOLICITUDES_ITEMS
where VAL_SOLICITUDES_ITEMS.ID_SOLICITUD = :ID_SOLICITUD_A_CANCELAR and
VAL_SOLICITUDES_ITEMS.SUCURSAL = :SUCURSAL
into :NUMERO_ITEM, :IMPORTE_UNITARIO, :CANTIDAD_SOLICITADA, :CODIGO_ALFABETA, :CODIGO_BARRAS, :CODIGO_TROQUEL,
:GENERICO, :CANTIDAD_APROBADA, :CODIGO_AUTORIZACION, :TIPO_COBERTURA, :PORCENTAJE_COBERTURA,
:IMPORTE_COBERTURA, :IMPORTE_A_CARGO_AFILIADO
do
insert into VAL_SOLICITUDES_ITEMS (SUCURSAL, ID_SOLICITUD, NUMERO_ITEM, IMPORTE_UNITARIO, CANTIDAD_SOLICITADA,
CODIGO_ALFABETA, CODIGO_BARRAS, CODIGO_TROQUEL, GENERICO, CANTIDAD_APROBADA,
CODIGO_AUTORIZACION, TIPO_COBERTURA, PORCENTAJE_COBERTURA, IMPORTE_COBERTURA,
IMPORTE_A_CARGO_AFILIADO)
values (:SUCURSAL, :ID_SOLICITUD_CANCELACION, :NUMERO_ITEM, :IMPORTE_UNITARIO, :CANTIDAD_SOLICITADA,
:CODIGO_ALFABETA, :CODIGO_BARRAS, :CODIGO_TROQUEL, :GENERICO, :CANTIDAD_APROBADA, :CODIGO_AUTORIZACION,
:TIPO_COBERTURA, :PORCENTAJE_COBERTURA, :IMPORTE_COBERTURA, :IMPORTE_A_CARGO_AFILIADO);
end
ODBC trace includes:
FARMACLICK a2c-2774 ENTER SQLFreeStmt
HSTMT 0x0376DF80
UWORD 3 <SQL_RESET_PARAMS>
FARMACLICK a2c-2774 EXIT SQLFreeStmt with return code 0 (SQL_SUCCESS)
HSTMT 0x0376DF80
UWORD 3 <SQL_RESET_PARAMS>
FARMACLICK a2c-2774 ENTER SQLPrepare
HSTMT 0x0376DF80
UCHAR * 0x03C64990 [ -3] "{CALL sp_val_registrar_cancelacion(2,42)}\ 0"
SDWORD -3
FARMACLICK a2c-2774 EXIT SQLPrepare with return code 0 (SQL_SUCCESS)
HSTMT 0x0376DF80
UCHAR * 0x03C64990 [ -3] "{CALL sp_val_registrar_cancelacion(2,42)}\ 0"
SDWORD -3
FARMACLICK a2c-2774 ENTER SQLExecute
HSTMT 0x0376DF80
FARMACLICK a2c-2774 EXIT SQLExecute with return code 0 (SQL_SUCCESS)
HSTMT 0x0376DF80
FARMACLICK a2c-2774 ENTER SQLNumResultCols
HSTMT 0x0376DF80
SWORD * 0x053AF7B2
FARMACLICK a2c-2774 EXIT SQLNumResultCols with return code 0 (SQL_SUCCESS)
HSTMT 0x0376DF80
SWORD * 0x053AF7B2 (1)
FARMACLICK a2c-2774 ENTER SQLSetStmtOption
HSTMT 0x0376DF80
UWORD 9 <SQL_ROWSET_SIZE>
SQLPOINTER 1
FARMACLICK a2c-2774 EXIT SQLSetStmtOption with return code 0 (SQL_SUCCESS)
HSTMT 0x0376DF80
UWORD 9 <SQL_ROWSET_SIZE>
SQLPOINTER 1
FARMACLICK a2c-2774 ENTER SQLFetch
HSTMT 0x012CB9B8
FARMACLICK a2c-2774 EXIT SQLFetch with return code -1 (SQL_ERROR)
HSTMT 0x012CB9B8
DIAG [24000] [ODBC Firebird Driver]Invalid cursor state (0)
FARMACLICK a2c-2774 ENTER SQLErrorW
HENV 0x0376BF40
HDBC 0x012C9068
HSTMT 0x012CB9B8
WCHAR * 0x053AF72C
SDWORD * 0x053AF7A2
WCHAR * 0x053AF32C
SWORD 512
SWORD * 0x053AF7A6
FARMACLICK a2c-2774 EXIT SQLErrorW with return code 0 (SQL_SUCCESS)
HENV 0x0376BF40
HDBC 0x012C9068
HSTMT 0x012CB9B8
WCHAR * 0x053AF72C [ 5] "24000"
SDWORD * 0x053AF7A2 (0)
WCHAR * 0x053AF32C [ 42] "[ODBC Firebird Driver]Invalid cursor state"
SWORD 512
SWORD * 0x053AF7A6 (42)