Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Consulta sobre Balance (https://www.clubdelphi.com/foros/showthread.php?t=42601)

Nelson Alberto 18-04-2007 03:05:29

Consulta sobre Balance
 
Despues de un afectuoso saludo, quisiera que alguien me oriente en cuanto a la siguiente consulta, tengo una tabla de movimiento con los siguientes campos:
cod_prod,
fecha,
No_fact
entrada
salida

quisiera generar la siguiente consulta por producto
------------------------------------------------------
fecha entrada salida balance
12/01/2007 15 0 15
13/01/2007 0 2 13
14/01/2007 5 0 18

esta consulta me esta siendo dificil de crear ya que soy nuevo, uso sql 2005 express

Ferrari 18-04-2007 04:54:47

Creo no esta bien formulada tu pregunta...No te entiendo ke campo es ke:D

Nelson Alberto 18-04-2007 05:17:59

desde la tabla de movimiento quisiera general un query para sacar estos resultados a ver si es posible


´fecha´ ´entrada´ ´salida ´ ´ balance
´12/01/2007´ ´15 ´ ´ 0 ´ ´ 15
´13/01/2007´ ´ 0 ´ ´ 2 ´ ´ 13
´14/01/2007´ ´ 5 ´ ´ 0 ´ ´ 18

lo que quiero es ver las entradas y las salidas de la tabla de movimiento por fecha y a la vez ver el balance

Nelson Alberto 18-04-2007 05:32:01

esto es una tabla de movimiento de inventario

cod_prod = codigo del producto ,
fecha = fecha del movimiento ya se factura o ajuste de inventario o compra etc.,

No_fact = numero del documento

entrada = si es alguna compra o alguna tranferencia o ajuste de inventario

salida = si es alguna venta o alguna tranferencia o ajuste de inventario

entiende los campos pero mi consulta hace referencia a fecha entrada menos la salida para generar el balance a la fecha

Nelson Alberto 18-04-2007 22:13:48

Necesito la ayuda de alguien urgente

egostar 18-04-2007 22:24:50

Hola amigo Nelson, solo toma en cuenta que en el foro no hay preguntas urgentes, aqui todos colaboramos de acuerdo a nuestro tiempo libre.

No se cual se el problema que tienes, pero esto seria muy fácil con una consulta SQL mas o menos de esta manera

Código SQL [-]
SELECT fecha,entrada,salida, (entrada-salida) as balance FROM Tabla

Salud OS.

egostar 18-04-2007 22:31:15

Por otra parte si interpreto bien tu problema, imagino que lo deseas por fecha.

Código SQL [-]
SELECT FECHA, SUM(Entrada), SUM(Salida), sum(Entrada-Salida) AS Balance FROM Tabla
GROUP BY FECHA

Salud OS.

Ferrari 18-04-2007 22:45:34

Respuesta
 
Cre ke Egostar te ha dado la respuesta correcta...asi de esa forma calculas tu campo...

fjcg02 19-04-2007 00:27:49

Siento deciros que esta consulta no se puede hacer de una sola vez a no ser que se haga lo siguiente:
1.- Crear una función que calcule el campo balance
Código SQL [-]
SELECT FECHA, SUM(Entrada), SUM(Salida), Balance(FECHA) FROM Tabla
GROUP BY FECHA
siendo balance una función , store procedure o como se diga, que haga lo siguiente, que es calcular la suma hasta la fecha anterior.

Código SQL [-]
FUNCTION BALANCE ( FECHAPARAMETRO)
DEFINO VARIABLE double;

SELECT sum(Entrada-Salida) INTO VARIABLE FROM Tabla
WHERE FECHA < FECHAPARAMETRO

RETURN VARIABLE
Como podeis ver, no sé escribir el código exacto ya que no tengo SQL SERVER.

2.- Si no se quiere hacer en SQL, crear el delphi un campo calculado en la ttable o tquery, que calcule el valor de BALANCE con la misma query que pongo en el caso 1.

Lo explico a 'grosso modo', porque ando un poco justo de tiempo.

Además, falta filtrar todo por codigo de producto, ya que si no nos mezclaría los datos de los distintos productos.

Espero haberos ayudado.

Un saludo y suerte.

egostar 19-04-2007 00:45:18

Hola fjcg02 pues ya he probado mi consulta en una base MS SQL y me da el resultado que quiero, por otro lado de acuerdo a la pregunta de Nelson no encuentro donde dice que hay que filtrar por código de producto.

Esto es lo único que necesita

´fecha´ ´entrada´ ´salida ´ ´ balance
´12/01/2007´ ´15 ´ ´ 0 ´ ´ 15
´13/01/2007´ ´ 0 ´ ´ 2 ´ ´ 13
´14/01/2007´ ´ 5 ´ ´ 0 ´ ´ 18

Que diferencia hay entre lo que yo hago

Código SQL [-]
sum(Entrada-Salida) AS Balance

con lo que tu haces.

Código SQL [-]
sum(Entrada-Salida) INTO VARIABLE

Disculpa pero no lo entiendo bien, puedo equivocarme, si es asi corrijanme por favor.

Salud OS.

Edito:

Retiro todo lo dicho, tienes razon fjcg02, el asunto es que va descontando el balance de acuerdo a las salidas y entradas.

Mea culpa.

Salud OS.

fjcg02 19-04-2007 01:08:49

Cita:

Esto es lo único que necesita

´fecha´ ´entrada´ ´salida ´ ´ balance
´12/01/2007´ ´15 ´ ´ 0 ´ ´ 15
´13/01/2007´ ´ 0 ´ ´ 2 ´ ´ 13
´14/01/2007´ ´ 5 ´ ´ 0 ´ ´ 18
Cita:

quisiera generar la siguiente consulta por producto
------------------------------------------------------
fecha entrada salida balance
12/01/2007 15 0 15
13/01/2007 0 2 13
14/01/2007 5 0 18
Según tu consulta, los valores de balance serían
15
-2
5

y no 15, 13, 18.
Es decir, el campo balance es un dato que se calcula sumando o restando del valor de la fila anterior. Balance = balance fila anterior + (entradas -salidas) fila actual. Tu consulta funciona perfectamente, pero no saca la información que necesita nuestro amigo Nelson Alberto.

Espero haberme explicado mejor. El que debiera mejorar su pluma es Nestor ;)
No hace falta que te disculpes por nada, y por supuesto, yo no pretendo corregir a nadie, sino aportar mi punto de vista y mi experiencia ( si puedo ).

Saludos.

egostar 19-04-2007 01:24:34

Cita:

Empezado por fjcg02
No hace falta que te disculpes por nada, y por supuesto, yo no pretendo corregir a nadie, sino aportar mi punto de vista y mi experiencia ( si puedo ).

Amigo fjcg02, siempre he dicho que cuando uno habla lo debe de hacer responsablemente, en este caso mi comentario fue sin haber leido correctamente el problema.

Por tal razón considero que si debo ofrecerte una disculpa, digo, es de caballeros.

Salud OS.

fjcg02 19-04-2007 09:28:11

egostar,
insisto en que no es necesario que te disculpes por nada, faltaría más.
A quien yo sí debo pedir disculpas es a Nelson Alberto, al que en el post anterior he bautizado ( le llamaba Nestor ) y al que le hemos 'boicoteado' un poco su hilo, ya que nos alejamos de lo que originalmente preguntó.
Lo dicho Nelson Alberto, si tienes alguna duda, intentaremos ayudarte.

Saludos a todos ;)

Nelson Alberto 19-04-2007 19:00:47

Como dice nuestro amigo fjcg02 lo que pretendo es acumular los balance un una columna y me de como resultado 15, 13, 18 y no encuentro la manera de hacerlo, soy nuevo en al manejo de sql, ya que he trabajado con tablas planas y ahora estoy trabajando con sql express, agradesco su cooperacion. gracias

fjcg02 20-04-2007 00:44:33

Bueno,
he probado haciendo una procedure, y soy incapaz de hacerlo funcionar. Como tengo la cabeza algo dura, he seguido probando, y haciendo alguna prueba, he conseguido esto

Código SQL [-]
SELECT     codigo, 
               fecha AS fecha, 
               SUM(entradas) AS Entrada, 
               SUM(salidas) AS salida, 
               SUM(entradas) - SUM(salidas) +
                          (SELECT     SUM(entradas - salidas)
                            FROM          inventario
                            WHERE      codigo = I.codigo AND fecha < I.fecha) 
                          AS balance
FROM         Inventario I
GROUP BY codigo, fecha
con el inconveniente de que la primera fila el campo balance da nulo porque la query saca un valor nulo.
Se podría poner un case para intentar maquear el resultado, pero ya no me queda fósforo en el coco. No sé si estoy haciendo una burrada, es decir, si la select dará el rendimiento adecuado, pero menos es nada, Ojo, que el orden de los sumandos de la columna 'balance' sí influye en que la query pase el analizador o no de errores de sintaxis.

esta es la salida de mi juego de ensayo

Código SQL [-]
codigo__Fecha________Entrada___Salida  Balance
0001____01/01/2007___15________5_________null  
0001____02/02/2007___10________3_________17
0001____03/03/2007____3________0_________20

Suerte y un saludo

Lepe 20-04-2007 12:34:49

El Balance yo lo veo como una variable:
en sql server no sé, en Firebird sería algo así:
Código SQL [-]
create procedure Miomio
returns (
fecha1  timestamp,
entrada1 integer,
salida1 integer,
balance integer)
as
begin
  balance = 0;
for select fecha, entrada, salida 
from tabla
order by fecha
 into :fecha1, :entrada1, :salida1 do
begin
  if entrada1 is null then 
   entrada1 = 0;
  if salida1 is null then 
    salida1 = 0;
     balance = balance + entrada1 - salida1; // uno de los dos es cero

  suspend; // devolvemos entrada1, salida1 y balance
end;

Le he cambiado el nombre añadiendo un "1" para que se entienda, pero no habría inconveniente en quitar ese "1"

ya en delphi se usaría ese procedure como un query:
Código SQL [-]
select * from miomio

Saludos

Nelson Alberto 20-04-2007 23:01:00

Gracias fjcg02

esta solucion es lo que yo estaba buscando pero para solucionarlo por completo solo le le faltaba manejar el registro nulo con la funcion ISNULL, agradesco a todos en general y para los compañeros foristas que han estado buscando algo simular aqui esta la respuesta


Código SQL [-]SELECT codigo,
fecha AS fecha,
SUM(entradas) AS Entrada,
SUM(salidas) AS salida,
SUM(entradas) - SUM(salidas) +

(SELECT ISNULL(SUM(entradas - salidas),0)
FROM inventario
WHERE codigo = I.codigo AND fecha < I.fecha)
AS balance
FROM Inventario I
GROUP BY codigo, fecha


esta es la respuesta a la pregunta


Código SQL [-]codigo__Fecha________Entrada___Salida Balance
0001____01/01/2007___15________5_________10
0001____02/02/2007___10________3_________17
0001____03/03/2007____3________0_________20


La franja horaria es GMT +2. Ahora son las 00:31:35.

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