segunda-feira, 29 de abril de 2013

ADempiere: Dicionário de aplicação

Se me perguntassem qual é a característica do ADempiere que mais gosto responderia sem dúvida: o dicionário de aplicação. Acho inclusive que essa seria a resposta da maior parte dos profissionais que trabalham com o ADempiere. Nos cursos que já ministrei os alunos também parecem se impressionar com os benefícios que o uso do dicionário de aplicação traz para o ADempiere.

Mas o que seria o dicionário de aplicação?

O dicionário de aplicação do ADempiere é o que garante a grande flexibilidade da aplicação. A maior parte das configurações do sistema são definidas no dicionário de aplicação. É no dicionário de aplicação que de indica, por exemplo, que a aba Parceiro de Negócios está vinculada a tabela C_BPartner no banco de dados.

O que se pode fazer dentro do dicionário de aplicação, basicamente:

  • Gerenciar as tabelas do banco de dados
  • Gerenciar as janelas, abas e campos do sistema
  • Criar relatórios
  • Criar processos (automáticos ou não) e vinculá-los a botões ou itens do menu
  • Manutenção das traduções
  • Criação de elementos de sistema
  • Manutenção de boa parte das mensagens
  • Manutenção das sequências de documentos
  • Criação de workflows

Existem outras tantas e a lista acima contempla talvez as principais.

Com o dicionário de aplicação, o trabalho de codificação em uma implantação fica bem menor do que seria em um desenvolvimento de sistema qualquer. Exemplo: um cliente solicita a criação de um campo em uma janela específica. Em um processo normal, o desenvolvedor tem que criar a alteração da base de dados correspondente, criar o elemento de interação (o campo), gerar o pacote de instalação e atualizar a aplicação (resumidamente).

Com o ADempiere esses passos não são muito diferentes, com uma pequena e importante diferença: não existe codificação. Ou seja, a criação de um campo em uma janela pode levar 5 minutos.

E como eu acesso o dicionário de aplicação? Simples, faça login com o usuário System (ou usuário SuperUser), escolha o perfil System Administrator e você estará no dicionário de aplicação. :-)

Experimente! Obviamente não faça esses experimentos em uma base de produção. Uma manutenção errada tem o poder de fazer a aplicação não funcionar mais. A dica que eu sempre dou é: antes de alterar veja como foi feito em outras tabelas e janelas. A boa e velha engenharia reversa ainda é uma ótima fonte de aprendizado.



sexta-feira, 26 de abril de 2013

ADempiere: colunas obrigatórias em uma tabela

Se deseja criar uma tabela nova no ADempiere é importante saber que existem colunas que são obrigatórias. Sem eles, características básicas do ADempiere não funcionarão, como controle de acesso, separação de dados empresa/organização, entre outras. Mas quais são essas colunas:


  • AD_Client_ID: coluna que indica o id da empresa que detém o registro. É através dessa coluna que o ADempiere sabe a qual empresa pertence um determinado registro. 
  • AD_Org_ID: coluna que indica o id da organização que detém o registro. É através dessa coluna que o ADempiere sabe a qual organização pertence um determinado registro. Se olhar o banco de dados e ver que essa coluna tem o valor 0, então isso indica ao ADempiere que o determinado registro pertence a todas as organizações. 
  • CreatedBy: contém o ID do usuário que criou o registro. Essa coluna é alimentada automaticamente pelo ADempiere. 
  • Created: data em que o registro foi criado. 
  • UpdatedBy: contém o ID do usuário que atualizou o registro pela última vez. Essa coluna é alimentada automaticamente pelo ADempiere. 
  • Updated: data em que o registro foi atualizado pela última vez. 
  • IsActive: indica se o registro está ativo ou não. 
  • NOMEDATABELA_ID: caso seja uma tabela de uma chave única, serve como ID do registro na tabela. Se a tabela chama-se Z_TipoFornecedor, então a coluna ID dessa tabela deverá ser chamada de Z_TipoFornecedor_ID. 


 Abaixo segue um script exemplo simples para criação de tabela com essas colunas obrigatórias:
CREATE TABLE z_tipofornecedor ( z_tipofornecedor_id numeric(10,0) NOT NULL, ad_client_id numeric(10,0) NOT NULL, ad_org_id numeric(10,0) NOT NULL, isactive character(1) NOT NULL DEFAULT 'Y'::bpchar, created timestamp without time zone NOT NULL DEFAULT now(), createdby numeric(10,0) NOT NULL, updated timestamp without time zone NOT NULL DEFAULT now(), updatedby numeric(10,0) NOT NULL, CONSTRAINT z_tipofornecedor_pkey PRIMARY KEY (z_tipofornecedor_id), CONSTRAINT z_tipofornecedor_isactive_check CHECK (isactive = ANY (ARRAY['Y'::bpchar, 'N'::bpchar])) ) WITH ( OIDS=FALSE );