Método "dataRefreshAll"


#1

Olá…

Eu gostaria de executar o método “dataRefreshAll” da classe “GridTab”, mas fora da classe “APanel”…

Alguém sabe como fazer?

Desde já obrigado…


#2

[quote=“emersonunk”:94baa]
Olá…

Eu gostaria de executar o método “dataRefreshAll” da classe “GridTab”, mas fora da classe “APanel”…

Alguém sabe como fazer?

Desde já obrigado…
[/quote:94baa]

Olá, emersonunk

Não entendi direito o que vc quer fazer?

Se a única coisa que vc quer é executar o método, é só instanciar um objeto do tipo GridTab e depois executar o método.


#3

Oi, Mário… Obrigado por responder.

Eu declarei um objeto dessa forma:

private GridTab m_gTab;

E depois executei assim:

m_gTab.dataRefreshAll();

Porém ocorre este erro em tempo de execução: java.lang.NullPointerException

A classe “APanel” possui a chamada para estes métodos, mas não estou sabendo como replicar na minha classe…


#4

então Emerson,

o problema é que vc não instanciou o objeto, apenas declarou ele, se vc olhar na própria APanel, vc irá ver assim:

GridTab gTab = m_mWorkbench.getMWindow(wb).getTab(tab);

para instanciar um objeto GridTab, vc deve fazer assim:

GridTab meugrid = new GridTab(GridTabVO vo);

obs, vc precisa de um GridTabVO para poder criar um GridTab, se vc estiver usando o eclipse, selecione o objeto e aperte F3 que ele irá para a classe.

Mas ainda não entendia pq vc quer fazer isso.

sds, Mario


#5

Mário, estou tentando fazer o seguinte…

Criei um botão dentro da Janela de Fatura pra importar os Pedidos de Vendas lá dentro, usando o mesmo processo de Gerar Faturas que tem no menu… isso deu certo, o botão está chamando o processo e faturando o pedido, só que daí eu gostaria que a janela executasse o “refresh” automaticamente, sem que o usuário precisasse executar através do botão refresh do menu… e se possivel, posicionasse na linha da fatura que foi gerada pelo processo (isso não sei se é possivel)… por isso eu gostaria de usar estes métodos do GridTab na classe que executa o processo, ao final da execução…


#6

[quote=“emersonunk”:9d959]
Mário, estou tentando fazer o seguinte…

Criei um botão dentro da Janela de Fatura pra importar os Pedidos de Vendas lá dentro, usando o mesmo processo de Gerar Faturas que tem no menu… isso deu certo, o botão está chamando o processo e faturando o pedido, só que daí eu gostaria que a janela executasse o “refresh” automaticamente, sem que o usuário precisasse executar através do botão refresh do menu… e se possivel, posicionasse na linha da fatura que foi gerada pelo processo (isso não sei se é possivel)… por isso eu gostaria de usar estes métodos do GridTab na classe que executa o processo, ao final da execução…
[/quote:9d959]

ok, entendi.

então a maneira mais complicada, é vc ir instanciando os objetos na mão, até conseguir o seu GridTab (acho no contexto vc consegue os IDs necessários)

a segunda maneira e bem mais simples, é vc criar uma callout para ser executada, quando algum dado seja alterado, no processo de geração da fatura alguma coisa vai sofrer uma alteração de estado. Um dos parâmetros que a callout passa é o GridTab, dai é bem simples, só colocar:

mTab.dataRefreshAll()


#7

Mário, prefiro a primeira maneira (infelizmente)…

Mas não estou conseguindo instanciar o objeto GridTab… vc poderia me passar um exemplo, se for possivel?

Meu conhecimento em java não é lá essas coisas…


#8

[quote=“emersonunk”:762a1]
Mário, prefiro a primeira maneira (infelizmente)…

Mas não estou conseguindo instanciar o objeto GridTab… vc poderia me passar um exemplo, se for possivel?

Meu conhecimento em java não é lá essas coisas…
[/quote:762a1]

então, Emerson

não sei se vc vai conseguir fazer assim, pois é mais complicado do que parece e não temos todos os dados, para criar o GridTab

a estrutura dos Objetos está assim:

  • GridTab precisa de um GridTabVO
  • GridTabVO precisa dos sequintes parâmetros (GridWindowVO wVO, int TabNo, ResultSet rs, boolean isRO, boolean onlyCurrentRows)
  • GridWindowVO precisa ainda de um contexto, número da janela e o ID da Janela

duas opções:

testar colocar uma callout no botão que chama o processo (nunca testei se executa antes ou depois do processo). Se for depois do processo, seus problemas acabaram só chamar o método.

criar um novo campo na tabela C_Invoice (Fatura) do tipo YES-NO para saber se a fatura foi gerada ou não e dai vc faz com que seu processo atualize este campo, e dai coloque uma callout neste campo.

sds, Mario


#9

Mário…

Eu criei um campo (Fatura) na tabela C_INVOICE como vc sugeriu, e criei uma callout pra ele… então modifiquei seu conteúdo tanto no processo como no método “beforesave” da MInvoice, porém não chamou a callout…

Será que esse método callout é chamado apenas quando o campo é alterado em modo de edição, e não através de processos?


#10

[quote=“emersonunk”:1affc]
Mário…

Eu criei um campo (Fatura) na tabela C_INVOICE como vc sugeriu, e criei uma callout pra ele… então modifiquei seu conteúdo tanto no processo como no método “beforesave” da MInvoice, porém não chamou a callout…

Será que esse método callout é chamado apenas quando o campo é alterado em modo de edição, e não através de processos?
[/quote:1affc]

teria que ter chamado sua Callout, falo isso, pq temos um exemplo no próprio Compiere, na C_Order, uma mesma Callout é usada para definir o Valor da Linha, nos campos Preço e Preço Unitário, e quando um valor alterado é chamada a Callout, e se vc olhar no código pode até observar que existe uma forma para tratar isso senão ficaria em um loop infinito, pois um iria chamar a outra.

bom, voltando ao foco do dataRefreshAll()

coloque um break point na sua Callout, veja se realmente está passando por ela:

basicamento o método de sua Callout deveria ser esse

[code:1affc]
public String dataRefresh (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value){
mTab.dataRefreshAll ();
return “”;
}[/code:1affc]

dai no campo da tabela vc colocaria assim: “exemplo de Pacote br.srv.compiere” - Arquivo CalloutInvoice

br.srv.compiere.CalloutInvoice.dataRefresh


#11

Olá, Mario

Eu fiz um teste com o campo C_BPartner_ID da Invoice… alterei o valor dele no método “beforesave” da classe MInvoice usando o método setC_BPartner_ID() e atribuindo um ID diferente do que havia informado no campo, apenas para teste.

Como vc sugeriu, eu coloquei um break point no método “bPartner” da CalloutInvoice, pra ver qual seria a reação.

Bem, quando estou editando o campo, o sistema passa pela Callout, porém quando passa pelo “beforesave”, o valor do campo é alterado mas não passa pela Callout.

Por isso acho que esse recurso só é ativado quando vc está editando o campo mesmo, daí a dificuldade em ativar o datarefreshall da forma que preciso…


#12

é realmente, a Callout só passa em tempo de execução.

vc tentou a Callout no botão, para ver se ela executa antes ou depois do processo?


#13

Mário

A Callout é executada quando o botão é acionado, antes de executar processo… vc sabe se é possivel executar algum método logo depois do término do processo, de forma automática, sem precisar criar outro botão pra fazer isso?

Estou tentando mexer no método APanel pra fazer isso, mas não estou conseguindo…


#14

[quote=“emersonunk”:57c4b]
Mário

A Callout é executada quando o botão é acionado, antes de executar processo… vc sabe se é possivel executar algum método logo depois do término do processo, de forma automática, sem precisar criar outro botão pra fazer isso?

Estou tentando mexer no método APanel pra fazer isso, mas não estou conseguindo…
[/quote:57c4b]

nunca testei, mas ACHO que vc pode colocar dois processos no mesmo botão assim:

org.compiere.process.Process1;org.compiere.process.Process2

dai ele executa na sequencia, bom pelo menos com o ModelValidator e Callout, funciona assim


#15

Mário, achei uma solução… quando o processo é terminado, ele passa por um método dentro da classe APanel, chamado “unlockUI”…

Eu coloquei o “datarefreshall” logo após a caixa de diálogo (ADialog) e deu certo.

Sobre executar 2 processos em sequencia, ainda não testei…

Obrigado pela ajuda!