Administração do sistema
Inclusão de campos dinamicamente
RT.FAQ-78280
Existem alguns cenários onde se deseja incluir campos dinamicamente em um formulário. Seriam situações onde a definição de cada campo está registrada em uma tabela. Neste casos, existe um local onde o administrador do sistema pode definir campos adicionais a serem utilizados para uma determinada entidade. Os valores destes campos deverão ser salvos em uma entidade associativa, formando uma relação de 1 para muitos com relação à entidade base.
Em tempo de desenvolvimento, no formulário onde se deseja incluir estes campos, será necessário criar um único campo UNBOUND na posição e características onde estes campos serão deverão ser inseridos.
Este bloco deverá ter dois métodos que serão responsáveis em controlar tanto a inclusão destes campos como a persistência de seus valores:
- Apresentar xxxx
- Salvar xxxx
Os nomes acima deverão seguir uma nomenclatura própria onde "xxxx" deverá ser substituído pelo elemento apropriado, tal como "propriedades" (de uma atividade), "características" de uma pessoa, "atributos" de um produto, etc.
A implementação das regras deverá utilizar dois métodos auxiliares existentes na ServiceModel:
includeCustomFields(Field baseField, String SQL)
- baseField: Campo UNBOUND sendo utilizado como referência e que indica onde e como os campos deverão ser incluídos.
- SQL: String contendo um SQL que monta os campos que deverão ser incluídos no lugar do baseField.
O SQL definido acima, deverá ter as seguintes solunas:
- name: Nome a ser adicionado ao campo para diferencias entre os diferentes campos. No formulário, todos os campos serão nomeados com o nome do baseField seguid deste nome.
- label: Label a ser utilizado para o campo
- domain: Domínio para o campo
- value: Valor atual do campo
- hint: Hint a ser adicionado ao campo
- format: Opções adicionais de comportamento do campo conforme os formatos aceitos pelo respectivo domínio;
Exemplo:
- Incluir as propriedades de uma atividade:
includeCustomFields(aPropriedades,
"select tpa.id as name"
+ ", tpa.dominio as domain"
+ ", tpa.titulo as label"
+ ", tpa.descricao as hint"
+ ", pa.valor as value"
+ " from tipos_propriedades_atividades tpa"
+ " join tipos_atividades t on t.id = tpa.tipo_atividade_id"
+ " left join propriedades_atividades pa on pa.propriedade_id = tpa.id"
+ " where t.tipo_atividade = '" + aTipoAtividade + "'"
+ " order by tpa.sequencia");
saveCustomFields(Field baseField, Entity entity, String parentColumn, String refColumn, String valueColumn)
- baseField: Campo UNBOUND sendo utilizado como referência e que indica onde e como os campos deverão ser incluídos.
- entity: Entidade onde as informações devem ser persistidas
- parentColumn: Nome da coluna que faz referencia com o ID da entidade base atual
- refColumn: Nome da coluna utilizada como referencia para cada campo
- valueColumn: Nome da coluna onde o valor deve ser salvo
saveCustomFields(aPropriedades,
new EntPropriedadesAtividades(ctx),
"ATIVIDADE_ID",
"PROPRIEDADE_ID",
"VALOR");
Ver também:
- (faq:12115; Manual T2)
- (faq:57640; Interfaces avançadas)