Supongo que das la posibilidad al usuario de crear almacenes, pero aún así, en el ancho de un folio, ¿cuantas columnas esperas poner
como máximo?
Para hacerlo vía SP, debes saber de antemano un máximo de columnas.
Cuando ese código lo metes en un SP, tienes que crear parámetros de salida al propio SP, y después ya en delphi pones en el SQL de un tquery:
Código SQL
[-]
select * from nombreStoreProcedure
ahora doble clic al Tquery y añades los campos persistentes..... aquí te aparecen los parámetros de salida del SP y ahora ya sí puedes hacer:
DatasetCAmpo1.Value
para enlazarlo al informe o a donde quieras.
Aquí te pongo un ejemplo real, que saca los totales por semanas de todos los trabajadores entre dos fechas determinadas, lo que devuelve es:
Código:
alias semana1 semana2 totaljornales pagasextras pagar atrasados
manolo 300€ 200€ 500 € 0 € 500€ 0€
jose 300€ 200€ 500 € 150 € 650€ 0€
Código SQL
[-]
CREATE PROCEDURE SPJORNALESAPAGAR (
DESDE DATE,
HASTA DATE)
RETURNS (
ALIAS VARCHAR(25),
CATEGORIA VARCHAR(25),
SEMANA1 NUMERIC(10,2),
SEMANA2 NUMERIC(10,2),
TOTALJORNALES NUMERIC(10,2),
ANTICIPOS NUMERIC(10,2),
PAGASEXTRAS NUMERIC(10,2),
PAGAR NUMERIC(10,2),
ATRASADOS SMALLINT)
AS
DECLARE VARIABLE JORNALESATRASADOS NUMERIC(10,2);
DECLARE VARIABLE ANTICIPOSATRASADOS NUMERIC(10,2);
DECLARE VARIABLE PAGASEXTRASATRASADAS NUMERIC(10,2);
begin
ATRASADOS = 0;
for select alias, categoria, sum(salario) from vwjornalobra
where idtrabajador = :idtrabajador
and fecha between :desde and :HASTA
and pagado = 'No'
group by alias, categoria
into :alias, :categoria, :TOTALjornales do
begin
totaljornales = coalesce(totaljornales, 0.0);
select COALESCE(sum(salario),0.0) from vwjornalobra
where idtrabajador = :idtrabajador
and (fecha between encodeDate(1,1, extractyear(:desde)) and :Hasta)
and pagado = 'No'
into :jornalesatrasados;
jornalesatrasados = coalesce(jornalesatrasados,0.0);
if (totaljornales <> jornalesatrasados) then
ATRASADOS = 1;
select coalesce(sum(salario),0.0) from vwjornalobra
where idtrabajador = :idtrabajador
and fecha between :desde and :DESDE + 6
and pagado = 'No'
into :SEMANA1;
select coalesce(sum(salario),0.0) from vwjornalobra
where idtrabajador = :idtrabajador
and fecha between :desde+7 and :HASTA
AND pagado = 'No'
into :SEMANA2;
select coalesce(sum(Importe),0.0) from Anticipo
where ANTICIPO.Idtrabajador = :IDTRABAJADOR
and anticipo.fecha between :desde and :HASTA
and liquidado = 'No'
into :ANTICIPOS;
anticipos = coalesce(anticipos, 0.0);
select coalesce(sum(Importe),0.0) from Anticipo
where ANTICIPO.Idtrabajador = :IDTRABAJADOR
and (fecha between encodeDate(1,1, extractyear(:desde)) and :Hasta)
and liquidado = 'No'
into :anticiposatrasados;
anticiposatrasados = coalesce(anticiposatrasados,0.0);
if (ANTICIPOS <> anticiposatrasados) then
ATRASADOS = ATRASADOS + 2;
select coalesce(sum(Importe),0.0) from PAGAEXTRA
where Idtrabajador = :idtrabajador
and fecha between :desde and :HASTA
and liquidado = 'No'
into :PAGASEXTRAS;
select coalesce(sum(Importe),0.0) from PAGAEXTRA
where Idtrabajador = :idtrabajador
and (fecha between encodeDate(1,1, extractyear(:desde)) and :Hasta)
and liquidado = 'No'
into :pagasextrasatrasadas;
if (pagasextras <> pagasextrasatrasadas) then
ATRASADOS = ATRASADOS + 4;
PAGAR = :jornalesatrasados + :pagasextrasatrasadas - :anticiposatrasados;
suspend;
end;
end
Como ves, lo que hago es buscar en cada tabla y asignar el valor al parámetro de salida del SP