Relatorio em FastReport com várias tabelas
Tenho três tabelas:
//TABELA MASTER, ONDE FICA OS DADOS GERAL DO PEDIDO
CREATE TABLE MOVFECHAPEDIDO (
CODIGO_FECHAPEDIDO INTEGER NOT NULL CHECK (VALUE > 0) ,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
DESCRICAO_PEDIDOFABRICACAO VARCHAR(70) COLLATE PT_BR,
DATA_FATURAMENTO DATE,
DATA_FECHAMENTO DATE,
CODIGO_CLIENTE INTEGER NOT NULL,
NOME_CLIENTE VARCHAR(60) COLLATE PT_BR
);
//TABELA ONDE GUARDO AS MATERIAS-PRIMAS UTILIZADAS NO PEDIDO
CREATE TABLE MOVFECHAPEDIDOMATERIAIS (
CODIGO_FECHAPEDIDOMATERIAL INTEGER NOT NULL CHECK (VALUE > 0) ,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
CODIGO_SERVICO INTEGER NOT NULL,
CODIGO_MATERIAL INTEGER NOT NULL,
QUANTIDADE DM_QUANTIDADE /* DM_QUANTIDADE = NUMERIC(10,3) */,
VALOR DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */,
TOTAL DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */
);
//TABELA ONDE GUARDO OS SERVICOS EFETUADOS NO PEDIDO
CREATE TABLE MOVFECHAPEDIDOSERVICOS (
CODIGO_FECHAPEDIDOSERVICO INTEGER NOT NULL,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
CODIGO_SERVICO INTEGER NOT NULL,
CODIGO_MAQUINA INTEGER,
CODIGO_FUNCIONARIO INTEGER,
DATA_INICIO DATE,
HORA_INICIO TIME,
DATA_FIM DATE,
HORA_FIM TIME,
TOTAL_HORAS TIME,
QUANTIDADE DM_QUANTIDADE /* DM_QUANTIDADE = NUMERIC(10,3) */,
VALOR DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */,
TOTAL DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */
);
O campo CODIGO_PEDIDOFABRICACAO é o campo em comum nas tabelas, ou seja, o que fazer o INNER JOIN.
O que eu preciso e basicamente criar um relatório com esse final de dados.
CABECALHO=PEDIDO - MATERIAS - EXTRUSAO - IMPRESSAO
DETALHE =TOTAL - TOTAL - TOTAL - TOTAL
EM SQL SERIA:
SELECT DISTINCT
PED.CODIGO_PEDIDOFABRICACAO,
PED.DATA_FECHAMENTO,
PED.PESO_ENTREGUE,
PED.DESCRICAO_PRODUTO,
PED.VALOR_TOTAL_VENDA,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=1 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_MATERIAL,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=1 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_EXTRUSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=3 AND
FROM
MOVFECHAPEDIDO PED
WHERE
PED.DATA_FECHAMENTO>='01.04.2010'
AND PED.DATA_FECHAMENTO<='10.04.2010'
ORDER BY
PED.CODIGO_PEDIDOFABRICACAO
Exemplo:
VALOR_MATERIAL=(TOTAL DE TODOS OS SERVICOS COM CODIGO=1)
Só que não estou conseguindo fazer isso com variaveis dentro do FastReport.
Alguem que entenda bem de FastReport, por favor me ajude.
Pode ser de qualquer jeito...MSN ou até mesmo Remoto.
Aguardo
Rodrigo de Oliveira
//TABELA MASTER, ONDE FICA OS DADOS GERAL DO PEDIDO
CREATE TABLE MOVFECHAPEDIDO (
CODIGO_FECHAPEDIDO INTEGER NOT NULL CHECK (VALUE > 0) ,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
DESCRICAO_PEDIDOFABRICACAO VARCHAR(70) COLLATE PT_BR,
DATA_FATURAMENTO DATE,
DATA_FECHAMENTO DATE,
CODIGO_CLIENTE INTEGER NOT NULL,
NOME_CLIENTE VARCHAR(60) COLLATE PT_BR
);
//TABELA ONDE GUARDO AS MATERIAS-PRIMAS UTILIZADAS NO PEDIDO
CREATE TABLE MOVFECHAPEDIDOMATERIAIS (
CODIGO_FECHAPEDIDOMATERIAL INTEGER NOT NULL CHECK (VALUE > 0) ,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
CODIGO_SERVICO INTEGER NOT NULL,
CODIGO_MATERIAL INTEGER NOT NULL,
QUANTIDADE DM_QUANTIDADE /* DM_QUANTIDADE = NUMERIC(10,3) */,
VALOR DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */,
TOTAL DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */
);
//TABELA ONDE GUARDO OS SERVICOS EFETUADOS NO PEDIDO
CREATE TABLE MOVFECHAPEDIDOSERVICOS (
CODIGO_FECHAPEDIDOSERVICO INTEGER NOT NULL,
CODIGO_PEDIDOFABRICACAO INTEGER NOT NULL,
CODIGO_SERVICO INTEGER NOT NULL,
CODIGO_MAQUINA INTEGER,
CODIGO_FUNCIONARIO INTEGER,
DATA_INICIO DATE,
HORA_INICIO TIME,
DATA_FIM DATE,
HORA_FIM TIME,
TOTAL_HORAS TIME,
QUANTIDADE DM_QUANTIDADE /* DM_QUANTIDADE = NUMERIC(10,3) */,
VALOR DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */,
TOTAL DM_MOEDA /* DM_MOEDA = NUMERIC(10,2) */
);
O campo CODIGO_PEDIDOFABRICACAO é o campo em comum nas tabelas, ou seja, o que fazer o INNER JOIN.
O que eu preciso e basicamente criar um relatório com esse final de dados.
CABECALHO=PEDIDO - MATERIAS - EXTRUSAO - IMPRESSAO
DETALHE =TOTAL - TOTAL - TOTAL - TOTAL
EM SQL SERIA:
SELECT DISTINCT
PED.CODIGO_PEDIDOFABRICACAO,
PED.DATA_FECHAMENTO,
PED.PESO_ENTREGUE,
PED.DESCRICAO_PRODUTO,
PED.VALOR_TOTAL_VENDA,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=1 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_MATERIAL,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=1 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_EXTRUSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=3 AND
FROM
MOVFECHAPEDIDO PED
WHERE
PED.DATA_FECHAMENTO>='01.04.2010'
AND PED.DATA_FECHAMENTO<='10.04.2010'
ORDER BY
PED.CODIGO_PEDIDOFABRICACAO
Exemplo:
VALOR_MATERIAL=(TOTAL DE TODOS OS SERVICOS COM CODIGO=1)
Só que não estou conseguindo fazer isso com variaveis dentro do FastReport.
Alguem que entenda bem de FastReport, por favor me ajude.
Pode ser de qualquer jeito...MSN ou até mesmo Remoto.
Aguardo
Rodrigo de Oliveira
Huelbert Oliveira
Curtidas 0
Respostas
Emerson Nascimento
05/05/2010
não entendi sua dúvida nem o que você postou como exemplo....
"Exemplo:
VALOR_MATERIAL=(TOTAL DE TODOS OS SERVICOS COM CODIGO=1)"
o que quer dizer isso?
"Exemplo:
VALOR_MATERIAL=(TOTAL DE TODOS OS SERVICOS COM CODIGO=1)"
o que quer dizer isso?
GOSTEI 0
Huelbert Oliveira
05/05/2010
exemplo
tabela de materias-primas eu tenho:
Material: Polietileno
Serviço onde é utilizado: 1 - Extrusão
Total: 100,00
Material: Polipropileno
Serviço onde é utilizado: 1 - Extrusão
Total: 150,00
Material: Tinta
Serviço onde é utilizado: 2 - Impressão
Total: 200,00
============================
Tenho que somar somente os Total(s) onde Serviço é igual a 1- Extrusão.
Queria saber como fazer isso dentro do FastReport, ou a melhor maneira de fazer o calculo, porque são vários campos assim.
Aguardo
Qualquer coisa me add no MSN
huelbert@hotmail.com
tabela de materias-primas eu tenho:
Material: Polietileno
Serviço onde é utilizado: 1 - Extrusão
Total: 100,00
Material: Polipropileno
Serviço onde é utilizado: 1 - Extrusão
Total: 150,00
Material: Tinta
Serviço onde é utilizado: 2 - Impressão
Total: 200,00
============================
Tenho que somar somente os Total(s) onde Serviço é igual a 1- Extrusão.
Queria saber como fazer isso dentro do FastReport, ou a melhor maneira de fazer o calculo, porque são vários campos assim.
Aguardo
Qualquer coisa me add no MSN
huelbert@hotmail.com
GOSTEI 0
Marlon Nardi
05/05/2010
Boa Noite Huelbert,
Comecei a utilizar o Fast Report em minhas aplicações ja faz uns 20 dias, uma exclente ferramenta para relatorios, a melhor que eu ja utilizei ate hoje...
estava lendo seu topico, se eu entendi bem se esse seu SQL esta ligando em uma Unica SQL Query por exemplo voce pode muito bem ligar a mesma no componente do Fast 'FrxDbDataset' e utilizar o componente de soma.
Ou voce possui dois SQL independentes e quer montar no mesmo relatorio?
Comecei a utilizar o Fast Report em minhas aplicações ja faz uns 20 dias, uma exclente ferramenta para relatorios, a melhor que eu ja utilizei ate hoje...
estava lendo seu topico, se eu entendi bem se esse seu SQL esta ligando em uma Unica SQL Query por exemplo voce pode muito bem ligar a mesma no componente do Fast 'FrxDbDataset' e utilizar o componente de soma.
Ou voce possui dois SQL independentes e quer montar no mesmo relatorio?
GOSTEI 0
Wilson Junior
05/05/2010
Olha, eu utilizo o Report Builder, e para isto eu utilizo os grupos do relatório para acumular os valores. Não se isto vai lhe ajudar em algo, pois nunca utilizei o Fast Report, mas como a maioria das ferramentas tem um mesmo ESCOPO, resolvi postar.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Huelbert Oliveira
05/05/2010
Possuo 3 tabelas, mas pelo meu entender e mais facil e agil juntar elas numa unica instrução de acesso ao bd, e no FastReport colocar um acumulador que some o valor quando a opção for verdadeira.Tipo:
if CODIGO_SERVICO = 1 then
VARIAVEL = VARIALVEL + TOTAL(Total da Materia-prima); ou VARIAVEL = SUM(TOTAL);
Eu não estou conseguindo e fazer isso.
if CODIGO_SERVICO = 1 then
VARIAVEL = VARIALVEL + TOTAL(Total da Materia-prima); ou VARIAVEL = SUM(TOTAL);
Eu não estou conseguindo e fazer isso.
GOSTEI 0
Fábio Cruz
05/05/2010
Amigo, crie uma view para trabalhar com várias tabelas e no FastReport chama apenas essa View.
GOSTEI 0
Huelbert Oliveira
05/05/2010
Cara criei a view como me disse.
CREATE VIEW VIEW_CALCULA_CUSTO_FABRICACAO(
CODIGO_PEDIDOFABRICACAO,
DATA_FECHAMENTO,
DESCRICAO_PRODUTO,
PESO_PROGRAMADO,
PESO_ENTREGUE,
PESO_PERDA,
PERCENTUAL_PERDA,
VALOR_TOTAL_VENDA,
TOTAL_MATERIA_PRIMA,
TOTAL_EXTRUSAO,
FIXO_IMPRESSAO,
SERVICO_IMPRESSAO,
TINTA_IMPRESSAO,
SOLVENTE_IMPRESSAO,
SERVICO_LAMINACAO,
MATERIAL_LAMINACAO,
TOTAL_CORTE,
TOTAL_REBOBINADEIRA,
TOTAL_POUCHEIRA,
VALOR_ADMINISTRACAO,
VALOR_COMISSAO,
VALOR_IMPOSTO,
TOTAL_LIQUIDO)
AS
SELECT
PED.CODIGO_PEDIDOFABRICACAO,
PED.DATA_FECHAMENTO,
PED.DESCRICAO_PRODUTO,
PED.PESO_PROGRAMADO,
PED.PESO_ENTREGUE,
PED.PESO_PERDA,
PED.PERCENTUAL_PERDA,
PED.VALOR_TOTAL_VENDA,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=1 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_MATERIAL,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=1 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_EXTRUSAO,
(SELECT SUM(SER.VALOR_FIXO) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS FIXO_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SERVICO_IMPRESSAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_MATERIAL=10 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS TINTA_IMPRESSAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_MATERIAL=11 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SOLVENTE_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=3 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SERVICO_LAMINACAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=3 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS MATERIAL_LAMINACAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=4 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_CORTE,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=5 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_REBOBINADEIRA,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=6 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_POUCHEIRA,
PED.VALOR_ADMINISTRATIVO,
PED.VALOR_COMISSAO,
PED.VALOR_IMPOSTO,
PED.VALOR_TOTAL_LIQUIDO
FROM MOVFECHAPEDIDO PED
ORDER BY
PED.CODIGO_PEDIDOFABRICACAO
;
Só que a performace dela e horrível...demora demais.
Não tem como fazer um INNER JOIN nas 3 tabelas e depois fazer tipo um SUM(IF())
Dei uma olhada na net e vi uma função assim...mas para postgre e mysql, firebird nada e nem consegui fazer.
Se alguem souber, agradeço.
Aguardo
CREATE VIEW VIEW_CALCULA_CUSTO_FABRICACAO(
CODIGO_PEDIDOFABRICACAO,
DATA_FECHAMENTO,
DESCRICAO_PRODUTO,
PESO_PROGRAMADO,
PESO_ENTREGUE,
PESO_PERDA,
PERCENTUAL_PERDA,
VALOR_TOTAL_VENDA,
TOTAL_MATERIA_PRIMA,
TOTAL_EXTRUSAO,
FIXO_IMPRESSAO,
SERVICO_IMPRESSAO,
TINTA_IMPRESSAO,
SOLVENTE_IMPRESSAO,
SERVICO_LAMINACAO,
MATERIAL_LAMINACAO,
TOTAL_CORTE,
TOTAL_REBOBINADEIRA,
TOTAL_POUCHEIRA,
VALOR_ADMINISTRACAO,
VALOR_COMISSAO,
VALOR_IMPOSTO,
TOTAL_LIQUIDO)
AS
SELECT
PED.CODIGO_PEDIDOFABRICACAO,
PED.DATA_FECHAMENTO,
PED.DESCRICAO_PRODUTO,
PED.PESO_PROGRAMADO,
PED.PESO_ENTREGUE,
PED.PESO_PERDA,
PED.PERCENTUAL_PERDA,
PED.VALOR_TOTAL_VENDA,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=1 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_MATERIAL,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=1 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_EXTRUSAO,
(SELECT SUM(SER.VALOR_FIXO) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS FIXO_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=2 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SERVICO_IMPRESSAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_MATERIAL=10 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS TINTA_IMPRESSAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_MATERIAL=11 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SOLVENTE_IMPRESSAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=3 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS SERVICO_LAMINACAO,
(SELECT SUM(MAT.TOTAL) FROM MOVFECHAPEDIDOMATERIAIS MAT WHERE MAT.CODIGO_SERVICO=3 AND MAT.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS MATERIAL_LAMINACAO,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=4 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_CORTE,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=5 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_REBOBINADEIRA,
(SELECT SUM(SER.TOTAL) FROM MOVFECHAPEDIDOSERVICOS SER WHERE SER.CODIGO_SERVICO=6 AND SER.CODIGO_PEDIDOFABRICACAO=PED.CODIGO_PEDIDOFABRICACAO) AS VALOR_POUCHEIRA,
PED.VALOR_ADMINISTRATIVO,
PED.VALOR_COMISSAO,
PED.VALOR_IMPOSTO,
PED.VALOR_TOTAL_LIQUIDO
FROM MOVFECHAPEDIDO PED
ORDER BY
PED.CODIGO_PEDIDOFABRICACAO
;
Só que a performace dela e horrível...demora demais.
Não tem como fazer um INNER JOIN nas 3 tabelas e depois fazer tipo um SUM(IF())
Dei uma olhada na net e vi uma função assim...mas para postgre e mysql, firebird nada e nem consegui fazer.
Se alguem souber, agradeço.
Aguardo
GOSTEI 0