Búsqueda de registros en una tabla

Quisiera saber como haría para buscar los registros de una tabla movimientos en la cual utilizo 5 códigos de otras tablas, como son codtien, codlin, codmar, codpro y codmed, con estos campos debo ubicar cada registros de la tabla movimientos.
1

1 respuesta

Respuesta
1
ME imagino que esa búsqueda lo quieres hacer en un datawindow, lo que harías es poner en una ventana 5 controles SingleLineEditcada uno para los campos de búsqueda.
Luego usas la función find del DW.
x ejemplo en un command button buscar iria el codigo
long ll_rowfind
ll_rowfind = dw_x.find("codtien='" + sle_1.text + "' and codlin='" + sle_2.text + "' and codmar='" + sle_3.text + "' and codpro='" sle_4.text + "' and codmed='" + sle_5.text + "'",1,dw_x.rowcount())
Si el valor de ll_rowfind es mayor que 0 entonces si ubico el registro solicitado solo es cuestión de hacer un salto a dicha fila
dw_x. scrolltorow(ll_rowfind)
Si es 0
Mensaje: NO hay registros con dichos parámetros.
Te agradezco tu atención, no necesito campos de entrada, mira en realidad son 2 tablas, una Saldos y otra Movimientos, lo que quiero hacer es un PROCESO para RECALCULAR la tabla saldos, para esto tengo que hacer un barrido de la tabla Movimientos, me dejo entender osea Leer todos los registros de tabla Movimiento, lógico que primero leo la tabla saldos.
Un Ejemplo, para un registro especifico es el querer recalcular el saldo del STOCK en la Tienda Alfa de una docena de Lapiceros Stabilo punta fina color rojo, donde Alfa es la Tienda, lapiceros es la Linea, stabilo es la Marca, punta fina color rojo es el Producto y docena es la Medida, estamos, esto debería ser la llave del producto para poder ubicar los registros y así sumar los movimientos de ingreso y salidas que ha tenido este producto para determinar el saldo stock y actualizarlo en la Tabla Saldos.
Yo tengo el script y te lo adjunto para que lo revises, he probado con 2 SingleLineEdit para verificar si hace el conteo de los registros de cada tabla y si lo realiza bien, haciendo en un DW el retrieve a la tabla saldos, luego creo un Datastore para el retrieve a la tabla movimientos, pero que pasa que al hacer la búsqueda en la tabla movimientos de cada producto de acuerdo al ejemplo anterior, con FIND al ejecutar el proceso me sale la ventanita de error de DW por cada registro leído con el mensaje Expression types must match que quiere decir expresión debe coincidir con los tipos. Tal vez las variables deben estar mal al convertirlas a String o en la llave Find las comillas y apostrofes estarán mal, o tal vez mi lógica esta mal, te agradecería tu asistencia así como también aceptar alguna sugerencia en cuanto a cambiar la lógica si lo crees conveniente. Te adjunto el script.
DECIMAL{0} lentradas // VARIABLES
DECIMAL{0} lsalidas
DECIMAL{0} lexistencia
LONG codtie, codlin, codmar, codpro, codmed, codope
LONG cuentom, cuentos, todos, ll_retrieve
LONG ll_for1, lopera, lcantidad, entra, sale
STRING lcodlin, lcodmar, lcodpro, lcodmed                                                                   STRING ls_error, ls_variable, ltienda
BOOLEAN lb_commit
INT posi ///////// En estas lineas ya jalo la tienda con un ddlb
string lcodtie, ldescritie                                                                                                    posi = pos(ddlb_tienda.text,',')
ldescritie = trim(left(ddlb_tienda.text,posi -1))
lcodtie = trim(mid(ddlb_tienda.text,posi +1))
parent.title = upper(ldescritie)+',  Recalculo de Saldos de Productos en General'
String jalotie               //Llamo a todos los registros de la tabla Saldos segun
Select saldos.tienda   //tienda seleccionada en el ddlb
into :jalotie
From Saldos
Where saldos.tienda = :lcodtie;
if lcodtie = jalotie then
 dw_1.enabled = True
 Dw_1.Retrieve(lcodtie) //// Recupero los registros en la tabla saldos segun tienda
 FOR ll_for1 = 1 to (dw_1.ROWCOUNT())
  lcantidad = 0
  lexistencia = 0
  lentradas = 0
  lsalidas = 0
  entra = 0
  sale = 0
  todos = 0
  codtie = dw_1.GetItemNumber(ll_for1, 'Tienda') // Jalo los campos de Tabla Saldos para
  codlin = dw_1.GetItemNumber(ll_for1, 'linea')    // hacer la busqueda en tabla Movimient
  codmar = dw_1.GetItemNumber(ll_for1, 'marca')
  codpro = dw_1.GetItemNumber(ll_for1, 'producto')
  codmed = dw_1.GetItemNumber(ll_for1, 'unidad')
  ltienda = string(codtie)
  lcodlin = string(codlin)
  lcodmar = string(codmar)
  lcodpro = string(codpro)
  lcodmed = string(codmed)
  cuentos = cuentos + 1    // Hago un conteo para los Registros de la tabla Saldos
  lds_local = CREATE DATASTORE     // Creo datastore para la Tabla movimientos
  lds_local.dataobject = 'd_grid_mvto_general'
  dw_1.DataObject = lds_local.DataObject
  dw_1.settransobject(SQLCA)
  dw_1.retrieve(ltienda) // Recupero los registros de tabla movimientos segun tienda
  long ll_find, ll_end  // Comienzo y final de la tabla
  ll_find = 1
  ll_end = dw_1.RowCount()
  ll_find = dw_1.Find("tienda = '" + ltienda + "' and linea = '" + lcodlin + "' and marca = '" & + lcodmar + "' and producto = '" + lcodpro + "' and unidad = '" + lcodmed + "'", ll_find, ll_end)          /// Aqui hago la busqueda
  DO WHILE ll_find > 0
   lopera = dw_1.GetItemNumber(ll_find, 'operacion') // Llamo al campo codigo operacion
   lcantidad = dw_1.GetItemNumber(ll_find, 'cantidad') // Llamo a la cantidad
   Select operacion.operacion   //Aqui llamo otra tabla Operacion para obtener el campo
   into :ls_variable                    //de operacion S si es suma o R si es resta como por        
   From Operacion                    //ejemplo Compras es una Suma y Ventas es una Resta.
   Where operacion.codigo = :lopera USING SQLCA;
   If ls_variable = 'S' Then
    entra = lcantidad
    sale = 0
   Else
    entra = 0
    sale = lcantidad
   End if
   cuentom = cuentom + 1   // Hago un conteo para los Registros de la tabla Movimientos
   lentradas = lentradas + entra
   lsalidas = lsalidas + sale
   lexistencia = (lentradas - lsalidas)
        ll_find++    // ultimo registro y vuelvo a iniciar la busqueda
   ll_find = dw_1.Find("tienda = '" + ltienda + "' and linea = '" + lcodlin + "' and marca = '" &
   + lcodmar + "' and producto = '" + lcodpro + "' and unidad = '" + lcodmed + "'", ll_find, ll_end)
  LOOP
   sle_1.text = string(cuentos)  // Esto es referencial para ver el conteo de la lectura de
   sle_2.text = string(cuentom) // de los registros de las 2 tablas Saldos y Movimientos
   UPDATE saldos    //  Aqui actualizo al campo saldo en la Tabla Saldos
   SET saldo = :lexistencia
   Where (saldos.tienda = :ltienda and saldos.linea = :lcodlin and saldos.marca = &
     :lcodmar and saldos.producto = :lcodpro and saldos.unidad = :lcodmed)
   USING SQLCA;
   lb_commit = ((SQLCA.SQLCode = 0) AND (SQLCA.SQLDBCode = 0))
   ls_error = SQLCA.SQLErrText
   IF lb_commit THEN
    COMMIT USING SQLCA;
   ELSE
    ROLLBACK USING SQLCA;
    MESSAGEBOX('ERROR', ls_error)
    EXIT
   END IF
 NEXT
else
 dw_1.reset()
 MessageBox ("Opcion de Consulta","¡No existen Movimientos¡", exclamation!)
 return
end if
El problema esta aquí... lo que pasa asumí que en tu tabla los campos mencionados eran de tipo cadena(varchar, char, etc.), ahora al momento de que tu obtienes los valores veo que en todos usas getitemnumber, entonces los campos que tienes son de tipo numérico.
ll_find = dw_1.Find("tienda = '" + ltienda + "' and linea = '" + lcodlin + "' and marca = '" & + lcodmar + "' and producto = '" + lcodpro + "' and unidad = '" + lcodmed + "'", ll_find, ll_end)          /// Aqui hago la busqueda
Efectivamente va existir error, xq en el FIND estamos comparando tipos de datos distintos, esto es por ponerle los apostrofes... DEBE SER
ll_find = dw_1.Find("tienda = " + ltienda + " and linea = " + lcodlin + " and marca = " & + lcodmar + " and producto = " + lcodpro + " and unidad = " + lcodmed, ll_find, ll_end)
SUGERENCIA... desde mi punto de vista te estas yendo por el camino más largo para conseguir tu objetivo, ya que por lo que veo tu único parámetro es tienda, los demás son parámetros internos para que logres sumar y restar y obtener el saldo por producto. Es más si usas las otras variables... quiere decir que tu codificación de tus artículos lo haces por tienda. SI YO TENGO UNA TABLA PRODUCTOS y mi clave principal es el CÓDIGO DEL PRODUCTO, linea, marca y unidad.. que me imagino están de sobra. Para una búsqueda.
Pues un producto por siempre pertenecerá a una sola linea y tendrá una sola marca, existirá productos similares o equivalentes, pero ya su código es otro y por ende tendrá la misma linea, pero varia la marca y su unidad. Pero siempre será único.
PROPUESTA de solución, yo usaría SQL para poder calcular los saldos, ohasta crear un procedimiento almacendo, y que se encargue el administrado de la BD quie calcule los saldos.
Primer paso en la tabla movimientos haremos una consulta, pero cambiamos todos los que tiene salidas lo multiplicaresmo por -1 para que permita hacer una agrupación.
select tienda,linea,producto,marca,unidad, case operacion when 'INGRESO' then cantidad when 'SALIDA' then -1 * cantidad end as valor
from movimientos
where tienda = :ltienda;

Esta consulta lo que hace es poner en negativo las operaciones de salida, nada más, ahora consideramos este resultado como una subconsulta para agrupar por producto cual es el saldo.
select tienda, linea,producto, marca, unidad, sum(valor) as  saldo
from (select tienda,linea,producto,marca,unidad, case operacion when 'INGRESO' then      
         cantidad when 'SALIDA' then -1 * cantidad end as valor
         from movimientos
         where tienda = :ltienda) mv
group by tienda,linea,producto,marca,unidad;

Esta ultima consulta ya tiene los cálculos de saldo, ahora solo queda actualizar dichos saldos a la tabla saldos.
update saldo
set saldo = m.saldo
from (select tienda, linea,producto, marca, unidad, sum(valor) as  saldo
           from (select tienda,linea,producto,marca,unidad, case operacion when 'INGRESO'   then  cantidad when 'SALIDA' then -1 * cantidad end as valor
         from movimientos
         where tienda = :ltienda) mv
group by tienda,linea,producto,marca,unidad) m
where saldo.tienda = m.tienda and saldo.linea=m.linea and saldo.producto=m.producto and saldo.marca=m.marca and saldo.unidad=m.unidad;

Este ultimo código SQL calcula los saldos de acuerdo a la tabla movimientos y los almacena en la tabla saldo. Solo este ultimo código... los anteriores solo explico como llego a obtener.
PARA TERMINAR Considerando mi apreciación de los datos de una tabla producto solo iría de esta forma el código
update saldo
set saldo = m.saldo
from (select tienda, producto, sum(valor) as  saldo
           from (select tienda, producto, case operacion when 'INGRESO'   then  cantidad when 'SALIDA' then -1 * cantidad end as valor
         from movimientos
         where tienda = :ltienda) mv
group by tienda, producto) m
where saldo.tienda = m.tienda and saldo.producto=m.producto;

El unico parametro es ltienda, que se puede obtener del ddlb, espero haberte ayudado y aclarado las cosas... Salu2
Estimado amigo, realmente te agradezco la manera analítica y minuciosa para con mis respuestas, mira el Cliente tiene varias librerías o Tiendas y usualmente un comprador llega a una de las tiendas y pide un producto el cual no se tiene en Stock, mi cliente quiere en ese momento consultar el resto de tiendas que posean el producto en Stock solicitado por el comprador. Es por eso la Tienda, ahora los artículos o productos no están codificados por tienda, las Lineas, Marcas y productos o artículos son unos solos para todas las tiendas. La estructura del Sistema es la siguiente:
6 Tablas : Tiendas(codigo,descripcion), Lineas(codigo,descripcion), Marcas(codlinea,codigo,descripcion), Productos(codlinea,codmarca,codigo,descripcion, unidad_costo,precio_costo), Medidas(codigo,descripcion) y Operaciones(codigo,descripcion, operacion(que es la variable de 'S'uma o 'R'esta).
1 Tabla de Movimientos(código, tienda, linea, marca, producto, unidad(que es la medida), operación, # docmto, fecha, cantidad, precio, utilidad, transfer).
Como observaras las tablas Lineas, Marcas y Productos están enlazadas, esto se debe a que las Lineas pueden ser colores, plumones, gomas, lapiceros etc., y para Marcas de los colores pueden ser Stabilo, Patitas, Faber Castell etc., y para Productos de Colores marca Stabilo pueden ser colores fosforecentes Kids triangulados. Me deje entender.
Ahora me podrías aclarar bien sobre tu sugerencia de acuerdo a la estructura de las tablas que te estoy dando, por mientras voy probando lo de la búsqueda con FIND y también probando lo del SQL. Ok.
Nuevamente reiterándote las gracias.
Tus tablas están correctas, y justo lo que me imaginaba, Linea, Marcas y Unidad, se podría decir auxiliares, que sirven para detallar de una mejor forma la descripción del Producto.
Ejemplo.
Linea Codigo, Descripcion
          001, Colores
          002, Plumones
          003, Gomas
          004, Lapiceros
Marca Codigo, Descripcion
           M1, stabilo
           M2, fabeercastell
           M3, layconsa
Unidad Codigo, Descripcion
            U1, unidad
            U2, caja
            U3, paquete
Producto: codlinea,codmarca,codigo,descripcion, unidad_costo,precio_costo
                 001, m1, p001, Colores x 24, u2, 10.00
                 004, m1, p002, Lapiceros Azul, u2, 30.00
                 004, m2, p003, Lapiceros Azul, u2, 32.00
                 004, m3, p004, Lapiceros Azul, u2, 31.00
entonces.. el solo hecho de señalar al producto p002, ya se que esta en la Linea Lapiceros, la Marca es Stabilo, Lapicero Azul, con unidad de medida Caja, sin la necesidad de especificar necesariamente la linea.
Al parecer estas confundiendo un poco lo que es la actualización con lo que es mostrar los saldos. Son 02 cosas distintas, el primero se hace internamente: es transparente para el usuario, por ello te envío el sentencia sql
update saldo
set saldo = m.saldo
from (select tienda, producto, sum(valor) as  saldo
           from (select tienda, producto, case operacion when 'S'  then  cantidad when 'R' then -1 * cantidad end as valor
         from movimientos) mv
group by tienda, producto) m
where saldo.tienda = m.tienda and saldo.producto=m.producto;

en este codigo inclusive lo he quitado la opcion WHERE:
where tienda = :ltienda
Por tanto la sentencia mostrado arriba, hace un recalculo de todos los pro tienda, sin excepción. Ahora si quisiéramos actualizar los saldos por tienda, pro una marca en especifica, por una linea en especifica ahí si es necesario ponerel WHERE indicando eso parámetros,
Una vez hecho el recalculo de saldos, digamos en la tabla saldo... ahora si los muestro, esto si es lo que le interesa ver. Al usuario
SALDO, tienda, codigoprod, saldo
             T1, p001, 30.00
             T1, p002, 15.00
             T1, p003, 50.00
             T2, p001, 15.00
             T2, p002, 0.00
             T2, p003, 10.00
Ojo que un producto nunca varia la unidad de medida, de lo contrario crearía todo un desajuste... por ello que si tienes lapiceros que los cuentas en cajas, siempre deber en cajas, pero si después quieres contarlo por unidades, necesariamente debes crear otro producto, siendo de la misma linea, mismo marca.
Entonces muestro lo siguiente.
select s.tienda, t.descripcion, s.codigoprod, l.descripcion, m.descripcion, p.descripcion, um.descripcion, s.saldo
from saldo s inner join producto p on (s.codigoprod=p.codigoprod)
        inner join tienda t on (s.tienda=t.tienda)
        inner join linea l on (p.codlinea=l.codigo)
        inner join marca m on (p.codmarca = m.codigo)
        inner join unidad um on (p.unidad = um.codigo)
--en el where especifico si quioero ver un liena en especial, o sies exclusivamente
--un producto, etc. eso depende de ti... para el ejemplo, seleccionaremos un producto
where p.codigoprod = 'p002'
Y esta consulta llevado a un DW es el resultado de un producto con su saldo en cada una de las tiendas...
Ok. Mira lo de Actualizar y obtener los saldos lo tengo bien en claro, lo que pasa es que meses atrás el personal dígito mal algunas operaciones como ventas, transferencias, salidas, y a raíz de eso se distorsionaron los saldos, ya hay una consulta de Saldos por Productos pero jala erróneamente, entonces es por eso que yo deseo recomponer o Recalcular los saldos por producto jalando los registros de la tabla movimientos obtener el saldo y actualizarlos a Tabla Saldos.
Ahora lo que quiero obtener es lo siguiente :
Producto Operación Medida Documento Fecha Ingresos Salidas Saldos
Lapicero Stabilo Tinta Liquida Azul
                    Inventario        Unidad   0000003      13/06/2009       23
                    Ventas            Unidad   0010027      20/06/2009                       18
                    Compras         Unidad   0130034      23/06/2009       64
                    Transfe.Salida  Unidad   0000005      25/06/2009                      10
                                                                          Totales                 87            28           59
Lapicero Stabilo Tinta Liquida Azul
                    Inventario         Docena   0000003      13/06/2009     18
                    Ventas              Docena   0010027      20/06/2009                       4
                    Compras          Docena   0130034      23/06/2009     30
                    Transfe.Salida   Docena   0000005      25/06/2009                       6
                                                                         Totales 48 10 38

Como podrás observar lo que necesito es el campo totales Saldos, y para esto necesito jalar los registros de esa manera para poder obtener esos totales y actualizarlos en la tabla saldos. Ah mil disculpas me había olvidado de que faltaba mencionarte la Tabla Saldos que contiene los siguientes campos : Tienda, Linea, Marca, Producto, Medida, Fecha y Saldo.
Por lo que para mi la lleve para acumular estos registros por producto seria Tienda, Linea, Marca, Producto y Medida.
Antes tambien habias recepcionado otra pregunta mia la cual consistia en el mismo ejemplo ya que tengo otra opcion donde ya jalo los movimientos en otra DW grid pero tipo reporte y agrupado por productos adicionando al final una columna Saldos de la tabla saldos de la siguiente manera :
===========================TABLA MOVIMIENTOS=====TABLA SALDOS
Operación         Medida   Documento    Fecha   Ingresos   Salidas   Saldos      SALDOS
Lapicero Stabilo Tinta Liquida Azul
Inventario         Unidad   0000003      13/06/2009       23
Ventas              Unidad   0010027      20/06/2009                   18
Compras          Unidad   0130034      23/06/2009       64
Transfe.Salida  Unidad   0000005       25/06/2009                   10
                                                               Totales        87        28           59              41
Lapicero Stabilo Tinta Liquida Azul
Inventario         Docena   0000003      13/06/2009       18
Ventas             Docena   0010027      20/06/2009                     4
Compras          Docena   0130034      23/06/2009       30
Transfe. Salida Docena 0000005 25/06/2009  6
Totales 48 10 38 32

Es con este DW GRID donde efectivamente me di cuenta de que estaban mal los saldos grabados, ahora yo a mi Cliente le voy activar una opción de menu de Racalcular Saldo y el solo le de Click y recalcule automáticamente, pero el no va a ver lo del ejemplo ya que es para mi solo el querer visualizar la secuencia de Recalculo para estar seguro de los saldos reales ya que hay dinero en mercadería y no quisiera tener problemas después con mi cliente, volviendo a este ultimo ejemplo al darle TAB ORDER y activar el campo saldo de la tabla saldos puedo modificar los saldos erróneos interactivamente y ahí me guio del saldo de los movimientos que esta OK. Pero que pasa que tendría que darle Enter o Click a casi mil registros para ir modificando producto por producto, es por eso que en la otra pregunta quería saber si había alguna manera de jalar instantáneamente al darle retrieve al DW grid el Campo Compute de Total saldo de la tabla movimientos al Saldo de la tabla Saldo.
Bueno no quisiera cansarte más, pero ya tienes una idea clara de cual es mi objetivo.
Estimado amigo, mil disculpas que lo moleste, mira probé las sentencias que me diste y acondicionandolas a mis tablas y variables he reducido bastante las lineas de programación gracias a tus recomendaciones.
Ahora mira con esta sentencias que me diste :
update saldo
set saldo = m.saldo
from (select tienda, producto, sum(valor) as  saldo
           from (select tienda, producto, case operacion when 'S'  then  cantidad when 'R' then -1 * cantidad end as valor
         from movimientos) mv
group by tienda, producto) m
where saldo.tienda = m.tienda and saldo.producto=m.producto;
Me sale el error sql 'No se puede convertir R a numeric(30,6) creo que tal vez se deba a que en la tabla Movimientos hay un campo operación que llama a Tabla Operación que puede ser Ventas, Compras, Inventario etc. pero por su código numérico y al parecer falta llamar a la Tabla Operación de la cual debo jalar el campo operación 'R' de resta si es Venta o 'S' suma si es Compra.
Esa es lo ultimo que te pediría de favor ya que no domino bien la combinación y comodines en las Sentencias SQL.
Te agradeceré tu respuesta.
Al parecer recién entendiste el mensaje... lo que me imagino es que el campo OPERACIÓN de la tabla movimientos es un foreign key de la tabla operaciones... puedes darme laestructur a de tu tabla operaciones... seria la única forma de saber si ese es el problema, ademas... en tu tabla movimientos, de que tipo es el campo movimientpos, porque yo pensé que era de tipo carácter y que iba R o S... tons pasas la voz
Ok. Mira la estructura de de la tabla operaciones es la siguiente :
Tabla Operaciones (Llave Foranea : Codigo)                                                             Codigo(Int,Autoincre.)     Descricpion(Ch,40)     Variable(Ch,1)                                    001                                 Inventario                       S                                                            002                                 Ventas                            R                                         003                                 Compras                         S                                                              004                                 Tranferencia Salida         R
Tabla Movimientos (Llaves foraneas: Tienda, Linea, Marca, Producto, Unidad y Operacion)Codigo(Int,Auto), Tienda(Int,6), Linea(Int,6), Marca(Int,6), Producto(Int,6), Medida(Int,6), Operacion(Int,6), Fecha(D), # Documento(N,10), Cantidad(N,7), Precio(N,7,2), Utilidad(N,7,2), Transf.Tda.(Int,6)
Tabla Saldos (Llaves foráneas: Tienda, Linea, Marca, Producto, Unidad) Código(Int, Auto), Tienda(Int, 6), Linea(Int, 6), Marca(Int, 6), Producto(Int, 6), Unidad(Int, 6), Fecha(D), Saldo(N, 7)
En la tabla Movimientos para el campo operación al llamar a los código 002 y 004 que es Ventas y Transferencias para que las sume todas debería jalar la variable R de restas de la Tabla Operación.
Mira aquí ya reducí el Script pero al ejecutar me racalcula los saldos sin discriminar las Opraciones de Suma o Resta osea me suma al barrer las operaciones de cada producto.
DECIMAL{0} lentradas /// Este procedimiento suma todas las operaciones sin
DECIMAL{0} lsalidas   /// Discriminar Suma o Resta para Tabla DW Movimiento
DECIMAL{0} lexistencia  /// d_grid_mvto_general
LONG ltienda
STRING ls_error, jalotie
BOOLEAN lb_commit
int posi
posi = pos(ddlb_tienda.text,',')
ldescritie = trim(left(ddlb_tienda.text,posi -1))
lcodtie = trim(mid(ddlb_tienda.text,posi +1))
parent.title = upper(ldescritie)+',  Recalculo de Saldos de Productos en General'
Select tienda
into :jalotie
From Movimiento
Where Movimiento.tienda = :lcodtie ;
if lcodtie = jalotie then
  dw_1.enabled = True
  Dw_1.Retrieve(lcodtie)
  update saldos
  set saldo = m.saldo
  from (select tienda, producto, sum(valor) as  saldo
          from (select tienda, producto, cantidad as valor
          from movimiento) mv
  group by tienda, producto) m
  where saldos.tienda = m.tienda and saldos.producto=m.producto
  USING SQLCA;
  lb_commit = ((SQLCA.SQLCode = 0) AND (SQLCA.SQLDBCode = 0))
  ls_error = SQLCA.SQLErrText
  IF lb_commit THEN
  COMMIT USING SQLCA;
  ELSE
       ROLLBACK USING SQLCA;
       MESSAGEBOX('ERROR', ls_error)
  END IF
else
   dw_1.reset()
   MessageBox ("Opcion de Consulta","¡No existen Movimientos¡", exclamation!)
   return
end if
sugiero que practiques mas sobre SQL, ya que si dominas eso cualquier manejo de datos te sera facil, sin necesidad de programar muchas lineas... sal solucion seria
update saldo
set saldo = m.saldo
from (select tienda, producto, sum(valor) as  saldo
           from (select m.tienda, m.producto, case op.variable when 'S'  then  m.cantidad when 'R' then -1 * m.cantidad end as valor
         from movimientos m inner join operacion op on (m.operacion = op.codigo)) mv
group by tienda, producto) m
where saldo.tienda = m.tienda and saldo.producto=m.producto;
¿Me confirmas si funciono o no?
Ok. Practicare SQL., mira me sale el error de SQL 'Error de sintaxis cerca de 'Variable' 1 en Linea. Sera que en los from falta algún paréntesis o palabra reservada son las 2 lineas From antes del group by por que los anule y no me salio error.
Mil disculpas estabas bien en las sentencias que me diste, lo que paso era que en la estructura de la tabla Operaciones los Campos son Código, descripción y operación(no variable).
Sabes creo que no termine ni dar la primera pestañada y ya lo había recalculado, y con el FIND me demoraba como 3 minutos...
Mil gracias y que te vaya bien en tu trabajo... que tengas buena suerte.
Paco Risco.
Perú.
Ah. Me olvidaba me puedes recomendar una dirección donde bajar sentencias SQL.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas