Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2014
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
Depurar DB MS SQL

Buen día a todos, hace tiempo no ingresaba, he ido desarrollando en base a las necesidades en la compañía donde laboro y tengo ya algunos dias con este problema. Tengo una tabla en MS SQL tiene unos 120 mil registros de los cuales muchos son repetidos en la columna "A" (clave de producto) por decirlo de alguna forma, pero que tomando la columna "B" (numero almacén) lo clasificaría en numero de almacén del producto "XXXX" y en la columna "C" estaría el concepto por el cual habría que definir si se resta o se suma la cantidad que esta en una columna "D" , y por ultimo tomar la cantidad que esta en una columna "E". para pasar al siguiente registro y validar el dato de la columna "A" sea igual al anterior. si es asi, ve si la columna "B" es igual, si no se asume que es otro almacén y con esto debería totalizar la columna "C", "D" y "E" y pegar esta información en una tabla distinta. lo desarrollado hasta el momento funciona en parte pero si encuentra que la columna "B" es distinta me agrega la info en la nueva tabla. lo que necesito es que se haga algo similar a la instruccion DISTINCT de SQL para que me muestre en la columna "A" la clave del producto y en la columna "B" únicamente los almacenes 1,2,3,4, etc en los que se encuentra (sin repetirse), en la columna "C" sus totales, en la "D" y "E" lo respectivo.
Espero haber sido claro en la explicación del problema. voy a buscar el código ya que lo he reescrito tantas veces que ya lo elimine, por suerte lo guarde en un txt para copiarlo.
Código Delphi [-]
  With DataModule1.ADOTabla Do
    Begin 
      Open;
      Edit;
      First;
      ProgressBar1.Max := RecordCount;
      Cart := DataModule1.ADOTabla.AsString;
      Cart1 := DataModule1.ADOTabla.AsString;
      Nalma := DataModule1.ADOTabla.AsInteger;
      Nalma1 := DataModule1.ADOTabla.AsInteger;
      Ncant := 0;
      Nexist := 0;
      Nsumacanti := 0;
      Nsumaexist := 0;
      While Not Eof Do
        Begin 
          Cart := DataModule1.ADOTabla.AsString;
          If Cart = Cart1 Then
            Begin
              Nalma := DataModule1.ADOTabla.AsInteger;
              If Nalma=Nalma1 Then
                Begin 
                  Nalma := DataModule1.ADOTabla.AsInteger;
                  If Nalma=1 Then
                    Begin
                      Cart := DataModule1.ADOTabla.AsString;
                      Ncon := DataModule1.ADOTabla.AsInteger;
                      DataModule1.ADOTabla.Next;
                      If Ncon = 1 Then
                        Begin
                          Nexist := DataModule1.ADOTabla.AsInteger;
                          Almacen[0] := Almacen[0]+Nexist;
                        End
                      Else
                      If Ncon = 2 Then
                        Begin
                          Nexist := DataModule1.ADOTabla.AsInteger;
                          Almacen[0] := Almacen[0]+Nexist;
                        End
                      Else
                      If Ncon = 3 Then
                        Begin
                          Nexist := DataModule1.ADOTabla.AsInteger;
                          Almacen[0] := Almacen[0]+Nexist;
                        End
                      Else
...............................

Gracias por su atención, apoyo y comentarios.
Responder Con Cita
  #2  
Antiguo 13-10-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Buenas, primero que nada, lo que planteas es un poco confuso , sobre todo llamando a los campos como a,b,c,d (al menos para mi, quiza sea un poco corto ) y creo que podrias aportarnos algun dato mas (no llego a entender que es exactamente lo que quieres hacer, hablando en terminos practicos)

Pasando al problema en si, lo ideal seria que la tabla esté de antemano ordenada para recorrerla como lo precisas

Código:
CAMPO_A | CAMPO_B | etc...
---------------------------
1               1               
1               1
1               2
2               1
2               4
3               2
3               1
3               1
entonces te quedaria algo masomenos asi (si entendi correctamente el problema)

Código Delphi [-]
Tu_Tabla.Open;
campo_a:= Tu_Tabla.FieldByName('Campo_A').Value;
campo_b:= Tu_Tabla.FieldByName('Campo_B').Value;
while not(Tu_Tabla.EoF) do
begin
    // inicializas la variable totalizadora
    total:= 0;
    while not(Tu_Tabla.EoF) and (campo_a = Tu_Tabla.FieldByName('Campo_A').Value) and 
          (campo_B = Tu_Tabla.FieldByName('Campo_B').Value) do
    begin
        // realizas tu proceso de ver si tenes que sumar/restar, 
        if (condicion_para_sumar) then
            total:= total + Tu_Tabla.FieldByName('Cantidad').Value
        else
            total:= total - Tu_Tabla.FieldByName('Cantidad').Value;
        Tu_Tabla.Next;
        campo_a:= Tu_Tabla.FieldByName('Campo_A').Value;
        campo_b:= Tu_Tabla.FieldByName('Campo_B').Value;
    end;

    // salir de este while significa que, o bien cambio el articulo
    // o bien que cambio de almacen, por lo tanto deberias guardar en la otra tabla el total?

    // guardas en la otra tabla el total
    with La_Otra_Tabla do
    begin
        Edit;
        FieldByName('total').Value:= total;
        Post;
    end;
end;

Si el proceso lo tenes que realizar para todos los productos, entonces yo optaria por hacer un query:

Código SQL [-]
SELECT * FROM Tu_Tabla WHERE A = :CodProducto

Luego recorres ese dataset para totalizar, y vuelves a lanzar el mismo query pero con otro codigo de producto, me explico?

Que es exactamente lo que precisas, saber cuanto de cada producto hay en cada almacen?

Un saludo!

Última edición por AgustinOrtu fecha: 13-10-2014 a las 08:03:47. Razón: me equivoque en una cosa del codigo :D
Responder Con Cita
  #3  
Antiguo 13-10-2014
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
AgustinOrtu
Gracias, por tu respuesta, no se me ocurrió manejar el While como lo expones. Voy a modificar el código para probar de esta forma. Exactamente que se requiere hacer? es precisamente la idea que tienes o captaste. Contabilizar los productos por almacén, solo que el mismo producto aparece en varios almacenes y estos almacenes aparecen varias veces. Variando así sus totales de existencia. La pretensión totalizar la existencia de producto ó articulo pero por almacén (Campo, columna "B") sin perder de vista lo principal, el producto o articulo que estamos trabajando. Dado que el código que tengo y expuse lo único que hace es "traspasar" la información de una tabla a otra. Y lo que necesito es un procedimiento que haga el "filtro" por almacenes totalizando la existencia por producto en base a conceptos "entradas" , "salidas", "devoluciones" , "cancelaciones", "compras", etc.
Gracias por el aporte y ya comentare si funciono como se desea. Hasta pronto
Responder Con Cita
  #4  
Antiguo 13-10-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Perfecto bueno mira, te comento como lo trabajo yo en mis sistemas para que sea menos engorroso.

La idea es que la tabla que tenés ahora sea para consultar como fue variando el stock de los productos en los diversos almacenes, sería un registro o historial de movimientos. Luego yo manejo otra tabla en la cual se tiene la cantidad del stock actual, por cada almacén. En mi caso opte por la mala idea (más difícil de extender, pero más cómoda y eficiente de trabajar) de definir una tabla más o menos así

Código:
 
IdProducto int,
Stock1 int,
StockMin1 int,
StockN int,
StockMinN int
Lo más perfecto creo yo sería tener tres tablas, productos, stock (idProd, IdAlmacen, stock) y la tabla de almacenes, e ir construyendo las relaciones.

Bueno, siguiendo con mi diseño, cada ves que se realiza uno de los movimientos de stock, no solo doy de alta el registro en la tabla de movimientos, sino que también en ese momento actualizo el stock del producto correspondiente, esto lo hago con un query similar a esto

Código SQL [-]
UPDATE Stock SET StockN + :Cantidad WHERE IdProducto = :Id
UPDATE Stock SET StockN - :Cantidad WHERE IdProducto = :Id

También es posible usar triggers, pero a mi particularmente no me gusta la programación en BD, prefiero hacer todo en mi código delphi

De esta forma tenés tu stock al día sin preocuparte de correr un proceso grande.

Si aún así fuera necesario el proceso que describís entonces asumiendo que tengas que recorrer todos los productos podes hacer algo parecido a esto

Código Delphi [-]
Function StockProducto(codProducto, almacén integer): integer
begin
  select * from tabla where a = codProd and b = almacén        // todos los movimientos del producto en un almacén
  Result:= 0
  while not EoF do
  begin
       If sumar then
          Result:= result + c
       else 
          Result:= result - c;    
  end;
   Next
end;

No estoy seguro pero esta última solución, mucho más fácil de leer y encarar, sea menos eficiente por andar lanzando queries a lo loco, podrías modificarla un poco para que te retorne en ves de solo el stock de un almacén el de todos en un array

Entonces todo se reduce a

Código Delphi [-]
// procesando productos
While not fin productos do
Begin
    ArrayStock:= StockProducto(fieldByName('a').asInteger);
   With tabla do
   Begin
       Edit;
       fieldByName (codProd).value:= a
       fieldByName(almacen1).value:= arrayStock[0]
       Etc
       Post
   End
   Next
End

Saludos!
Responder Con Cita
  #5  
Antiguo 13-10-2014
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
AgustinOrtu
Gracias de nueva cuenta por esta aportación. Estoy trabajando con los cambios que inicialmente propusiste, complementando la información. Los totales se requieren obtener por cada producto, y por cada almacén ya que los almacenes del 1-99 son para diferentes rubros. Almacén 1 producto de linea, almacén 2 Almacén-foráneo, almacén 5 refacciones, almacén 20 inservibles, almacén 80 irrecuperables y así con todos los almacenes y como es el mismo producto se necesita totalizar por cada uno en los diferentes almacenes.
Enseguida coloco como seria la información en la tabla (campos o columnas principales). Esto porque se requiere así? Debido a que estoy programando una aplicación que accede a esta información y muestra la existencia del producto con sus características y existencias en los almacenes donde exista asignado.
Gracias y hasta pronto
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Depurar una CGI en Delphi 5 bitbow Internet 0 10-03-2011 17:55:42
Depurar una dll en TurboDelphi yarones Varios 3 18-01-2008 13:22:29
Depurar Clases jplj Varios 2 13-11-2007 18:39:59
No depurar ciertas units marto Varios 3 22-06-2004 19:09:38
depurar libreria agonzalez Varios 6 16-03-2004 20:03:08


La franja horaria es GMT +2. Ahora son las 00:42:38.


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