Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-02-2007
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
problema con procedimiento almacenado

Hola amigos:

Tengo un problema con un procedimiento almacenado, y es que tengo que acumular los saldos de las dos columnas llamadas saldo y saldo2 y no se como hacerlo.

Vayamos por partes, este es el codigo que tengo dentro del procedimiento:
Código SQL [-]
  for select costes.codigo, sum(lista.sal1), sum(lista.sal2), costes.nombre from
  (select costespago.codigo as cod, costespago.importe as sal1, cast('0.00' as numeric(10,2)) as sal2 from costespago
   union all
   select ejecutapago.codigo as cod, cast('0.00' as numeric(10,2)) as sal1, ejecutapago.importe as sal2 from ejecutapago) as lista
  right join costes on costes.codigo=lista.cod
  group by costes.codigo, costes.nombre
  order by costes.codigo
  into :codigo, :saldo, :saldo2, :nombre do
  begin
      if (saldo is null) then saldo=0;
      if (saldo2 is null) then saldo2=0;
  suspend;
  end
este codigo me devuelte un listado que seria perfecto para estas necesidades salvo que las columnas saldo y saldo2, que aun siendo correctas las cantidades que muestra para cada registro, tengo que acumularlas de la siguiente manera:

Supongamos que obtenemos la siguiente lista para acumular:
Cita:
CODIGO SALDO SALDO2 NOMBRE
------- ------- ------- --------
A 0 0
A1 1.000 0
A11 0 1.000
A12 1.000 0
y necesito que el listado quede de la siguiente manera a ser posible diseñado dentro del mismo procedimiento:
Cita:
CODIGO SALDO SALDO2 NOMBRE
------- ------- ------- --------
A 2.000 1.000
A1 2.000 1.000
A11 0 1.000
A12 1.000 0
Es decir, acumular el saldo y saldo2 de un codigo en los registros donde el codigo sea igual al mismo descontando la ultima letra en cada pasada, o lo que es lo mismo, el saldo y saldo2 del codigo A12 se acumularia en los codigos A1 y A, y asi sucesivamente con todo el listado.

Espero que me entiendan y que tengan alguna posible solución para hecharme una manilla...

Gracias...
Responder Con Cita
  #2  
Antiguo 05-02-2007
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 21
lbuelvas Va por buen camino
Podrias ser mas calro por favor ?
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #3  
Antiguo 05-02-2007
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
Hola de nuevo:

pues como poder ser mas claro, voy a intentarlo, porque con el lio que tengo en la cabeza, descrifrarlo todo para que me puedan entender es complicado, pero voy a ello...

Lo que necesito obtener, es un listado que tenga las columnas: codigo, nombre, saldo1, saldo2. Estas ultimas columnas deben de ser numeros que, tanto estan en la tabla y se obtienen de ella, como ademas de esto, poder sumarlo el saldo que tenga en otra columna y que contenga el codigo de esta.

Esto es parecido a un listado de cuentas contables con saldos acumulados, tipo debe,haber, saldo....pero la condicion de la columna saldo se debe incremencar ademas con el saldo de otra cuenta....y repito que el campo codigo este dentro del campo codigo de la cuenta a acumular...

Pero vamos a otro ejemplo: con el procedimiento que he puesto, obtengo este listado: el simbolo _ lo he puesto para intentar cuadrar mejor las columnas....lo siento..
Cita:
codigo nombre saldo1 saldo2
------ ------- ------ ------
A111_ da_igual0 ___0 ____0
A1112 da_igual1 1.000 ____0
A1113 da_igua2 2.000 ____0
si observamos el campo codigo, el primer registro tiene un valor de A111 y como tal esta en los siguientes 2 registros obviando el resto del valor del campo, por lo que debemos sumar los valores de las columnas saldo1 y saldo2 en la primera, con lo que quedaria un listado tal que asi:
Cita:
codigo nombre saldo1 saldo2
------ ------- ------ ------
A111_ da_igual0 3.000 ____0
A1112 da_igual1 1.000 ____0
A1113 da_igua2 2.000 ____0
Es esto lo que necesito hacer, y gracias por tomarte tu tiempo en hecharme una mano...
Responder Con Cita
  #4  
Antiguo 12-02-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

No entendi mucho.

Lo poco que enteni es que quieres variar el nombre d elso campos segunsean los datos. Si es eso lo que quieres decir no se puede hacer con un store procedure pero si con una sentencia Case.

Asi que enfuerzate por plantean un buen ejemplo y que se puede entender que aui no somos magos ni clarividentes y menos leemos mentes.

Bueno eso es si quieres que te respondan.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #5  
Antiguo 12-02-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Algo asi?

A ver si entendí bien. ¿Tu quieres realizar una suma recursiva? Yo entiendo que quieres mostrar la suma acumulada de ambos saldos según la jerarquia del código. Algo como:

Suma Acumulada del Codigo A = sumatoria de los subcodigos de A
Suma Acumulada del SubCodigo A1 = sumatoria de los subcodigos de A1
...
etc, etc... etc...

Ummmm.... ha decir verdad, si es eso lo que pretendes. No tengo mucha idea de como puede encarse. Dudo que un procedimiento alamacenado pueda ser ejecutado en forma recursiva.

También habría que considerar que tan profunda pueda ser la categoría.
¿La jerarquia tiene un límite o puede crecer a voluntad del usuario?

Esto último no se será un disparate... porque si hay un límite tal vez se pueda haciendo con la cantidad de selects anidados. O algo por el estilo.
Tendría que pensarlo bien... para ver como se puede conseguir.

Espero haber aportado algo, y si fue todo un disparate... ¡diganmelo!
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 13-02-2007
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
Hola amigos:

y gracias rastafarey, porque el amigo delphius ha dado en el clavo con eso de suma recursiva, cosa que yo he sido incapaz de decir...lo siento...

Pero es eso exactamente lo que necesito hacer, y lo estoy intentando con varios anidados, pero nada...

Es cierto que la jerarquia puede crecer a voluntad del usuario, y pienso que lo mejor va a ser hacerlo por codigo desde delphi y no como procedimiento almacenado...

Ya me desespero de hacer pruebas con esto, voy a por el codigo...a ver que tal se me da...

Gracias de nuevo
Responder Con Cita
  #7  
Antiguo 14-02-2007
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Siempre y cuando sepas el nº de 'grupos' de registros que tengas que calcular, podrías hacer una select con UNION. Para realizarla necesitas que todas las querys que unas devuelvan los mismos campos, que creo que es el caso.
Ejemplo, los grupos son de 1, 2 y tres caracteres:
A
A1 -> A11, A12, A13
A11 -> A111, A112, A113

Código SQL [-]
SELECT substr(codigo,1,1) AS codigo, sum(cant1), sum(cant2) from X 
group by codigo
UNION
SELECT substr(codigo,1,2) AS codigo, sum(cant1), sum(cant2) from X 
group by codigo
UNION
SELECT substr(codigo,1,3) AS codigo, sum(cant1), sum(cant2) from X 
group by codigo

Si no sabes cuantos 'grupos' tienes, siempre puedes hacer unas querys previamente para calcularlos, es decir

Código SQL [-]
select distinct length(codigo) as grupo from x order by grupo

te devolverá el nº de selects que tendrás que preparar.

Espero no haber sido muy espeso, es por la hora....

Suerte y un saludo
PD: No se que motor de BBDD usas, pero no creo que tengas problemas para adaptarlo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #8  
Antiguo 14-02-2007
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
Hola:

Es una buena idea, fjcg02...

Estoy trabajando sobre firebird 2.0 y cuando pruebo solamente un select sin union me da error en la funcion substr...pero es raro ya que aparece en el langref.pdf y no me deja ejecutar el procedimiento...

¿A que se puede deber este error?

Gracias amigo...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con procedimiento almacenado XBart Firebird e Interbase 3 27-10-2005 09:08:17
Problema con Procedimiento Almacenado Offset 88 AGAG4 Firebird e Interbase 8 19-11-2004 23:02:55
problema con procedimiento almacenado Choclito Firebird e Interbase 2 04-11-2004 20:58:46
Problema con procedimiento almacenado juziel Firebird e Interbase 4 20-09-2004 18:31:41
Problema con un procedimiento almacenado Markoz Firebird e Interbase 1 08-07-2003 11:47:20


La franja horaria es GMT +2. Ahora son las 18:53:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi