Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta Datos Parciales sql (https://www.clubdelphi.com/foros/showthread.php?t=69032)

Caral 22-07-2010 03:29:26

Consulta Datos Parciales sql
 
Hola
Estoy trabajando mucho......

Estoy tratando de hacer una consulta que me regrese la suma de los totales de las piezas que fabrico, pero esta consulta la ejecuto en un reporte.
La consulta funciona, pero no me da los datos parciales, solo los totales.
Esta es:
Código SQL [-]
SELECT DISTINCT OrdenProdItem.CodParte,
Articulos.Descripcion|| ' ' ||Categoria|| ' ' ||SubCategoria AS Descr, SerieMaterial.CodMaterial,
Materiales.Descripcion, Materiales.Unidad, sum(SerieMaterial.Cantidad) AS Cantidad,
max(Materiales.Costo) AS Costo, max(SerieMaterial.CostoALaFecha) AS CostoALaFecha,
(SELECT Count(*) FROM OrdenProdItem)
FROM Articulos RIGHT JOIN (OrdenProdItem INNER JOIN (Materiales RIGHT JOIN SerieMaterial
ON Materiales.CodMaterial = SerieMaterial.CodMaterial) ON OrdenProdItem.NumSerie = SerieMaterial.NumSerie)
ON Articulos.CodParte = OrdenProdItem.CodParte
WHERE OrdenProdItem.FinProd >= :f1 AND OrdenProdItem.FinProd <= :f2 +1
GROUP BY OrdenProdItem.CodParte
Articulos.Descripcion|| ' ' ||Categoria|| ' ' ||SubCategoria, SerieMaterial.CodMaterial, 
Materiales.Descripcion, Materiales.Unidad
Si teneis alguna idea os lo agradezco.
A mi no se me enciende el.....
Saludos

Caral 22-07-2010 04:14:20

Hola
Para ampliar un poco mas los datos:
Asi es como llamo al qreport:
Como veis divido la consulta sacando el where y el group by, lo típico nada mas.
Código Delphi [-]
 try
         QRProduccionTerminadasPiezas:=TQRProduccionTerminadasPiezas.Create(self);
         QRProduccionTerminadasPiezas.ADOQuery1.SQL.Add(' WHERE OrdenProdItem.FinProd >= :f1 AND OrdenProdItem.FinProd <= :f2 +1');
         QRProduccionTerminadasPiezas.ADOQuery1.SQL.Add(' GROUP BY OrdenProdItem.CodParte, '+
         ' Articulos.Descripcion|| '' '' ||Categoria|| '' '' ||SubCategoria, SerieMaterial.CodMaterial, '+
         ' Materiales.Descripcion, Materiales.Unidad ');
         QRProduccionTerminadasPiezas.ADOQuery1.Params[0].Value:= DateToStr(DTP1.Date);
         QRProduccionTerminadasPiezas.ADOQuery1.Params[1].Value:= DateToStr(DTP2.Date);

         QRProduccionTerminadasPiezas.ADOQuery1.Open;
         QRProduccionTerminadasPiezas.QRLblDesde.Caption := DateToStr(DTP1.Date);
         QRProduccionTerminadasPiezas.QRLblHasta.Caption := DateToStr(DTP2.Date);
         If RadioGroup1.ItemIndex = 0 then QRProduccionTerminadasPiezas.Print
         else QRProduccionTerminadasPiezas.Preview;
      finally
         QRProduccionTerminadasPiezas.Free;
      end; //try
Saludos

Caral 22-07-2010 04:43:15

Hola
Amplio aun mas esto:
El reporte genera los datos de las piezas que he fabricado, lo que hace es sumar los datos de acuerdo al tipo de pieza mostrando los materiales y las cantidades de estos.
Este es el actual; genera la cantidad de piezas total, en este caso 22.



El asunto es que como es un reporte en el que suma las cantidades contrae todo.
Lo que busco es la suma parcial de las piezas por modelo asi:.



Si se os ocurre como hacerlo por aqui estoy.
Gracias de antemano.
Saludos

guillotmarc 22-07-2010 10:18:49

Hola.

Esto me parece que no hay ninguna necesidad de calcularlo en una consulta (puesto que entonces necesitarías dos consultas, una para calcular los datos, y otra para calcular los subtotales).

Lo habitual es solo tener la consulta de los datos a mostrar, y añadir una banda de agrupación en el informe, con el sumatorio de las unidades dentro de la agrupación.

Yo lo hago continuamente en Fast-Reports y funciona muy bien.

En todo caso, si lo quieres calcular en una consulta, ya vas bien encaminado, se trata de un consulta de sumatorio con group by.

Neftali [Germán.Estévez] 22-07-2010 11:40:35

No estoy mucho en tema de reportes, pero iba a sugerir algo parecido a lo que comenta guillotmarc; Me da la impresión de que esos totales deben poder calcularse desde el report mejor que desde la consulta.

De todas formas, ya te digo Carlos, que en esto de Reports no estoy nada al día.

Caral 23-07-2010 02:42:22

Hola
Gracias amigos, esto es mas dificil de lo que parece.
No quiere caminar, ni por sql ni por el reporte que seria lo mas sencillo.
Sigo buscando.
Saludos

Jac fcc 23-07-2010 17:17:34

Hace poco estuve batallando con ese mismo inconveniente.

como indica guillotmarc, yo tambien lo solucioné en el form del QReport, En algun momento se asigna a una banda un campo de la consulta (por codigo o en las propiedades de la banda)

por ejemplo crear una banda tipo TQRGroup llamada TQRPiezas y en su propiedad 'Expresion' colocar el campo por el cual se quiere agrupar, en este caso el campo de Tipopiezas. tambien ayuda que se cree una variable para los datos parciales y en el evento OnPrint del campo que se imprime se inicie a cero la variable que muestra los datos parciales. en un campo 'numpiezas' se estarian sumando los valores.

Algo que me dejó dudando (hasta ahora no se porque); la consulta se ordena como le indiquemos pero asi como se obtiene se agrupa, no lo hace de forma global. me explico con un ejemplo:
si por alguna razon mi consulta la ordeno por el numero de piezas me resulta:

clave descripcion grupos num piezas
torn01 descripcion tornillo accesorios 10
torn02 descripcion tornillo 02 accesorios 20
pin01 descripcion pinzas 01 herramientas 30
torn03 descripcion tornilo 03 accesorios 40

el Qreport hará tres grupos; los primeros 2 tornillos, la pinza y el utlimo tornillo.
por que esa es la forma en la que encuentra los datos al consultar.
independientemente de que los tres tornillos pertenezcan a accesorios y lo correcto sea crear solo dos agrupaciones.

lo digo por que eso me dió varios dolores de cabeza y espero que no te este sucediendo.
consulta los datos en codigo SQl para ver como regresan las consultas y si es necesario cambia la manera de ordenarlos.

:D

Caral 24-07-2010 03:24:20

Hola
Gracias por vuestros consejos.
Saludos

Caral 30-07-2010 04:05:50

Hola
Hoy he terminado de resolver este problema, os cuento.
Queria que me salieran los datos parciales, pero, el problema era que dependia del dato que suministraba el query que esta en el reporte, osea, como sacar ese dato si cuando lo captura, lo muestra inmediatamente?.
Bien, lo solucione, después de romperme la cabeza, usando el evento AfterScroll del query.
Ahi es donde hago el codigo (en un query independiente) para que me muestre el dato.
Osea, el reporte ahora tiene dos query y en el unit del reporte coloco el codigo que en realidad es sencillo.
Código Delphi [-]
procedure TQRProduccionTerminadasPiezas.ADOQuery1AfterScroll(
  DataSet: TDataSet);
begin
   AQTemp.Close;
   AQTemp.SQL.Text:= 'select count(*) from OrdenProdItem Where OrdenProdItem.CodParte = :cod'+
           ' and OrdenProdItem.FinProd >= :f1 AND OrdenProdItem.FinProd <= :f2 +1';
   AQTemp.Params[0].Value:= ADOQuery1CODPARTE.AsString;
   AQTemp.Open;
end;

El codigo de la pieza lo saca del adoquery1 y las fechas las saca del form que lo llama.

Bueno, lo importante:
Gracias a todos por vuestros consejos.
Tal vez a alguien mas le suceda algo así y sabrá como resolverlo.
Saludos


La franja horaria es GMT +2. Ahora son las 22:56:39.

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