Fue lo primero que se me ocurrió.
Estoy armando una consulta para hacer un balance de sumas y saldos.
Tengo mi tabla de cuentas contables, en donde ahí tengo todos los niveles
del árbol del plan de cuentas.
Yo genero el cursor en donde, aparte de traerme la tabla de cuentas, me
traigo los saldos de las cuentas imputables.
También tengo otra tabla temporal, en donde voy guardando los registros
definitivos.
Entonces voy recorriendo de ese cursor, para ir calculando los saldos de
cada padre con respecto a los hijos que tiene y almacenándolos en la tabla
temporal para después devolver esta como definitiva.
Fue lo mejor que me salio.
Adjunto el SP para que entiendas mejor. Igualmente, así funciona, la
pregunta fue una curiosidad.
Si hay alguna forma mejor de hacer lo que hice (seguramente) soy todo oídos.
Saludos.
 
 
 
Martín R. Comparetto
NewDev S.R.L.
Rioja 1151 Piso 10 Of. 4
(S2000AYO) Rosario - Santa Fé - Argentina
›  <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED]

* (54-341) 425-9808

þ  <http://www.newdev.com.ar/> www.newdev.com.ar

 

  _____  

De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Jose Mariano
Alvarez
Enviado el: Miércoles, 11 de Abril de 2007 05:39 p.m.
Para: martin.comparetto
Asunto: [dbms] Declarar variables - SQL 2005


Si debes cambiar la variable.
Lo que no deberias hacer es usar cursores.
 
Por que precisas un cursor?
 
Saludos


 
On 4/11/07, Martín R. Comparetto <[EMAIL PROTECTED]> wrote: 

Hola !
Recien veo la respuesta. No, en realidad estoy empezando a meterme mas en
SQL. Sempre lo use como repositorio de datos. Quiero empezar a utilizar las
cosas que tiene. 
Bueno, entonces estoy con los SP.
Se me ocurrio preguntar eso porque, estoy creando un cursor, y para
recorrerlo utilizo el comando FETCH ... INTO @variable1, ... 
Bueno, estas variables las declaro antes con el mismo tipo de datos que
tiene el campo, pero a mano. Si el campo cambiara, tengo que cambiar el SP.
Por eso preguntaba. Ya se, es muy raro que cambie el tamaño de un campo,
pero bue... preguntaba porque creo haberlo escuchado... 
Muchas gracias !!
Saludos,

 

Martín R. Comparetto
NewDev S.R.L.
Rioja 1151 Piso 10 Of. 4
(S2000AYO) Rosario - Santa Fé - Argentina
›  <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED]

* (54-341) 425-9808

þ  <http://www.newdev.com.ar/> www.newdev.com.ar

 

  _____  

De: [email protected] [mailto: [email protected] <mailto:[email protected]> ] En
nombre de Jose Mariano Alvarez
Enviado el: Martes, 10 de Abril de 2007 07:43 a.m.
Para: martin.comparetto
Asunto: [dbms] Declarar variables - SQL 2005

 

Podrias explicarnos cual es la relacion entre la variable yel campo de la
tabla:
 
Saludos

 
On 4/9/07, Martín R. Comparetto <  <mailto:[EMAIL PROTECTED]>
[EMAIL PROTECTED]> wrote: 


Hola a todos !
Estoy haciendo un SP en donde quiero declarar una variable y definirle el
tipo de un campo de una tabla.
Se entiende? Se puede hacer eso?
Saludos a todos y gracias !
 
 

Martín R. Comparetto
NewDev S.R.L.
Rioja 1151 Piso 10 Of. 4
(S2000AYO) Rosario - Santa Fé - Argentina
›  <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED]

* (54-341) 425-9808

þ  <http://www.newdev.com.ar/> www.newdev.com.ar

 




-- 
-------------------------------- 
Atte.
Ing. Jose Mariano Alvarez 




-- 
-------------------------------- 
Atte.
Ing. Jose Mariano Alvarez 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:              NewDev S.R.L.
-- Create date: 09-04-2007
-- Description: Balance de Sumas y Saldos
-- =============================================
ALTER PROCEDURE balance_sumas_saldos
        @ejercicio_id int
AS
BEGIN
        SET NOCOUNT ON;

        DECLARE @orden char(80), @codigo_cuenta_padre char(40), @codigo_cuenta 
char(40), @cuenta char(100), @importe_debe float, @importe_haber float, @saldo 
float, @imputable bit;

        /* Tabla Temporal para guardar los componentes finales */
        CREATE TABLE #tmp_cuentas ( nivel int, orden char(80), 
codigo_cuenta_padre char(40), codigo_cuenta char(40), cuenta char(100), 
importe_debe float, importe_haber float, saldo float );

        /* Traigo los saldos de las cuentas imputables */
        DECLARE crs_scrl_cuentas CURSOR LOCAL SCROLL FOR 
                        SELECT cuentas_padres.cuenta As codigo_cuenta_padre, 
cuentas.cuenta As codigo_cuenta, cuentas.denominacion As cuenta, 
                                   importe_debe = ROUND( ISNULL( ( SELECT SUM( 
asientos_detalle.importe_debe ) As importe_debe 
                                                                                
          FROM asientos_detalle INNER JOIN 
                                                                                
                   asientos ON asientos.id = asientos_detalle.asiento_id LEFT 
JOIN 
                                                                                
                   comprobantes ON comprobantes.id = asientos.comprobante_id 
                                                                                
         WHERE asientos_detalle.cuenta_id = cuentas.id AND 
asientos.ejercicio_id = @ejercicio_id AND 
                                                                                
                  ( asientos.comprobante_id Is Null OR comprobantes.estado_id 
<> 307 ) ), 0 ), 2 ), 
                                   importe_haber = ROUND( ISNULL( ( SELECT SUM( 
asientos_detalle.importe_haber ) As importe_haber 
                                                                                
           FROM asientos_detalle INNER JOIN 
                                                                                
                        asientos ON asientos.id = asientos_detalle.asiento_id 
LEFT JOIN 
                                                                                
                        comprobantes ON comprobantes.id = 
asientos.comprobante_id 
                                                                                
          WHERE asientos_detalle.cuenta_id = cuentas.id AND 
asientos.ejercicio_id = @ejercicio_id AND 
                                                                                
                        ( asientos.comprobante_id Is Null OR 
comprobantes.estado_id <> 307 ) ), 0 ), 2 ), 
                                   saldo = ROUND( ISNULL( ( SELECT SUM( 
asientos_detalle.importe_debe - asientos_detalle.importe_haber ) As saldo 
                                                                           FROM 
asientos_detalle INNER JOIN 
                                                                                
        asientos ON asientos.id = asientos_detalle.asiento_id LEFT JOIN 
                                                                                
        comprobantes ON comprobantes.id = asientos.comprobante_id 
                                                                          WHERE 
asientos_detalle.cuenta_id = cuentas.id AND asientos.ejercicio_id = 
@ejercicio_id AND 
                                                                                
        ( asientos.comprobante_id Is Null OR comprobantes.estado_id <> 307 ) ), 
0 ), 2 ), 
                                   cuentas.imputable 
                          FROM cuentas LEFT JOIN 
                                   cuentas cuentas_padres ON cuentas_padres.id 
= cuentas.padre_cuenta_id 
                         ORDER BY cuentas.cuenta DESC, cuentas_padres.cuenta 
DESC 

        OPEN crs_scrl_cuentas;

        /* Recorro el cursor y lo agrego a la tabla temporal definitiva */
        FETCH FIRST FROM crs_scrl_cuentas INTO @codigo_cuenta_padre, 
@codigo_cuenta, @cuenta, @importe_debe, @importe_haber, @saldo, @imputable;
        WHILE @@FETCH_STATUS = 0
        BEGIN
                IF ( @imputable = 0 )
                        BEGIN
                                SET @importe_debe = ( SELECT ISNULL( SUM( 
#tmp_cuentas.importe_debe ), 0 ) As importe_debe 
                                        FROM #tmp_cuentas 
                                       WHERE #tmp_cuentas.codigo_cuenta_padre = 
@codigo_cuenta );
                                SET @importe_haber = ( SELECT ISNULL( SUM( 
#tmp_cuentas.importe_haber ), 0 ) As importe_haber 
                                         FROM #tmp_cuentas 
                                        WHERE #tmp_cuentas.codigo_cuenta_padre 
= @codigo_cuenta );
                                SET @saldo = ( @importe_debe - @importe_haber );
                        END;

                /* Agrego el registro a la tabla temporal definitiva */
                SET @orden = LTRIM( ISNULL( @codigo_cuenta_padre, '' ) + 
@codigo_cuenta );
                INSERT INTO #tmp_cuentas ( orden, codigo_cuenta_padre, 
codigo_cuenta, cuenta, importe_debe, importe_haber, saldo )
                VALUES ( @orden, @codigo_cuenta_padre, @codigo_cuenta, @cuenta, 
@importe_debe, @importe_haber, @saldo );
                FETCH NEXT FROM crs_scrl_cuentas INTO @codigo_cuenta_padre, 
@codigo_cuenta, @cuenta, @importe_debe, @importe_haber, @saldo, @imputable;
        END;

        /* Cierro el cursor temporal */
        CLOSE crs_scrl_cuentas;
        DEALLOCATE crs_scrl_cuentas;

        EXECUTE asignar_nivel_cuentas

        /* Devuelvo el cursor definitivo */
        SELECT ( SELECT #tmp_cuentas.* FROM #tmp_cuentas ORDER BY 
#tmp_cuentas.orden FOR XML AUTO, ELEMENTS, XMLSCHEMA );

        /* Borro la tabla temporal */
        DROP TABLE #tmp_cuentas;
END
GO

Responder a