Ir al contenido


Foto

restar un mismo campo de una tabla


  • Por favor identifícate para responder
16 respuestas en este tema

#1 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 10:58

que hay amigos aqui estoy con un problema a ver quien me puede echar la mano, tengo una base de datos en  mysql donde tengo los campos nombre, codigo, documento, cantidad  lo que quiero es restar el campo cantidad , donde lo que diferenciaria seria el campo documento ya que puede ser "E" o "S", entonces seria sumar la cantidad donde documento="E" y restarle la suma de documento="S" no se si me explique lo que quiero lograr
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 11:07

Pues, debes ser mucho más claro sobre lo que necesitas, por que a bote pronto se me ocurre esto:



Select (Select Sum(Cantidad) From Tabla where documento="E") -
        (Select Sum(Cantidad) From Tabla where documento="S") Total


  • 0

#3 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 11:16

si algo asi es mas o menos lo que necesito nomas que con esa respuesta nomas me aparece el resultado y me gustari que apareciera nombre, codigo y ya el resultado intente agregarle en el select nombre y codigo pero me dice que no existen esas columnas
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 11:22

Entonces  quieres el resultado de las operaciones  de entrada y salida

ok... lo ideal sería tomar los datos de código y nombre de tu catálogo de artículos pero como no se la estructura de tus tablasl o sacare de tus tablas de operación, que aclaro es algo ineficiente



    Select Distinct Datos.Codigo, Datos.Nombre
              coalesce(Entradas.Entradas,0) -
              coalesce(Salidas.Salidas,0)  CantidadTotal
      From TablaDatos Datos
Left join (
              Select Codigo, Sum(Cantidad) Entradas
                  from TablaDatos
                WHERE documento="E"             
              Group by Codigo
            ) Entradas
      On Datos.Codigo = Entradas.Codigo
Left join (
              Select Codigo, Sum(Cantidad) Salidas
                  from TablaDatos
                WHERE documento="S"             
              Group by Codigo
            ) Salidas
      On Datos.Codigo = Salidas.Codigo



  • 0

#5 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 11:33

sabes que no me funcion o mas bien no supe como adaptarlo no se si necesites un pco mas de informacion , pero mi base de datos se llama cuauhtemoc la tabla se llama entradas

CODIGO      NOMBRE        DOCUMENTO      CANTIDAD
A01              BURO              E                          15
A01              BURO                E                            3
A01              BURO                S                            10

entonces en mi reporte quiero qe me salga de la siguiente forma

CODIGO      NOMBRE              TOTAL
A01            BURO                    8

         
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 11:46



entonces en mi reporte quiero qe me salga de la siguiente forma

CODIGO      NOMBRE              TOTAL
A01            BURO                    8

         


La segunda consulta  da de hecho ese resultado.... qué problema te da
  • 0

#7 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 11:48

me sale este error amigo:


Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COALESCE(Entradas.Entradas,0) -
              COALESCE(Salidas.Salidas,0)  Cant' at line 2

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time    : 00:00:00:000

  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 11:53

que versión de mysql usas?

prueba quitando la función coalesce y el alias...

  • 0

#9 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 11:57

la version que tengo es esta: appserv-win32-2.5.10, ahora me esta marcando esto:


Error Code : 1305
FUNCTION datos.Nombre does not exist

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time    : 00:00:00:000

y si le quito la parte de datos me pone lo siguiente:

Error Code : 1052
Column 'Codigo' in field list is ambiguous

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time    : 00:00:00:000



  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 12:02



la version que tengo es esta: appserv-win32-2.5.10, ahora me esta marcando esto:


Esa es la versión del paquete... yo te preguntaba la versión de mysql.


    Select Datos.Codigo, Datos.Nombre,
            Entradas.Entradas - Salidas.Salidas
      From (
                Select distinct Codigo, Nombre
                    From TablaDatos
            )  Datos
Left join (
              Select Codigo, Sum(Cantidad) Entradas
                  from TablaDatos
                WHERE documento="E"             
              Group by Codigo
            ) Entradas
      On Datos.Codigo = Entradas.Codigo
Left join (
              Select Codigo, Sum(Cantidad) Salidas
                  from TablaDatos
                WHERE documento="S"             
              Group by Codigo
            ) Salidas
      On Datos.Codigo = Salidas.Codigo





a ver ahora :p
  • 0

#11 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 12:14

jeje disculpa la version es la 5.0.51b y ya me aparece el resultado aunque esto lo hago directamente de mysql, me imagino que este mismo lo puedo adaptar para un reporte en tquickreport o no me sirve?? bueno por lo pronto tratare de adecuarlo a ver como me va porque necesito que me arroje el resultado en un rango de codigos
  • 0

#12 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 12:19

Puedes usar el resultado para enviarlos a QuickReport, o FastReport, o Cristal o el reporteador que necesites... :)


  • 0

#13 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 12:28

ok por ultimo amigo al tratar de adecuarla ya en delphi lo intento de esta manera:

p

delphi
  1. rocedure TForm12.imprimirClick(Sender: TObject);
  2. begin
  3. tabla.close ;
  4. tabla.SQL.Clear;
  5.  
  6. tabla.sql.add('SELECT Datos.Codigo, Datos.Nombre, COALESCE(Entradas.Entradas,0) - COALESCE(Salidas.Salidas,0) cantidad  '+
  7. 'FROM (SELECT DISTINCT Codigo, Nombre FROM entradas)  Datos LEFT JOIN ( SELECT Codigo, SUM(Cantidad) Entradas'+
  8. 'FROM entradas WHERE documento=:doc1 and codigo<= :inicial GROUP BY Codigo) Entradas ON Datos.Codigo = Entradas.Codigo LEFT JOIN (SELECT Codigo, SUM(Cantidad) Salidas FROM entradasWHERE documento= :doc2 codigo<= :final GROUP BY Codigo)'+
  9. 'Salidas ON Datos.Codigo = Salidas.Codigo ');
  10. tabla.ParamByName('inicial').Asstring:=inicial.Text;
  11. tabla.ParamByName('final').Asstring:=final.Text;
  12. tabla.ParamByName('doc1').Asstring:=doc1.Text;
  13. tabla.ParamByName('doc2').Asstring:=doc2.Text;
  14.  
  15. tabla.PREPARE;
  16. tabla.Active:=TRUE;
  17. form13.reporte.Preview;
  18. inicial.SetFocus;
  19.  
  20. end;



pero me sale un error el cual es el siguiente:

#42000 you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' entradas where documento=? and codigo<=?' group by codigo) entradas ON Datos.cod at line1.
  • 0

#14 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 12:33

no se le entiende nada a tu código sql... por favor indenta correctamente tu consulta para hacerla más legible... así no le entiendo nada...


  • 0

#15 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 12:44

jeje disculpa a ver ahora que te parece, ya con esto si me sale el reporte pero me salen todos los registros,  tengo 2 edit que son los parametros que quiero que tome para mostra la informacion pero no mes los respeta y me manda todo



delphi
  1. procedure TForm12.imprimirClick(Sender: TObject);
  2. begin
  3. tabla.close ;
  4. tabla.SQL.Clear;
  5.  
  6. tabla.sql.add('SELECT Datos.Codigo, Datos.Nombre, '+
  7.  
  8. 'COALESCE(Entradas.Entradas,0) - COALESCE(Salidas.Salidas,0)  cantidad'+
  9.  
  10.     '  FROM ('+
  11.             '  SELECT DISTINCT Codigo, Nombre '+
  12.                 '    FROM entradas '+
  13.           '  )  Datos          '+
  14. 'LEFT JOIN (                      '+
  15.               'SELECT Codigo, SUM(Cantidad) Entradas '+
  16.                   ' FROM entradas                    '+
  17.                 'WHERE documento="E"  and codigo>=:inicial  '+
  18.             '  GROUP BY Codigo                        '+
  19.             ') Entradas                              '+
  20.       ' ON Datos.Codigo = Entradas.Codigo            '+
  21. 'LEFT JOIN (                                          '+
  22.               ' SELECT Codigo, SUM(Cantidad) Salidas  '+
  23.                   ' FROM entradas                            '+
  24.                 ' WHERE documento="S" and codigo<=:final  '+
  25.             ' GROUP BY Codigo                                  '+
  26.           ' ) Salidas                                          '+
  27.       ' ON Datos.Codigo = Salidas.Codigo');
  28.  
  29.  
  30. tabla.ParamByName('inicial').Asstring:=inicial.Text;
  31. tabla.ParamByName('final').Asstring:=final.Text;
  32.  
  33.  
  34. tabla.PREPARE;
  35. tabla.Active:=TRUE;
  36. form13.reporte.Preview;
  37. inicial.SetFocus;
  38.  
  39. end;


  • 0

#16 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 24 septiembre 2012 - 01:02

Podrías hacerlo de esta manera:




delphi
  1. Tabla.close;
  2. Tabla.SQL.Clear;
  3. tabla.sql.text :=
  4.   '  SELECT Datos.Codigo, ' +
  5.   '        Datos.Nombre,  ' +
  6.   '        COALESCE(Entradas.Entradas,0) - COALESCE(Salidas.Salidas,0) cantidad  ' +
  7.   '    FROM (SELECT DISTINCT Codigo, Nombre  ' +
  8.   '            FROM entradas ' +
  9.   '          Where Codigo >=  ' + inicial.Text + ' And ' +
  10.   '                Codigo <=  ' + Final.Text +
  11.   '        )  Datos  ' +
  12.   '  LEFT JOIN ( SELECT Codigo, SUM(Cantidad) Entradas ' +
  13.   '                FROM entradas  ' +
  14.   '              WHERE documento="E" and  ' +
  15.   '                    Codigo >= ' + inicial.Text + ' And ' +
  16.   '                    Codigo <= ' + Final.Text  +
  17.   '            GROUP BY Codigo ' +
  18.   '            ) Entradas  ' +
  19.   '        ON Datos.Codigo = Entradas.Codigo    ' +
  20.   '  LEFT JOIN (  SELECT Codigo, SUM(Cantidad) Salidas  ' +
  21.   '                FROM entradas  ' +
  22.   '              WHERE documento="S" and  ' +
  23.   '                    Codigo >= ' + inicial.Text + ' And ' +
  24.   '                    Codigo <= ' + Final.Text  +
  25.   '            GROUP BY Codigo ' +
  26.   '          ) Salidas  ' +
  27.   '        ON Datos.Codigo = Salidas.Codigo  ';
  28. Tabla.Active:=TRUE;
  29. form13.reporte.Preview;
  30. Inicial.SetFocus;


  • 0

#17 edgar_prospero

edgar_prospero

    Advanced Member

  • Miembros
  • PipPipPip
  • 136 mensajes

Escrito 24 septiembre 2012 - 01:10

listo ya quedo solucionado muchas gracias por tu ayuda y paciencia  (y)
  • 0




IP.Board spam blocked by CleanTalk.