[Resolvido] Lógica padrão de parâmetro em relatório


#1

Boa tarde.
Quando criamos um parâmetro em um relatório no AD, tem um campo chamado Lógica Padrão, que define um ‘valor’ padrão quando for gerar aquele relatório.
O exemplo mais comum é um campo de data, que na lógica padrão adiciona-se @#Date@, que irá trazer a data do sistema.
Gostaria de saber, se tem um modo diferente de definir essa lógica, por exemplo, num intervalo de data que ele coloque digamos, a data inicial 01/01/2010*(ano anterior) e data final 31/12/2011*(ano atual).
Teria como fazer algo assim na lógica padrão?

Desde já agradeço. :wink:

Cátia.


#2

Cátia,
Não existe (pelo menos não conheço) uma forma de tratar isso com variáveis na lógica padrão. Contudo, você pode usar uma tag SQL para trazer um retorno do Postgres. O exemplo abaixo te retornaria 01/01/2010 (Considerando o dia e o mês fixos e o ano como o ano da tata atual -1):

@SQL=SELECT '01/01/' || EXTRACT(year FROM current_date)-1

O current_date retorna a data atual do Postgres e pode ser substituído por um campo contendo uma data na sua tabela. Para pegar o mês ou o dia da, basta trocar o year no parâmetro do extract.

Sds,
Marcelo


#3

Mas eu coloco onde essa SQL? Na lógica padrão? Ou em qual campo?

Obrigada


#4

Sim, é na lógica padrão.
Da mesma forma que você usa variáveis de contexto com @#Variavel@, você pode usar esse @SQL para utilizar códigos SQL.

Sds,
Marcelo


#5

Mas eu coloquei e quando fui gerar o relatório o campo ficou em branco.
No lugar de || não teria que ser && ?
Porque o || é ou, ou seja, ele vai trazer o dia e o mês ou o ano? Não seria o dia e o mês fixo e o ano?
Só que com o && também não da certo!


#6

Eu havia esquecido de um detalhe importante (resposta num domingo depois de meia noite dá nisso… 8) ). O resultado do seu SQL tem que vir em uma coluna com o nome DefaultValue, então o SQL deveria ser:

@SQL=SELECT '01/01/' || EXTRACT(year FROM current_date)-1 as DefaultValue

O || não é problema, porque ele é do Select e não do java. No Select ele significa concatenação, ao invés do ‘ou’ do java.
Um último detalhe é que o resultado que ele está te retornando é do tipo texto. Se quiser usar em um campo data, também é necessário modificar o tipo do retorno:

@SQL=SELECT CAST('01/01/' || EXTRACT(year FROM current_date)-1 As Date)as DefaultValue

Como estou sem acesso ao ‘meu’ Adempiere, fiz um teste no http://www.testadempiere.com/webui com o relatório de Detalhes da Transação e copiei a tela do resultado. Utilizei exatamente os códigos que te passei acima: com o cast nos campos de data e sem o cast nos campos de texto.

Sds,
Marcelo


#7

Muito Obrigada, deu certo. :smiley:

Continuando a falar de parâmetros, eu tentei usar um dos parâmetros que eu passo do AD pro iReport como comparação no Inner Join da SQL, mas não da certo (Até porque o valor pode vir nulo). Teria algum modo de fazer isso? Porque o parâmetro é a Organização, ai se ela é selecionada, eu exibo ela no relatório, mas assim só traz o ID, não o nome. Alguma idéia de como posso trazer o nome da Organização selecionada como parâmetro?

Desde já agradeço.


#8

então coloca um LEFT JOIN AD_Org org ON (org.AD_Org_ID = $P{AD_Org_ID})

se for null, org.Name vai ser null, mas vai trazer todos os valores para o relatório, pois vc esta fazendo com left join


#9

Deu certo. Muitíssimo Obrigada.


#10

Bom dia.
Continuando no mesmo relatório, me pediram para tirar a organização e trazer duas vezes o Armazém, ou seja, para trazer de 2 armazens.
No relatório, coloquei o M_Warehouse_ID, com nome Armazem, e coloquei um outro, M_WarehouseAux. como Armazém 2.
Ai na SQL eu coloquei assim:

AND (CO.M_WAREHOUSE_ID = ($P{M_Warehouse_ID} OR $P{M_Warehouse_ID} IS NULL)) AND (CO.M_WAREHOUSE_ID = ($P{M_WarehouseAux} OR $P{M_WarehouseAux} IS NULL))
Não deu certo.
Se usar só um dos parâmetros até funciona, se deixar um em branco; senão, não funciona. Exibe mensagem “o documento não possui paginas”.
Tentei colocar os dois em um só, usando IN, mas também não deu certo.
Alguém tem alguma sugestão de como eu poderia fazer?

Desde já agradeço. 8)


#11

o problema é o seu segundo AND, acho que deveria ser OR … pq vc concorda que vc faz a comparação com o mesmo campo e passa dois valores diferentes… NUNCA o AND irá funcionar, pois sempre serão diferentes


#12

mas se eu colocar OR, ele não vai trazer só um dos dois parâmetros?
Porque se os dois forem escolhido, eu rpeciso trazer os dois, e não só um deles; :confused:


#13

Na verdade, acho que deu certo do jeito que fiz agora:

   AND (CO.M_WAREHOUSE_ID IN ($P{M_Warehouse_ID},$P{M_WarehouseAux}) OR ($P{M_Warehouse_ID},$P{M_WarehouseAux}) IS NULL)

Creio que não funcionou antes porque os parâmetros estava na ordem inversa no relatório; estava primeiro o Armazém 2 e depois o outro, sendo que no AD era o contrário.

Obrigada pela ajuda. :stuck_out_tongue: