Visual Basic Foro

Programación => Bases de Datos => Mensaje iniciado por: Ozcarj en Abril 23, 2011, 05:06:17 pm

Título: CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Abril 23, 2011, 05:06:17 pm
Bueno primeramente un saludo a todo el foro la cual me saco de muchas pero muchas dudas por la cual estoy muy agradecido por los temas publicados; en si!!! mi duda es la siguiente estuve buscando como hacer una consulta en la que consuga una calculo para el kardex de productos; encontre una respuesta publicada por nuestro compañero YvanB pero lo intente y no me resulto; tal vez por que yo uso access, en fin mi duda es la siguiente:
Yo tengo una tabla en la cual se denomina Tabla_Det_Movimientos la cual se ve de la siguiente forma:
[ID]----- [DETALLE]----- [INGRESOS]----- [SALIDAS]
1______compra_________100__________0
2______venta____________0__________50
3______venta____________0__________20

lo que necesito es realizar una consulta en la cual me de el siguiente resultado.

[ID]----- [DETALLE]----- [INGRESOS]----- [SALIDAS]-----[SALDO]
1______compra_________100__________0_________100
2______venta____________0__________50_________50
3______venta____________0__________20_________30

Muchas gracias de antemano a todos por las posibles respuesta u opiniones.
saludos desde La Paz Bolivia.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Abril 23, 2011, 06:10:31 pm
Hola.
Le explicación que di corre para cualquier base de datos, no hay restricción por el motor que uses.

Otro punto. Sobre el diseño de la tabla no veo necesario que esa sea la estructura. Bien podria ser:
ID----Detalle----Movim
1____Compra___ 100
2____Venta_____-50
3____Venta_____-20

Incluso si no quieres usar el signo negativo tendrías entonces que preguntar por el campo Detalle pero mejor es usar el signo.
Como fuere, siguiendo tu table, para armar el informe que quieres tendrías que hacerlo con un Stored Procedure o alli si usando ADO para armar el campo de saldos ya que tendrías que recorrer cada registro. Lo haremos con ADO:

Haces tu consulta normal pero agregas el campo Saldo
rs.Open (" Select ID, Detalle, Ingresos, Salidas, ' ' as Saldo "), dB, adOpenDynamic, adLockPessimistic

y luego vas llenando en el campo Saldo los saldos.
<<<< Aqui el código sugerido >>>
Código: [Seleccionar]
If rs.RecordCount > 0 Then
   For i = 1 To rs.RecordCount
      If Val(rs!Ingresos) > 0 Then Movimiento = Val(rs!Ingresos) Else Movimiento = Val(rs!Egresos)
      If i = 1 Then
         rs!SALDO.Value = Movimiento + SaldoPrevio  '<-- esto si usas rango de fechas y ya traes un saldo previo
         NuevoSaldo = Movimiento + SaldoPrevio
      Else
         rs!SALDO.Value = Movimiento + NuevoSaldo
         NuevoSaldo = Movimiento + NuevoSaldo
      End If
      rs.Update
      rs.MoveNext
   Next i
End If

y luego llena el grid o reporte con el rs y listo.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Abril 23, 2011, 06:51:50 pm
Estimado YvanB te comento que acabo de realizar tu sugerencia y me lanza el siguiente error:

La Operación en varios pasos generó errores, compruebe los valores de estado.

que estoy realizan mal; no lo se, te envio el codigo:

With rs
    If .State = 1 Then .Close
    .Open "SELECT id, detalle, ingresos, salidas, '' as SALDO from Tabla_Det_Movimientos;", base, adOpenDynamic, adLockPessimistic
    If .RecordCount > 0 Then
        For i = 1 To .RecordCount
                 If Val(!Ingresos) > 0 Then Movimiento = Val(!Ingresos) Else Movimiento = Val(!salidas)
      If i = 1 Then
         !SALDO = Movimiento + SaldoPrevio '<-- esto si usas rango de fechas y ya traes un saldo previo
         NuevoSaldo = Movimiento + SaldoPrevio
      Else
         !SALDO.Value = Movimiento + NuevoSaldo
         NuevoSaldo = Movimiento + NuevoSaldo
      End If
      .Update
      .MoveNext
   Next i
End If
End With
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Abril 23, 2011, 07:08:23 pm
Por eso puse que era una sugerencia, debes ajustarlo a tu proyecto.
Imagino que el error te sale en el Open o donde te sale? si puedes manda una captura de pantalla.
Yo tengo ahora mismo un código bastante similar y levanta bien.

Quizá te falta alguna referencia???

Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Abril 23, 2011, 07:30:45 pm
te comento que lo adapte tal como me sugeriste pero me da el error en la siguiente linea.

!SALDO = Movimiento + SaldoPrevio
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Abril 23, 2011, 07:34:27 pm
jajajaja, pucha doc... si te fijas mas abajito del código original verás la respuesta, por la velocidad de editar el código me borre alli una palabra.
En vez de:
!SALDO = Movimiento + SaldoPrevio

debe ir:
!SALDO.Value = Movimiento + SaldoPrevio
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Abril 23, 2011, 07:41:16 pm
te comento que acabo de editarlo adicionando el VALUE, pero lamentablemente me sigue saliendo el error; bueno de todos modos muchisimas gracias por la sugerencia y por la molestias de responder tan pronto, saludos
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Abril 23, 2011, 07:44:38 pm
Bueno.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Abril 23, 2011, 07:59:59 pm
Estimado YvanB te comento que acabo de añadir el campo SALDO a la tabla asi funciono; muchas gracias por tu sugerencia me ayudo mucho.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: crema20 en Mayo 03, 2011, 08:13:07 pm
Buenas tardes YvanB...tengo el mismo problema sobre la consulta del kardex y quisiera que me enseñes a hacerlo en un stored procedure en Sql Server...muchas gracias por la atencion prestada
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Mayo 04, 2011, 02:15:24 am
Hola crema20, no se si te percataste pero no trabajo con SQL Server, trabajo con FirebirdSQL, aunque el código (script de SqlServer) pueda ser casi el mismo seria conveniente que veas como se crea en SQL Server.

En lineas generales se trata de crear un SP que actualiza el campo SALDO de tu tabla, claro primero lees con otro SP el saldo anterior y lo almacenas en una variable llamada por ejemplo saldoanterior. La joda esta en que aqui hay un campo de Ingreso y otra de Salida asi que tienes que leer primero el de ingreso y si es cero asumes el de salida... me parece enredoso, por eso yo trabajo con una sola columna y para los ingresos utlizo valores positivos y para los egresos negativos.

CREATE PROCEDURE set_ActualizaSaldo(ID Integer, Cant Integer) as
BEGIN
   Update MiTabla Set Saldo = SaldoAnterior + :Cant Where Id = :ID;
END

Por ejemplo no se como pasan los parámetros en sqlServer, no se si usa ":Variable" ... checa eso.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: ssccaann43 en Mayo 04, 2011, 12:52:51 pm
Yvan, lo que el quiere es algo simple....! Fijate en la siguiente consulta..!

Código: [Seleccionar]

SELECT ID,Detalle,'Ingresos'=
      CASE
         WHEN Detalle = 'compra' THEN SUM(monto)
      END
,'Salidas'=
      CASE
         WHEN Detalle = 'venta' THEN SUM(monto)
      END
From Tu_tabla
group by ID, Detalle


Ahora bien, alli te agrupa y te muestra todos los ingresos y todas las salidas ya totalizadas...! Verifica y nos comentas...!
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: ssccaann43 en Mayo 04, 2011, 01:01:42 pm
Yo tengo una tabla en la cual se denomina Tabla_Det_Movimientos la cual se ve de la siguiente forma:
[ID]----- [DETALLE]----- [INGRESOS]----- [SALIDAS]
1______compra_________100__________0
2______venta____________0__________50
3______venta____________0__________20

lo que necesito es realizar una consulta en la cual me de el siguiente resultado.

[ID]----- [DETALLE]----- [INGRESOS]----- [SALIDAS]-----[SALDO]
1______compra_________100__________0_________100
2______venta____________0__________50_________50
3______venta____________0__________20_________30

Ahora bien, si solo quieres hacer ese tipo de consulta, pues simple...! Realiza lo siguiente...

Código: [Seleccionar]
SQL="Select ID, Detalle, Ingresos, Salidas, abs(Ingresos - Salidas) as Saldo from Tabla_Det_Movimientos"
Es evidente que el resultado en caso de que los registros sean salidas, dara negativo, ya que si resto 0 ingresos menos 50 salidas, me arrojara (-50).. Pero simplemente aplicas el abs(campo) y listo, el te da el valor absoluto que siempre es positivo..! Y es el abs que ves en la consulta...! Saludos...!
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: YAcosta en Mayo 04, 2011, 01:17:30 pm
Solo veo un problema a nivel funcional acerca de:
abs(Ingresos - Salidas)

Si hacemos esto, no creas que confundirá el ver que todos los valores son positivos??? ejemplo
Ingreso  Egreso  Saldo
100____ _____ _100
_______ __50_ __50
_20____ _____ __70
_______ __80_ __10    <--- aquí debería decirme -10, considero que el Abs no debe ir.

Ahora, si tu software Ozcarj tiene como política NO CONCENTIR saldo negativos (como es mi caso, mi software no permite jamas vender si no hay stock, por tanto nunca quedaría una saldo negativo) por ende el Abs no seria necesario tampoco.
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: ssccaann43 en Mayo 04, 2011, 02:25:57 pm
Pero el expone que ambos resultados sean positivos?  :-\ a menos que su planteamiento no este claro del todo..!
Título: Re:CONSULTA SQL PARA KARDEX
Publicado por: Ozcarj en Mayo 04, 2011, 04:05:34 pm
Bueno, primeramente muchas gracias por los comentarios IvanB y ssccaann43; pero mi sistema contempla negativos ya que tengo un modulo de preventa, es decir que tengo una tabla en cual es el detalle de la factura ó venta por así decirlo, en la cual para filtrar y tener un reporte en la que me de un kardex de tal manera que pueda ver una suma continua de acuerdo al movimiento por fecha de un solo item; anteriormente lo hice utilizando un bucle; al principio no hubo problemas por que los registro no fueron grandes, pero cuando ya se tuvo muchos registros tales calculos tardaban mucho, en sintesis quiero lograr realizar una consulta sin tener que utilizar un bucle, bueno  quisiera subir el ejemplo que tengo pero no se como hacerlo; ahora estoy ocupado por los EEFF de mi trabajo, pero apenas tenga tiempo lo subire a rapishare u otro para que así puedan analizarlo mejor.
Otra vez muchas gracias por sus comentarios

Saludos desde La Paz Bolivia.
Oscar J. Crespo