Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-05-2008
Caray Caray is offline
Miembro
 
Registrado: abr 2006
Posts: 61
Poder: 18
Caray Va por buen camino
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.
__________________
La inteligencia me persigue, pero yo soy más rápido que ella.
Responder Con Cita
  #2  
Antiguo 02-05-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿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.
__________________

Responder Con Cita
  #3  
Antiguo 03-05-2008
Caray Caray is offline
Miembro
 
Registrado: abr 2006
Posts: 61
Poder: 18
Caray Va por buen camino
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.
__________________
La inteligencia me persigue, pero yo soy más rápido que ella.
Responder Con Cita
  #4  
Antiguo 03-05-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.

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.
__________________

Responder Con Cita
  #5  
Antiguo 05-05-2008
Caray Caray is offline
Miembro
 
Registrado: abr 2006
Posts: 61
Poder: 18
Caray Va por buen camino
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
__________________
La inteligencia me persigue, pero yo soy más rápido que ella.
Responder Con Cita
  #6  
Antiguo 05-05-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #7  
Antiguo 07-05-2008
Caray Caray is offline
Miembro
 
Registrado: abr 2006
Posts: 61
Poder: 18
Caray Va por buen camino
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 inteligencia me persigue, pero yo soy más rápido que ella.
Responder Con Cita
Respuesta



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
maestro-detalle en rave reporte hob Impresión 4 10-08-2006 17:30:28
Reporte Maestro Detalle Caro Impresión 1 14-06-2005 20:18:47
Reporte Maestro detalle FastReport IVAND Impresión 1 23-03-2005 13:52:31
Reporte Maestro/Detalle/Detalle de 4 Tablas jovehe Impresión 2 23-03-2005 01:25:02
reporte maestro/detalle/subdetalle dphmariano Impresión 1 24-03-2004 07:21:24


La franja horaria es GMT +2. Ahora son las 17:48:51.


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