Relatorio quickreport colunas
Bom Dia!!!
quero montar um relatorio onde o tenho 4 empresa e diversos produtos para esses empresas, no relatorio quero que saia assim
modelo estoque loja 1 estoque loja 2 estoque loja 3 estoque loja 4
uso este procedimento no firebird
CREATE PROCEDURE REL_ADM_COMPARATIVO_ESTOQUE (
I_TIPO VARCHAR(15))
RETURNS (
R_EMPRESA VARCHAR(45),
R_DESC_GRUPO VARCHAR(45),
R_DESC_MODELO VARCHAR(45),
R_SEQUENCIA INTEGER,
R_CLASSIFICACAO VARCHAR(10),
R_CATEGORIA VARCHAR(10),
R_QUANT INTEGER)
AS
begin
IF (:I_TIPO = ´APARELHOS´) THEN
BEGIN
FOR
SELECT
EMP.emp_razao_social,
gru.gru_descricao,
MOD.mod_descricao,
MOD.mod_sequencia,
MOD.mod_classificacao,
MOD.mod_categoria,
SUM(PROD.pro_estoque)
FROM
PRODUTO PROD
LEFT JOIN
EMPRESA EMP ON (EMP.emp_codigo = PROD.pro_emp_ativa)
INNER JOIN
MODELO MOD ON (MOD.mod_codigo = PROD.pro_cod_modelo
AND MOD.mod_grupo = 1)
inner join
grupo gru on (gru.gru_codigo = mod.mod_grupo)
WHERE
PROD.pro_estoque > 0
GROUP BY EMP.emp_razao_social, gru.gru_descricao, MOD.mod_descricao, MOD.mod_sequencia,
MOD.mod_classificacao, MOD.mod_categoria
ORDER BY MOD.mod_sequencia, MOD.mod_classificacao, MOD.mod_categoria
INTO
:r_empresa,
:r_desc_grupo,
:r_desc_modelo,
:r_sequencia,
:r_classificacao,
:r_categoria,
:r_quant
do
SUSPEND;
END
end
Existe a possibilidade de montar o relatorio dessa forma???????
Obrigado!
quero montar um relatorio onde o tenho 4 empresa e diversos produtos para esses empresas, no relatorio quero que saia assim
modelo estoque loja 1 estoque loja 2 estoque loja 3 estoque loja 4
uso este procedimento no firebird
CREATE PROCEDURE REL_ADM_COMPARATIVO_ESTOQUE (
I_TIPO VARCHAR(15))
RETURNS (
R_EMPRESA VARCHAR(45),
R_DESC_GRUPO VARCHAR(45),
R_DESC_MODELO VARCHAR(45),
R_SEQUENCIA INTEGER,
R_CLASSIFICACAO VARCHAR(10),
R_CATEGORIA VARCHAR(10),
R_QUANT INTEGER)
AS
begin
IF (:I_TIPO = ´APARELHOS´) THEN
BEGIN
FOR
SELECT
EMP.emp_razao_social,
gru.gru_descricao,
MOD.mod_descricao,
MOD.mod_sequencia,
MOD.mod_classificacao,
MOD.mod_categoria,
SUM(PROD.pro_estoque)
FROM
PRODUTO PROD
LEFT JOIN
EMPRESA EMP ON (EMP.emp_codigo = PROD.pro_emp_ativa)
INNER JOIN
MODELO MOD ON (MOD.mod_codigo = PROD.pro_cod_modelo
AND MOD.mod_grupo = 1)
inner join
grupo gru on (gru.gru_codigo = mod.mod_grupo)
WHERE
PROD.pro_estoque > 0
GROUP BY EMP.emp_razao_social, gru.gru_descricao, MOD.mod_descricao, MOD.mod_sequencia,
MOD.mod_classificacao, MOD.mod_categoria
ORDER BY MOD.mod_sequencia, MOD.mod_classificacao, MOD.mod_categoria
INTO
:r_empresa,
:r_desc_grupo,
:r_desc_modelo,
:r_sequencia,
:r_classificacao,
:r_categoria,
:r_quant
do
SUSPEND;
END
end
Existe a possibilidade de montar o relatorio dessa forma???????
Obrigado!
Uiliangurjon
Curtidas 0
Respostas
Jujan
23/06/2006
Ue também já tive que resolver um problema deste tipo a solução que eu achei melhor foi criar um dataset local com os campo na ordem que eu prescisava e exibir o relatório por ele.
A tabela me dava os dados em linha exemplo:
Status
DE
FA
RT
e eu prescisava em colunas assim:
DE FA RT
o que fiz montei um data set local e mandei escrever nele.
OBS:Claro que eu fiz isso eu já sabia a quantidade de colunas que ia ter mas vc pode também criar os campo em run time.
A tabela me dava os dados em linha exemplo:
Status
DE
FA
RT
e eu prescisava em colunas assim:
DE FA RT
o que fiz montei um data set local e mandei escrever nele.
OBS:Claro que eu fiz isso eu já sabia a quantidade de colunas que ia ter mas vc pode também criar os campo em run time.
GOSTEI 0
Micheus
23/06/2006
Se vc utilizar o QuickReport e considerando sua necessidade
Vou exemplificar com a utilização de compoentes TQuery e seria algo mais ou menos assim:
1) Vc teria que obter a lista de todos os produtos (código e descrição) que aparecerão neste relatório - uma única vez (isto vc consegue com um select parecido com o seu, apenas não considerando as lojas, e utilizando DISTINCT);
2) Utilizaria 4 TQuery´s, uma para a consulta de estoque de cada loja, incluindo na cláusula WHERE uma referência ao parâmetro código do produto (... where ... and Codigo = :Codigo ...);
3) Ligaria estas 4 query´s via datasource à query com a lista de produtos. Isto fará com que a cada registro posicionado na query de produtos, as outras quatro também sejam filtradas. Assim, se houver numa loja uma quantidade de estoque para a mesma, haverá um registro a ser impresso;
4) Seu relatório consistirá no mínimo de um componente TQuickRep e um TQRBand (com a propriedade BandType = rbDetail).
5) Na banda detalhe vc coloca componentes TQRDBEdit na na sequência correspondente ao que serão as colunas:6) Atribui a query de produtos a propriedade DataSet do TQuickRep;
7) Abre as querys antes de chamar o QuickRep.Preview e acho que é isto.
O resultado deve ser parecido com isto:
Talvez tenha faltado algum detalhe, mas acho que esta dica pode lhe ajudar (se entendi direito o que vc queria)
modelo estoque loja 1 estoque loja 2 estoque loja 3 estoque loja 4
Vou exemplificar com a utilização de compoentes TQuery e seria algo mais ou menos assim:
1) Vc teria que obter a lista de todos os produtos (código e descrição) que aparecerão neste relatório - uma única vez (isto vc consegue com um select parecido com o seu, apenas não considerando as lojas, e utilizando DISTINCT);
2) Utilizaria 4 TQuery´s, uma para a consulta de estoque de cada loja, incluindo na cláusula WHERE uma referência ao parâmetro código do produto (... where ... and Codigo = :Codigo ...);
3) Ligaria estas 4 query´s via datasource à query com a lista de produtos. Isto fará com que a cada registro posicionado na query de produtos, as outras quatro também sejam filtradas. Assim, se houver numa loja uma quantidade de estoque para a mesma, haverá um registro a ser impresso;
4) Seu relatório consistirá no mínimo de um componente TQuickRep e um TQRBand (com a propriedade BandType = rbDetail).
5) Na banda detalhe vc coloca componentes TQRDBEdit na na sequência correspondente ao que serão as colunas:
Produto | Estoque1 | Estoque2 | Estoque3 | Estoque4
7) Abre as querys antes de chamar o QuickRep.Preview e acho que é isto.
O resultado deve ser parecido com isto:
Produto | Estoque1 | Estoque2 | Estoque3 | Estoque4 Produto1 | 10 | | 20 | 05 Produto3 | 09 | 15 | | 17 Produto7 | 88 | 31 | 07 | 25 Produto8 | 32 | | 20 | 11
Talvez tenha faltado algum detalhe, mas acho que esta dica pode lhe ajudar (se entendi direito o que vc queria)
GOSTEI 0
Uiliangurjon
23/06/2006
Obrigado pelas dicas, e quero deixar bem claro aki q meu problema foi solucionado graças a suas dicas, e mostar a forma como resolvi o meu problema
criando esta storedprocedure no firebird
CREATE PROCEDURE REL_ADM_COMPARATIVO_ESTOQUE (
I_TIPO VARCHAR(15))
RETURNS (
R_DESC_GRUPO VARCHAR(45),
R_DESC_MODELO VARCHAR(45),
R_SEQUENCIA INTEGER,
R_CLASSIFICACAO VARCHAR(10),
R_CATEGORIA VARCHAR(10),
R_QTD_MON INTEGER,
R_QTD_SEV INTEGER,
R_QTD_BEB INTEGER,
R_QTD_COL INTEGER)
AS
declare variable V_COD_MODELO VARCHAR(13);
begin
/* teste */
IF (:I_TIPO = ´APARELHOS´) THEN
BEGIN
FOR
SELECT
MOD.mod_codigo,
gru.gru_descricao,
MOD.mod_descricao,
MOD.mod_sequencia,
MOD.mod_classificacao,
MOD.mod_categoria
FROM
MODELO MOD
LEFT join
grupo gru on (gru.gru_codigo = mod.mod_grupo)
WHERE MOD.mod_grupo = 1
ORDER BY MOD.mod_sequencia, MOD.mod_classificacao, MOD.mod_categoria
INTO
:v_cod_modelo,
:r_desc_grupo,
:r_desc_modelo,
:r_sequencia,
:r_classificacao,
:r_categoria
do
BEGIN
/* SELECIONANDO loja1 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 1 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_mon;
IF (:r_qtd_mon IS NULL) THEN
r_qtd_mon = 0;
/* SELECIONANDO loja2*/
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 2 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_sev;
IF (:r_qtd_sev IS NULL) THEN
r_qtd_sev = 0;
/* SELECIONANDO loja3 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 3 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_beb;
IF (:r_qtd_beb IS NULL) THEN
r_qtd_beb = 0;
/* SELECIONANDO loja 4 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 4 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_col;
IF (:r_qtd_col IS NULL) THEN
r_qtd_col = 0;
suspend;
END
END
end
criando esta storedprocedure no firebird
CREATE PROCEDURE REL_ADM_COMPARATIVO_ESTOQUE (
I_TIPO VARCHAR(15))
RETURNS (
R_DESC_GRUPO VARCHAR(45),
R_DESC_MODELO VARCHAR(45),
R_SEQUENCIA INTEGER,
R_CLASSIFICACAO VARCHAR(10),
R_CATEGORIA VARCHAR(10),
R_QTD_MON INTEGER,
R_QTD_SEV INTEGER,
R_QTD_BEB INTEGER,
R_QTD_COL INTEGER)
AS
declare variable V_COD_MODELO VARCHAR(13);
begin
/* teste */
IF (:I_TIPO = ´APARELHOS´) THEN
BEGIN
FOR
SELECT
MOD.mod_codigo,
gru.gru_descricao,
MOD.mod_descricao,
MOD.mod_sequencia,
MOD.mod_classificacao,
MOD.mod_categoria
FROM
MODELO MOD
LEFT join
grupo gru on (gru.gru_codigo = mod.mod_grupo)
WHERE MOD.mod_grupo = 1
ORDER BY MOD.mod_sequencia, MOD.mod_classificacao, MOD.mod_categoria
INTO
:v_cod_modelo,
:r_desc_grupo,
:r_desc_modelo,
:r_sequencia,
:r_classificacao,
:r_categoria
do
BEGIN
/* SELECIONANDO loja1 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 1 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_mon;
IF (:r_qtd_mon IS NULL) THEN
r_qtd_mon = 0;
/* SELECIONANDO loja2*/
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 2 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_sev;
IF (:r_qtd_sev IS NULL) THEN
r_qtd_sev = 0;
/* SELECIONANDO loja3 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 3 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_beb;
IF (:r_qtd_beb IS NULL) THEN
r_qtd_beb = 0;
/* SELECIONANDO loja 4 */
SELECT
SUM(PROD.pro_estoque)
FROM PRODUTO PROD
WHERE PROD.pro_emp_ativa = 4 AND
PROD.pro_cod_modelo = :v_cod_modelo
INTO :r_qtd_col;
IF (:r_qtd_col IS NULL) THEN
r_qtd_col = 0;
suspend;
END
END
end
GOSTEI 0
Cpd_arim
23/06/2006
estou fazendo um relatorio e preciso de um select para somar alguns campos, quero exibir no relatorio a nota, data, cfop, cst o total da nota e o valor do desconto, fiz como esta abaixo, funciona mas não é o que quero pois assim ele agrupa por nota, data, cfop e cst, quero agrupar apenas pela nota como faço?
select nota, data, cfop, cst, sum(vr1), sum(vr2) from tabela
group by nome1, nome2, nome3, nome4
select nota, data, cfop, cst, sum(vr1), sum(vr2) from tabela
group by nome1, nome2, nome3, nome4
GOSTEI 0
Uiliangurjon
23/06/2006
Cara, ja perguntei isso no forum, para agrupar vc deve usar todos os campos
GOSTEI 0
Micheus
23/06/2006
select nota, data, cfop, cst, sum(vr1), sum(vr2) from tabela
group by nome1, nome2, nome3, nome4
Neste seu exemplo, o group dever conter todos os campos que não fazem parte das funções de agrupamento:select nota, data, cfop, cst, sum(vr1), sum(vr2) from tabela group by nota, data, cfop, cst
GOSTEI 0