Criando campo de pesquisa


#1

Olá,

Estou estudando como customizar o Adempiere.
Criei duas telas. Uma serve para cadastrar Candidatos a Vagas na empresa. A outra tela é somente um teste com um campo que faz referência a um registro de Candidato a Vaga.

Minhas tabelas ficaram assim:

CREATE TABLE candidato
(
  candidato_id numeric(10) NOT NULL,
  ad_client_id numeric(10) NOT NULL,
  ad_org_id numeric(10) NOT NULL,
  isactive character(1) NOT NULL DEFAULT 'y'::bpchar,
  created timestamp without time zone NOT NULL DEFAULT now(),
  createdby numeric(10) NOT NULL,
  updated timestamp without time zone NOT NULL DEFAULT now(),
  updatedby numeric(10) NOT NULL,
  nome character varying(30)
)
CREATE TABLE candidato_refer
(
  candidato_refer_id numeric(10) NOT NULL,
  candidato_id numeric(10) NOT NULL, /** este campo deveria ser chave estrangeira para a PK da tabela acima **//
  ad_client_id numeric(10) NOT NULL,
  ad_org_id numeric(10) NOT NULL,
  isactive character(1) NOT NULL DEFAULT 'y'::bpchar,
  created timestamp without time zone NOT NULL DEFAULT now(),
  createdby numeric(10) NOT NULL,
  updated timestamp without time zone NOT NULL DEFAULT now(),
  updatedby numeric(10) NOT NULL,
  refer character varying(30)
)

Aí eu criei uma janela que cadastra informações na primeira tabela e outra janela para a outra tabela.

Meu problema está com o campo candidato_refer.candidato_id. Peguei como exemplo a tela de Pedido de Compra (Menu -> Da Requisição à Fatura -> Pedido de Compra), com o campo Parceiro de Negócios:

[attachment=1]Pedido de Compra.JPG[/attachment]

Quando eu clico no botão ao lado do campo, ele abre uma janela para pesquisa do Parceiro de Negócios:

[attachment=0]Informações do Parceiro de Negócios.JPG[/attachment]

Pesquisei dentro do Dicionário de Aplicação sobre como foi construída essa janela, e não encontrei em lugar nenhum alguma característica que informe ao sistema para criar o campo Parceiro de Negócios com esse detalhe do botão para abrir a tela de pesquisa.

No esquema do banco de dados, verifiquei que a tabela c_order tem uma foreign key para o campo c_bpartner_id:

...
CONSTRAINT cbpartner_corder FOREIGN KEY (c_bpartner_id)
      REFERENCES c_bpartner (c_bpartner_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
...

Então para resumir, minhas dúvidas são as seguintes:

  1. Como faço para criar um campo que referencie um campo de outra tabela, e na tela o campo tenha essa característica de exibir um botão que abra uma janela de busca, igual no exemplo do pedido de compra?

  2. Como faço para criar chaves estrangeiras (foreign key) utilizando o dicionário de aplicação?

Obrigado


#2

Carlos,

Para entender como trazer uma janela de pesquisa de registros que está em outra tabela, dê uma olhada na tabela C_OrderLine ou na tabela C_InvoiceLine e verifique o campo LBR_CFOP_ID.

Você irá observar que existe uma referência criada para exibir os registros da tabela na CFOP quando o usuário seleciona o campo CFOP na janela.

Quanto as chaves estrangeiras elas devem ser criadas manualmente no banco de dados.

Atualmente o dicionário da aplicação não dá suporte a criação de chaves estrangeiras.

Espero ter ajudado.

Um abraço,
Eduardo.


#3

Vamos ver se entendi o que necessita.
Carlos, trabalho com o Compiere e nele para conseguir isso que deseja, em primeiro lugar o tipo do campo na tabela onde deseja que apareça o referido botão não pode ser Table Direct, deve ser Search (pesquisa), e você deverá marcar a coluna que deseja ser um filtro, na referida tabela, como Colna de Seleção (Select Column).
Ou seja pelo que pude entender, na tabela candidato, você deverá marcar na coluna nome como Indetificador desta tabela, ou seja onde se referir a esta coluna, irá mostrar o nome do candidato e na tabela candidato_refer a Referência da coluna deverá estar marcada como Search e ainda deverá assinalar o campo Select Column. Com estes procedimentos irá conseguir o que deseja.
Quanto as FK, deverá assinalar diretamente no database, como informou nosso mestre emontenegro
Esses são os procedimento usuais no Compiere e pelo que já pude ver, funciona da mesma forma no Adempiere.

Espero ter ajudado e não complicado!!!