Customizar relatório já existente


#1

Boa noite…

preciso customizar o Relatório de Reabastecimento, e vou fazer pelo IReport.
Mas como eu faço para executar o processo desta classe e chamar o .jasper ao invés do padrão do Adempiere???
No ambiente do Adempiere (como System em Relatorio&Processo->Replenish Report) eu coloco no campo: relatorio.jasper e o campo de visualização do relatório: deixo em branco.
Ele faz tudo certo, e mostra o relatório que criei (do IReport), mas não sei como passar o parâmetro, que no caso é o ad_pinstance_id…
Ou tenho que criar uma nova classe baseada no ReportStarter e tentar passar por aí???
Obrigado pela ajuda

Ricardo


#2

Veja adempiere.com/index.php/ADem … tion_HowTo

Penso que seja o Recod_id "$P{RECORD_ID} "…veja se da certo, caso não de certo me fale que mando um jasper de exemplo.


#3

obrigado Edislon, acho mesmo que é por aí, mas 2 coisas…
1-nao encontro o ResportStarter2.java… em qual brance está???
2-mesmo assim fica a dúvida… pq.no Relatório de Reabastecimento ele utiliza a classe org.compiere.process.ReplenishReport. E nesta classe ele faz uma série de ações onde finaliza populando a tabela T_Replenish, e é esta a tabela do select utilizado pelo relatório. Mas nesta classe ele executa o processo e depois gera o relatório. O que ainda não sei é como vou fazer para ele executar o processo e depois gerar o relatório .jasper. Pq. eu ainda não tenho o Recod_id "$P{RECORD_ID}, somente vou te-lo depois de processar (onde inclusive preciso gerar o Pededido de Compra baseado neste relatório - mas isso ele faz). Aí sim, eu teria esta variável e poderia chamar a classe ResportStarter2…
obrigado
Ricardo


#4

veja a Classe ReportStarter em org.compiere.repor.ReportStarter da tag 342.

veja a imagem no ireport na figura, que estou referenciando a categoria do produto cm $P{RECORD_ID}, então so vai imprimir a categoria que esta na tela.

Quando você for informar para o relatório faça assim no campo jasper report = attachment:NOMEDOARQUIVO.jrxml

seria isso que vc deseja?
ainda tem alguma duvida?

[attachment=0]irepot.png[/attachment]


#5

Ola.
Bom para executar um novo .jasper são necessários alguns procedimentos. Uma dica, crie um novo “Relatorio de Reabastecimento” e apenas desative o anterior.
Então: em Relatorio/Processo.
Você ira preencher os campos de cadastro… (vermelhos são obrigatórios).- não esqueca de marcar o checkbox “relatório”.
Anexe o seu arquivo .jasper (que você criou pelo iReport) no processo (basta clicar no clipse que há logo acima).
No ultimo campo “Jasper Report” coloque o seguinte: attachment:arquivo.jasper
Coloque o .jasper que evita alguns erros que aparecem para compilar o arquivo .jrmxl
Caso voce utilize parametros, na aba de parametros o valor do campo “nome da coluna BD” deve coincidir com nome do parametro em seu relatório.

Att.

Fernando


#6

Bom é quase isto, mas o problema é somente o parametro. Fiz como o fernando sugeriu, e funcionou: ele chama o .jasper, mas aparece a mensagem: Não Contém Páginas. Isto por causa do parametro. Veja, eu já tenho 4 parametros, mas eles são para popular a tabela T_Replenish, e este processo funciona ok. Mas o parametro para o jasper é outro. E é justamente este que eu não sei como passar. Dentro da minha classe eu sei como pega-lo (getAD_PInstance_ID() - é só isso), mas como eu já tenho os outros parametros, me confundo… tenho que apaga-los e colocar somente o outro??? e como faço isto??? Ou seja, para o MEU processo, os parametros estao Ok, mas para o processo RportStarter é que não sei como passa-lo.
O meu select no jasper está assim:
select from adempiere.t_replenish where ad_pinstance_id=$P{ad_pinstance_id}
mas não tem como colocar este ad_pinstance_id na aba dos parametros. ou tem??? bom eu ja estou confuso e divagando, amanha volto a mexer com isto com a cabeça arejada…
obrigado pela ajuda…
Ricardo


#7

Olá Ricardo,

Basta incluir o parâmetro diretamente no iReport, com o mesmo nome que você colocou no Adempiere. Ex:

Adempiere: M_Product_ID
iReport: $P{M_Product_ID}

Att.


#8

No IReport está certo é o $P{ad_pinstance_id}
e no Adempiere é o campo: ad_pinstance_id
Mas isto não posso colocar como um parametro na: Aba de Parametros
No código fonte (minha classe), como fazer para criar parametro??
Obrigado


#9

Algumas perguntas, ainda nao entendi ao certo o que você está fazendo. Mas voce pode colocar o parametro AD_… sempre atento a diferenciacao de maiuscula e minuscula. Voce poderia colocar a imagem da janela Relatorio/Processo. Você esta executando uma classe(processo) e ao mesmo tempo querendo gerar o relatório, correto?!

Da pra chamar o relatorio via fonte, mas preciso conseguir entender o seu processo para tentar orientá-lomelhor maneira.

Att.

Fernando


#10

Desculpe a todos, eu acho que deveria ter começado justamente por esta parte, mas vamos lá.
O que estou querendo fazer é exatamete o Relatorio de Reabastecimento. Pelo Menu=>Administracao de Materiais=>Relatorio de Reabastecimento, que já existe e funciona como eu desejo. Ali tem 4 parametros: 1-Armazem / 2-Fornecedor / 3-Tipo de Documento / 4-Tipo de Documento.
Ou seja, para 1 armazém, escolho 1 fornecedor (e ligado a ele existem n produtos) e os Tipos de Documento quer dizer:
(de acordo com a regra escolhida lá no produto=>estoque min.e estoque máx…) se existir algum produto (que esteja ligado a este fornecedor) possuir um estoque menor do que o estoque mínimo, então aparece no relatório com a quantidade a comprar. E mais, se nos parametros existirem os Tipos de Documento (por exemplo Pedido de Compra), esse documento é gerado automaticamente.
Então existe a classe: org.compiere.process.ReplenishReport que faz exatamente isto. Ou seja, 1-executa um processo para validar/preencher a tabela T_Replenish 2-executa o processo de mostrar o relatório, que é baseado nesta tabela 3-cria automaticamente o documento desejado.
Como disse, ele faz, e faz correto. A única coisa que eu quero, é que ao invés de mostrar o relatório padrão do Adempiere, eu possa substituí-lo por um que vou criar pelo IReport. De resto está perfeito.
Aí que eu me perdi. Como passar o parametro do processo 1 => relatorio Jasper (ao invés de chamar o padrão).
Acredito que não seja tão difícil, já teste/debugei mas eu ainda estou me habituando ao código do Adempiere então fico me batendo… e incomodando…:slight_smile:
obrigado pela atenção…

Ricardo


#11

Bom, nunca precisei alterar algo do tipo. mas vamos entender o que o adempiere faz.
Primeiro ele executa o processo que esta explito la:

-org.compiere.process.ReplenishReport

Logo apos este processo ser executado com sucesso, o sistema
continua a execuçao e realiza outras validacoes (classe ProcessCtl.java)

Se voce analisar o método verá que se tiver algum caminho setado
no campo “Jasper Report” que via setar a variavel isJasper == true

e vai entrar num IF q tem quase no final do metodo

		if (isJasper)
		{
			m_pi.setReportingProcess(true);
			m_pi.setClassName(ProcessUtil.JASPER_STARTER_CLASS);
			startProcess();
			unlock();
			return;
		}

Entao tu vai colocar normalmente o caminho do jasper…
Agora os parametros, ele vai usar os do processo, no momento nao consigo visualizar outra forma a nao ser criar um parametro ad_p… com uma logica padrao (para obter o valor da variavel e passa-la pro iReport).

Uma segunda alternativa seria copiar a classe ReplenishReport
e chamar o arquivo do report manualmente… passando os devidos parametros e dxando a opcao relatorio desmarcada na config do Relatorio de Reabastecimento.

Att.

Fernando


#12

É isso mesmo. Analisei e debugei, e acho que o melhor que devo fazer é mesmo como vc. sugeriu: copiar a ReplenhishReport e tirar a opção de relatório, ou seja, ele vai apenas fazer o processo, e depois eu chamo apenas o relatório manualmente. Fica mais fácil e prático e do jeito que o usuario quer, porque tudo isto é porque o cara quer “perfumaria”, mas já que ele quer a gente faz. O probelam é que perdi muito tempo e esforço para isto, mas por outro lado aprendi mais importantes e coisas sobre o Adempiere. Obrigado a todos pela ajuda…
Ricardo


#13

Vou reabrir o tópico. Estou mais ou menos na mesma questão.
Tenho esta tela que criei conforme anexo. Nela, posso selecionar uma ou várias expedições. E quando eu clicar no botão ok, ela vai imprimir essas expedições.
Eu criei o relatório no jasper e adicionei no “relatórios e processos”. Só que como parâmetro, tenho que passar o DocumentNo da Nota Fiscal (LBR_NotaFiscal); mas não posso usar como parâmetro na aba parâmetros, pois podem ser várias, ou seja, teria que usar um array. No eclipse eu poderia usar algo como isso:

1. JRDataSource vetor = new JRBeanArrayDataSource(listaBoleto.toArray()); 2. Map < String, Object > parametros = new HashMap < String, Object > (); 3. 4. parametros.put("numGuia", numGuia); 5. parametros.put("pvEmissor", pvEmissor); 6. parametros.put("dataEmissao", dataEmissao); 7. parametros.put("dataValidade", dataValidade); 8. parametros.put("controle", controle); 9. parametros.put("nis", nis); 10. parametros.put("tpSegurado", tpSegurado); 11. parametros.put("nomeSegurado", nomeSegurado); 12. parametros.put("dataNascimento", dataNascimento); 13. parametros.put("nomeMae", nomeMae); 14. parametros.put("nuRequerimento", requerimento); 15. 16. JasperPrint jasperPrint = JasperFillManager.fillReport( seu jasper aqui, parametros, vetor );

mas e no Adempiere? e No iReport?
Ou tem outro jeito de fazer??
Desde já agradeço :smiley:

P.S. Conseguiram entender meu caso?


#14

no seu formulário vc faz um processo que salva o ID das notas fiscais em uma tabela temporária, e dai no seu jasper vc faz um select dos ids desta tabela…