Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Reporte tipo Maestro /Detalle!!! (https://www.clubdelphi.com/foros/showthread.php?t=55961)

Caray 02-05-2008 21:42:19

Reporte tipo Maestro /Detalle!!!
 
Hola gente del foro pues en esta ocasion los molesto con algo que puede verse sencillo pero que a mi me ha dado muchos problemas.
Primero que nada quiero decir lo que pretendo hacer y esto es un reporte tipo Maestro Detalle de la siguiente forma:

Nombre_Trabajador1 sueldo_total1
laborquerealizo1 importe1
laborquerealizo2 importe2
...
laborquerealizon importen

Nombre_Trabajador2 sueldo_total2
laborquerealizo1 importe1
laborquerealizo2 importe2
...
laborquerealizon importen

El sueldo total seria la suma de todos los importes, pues les quiero decir que todo me sale bien menos lo de el Sueldo_Total ya que no me lo muestra correctamente.
El Codigo que pongo en el QuickReport (utilizo Delphi 7) es el siguiente:
Código:

procedure TfrmRepNominaOperador.RepNominaOperaBeforePrint(
  Sender: TCustomQuickRep; var PrintReport: Boolean);
var cSql : String;
var cSql2 : String;
begin
  cSql := ' select nomina_operador.n_registro,operador.nombre,inspectores.nombre_inspector,labores.nombre_labor,maquinas.descripcion, nomina_operador.ano, nomina_operador.numero,det_nomina_operador.superficie, ' +
          ' det_nomina_operador.tarifa,det_nomina_operador.total_operador '+
          ' from operador, labores,det_nomina_operador,nomina_operador,maquinas,inspectores '+
          ' where operador.clave_operador=det_nomina_operador.clave_operador  AND inspectores.clave_inspector=nomina_operador.clave_inspector AND maquinas.clave_maquina=det_nomina_operador.clave_maquina  AND labores.clave_labor= det_nomina_operador.clave_labor ' +
          ' AND det_nomina_operador.n_registro=nomina_operador.n_registro AND maquinas.clave_sociedad=det_nomina_operador.clave_sociedad and nomina_operador.numero='+ quotedstr(frmnominaoperador.semana.text) + ' and  nomina_operador.ano=' + quotedstr(frmnominaoperador.edzafra.Text) +
          ' group by nomina_operador.n_registro,operador.nombre,inspectores.nombre_inspector, labores.nombre_labor,maquinas.descripcion, nomina_operador.ano, nomina_operador.numero, det_nomina_operador.superficie, det_nomina_operador.tarifa, ' +
          ' det_nomina_operador.total_operador '+
          ' Order BY nomina_operador.n_registro';
  Datos.qryBuscar.SQL.Clear;
  Datos.QryBuscar.SQL.ADD(cSql);
  Datos.QryBuscar.Open;
  cSql2:= ' select  nomina_operador.n_registro,operador.clave_operador,sum(det_nomina_operador.total_operador) as sueldo  ' +
          ' from det_nomina_operador,nomina_operador,operador,maquinas,labores,inspectores  '+
          ' where operador.clave_operador=det_nomina_operador.clave_operador  AND inspectores.clave_inspector=nomina_operador.clave_inspector AND maquinas.clave_maquina=det_nomina_operador.clave_maquina  AND labores.clave_labor= det_nomina_operador.clave_labor ' +
          ' AND det_nomina_operador.n_registro=nomina_operador.n_registro AND maquinas.clave_sociedad=det_nomina_operador.clave_sociedad and nomina_operador.numero='+ quotedstr(frmnominaoperador.semana.text) + ' and  nomina_operador.ano=' + quotedstr(frmnominaoperador.edzafra.Text) +
          ' GROUP BY nomina_operador.n_registro,operador.clave_operador'+
          ' Order BY nomina_operador.n_registro';
  Datos.qryauxbuscar.SQL.Clear;
  Datos.QryauxBuscar.SQL.ADD(cSql2);
  Datos.QryauxBuscar.Open;
end;

Con el QryBuscar logro que me ponga el nombre del trabajador, las labores y el importe; el nombre lo tengo en una banda QrGroup con la expresion: Qrybuscar.n_registro;y la labor y el importe en una detail.
Con el QyAuxBuscar intento que me ponga la suma de los importes de las labores para ese empleado y tambien la tengo en la banda QrGroup, pero lo malo es que para todos los nombres de persona me pone la misma cantidad: Ejemplo:

Nombre:Sergio Sueldo total: 50--> Eso Esta bien
limpia importe=25
limpia2 importe=25

nombre: Juan Sueldo Total: 50-->Esto debria ser 200
Quema importe=50
Quema2 importe=150

Y pues la neta no se que pasa por que el codigo del QryAuxBuscar probado en el ISQL funciona bien.

Bueno espero comprendan este post que parece mas una carta anticipada a Santa.
Esperando y agradeciendo de antemano su respuesta, me despido quedando de ustedes su amigo:SERGIO A. L.

ContraVeneno 02-05-2008 23:06:51

¿porque no traes todos los datos en una sola consulta? ¿porque tienen que ser dos?

Sería más fácil traer todos los datos en una sola consulta y las agrupaciones y sumatorias hacerlas en el reporte.

Caray 03-05-2008 03:55:25

Se me complica mucho!!!
 
La verdad yo para el lenguaje SQL no soy muy bueno, lo intente hacer en una sola pero la neta se me complico demasiado, es decir no me salio, asi k mejor opte por hacerla con dos. Le movi y movi a la sentencia pero simplemente no puede hacerla con una. Esa es la verdad y pues me da algo de cosa ya que aqui hay puro experto.

ContraVeneno 03-05-2008 17:55:51

Bueno, expertos, expertos, lo que se dice expertos, pues no... Bueno, la mayoría si, yo no soy experto. Pero entre todos nos ayudamos un poco y espero llegar a ese nivel.

En fin. Según veo, tu primer consulta y la segunda consulta son exactamente lo mismo, solo que en la segunda haces una suma. Esa suma es la que podrías hacer en el reporte; en otras palabras, no habría necesidad de hacer la segunda consulta.

Luego en tu primer consulta, estas agrupando, pero no utilizas ninguna función de agrupación; es decir, tienes el Group By por todos los campos en el select, pero no tienes ningún Sum, Avg o Max. :confused::confused::confused:

Ahora, en tu código podrías ahorrarte las variables cSQL y cSQL2 y podrías agregar tu consulta directo con la función Add.
Así como lo tienes, si quisieras extraer la consulta a un archivo o un stream, toda la consulta estaría en una sola línea. En tu código la ves en varias linéas, pero realmente (al utilizar +) lo estas haciendo en una sola línea. Si utilizas directamente la función Add, la consulta estará dividida en líneas (como un TStringList) y es mucho más fácil hacer otras cosas.

Y por último, realizas la consulta en el evento BeforePrint, lo cuál puede funcionar, pero no te lo recomendaría. Sería mejor realizar la consulta antes de mandar la vista previa. Y en el evento BeforePrint, hacer ajustes menores en el reporte. Pero no es recomendable ejecutar la consulta en ese evento.

En resumen, lo que yo haría, sería lo siguiente:
Código Delphi [-]
Procedure TfrmRepNominaOperador.UnBotonOnClick(Sender as TObject);
begin
  inherited;
  with Datos.qryBuscar do begin
   If active then close;
   SQL.Clear;
   SQL.Add('select NO.n_registro, O.nombre, I.nombre_inspector,');
   SQL.Add('L.nombre_labor, M.descripcion,  NO.ano,');
   SQL.Add('NO.numero, DNO.superficie, DNO.tarifa, DNO.total_operador');
   SQL.Add('from det_nomina_operador DNO,');
   SQL.Add('join nomina_operador NO on (DNO.n_registro = NO.n_registro)');
   SQL.Add('join Operador O on O.clave_operador = DNO.clave_operador');
   SQL.Add('join labores L on L.clave_labor =  DNO.clave_labor');
   SQL.Add('join maquinas M on M.clave_sociedad = DNO.clave_sociedad AND M.clave_maquina = DNO.clave_maquina');
   SQL.Add('join inspectores I on I.clave_inspector = NO.clave_inspector');
   SQL.Add('Where NO.numero =  :Numero and  NO.ano =  :Year');
   SQL.Add('Order BY NO.n_registro');
   ParamByName('Numero').AsInteger := tryStrtoInt(frmNominaOperador.Semana.Text);
   ParamByName('Year').AsInteger := tryStrtoInt(frmNominaOperador.edzafra.Text);
   Open;
  end; //with
end;

La idea es que en la consulta traigas todos los datos que necesites, sin agrupar, sin sumar. Y ya en el reporte hacer todas las agrupaciones y/o sumatorias necesarias.

Caray 05-05-2008 20:43:40

Error en Suma!!!
 
hola gente:
Pues quiero decirles que pude traer los datos en una sola consulta,algo mas o menos asi
Código:

SELECT Nomina.folio,det_nomina.dia,Labores.nombre_labor,Ejidos.nombre_ejido,Nomina.clave_inspector,Inspectores.nombre_inspector,semana.inicio,semana.fin,semana.mes,Nomina.numero,Nomina.ano,Det_Nomina.clave_jornal, ' +
          ' Jornales.nombre_jornal,det_nomina.clave_zona,Det_Nomina.tarifa,det_nomina.total_pagar,sum(det_nomina.total_pagar) as sueldo '+
          ' FROM Det_Nomina,Jornales,Inspectores,Nomina,labores,ejidos,semana '+
          ' WHERE Nomina.folio=Det_nomina.folio AND Det_Nomina.clave_jornal=Jornales.clave_jornal AND Nomina.Clave_inspector=Inspectores.Clave_Inspector and nomina.numero=semana.numero and det_nomina.clave_productor=''2'' AND nomina.clave_inspector=' + quotedstr(frmrep_nomina.cbinspector.KeyValue)+ ' AND nomina.numero='+ quotedstr(frmrep_nomina.edsemana.text) + ' AND nomina.ano='+ quotedstr(frmrep_nomina.edzafra.Text) +
          ' AND det_nomina.clave_labor=Labores.clave_labor And det_nomina.Clave_ejido=Ejidos.Clave_ejido '+
          ' GROUP BY Nomina.folio,det_nomina.dia,Labores.nombre_labor,Ejidos.nombre_ejido,Nomina.clave_inspector,Inspectores.nombre_inspector,semana.inicio,semana.fin,semana.mes,Nomina.numero,Nomina.ano,Det_Nomina.clave_jornal, ' +
          ' Jornales.nombre_jornal,det_nomina.clave_zona,Det_Nomina.tarifa,det_nomina.total_pagar '+
          ' Order BY nomina.folio

pero la suma me sale erronea, intente poner un qrexpr y en la opcion expression le puse Sum(qrybuscar.total_operador). Primero se lo puse en la Group Footer con la opcion ResetAfterPrint a True, pero vi que no aparecia nada asi que se lo cambie al group header pero me aparece asi:

Nombre: Sergio Sueldo:0 --Deberia ser 400
Quema importe:250
Abonada importe:150

Nombre: Sergio Sueldo:400-- deberia ser 250
Quema importe: 250

Como ven en el primer sueldo siempre me pone 0(cero) y en el segundo me pone el total del primero.En el Group Header tengo la propiedad Expression:QryBuscar.folio .En que creen que falle?

PD. intente en la consulta poner la suma:
select ...... ,sum(det_nomina.total_operador) as sueldo
from...
where...

pero tampoco jalo asi,como hacer la suma ya con los datos en una sola consulta?, lo recomendable segun he visto es con un qrexpr pero no quiere funcionar con eso, por lo dicho arriba.

sin mas me despido por el momento

ContraVeneno 05-05-2008 23:09:59

Pues sí, lo recomedable es hacer las sumas con un qrexpr, colocado en el group footer. Eso sería lo correcto.

¿porque no salía nada? pues no se, no estaría bien enlazado, no estaría apuntando al campo correcto. Podrían haber sido muchas cosas.

Pero en fin, lo correcto es eso. Una consulta, un TQRExpr en un GroupFooter con su propiedad ResetAfterPRint a verdadero.

Caray 07-05-2008 03:09:33

Solucionado
 
Señor ContraVeneno quiero agradecerle toda la ayuda que me proporcionó, ya que sin esta no hubiera sido posible encontrarle solución a un problema que me habia aquejado durante mucho tiempo. Quiero decirle que lo del Group Footer era por un mal linkeado de las bandas, todo lo demás estaba bien. Pues sin más que decir, me despido no sin antes reiterarle mis más sinceras gracias.
ATTE Sergio A.L.
PD. Cuando pueda y sepa como voy a subir mi codigo para que gente como ustedes lo vean y critiquen pero de manera sana, esto para en un futuro poder mejorarlo.


La franja horaria es GMT +2. Ahora son las 06:43:49.

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