none
Problema en Stored Procedure RRS feed

  • Pregunta

  • Tengo este procedimiento:

    sp_cp_Obten_Facturas_Empresas 1,'2,7,9',2,5500,'Oct 23 16 11:02:44AM','Oct 23 16 11:02:44AM',109,NULL 

    ALTER PROCEDURE sp_cp_Obten_Facturas_Empresas(
    @Numero_Empresa INT,
    @Cadena_Empresas VARCHAR(200),
    @Numero_Usuario INT,
    @Numero_Proveedor INT,
    @Fecha_De DATETIME,
    @Fecha_Hasta DATETIME,
    @Clas_Moneda INT,
    @Numero_CP VARCHAR(1000) = NULL)

    AS

    DECLARE @Tipo_Pedido TINYINT,
    @Descripcion VARCHAR(100)

    DECLARE @Query VARCHAR(1000)

    DECLARE @Numero_CC INT,
    @Nombre_Empresa VARCHAR(100),
    @Numero_Cliente_Aux INT,
    @Nombre_Cliente VARCHAR(300),
    @Numero_Concepto INT,
    @Des_Concepto VARCHAR(80),
    @Numero_Referencia VARCHAR(50),
    @Documento VARCHAR(50),
    @Fecha_Aplicacion DATETIME,
    @Fecha_Vencimiento DATETIME,
    @Monto DECIMAL(20,2),
    @Abono DECIMAL(20,2),
    @Saldo DECIMAL(20,2),
    @Importe_Pago DECIMAL(20,2),
    @Clas_Moneda_Aux INT,
    @Des_Moneda VARCHAR(80),
    @Numero_Banco INT,
    @Nombre_Banco VARCHAR(200),
    @Numero_Cuenta INT,
    @Des_Cuenta VARCHAR(50),
    @Clas_Tipo_Documento INT,
    @Des_Tipo_Documento VARCHAR(80),
    @Tipo_Documento_CC SMALLINT,
    @Numero_Caja INT,
    @Des_Caja VARCHAR(200),
    @Clas_IVA INT,
    @Auxiliar TINYINT,
    @Tipo_Cambio DECIMAL(20,10),
    @Anticipo    INT,
       @Poliza_Manual INT,
       @Folio_Fiscal    VARCHAR(4000)

    DECLARE @Dato_01 INT,
    @Dato_02 DECIMAL(20,2)

    BEGIN TRAN

    -- Inicializa las variables

    -------------------------------------------------------------------------------------------------------------------------
    CREATE TABLE #Registros_Pagos(
    Secuencia INT IDENTITY NOT NULL PRIMARY KEY,
    Nombre_Empresa VARCHAR(100),
    Numero_Empresa INT,
    Numero_Usuario INT,
    Tipo_Pedido TINYINT,
    Tipo INT,
    Descripcion VARCHAR(100),
    Chk TINYINT,
    Numero_CC INT,
    Numero_Cliente VARCHAR(100),
    Nombre_Cliente VARCHAR(300),
    Numero_Concepto INT,
    Des_Concepto VARCHAR(80),
    Numero_Referencia VARCHAR(50),
    Documento VARCHAR(50),
    Fecha_Aplicacion DATETIME,
    Fecha_Vencimiento DATETIME,
    Monto VARCHAR(100),
    Abono DECIMAL(20,2),
    Saldo VARCHAR(100),
    Importe_Pago VARCHAR(100),
    Clas_Moneda INT,
    Des_Moneda VARCHAR(80),
    Numero_Banco INT,
    Nombre_Banco VARCHAR(200),
    Numero_Cuenta INT,
    Des_Cuenta VARCHAR(50),
    Clas_Tipo_Documento INT,
    Des_Tipo_Documento VARCHAR(80),
    Tipo_Documento_CC SMALLINT,
    Numero_Caja INT,
    Des_Caja VARCHAR(200),
    Clas_IVA INT,
    Auxiliar TINYINT,
    Tipo_Cambio DECIMAL(20,10),
    Anticipo INT,
    Poliza_Manual           INT,
    Folio_Fiscal            VARCHAR(4000))
    -------------------------------------------------------------------------------------------------------------------------


    SET @Descripcion = CASE @Tipo_Pedido WHEN 0 THEN 'NO PAGADAS'
    WHEN 1 THEN 'NO PAGADAS'
    END

    SET @Query = 'DECLARE cc_Facturas CURSOR FOR
    SELECT Nombre_Corto, Numero, Numero_Proveedor, Nombre_Completo, Numero_Concepto, Descripcion,
    Numero_Referencia, Documento, Fecha_Aplicacion, Fecha_Vencimiento, Monto,
    Monto - Saldo, Saldo, Saldo, Moneda, Des_Moneda,
    Num_Banco, Nombre_Banco, Num_Cuenta, Des_Num_Cuenta, -59,
    ''Docto Electrónico'', 1, Num_Caja, Caja_Descripcion , Clas_IVA,
    Auxiliar, Tipo_Cambio, Anticipo, Poliza_Manual, Folio_Fiscal
    FROM vCuentas_Pagar_Empresa
    WHERE Saldo > 0 
    AND Numero_Concepto IN( SELECT Numero
    FROM Cuentas_Pagar_Conceptos
    WHERE Numero_Empresa IN ('+@Cadena_Empresas+') 
    AND Tipo = ''+'' 
    AND Numero <> -1)
    AND Fecha_Aplicacion BETWEEN  '+CAST(@Fecha_De AS VARCHAR(20))+' AND '+CAST(@Fecha_Hasta AS VARCHAR(20))+'
    AND Moneda = '+CAST(@Clas_Moneda AS VARCHAR(5))+' 
    AND Numero_Empresa IN ('+@Cadena_Empresas+') 
    AND Numero_Proveedor = CASE ISNULL('+CAST(@Numero_Proveedor AS VARCHAR(10))+', 0) 
    WHEN 0 THEN Numero_Proveedor 
    ELSE '+CAST(@Numero_Proveedor AS VARCHAR(10))+' END'

    ---------------------------------------------------------------------------------------------------------------------


    EXEC (@Query)

    OPEN cc_Facturas
    FETCH NEXT FROM cc_Facturas INTO @Numero_CC, @Nombre_Empresa, @Numero_Cliente_Aux, @Nombre_Cliente, @Numero_Concepto, @Des_Concepto,
    @Numero_Referencia, @Documento, @Fecha_Aplicacion, @Fecha_Vencimiento, @Monto,
    @Abono, @Saldo, @Importe_Pago, @Clas_Moneda_Aux, @Des_Moneda, 
    @Numero_Banco, @Nombre_Banco, @Numero_Cuenta, @Des_Cuenta, @Clas_Tipo_Documento, 
    @Des_Tipo_Documento, @Tipo_Documento_CC, @Numero_Caja, @Des_Caja, @Clas_IVA, 
    @Auxiliar, @Tipo_Cambio, @Anticipo, @Poliza_Manual, @Folio_Fiscal

    WHILE  @@FETCH_STATUS = 0
    BEGIN

    -----------------------------------------------------------------------------------------------------------------
    -- DATOS
    SET @Dato_02 = ISNULL(@Dato_02, 0) + @Saldo 
    SET @Dato_01 = ISNULL(@Dato_01, 0) + 1

    INSERT INTO #Registros_Pagos
    VALUES (@Numero_Empresa, @Numero_Usuario, @Tipo_Pedido, 3,NULL, NULL,
    0, @Numero_CC, RTRIM(@Numero_Cliente_Aux), @Nombre_Cliente, @Numero_Concepto, @Des_Concepto,
    @Numero_Referencia, @Documento,@Fecha_Aplicacion, @Fecha_Vencimiento, 
    RTRIM(CONVERT(VARCHAR(100), CAST(@Monto AS MONEY), 1)), @Abono,
    RTRIM(CONVERT(VARCHAR(100), CAST(@Saldo AS MONEY), 1)),
    RTRIM(CONVERT(VARCHAR(100), CAST(@Importe_Pago AS MONEY), 1)),
    @Clas_Moneda_Aux, @Des_Moneda, @Numero_Banco, @Nombre_Banco, @Numero_Cuenta, @Des_Cuenta,
    @Clas_Tipo_Documento, @Des_Tipo_Documento, @Tipo_Documento_CC, @Numero_Caja, @Des_Caja,
    @Clas_IVA, @Auxiliar, @Tipo_Cambio, @Anticipo, @Poliza_Manual, @Folio_Fiscal)

    -----------------------------------------------------------------------------------------------------------------

    FETCH NEXT FROM cc_Facturas INTO  @Numero_CC, @Nombre_Empresa, @Numero_Cliente_Aux, @Nombre_Cliente, @Numero_Concepto, @Des_Concepto,
    @Numero_Referencia, @Documento, @Fecha_Aplicacion, @Fecha_Vencimiento, @Monto,
    @Abono, @Saldo, @Importe_Pago, @Clas_Moneda_Aux, @Des_Moneda, 
    @Numero_Banco, @Nombre_Banco, @Numero_Cuenta, @Des_Cuenta, @Clas_Tipo_Documento,
    @Des_Tipo_Documento, @Tipo_Documento_CC, @Numero_Caja, @Des_Caja, @Clas_IVA, 
    @Auxiliar, @Tipo_Cambio, @Anticipo, @Poliza_Manual, @Folio_Fiscal
    END

    CLOSE cc_Facturas
    DEALLOCATE cc_Facturas

    ---------------------------------------------------------------------------------------------------------------------


    INSERT INTO #Registros_Pagos
    VALUES (@Numero_Empresa, @Numero_Usuario, NULL, 4, @Nombre_Empresa, 'TOTAL',
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, @Dato_01, NULL, NULL, NULL, NULL,
    RTRIM(CONVERT(VARCHAR(100), CAST(@Dato_02 AS MONEY), 1)),
    RTRIM(CONVERT(VARCHAR(100), CAST(0 AS MONEY), 1)),
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL)
    -------------------------------------------------------------------------------------------------------------------------

    -------------------------------------------------------------------------------------------------------------------------
    -- SEPARADORES
    INSERT INTO #Registros_Pagos
    VALUES (@Numero_Empresa, @Numero_Usuario, NULL, 0, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL)

    INSERT INTO #Registros_Pagos
    VALUES (@Numero_Empresa, @Numero_Usuario, NULL, 0, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
    NULL, NULL)
    -------------------------------------------------------------------------------------------------------------------------

    -------------------------------------------------------------------------------------------------------------------------
    -- DEVUELVE LOS DATOS POR MEDIO DEL SELECT
    SELECT Secuencia, Tipo, Nombre_Empresa, Descripcion, Chk, Numero_CC, Numero_Cliente, Nombre_Cliente, Numero_Concepto,
    Des_Concepto, Numero_Referencia, Documento, Fecha_Aplicacion, Fecha_Vencimiento, Monto, Abono,
    Saldo, Importe_Pago, Clas_Moneda, Des_Moneda, Numero_Banco, Nombre_Banco, Numero_Cuenta,
    Des_Cuenta, Clas_Tipo_Documento, Des_Tipo_Documento, Tipo_Documento_CC, Numero_Caja, Des_Caja,
    Clas_IVA, Auxiliar, Tipo_Cambio, Anticipo, Poliza_Manual, Folio_Fiscal ,CONVERT(VARCHAR(10), Fecha_Aplicacion, 103)AS Fecha_Aplicacion1
    FROM #Registros_Pagos
    WHERE Numero_Usuario = @Numero_Usuario AND
    Numero_Empresa = @Numero_Empresa 
    ORDER BY Secuencia
    -------------------------------------------------------------------------------------------------------------------------

    COMMIT TRAN
    RETURN 0

    Y a la hora de correrlo me marca los siguientes errores:

    Msg 16916, Level 16, State 1, Procedure sp_cp_Obten_Facturas_Empresas, Line 128
    No existe un cursor con el nombre 'cc_Facturas'.
    Msg 16916, Level 16, State 1, Procedure sp_cp_Obten_Facturas_Empresas, Line 131
    No existe un cursor con el nombre 'cc_Facturas'.
    Msg 16916, Level 16, State 1, Procedure sp_cp_Obten_Facturas_Empresas, Line 167
    No existe un cursor con el nombre 'cc_Facturas'.
    Msg 16916, Level 16, State 1, Procedure sp_cp_Obten_Facturas_Empresas, Line 168
    No existe un cursor con el nombre 'cc_Facturas'.

    alguien sabe como corregir el error

    lunes, 26 de septiembre de 2016 17:01

Respuestas

  • Seria interesante saber que tratas de hacer y por que usas un cursor ademas de sql dinamico.

    Los cursores en SQL Server pueden ser locales (alcanze donde se declara) o globales (alcanze en la conexion), y el defecto se puede cambiar con un seteo a nivel de base de dato. En tu caso, si el defecto es LOCAL entonces al ejecutar el query dinamico y salir de esa sesion el cursor se destruye.

    SELECT
        name,
        database_id,
        is_local_cursor_default
    FROM
        sys.databases
    WHERE
        database_id = DB_ID();
    GO


    Ejemplo:

    EXEC sys.sp_executesql N'declare mc cursor local for select 1 as col1;'
    OPEN mc;
    CLOSE mc;
    DEALLOCATE mc;
    GO
    /*
    
    Msg 16916, Level 16, State 1, Line 1
    A cursor with the name 'mc' does not exist.
    Msg 16916, Level 16, State 1, Line 3
    A cursor with the name 'mc' does not exist.
    Msg 16916, Level 16, State 1, Line 4
    A cursor with the name 'mc' does not exist.
    
    */
    
    -- no error
    EXEC sys.sp_executesql N'declare mc cursor global for select 1 as col1;'
    OPEN mc;
    CLOSE mc;
    DEALLOCATE mc;
    GO

    Tambien puedes usar variable tipo cursor y tener parametros de salida que duvuelven un cursor.

    DECLARE @c CURSOR;
    EXEC sys.sp_executesql N'set @mc = cursor local for select 1 as col1; open @mc;', N'@mc cursor output', @c OUTPUT;
    DECLARE @i int;
    FETCH FROM @c INTO @i;
    SELECT @i AS col1;
    CLOSE @c;
    DEALLOCATE @c;
    GO

    Tambien puedes usar la funcion CURSOR_STATUS para saber si un cursor con ese nombre y tipo esta disponible para uso.

    EXEC sys.sp_executesql N'declare c cursor global for select 1 as col1;';
    SELECT CURSOR_STATUS('global', 'c') AS col1;
    OPEN c;
    CLOSE c;
    DEALLOCATE c;
    GO
    -- cursor global con ese nombre no existe
    EXEC sys.sp_executesql N'declare c cursor local for select 1 as col1;';
    SELECT CURSOR_STATUS('global', 'c') AS col1;
    OPEN c;
    CLOSE c;
    DEALLOCATE c;

    Para resolver tu caso bastaria marcar el cursor como GLOBAL.

    Te recomiendo tratar de usar una solucion orientada a conjuntos y dejes el cursor como ultima herramienta en tu caja.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    lunes, 26 de septiembre de 2016 17:29