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