Subject "Invalid Cursor State"
Author Jorge Andres Brugger
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".
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)

What am I doing wrong?
(FB 3.0.2/ODBC 2.0.5 build 156)
Thanks!