Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta que de resultado entrada, salida y saldo (https://www.clubdelphi.com/foros/showthread.php?t=50194)

Carmelo Cash 11-11-2007 04:11:52

consulta que de resultado entrada, salida y saldo
 
Hola foro:
Será posible hacer una conculta que de como resultado la siguiente salida?.
La tabla es algo así:
Fecha--- Detalle--Cantidad
01/01/07 Compra_____5
02/01/07 Venta_____ -1
03/01/07 Venta_____ -3
04/01/07 Compra____ 2

Y el la salida que necesito es:
Fecha--- Detalle--Entrada--Salida--Stock
01/01/07 Compra____5______ 0_____5
02/01/07 Venta_____0______-1_____4
03/01/07 Venta_____0______-3_____1
04/01/07 Compra____2______ 0_____3

Estoy usando InterBase.
Bueno, Si alguno tiene una idea le agradeceré infinitamente.

enecumene 12-11-2007 16:06:13

Hola, una pregunta como haces la entrada y las salidas? las mismas se encuentran en otra tabla? por favor, si no es ninguna molestia podrias explicarnos mas a fondo?.

Saludos.

Ivanzinho 12-11-2007 16:33:05

Quizá te pueda valer lo siguiente :
Código SQL [-]
Select T1.fecha, T1.detalle, 
       case when T1.cantidad > 0 then 
         T1.cantidad 
       else 
         0 
       end as Entrada, 
       case when T1.cantidad < 0 then 
         T1.cantidad 
       else 
         0 
       end as Salida, Sum(T2.Cantidad) Stock
from Tabla T1 inner join Tabla T2 on T1.Fecha >= T2.Fecha
group by T1.fecha, T1.detalle, T1.cantidad
order by fecha

Puede ser que tengas entradas y salidas el mismo día, por lo que en la condición de join tendrías que incluír algo más para el cálculo del acumulado, como pudiese ser un código incremental u otra clave.

Un saúdo

Carmelo Cash 13-11-2007 02:11:28

Gracias por responder
 
Hola.
Enecumene, gracias por preguntar. los datos están en una sola tabla y es donde grabo el movimiento de stock, un registro por cada venta. en esa misma tabla se guarda el movimiento cuando se hace una compra.
ej,
cte--- fecha---- cantidad
FC 1 01/01/2007--- -300 (vendí treceintos)
FC 2 01/01/2007--- -400 (vendí cuatrocientos)
RM 5 01/01/2007--- 1000 (compré mill)

entonces necesito hacer la famosa ficha "KARDEX"

Articulo xxxxxxxx
fecha--detalle--entradas--salidas--stock
Saldo anterior-------------------- 1200
01/01/07 fc 1----------------300---900
01/01/07 fc 2 ---------------400---500
01/01/07 RM 5--1000--------------1500


Con respecto a a la Propuesta de IVanzinho, creo que InterBase no soporta esa sintaxis, porque me dan errores por todos lados.
Bueno. a seguir probando, y gracias.

Ivanzinho 13-11-2007 08:45:59

Cita:

Empezado por Carmelo Cash (Mensaje 245674)
Con respecto a a la Propuesta de IVanzinho, creo que InterBase no soporta esa sintaxis, porque me dan errores por todos lados.
Bueno. a seguir probando, y gracias.

¿Qué errores te da?

Un saúdo.

Héctor Randolph 13-11-2007 09:04:37

La sentencia de Ivanzinho es perfectamente válida en Firebird 1.5 o superior.
Interbase no sé si soporta CASE, al menos en la versión 6.5 que es la que yo utilizaba no existía.

En cambio se puede lograr lo mismo con un procedimiento almacenado.

Saludos

Ivanzinho 13-11-2007 09:58:55

El CASE fué introducido en firebird a partir de la versión 1.5 y en interbase en la 7.5, si la versión que tienes es anterior entonces lo mejor, como comento hector, es que lo hagas en un procedimiento almacenado o que actualices a una versión superior.

Un saúdo.

Carmelo Cash 13-11-2007 14:11:34

Gracias
 
Comenzaré a probar con procedimintos almacenados. Gracias amigos.

Carmelo Cash 17-11-2007 13:29:55

Ya lo solucioné !!! una parte
 
Bueno la primer parte fué facil, quedó más o menos así.

Select fecha, detalle, cantidad as entrada, (cantidad * 0) as salida
From Movimientos
where cantidad > 0
Union
Select fecha, detalle, (cantidad * 0) as entrada, (cantidad * -1) as salida
From Movimientos
where cantidad < 0

(Muy astuto ¿no?)

Con esto obtengo entrada y salida, la columna de saldo la hice con una etiqueta de cálculo poniendo Sum(Entrada-salida).

No encontré como resolver el saldo en la consulta. Si alguién tiene una idea bienvenido sea.
Gracias.:cool:

pcicom 12-11-2009 20:29:03

Sin UNION

Código SQL [-]

Select fecha, detalle, 
  IF(cantidad>=0,CANTIDAD,0)  as entrada, 
  IF(cantidad<0,cantidad,0) as salida
From Movimientos

rgstuamigo 12-11-2009 20:55:00

Cita:

Empezado por pcicom (Mensaje 346403)
Sin UNION

Código SQL [-] Select fecha, detalle, IF(cantidad>=0,CANTIDAD,0) as entrada, IF(cantidad<0,cantidad,0) as salida From Movimientos

Yo creo que le ha servir nomas al amigo Carmelo Cash, tu solucion ya que es un hilo (tema) de algunos años atras...
como quien dice:"Mas vale tarde que nunca":):D:D.
Saludos...:)

ekbadel 13-11-2009 19:44:22

Cita:

Empezado por Carmelo Cash (Mensaje 245311)
Hola foro:
Será posible hacer una conculta que de como resultado la siguiente salida?.
La tabla es algo así:
Fecha--- Detalle--Cantidad
01/01/07 Compra_____5
02/01/07 Venta_____ -1
03/01/07 Venta_____ -3
04/01/07 Compra____ 2

Y el la salida que necesito es:
Fecha--- Detalle--Entrada--Salida--Stock
01/01/07 Compra____5______ 0_____5
02/01/07 Venta_____0______-1_____4
03/01/07 Venta_____0______-3_____1
04/01/07 Compra____2______ 0_____3

Estoy usando InterBase.
Bueno, Si alguno tiene una idea le agradeceré infinitamente.


Personalmente no se como tengas tu Tabla de Stock, en un programa ke ice para Salir de l Universidad mi tabla tiene

Periodo
idarticulo
cantidadinicial
cantidadanterior
cantidadActual

NumeroEntradas
NumeroSalidas
TotalMovimiento

y mi query la lanzo asi.

qryPeriodo.Close;
qryPeriodo.ParamByName('Periodo').AsString := dbe_periodo.Text;
qryPeriodo.Open;
if qryPeriodo.IsEmpty then
ShowMessage('error')
else
While Not qryperiodo.Eof Do Begin
qryperiodo2.Open;
qryperiodo2.Edit;
qryperiodo2Periodo.Value := dbe_sigperiodo.text;
qryperiodo2idarticulo.value := qryperiodoIdArticulo.Value;
qryperiodo2ExistenciaInicial.Value := qryperiodoExistenciaFinal.Value;
qryperiodo2ExistenciaActual.Value := qryperiodo2ExistenciaInicial.Value;
qryperiodo2CostoProInicial.Value := qryperiodoCostoProActual.Value;
qryPeriodo2.Post;
qryperiodo2.Close;
qryperiodo.Next;
end;
except
on e:exception do begin
showmessage(e.message);
end;
end;


Espero te sirva de algo lo hice con Firebird 1.5

Saludos..


La franja horaria es GMT +2. Ahora son las 01:21:47.

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