Delete Record


#1

Gostaria de saber como o botão “Delete Record” da janela do Adempiere funciona? Como ele faz a exclusão do registro na tabela? Eu tenho uma janela no Adempiere e uma tabela espeficica, estou utilizando esta janela apenas para pegar os dados referentes a c_invoice e c_invoiceline(não são todos os dados). Estou gravando os dados na minha tabela e na c_invoice, e estou fazendo o update também nas duas, agora estou querendo da minha janela, deletar os registros que são gerados tanto na minha que o Adempiere já gerencia sozinho e também na c_invoice que gerei, como eu faço?


#2

Leandro,

Deixa eu ver se entendi direito sua dúvida.

Você tem uma Janela customizada e deseja que ao apagar um registro da sua tabela, automaticamente um registro de outra tabela seja apagado?

Ao clicar no botão de apagar o Adempiere tenta fazer o DELETE no BD, caso haja alguma constraint ativa que faça referência ao registro que esta tentando apagar isso irá gerar um erro. Para apagar uma sequência de dados o que você pode fazer é alterar o código fonte e criar uma rotina para apagar os dados das outras tabelas ao clicar no botão de excluir. Dê uma pesquisada em ModelValidator que serve para você executar uma função a partir de uma ação do sistema, por exemplo, executar a ação de apagar os dados que você deseja ao clicar no botão de excluir da sua janela.

Abraço.


#3

ralexsander,

Valeu pela ajuda estou procurando o local onde ele executa a ação de deletar, vou dar uma olhada nesta classe.

Obrigado.


#4

Bom… seguindo o que já foi dito. Para que vc execute tipo de ações, tu deve implementar classe referente a tabela que você criou.
Normalmente o passo após criar uma tabela no banco de dados, é executar a classe GenerateModel. Ela irá gerar classes X_NOMESUATABELA

Você obsevá-la ela contém todas as validacoes que vc colocou ao cadastrá-la no sistema em “Tabela e Coluna”. Para adicionar métodos extras (after/before save/delete… e afins). Você deve criar uma outra classe que seguindo a padronizacao do adempiere deverá ser MNomeSuaTabela… nao esqueca de retirar o prefixo, por exemplo:

C_Invoive -> X_C_Invoice (Gerada pelo sistema) -> MInvoice ( classe que implementa outros métodos)

Normalmente para adicionar validacoes em tabelas do sistema. Nós fazemos uso dos chamados “Validators”. Entrtando para tabelas nossas… podemos criar as classes sem problemas.

No seu caso vc deve criar a classe M… colocar ela no pacote ou em org.compiere.model ou em outro pacote q vc deve cadastrar em:

Logado como SystemAdmin
ir em Menu -> Dicionário de Aplicacao -> Tipo de Entidade
Campo: model package

Exemplo:
org.suaempresa.adempiere.model

Outras duvidas… sór ir postando.

[]'s

Fernando


#5

Fernando,

Agradeço pelas dicas, estava pirando com a classe M já, o Adempiere não encontrava de jeito nenhum, mas como você mesmo disse, tem que criar a classe M sem as iniciais do nome que você criou a sua tabela no banco, e mais, se utilizar 3 letras(“XXX_YYYYYY”) e mais um nome qualquer, o Adempiere deixa você criar a classe M(MXxxYyyyyy) com todas as letras, ainda não sei o porque, se caso alguém souber, eu agradeceria. Eu escrevi este tópico pois o delete row da janela do Adempiere não enxergava a minha classe M, consequentemente eu não conseguia utilizar o método da PO de deletar, descobri que para ele enxergar a classe M, a classe precisa conter o construtor da classe com os seguintes parêmetros(Properties ctx, ResultSet rs, String trxName). Agora tudo esta funcionando numa boa.


#6

Tipo… se vc colcoar um prefixo com mais de tres letras. por exemplo

LBR_NomeTabela

a sua classe deveá ser MLBRNomeTabela

Pois no fonte o adempiere (nao recordo qual classe) verifica o prefixo tem tamanho <= 2 e o retira , caso contrario ele so remove os underline.

[]'s

Fernando


#7

Valeu por tirar esta dúvida Fernando, sabia que era algo do tipo, mas não tinha certeza.

Obrigado.