Tabela Campo
[!WARNING] ATENÇÃO Documento incompleto!
Tipos de campo
LINK
Um campo do tipo LINK pode receber algumas opções, como:
CRUD: Abre um crud filtrado pelo p1 com o v1, podendo ser em uma nova janela ou não.
'OPCOES' => 'type:CRUD;popup:1;crud:MARTE_REPORT_AX;p1:MARTE;v1:SEQ_DB;icon:fa fa-tags',
O tipo GET_URL, por padrão, abre a url informada.
'OPCOES' => 'type:GET_URL;url:{url_desejada};p1:SEQ_DB;v1:SEQ_DB;icon:fa fa-cloud',
É possível abrir uma url baseada no retorno de um entryPoint.
'OPCOES' => 'type:GET_URL;url:reposts/entryPoint/{entry_point_action};p1:SEQ_DB;v1:SEQ_DB;icon:fa fa-link',
O retorno do entryPoint deve seguir o expresso abaixo:
$this->outputValues['report'] = $link_relatorio;
// se for multiple
$this->outputValues['report_filters'] = ['inspecao' => [$inspecao_seq_db]];
// senao for multiple
$this->outputValues['report_filters'] = ['inspecao' => $inspecao_seq_db];
Caso não queira abrir em nova janela, informar popup:0 e então será chamada a url por AJAX.
Nesse tipo também é possível mudar a URL, sem ser por AJAX, causando um redirecionamento da página, para isso, informar ajaxify:0. Exemplo para fazer do download de um item de telemetria:
'OPCOES' => 'type:GET_URL;popup:0;ajaxify:0;url:marte/telematic/download/0;p1:SEQ_DB;v1:SEQ_DB;icon:fa fa-cloud',
Código no core:
$ajaxify = 'ajaxify';
$newWindow = true;
if (isset($options['popup']) && $options['popup'] == 0) {
$newWindow = false;
if (isset($options['ajaxify']) && $options['ajaxify'] == 0) {
$ajaxify = '';
}
}
Com o uso do GET_URL, é possível configurar uma url que permite realizar o download de um relatório em formato pdf.
'OPCOES' => 'type:GET_URL;popup:0;ajaxify:0;url:reports/assistencia_tecnica;p1:format=pdf&pdfAction=download&&form[os][];v1:SEQ_DB;icon:fa fa-file-text-o',
Conforme exemplo anterior, é necessário utilizar popup:0 e ajaxify para evitar que uma nova janela sem conteúdo seja aberta, e, adicionar format=pdf e pdfAction=download no início da QueryParam 'p1', de modo a evitar erro de concatenação com o valor de 'v1' definido.
Outros tipos (falta documentar):
switch ($options['type']) {
case 'CLONE':
return static::linkCloneRow($action, $row);
case 'GET_URL':
return static::linkGetUrl($action, $row);
case 'POST_URL':
return static::linkPostUrl($action, $row);
case 'GIS':
return static::linkGis($action, $row);
case 'CRUD':
default:
return static::linkCrud($action, $row);
}
PROC_ST
Exemplo de uso do campo do tipo PROC_ST: (usado para controles de processamento ou integração)
Dica de boa prática: Separar cada campo para uma responsabilidade. Por exemplo, se existe algum processo de integração então pode-se criar um campo INTEGRACAO_ST para esse controle.
Criando um campo PROC_ST:
INSERT INTO nfs_core_ds_tabela_campo (TABELA_NOME, NOME, SEQ, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES) VALUES('EQP_BOLETIM', 'TESTE', 100, 0, 1, 1, 1, NULL, NULL, 'PROC_ST', NULL, NULL, NULL, NULL, 'IU', '0', NULL, NULL, NULL, '0:Pendente;1:Liberado Int.;4:Integrado;9:Processado ERP', NULL, NULL, NULL, NULL, NULL);
Quando rodar o DS serão gerados 3 campos:
DDL => ALTER TABLE APP_EQP_BOLETIM ADD COLUMN TESTE_ST CHAR(1) NULL DEFAULT '0';
DDL => ALTER TABLE APP_EQP_BOLETIM ADD COLUMN TESTE_DH TIMESTAMP NULL DEFAULT NULL;
DDL => ALTER TABLE APP_EQP_BOLETIM ADD COLUMN TESTE_DESC VARCHAR(250) NULL DEFAULT NULL;
Veja que no campo OPTIONS foi usada uma declaração de campo do tipo LOV1, que será usada no campo TESTE_ST.
Exemplo: '0:Pendente;1:Liberado Int.;4:Integrado;9:Processado ERP'
O campo Descrição e Descrição Resumida ser usado e será adicionado ao valor padrão.
Se precisar mudar o texto completo ou alguma outra propriedade, pode-se usar o setFields na declaração na nfs_core_ds_tabela.
VALIDACAO
filterLink
FIltra os dados de uma uma tabela fk(especificada como link), exemplo:
{
"filterLink": [{
"condition": [{
"field": "RO",
"operator": "=",
"value": "0",
"comparator": "AND"
},
{
"field": "FLAG_PRODUCAO",
"value": "1",
"operator": "=",
"comparator": ""
}]
}]
}
ira adicionar a condição ao filtrar por registros da FK:
RO = 0 AND FLAG_PRODUCAO = 1
VALIDACAO_VIEW
A validação view é muito usada para exibir ou não um campo.
TABELA_NOME | NOME | DESCRICAO | TIPO | VALIDACAO_VIEW |
---|---|---|---|---|
ITEM_INSPECAO | FLAG_FERRAMENTA_MEDICAO | Usa Ferramenta de Medição? | BOOL | |
ITEM_INSPECAO | FLAG_ROLETE | É Rolete Inferior? | BOOL | FLAG_FERRAMENTA_MEDICAO:1 |
No caso acima o checkbox FLAG_ROLETE (É Rolete Inferior?) somente será exibido quando a FLAG_FERRAMENTA_MEDICAO (Usa Ferramenta de Medição?) for verdadeira, ou em outra palavras, marcada como SIM.
Logo também é verdade que qualquer VALIDACAO_VIEW que depende da FLAG_ROLETE será ou não exibida baseada na sua exibição, exemplo
TABELA_NOME | NOME | DESCRICAO | TIPO | VALIDACAO_VIEW |
---|---|---|---|---|
ITEM_INSPECAO | FLAG_FERRAMENTA_MEDICAO | Usa Ferramenta de Medição? | BOOL | |
ITEM_INSPECAO | FLAG_ROLETE | É Rolete Inferior? | BOOL | FLAG_FERRAMENTA_MEDICAO:1 |
ITEM_INSPECAO | MINIMO | Mínimo | DECIMAL | FLAG_ROLETE:0 |
ITEM_INSPECAO | RODANTE_FERRAMENTA_MEDICAO | Ferramenta de Medição (Tabela de Conversão) | LOVN | FLAG_ROLETE:0 |
ITEM_INSPECAO | STANDER | Stander | DECIMAL | FLAG_ROLETE:0 |
Então quando a FLAG_ROLETE não ser exibida baseado no valor falso da FLAG_FERRAMENTA_MEDICAO os campos MINIMO (Mínimo), RODANTE_FERRAMENTA_MEDICAO (Ferramenta de Medição (Tabela de Conversão)) e STANDER (Stander) também não são exibidos. Caso seja necessário desabilitar essa hierarquia tem que seguir os passos da VALIDACAO_VIEW sem validar seus dependentes na sua hierarquia.
VALIDACAO_VIEW sem validar seus dependentes na sua hierarquia
Para não usar essa hierarquia basta adicionar na coluna PROPERTIES da nfs_core_ds_tabela_campo a chave no json { "tree_validation": "false" }
Exemplo
TABELA_NOME | NOME | DESCRICAO | TIPO | VALIDACAO_VIEW | PROPERTIES |
---|---|---|---|---|---|
ITEM_INSPECAO | FLAG_ROLETE | É Rolete Inferior? | BOOL | FLAG_FERRAMENTA_MEDICAO:1 | {¶ "tree_validation": "false"¶} |
Com isso as VALIDACAO_VIEW que dependem da FLAG_ROLETE são independetes dela ser exibida ou não.
FILTRO VIEW
Traz os registros do campo baseados no valor de outro campo.
FK
Filtro baseado em duas FKs
Filtra os registros de um campo, baseado no valor de outro campo do qual o mesmo possua relacionamento. Possuii a seguinte estrutura:
TABELAA:TABELAB
Exemplo:
- Tenho a tabela
OS
contendo os campos FKCLIENTE
eEQUIPAMENTO
; - Quero que apenas os registros de
EQUIPAMENTO
que possuem relação com oCLIENTE
definido naOS
estejam disponiveis para seleção:
TABELA_NOME | NOME | LINK | FILTRO_VIEW | TIPO |
---|---|---|---|---|
OS | CLIENTE | CLIENTE | - | FK |
OS | EQUIPAMENTO | EQUIPAMENTO | CLIENTE:EQUIPAMENTO | FK |
[!NOTE] Neste caso o sistema irá procurar na tabela
EQUIPAMENTO
pelo campo FK relacionado aoCLIENTE
e filtrará os registros de acordo com oCLIENTE
definido naOS
Tambem podemos definir o filtro para campos que possuem a tabelaA como link, como no caso de precisar filtrar o CLIENTE
baseado no baseado no valor de AGENDAMENTO_SERVICO
, usando o filtro CLIENTE:AGENDAMENTO_SERVICO
TABELA_NOME | NOME | LINK | FILTRO_VIEW | TIPO |
---|---|---|---|---|
OS | AGENDAMENTO_SERVICO | AGENDAMENTO_SERVICO | - | FK |
OS | CLIENTE | CLIENTE | CLIENTE:AGENDAMENTO_SERVICO | FK |
[!WARNING] Note que A
TabelaB
sempre sera utilizada como a tabela que possui vinculo entre as FKs
Filtro baseado no campo FK de uma tabela:
Filtra os registros de um campo, baseado no valor de um campo em uma outra tabela desde que este segundo campo seja do tipo FK e possua o mesmo LINK. Possui a seguinte estrutura:
FIELD:TABELA:NOME_DO_CAMPO
Exemplo:
- Tenho a tabela
MO_APT
contendo os campos FKOPER
eSUBATIDADE
; - A tabela
OPER
possui o campoSUBATIVIDADE_PRODUCAO
que por sua vez é do tipo FK e possui LINK paraSUBATIDADE
; - Na tabela
MO_APT
, quero que apenas os registros deSUBATIVIDADE
que possuem relação com aOPER
definido naMO_APT
estejam disponiveis para seleção(relação feita através do campoSUBATIVIDADE_PRODUCAO
):
TABELA_NOME | NOME | LINK | FILTRO_VIEW | TIPO |
---|---|---|---|---|
MO_APT | OPER | OPER | - | FK |
MO_APT | SUBATIVIDADE | SUBATIVIDADE | FIELD:OPER:SUBATIVIDADE_PRODUCAO | FK |
Filtro por LOVN
Para filtrarmos os registros de um campo de uma tabela baseado no valor de um outro campo, sendo que ambos os campos possuem um relacionamento de "muitos para muitos(n x m)", podemos utilizar o por LOVN, sendo a sua estrura:
PREFIXO:TABELA_DE_RELACIONAMENTO:TABELA_B:TABELA_A
PREFIXO
: Neste caso será "LOVN";TABELA_DE_RELACIONAMENTO
: Nome da tabela que possui o relacionamento entre a TABELA_A e a TABELA_B(TABELA_TABELAB);TABELA_A
: Tabela correspondente ao campo cujo os registros serão filtrados;TABELA_B
:Tabela correspondente ao campo cujo o valor será utilzado como filtro. {.grid-list}
Exemplo 1
Para filtrar as subatividades baseado no valor da atividade
TABELA_NOME | NOME | LINK | FILTRO_VIEW | TIPO |
---|---|---|---|---|
MO_APT | ATIVIDADE | OPER | - | FK |
MO_APT | SUBATIVIDADE | SUBATIVIDADE | LOVN:OPER_SUBATIVIDADE:SUBATIVIDADE:ATIVIDADE | FK |
ou para filtra a atividade baseado no valor da subatividade
TABELA_NOME | NOME | LINK | FILTRO_VIEW | TIPO |
---|---|---|---|---|
MO_APT | ATIVIDADE | OPER | LOVN:OPER_SUBATIVIDADE:ATIVIDADE:SUBATIVIDADE | FK |
MO_APT | SUBATIVIDADE | SUBATIVIDADE | - | FK |
Outros Exemplos:
Supondo que haja uma tabela LOVN entre Fazenda e Gleba (APP_FAZENDA_N_GLEBA) e na tela de OS haja os campos para escolher a fazenda e gleba, sendo que após escolher a fazenda deve trazer somente as glebas que estão na LOVN daquela fazenda, para isso é somente fazer a seguinte configuração na linha da nfs_core_ds_tabela_campo onde está a GLEBA:
LOVN:FAZENDA_GLEBA:GLEBA:FAZENDA
MASCARA
Regex
Para usar regex, configure o valor do campo "máscara" da seguinte forma:
regex:<regex>
Exemplo:
regex:[a-z1-9]*
Tela
Configurar Botão de Ação (Integração/Extorno, Relatório)
Para configurar um botão de ação basta usar a tabela nfs_core_ds_field_action depois dar permissão para qual usuário/grupo deseja liberar.
Campos:
- SEQ_DB: Gerado automaticamente, não é necessário inserir.
- TABELA: Adicionar a tabela a qual a botão irá pertecenter.
- DESCRICAO: Importante adicionar para diferenciar de outros botões.
- CONFIG: Campo mais importane que é onde vai a configuração do botão que pode ter os seguintes
Exemplo:
SEQ_DB | TABELA | DESCRICAO | CONFIG | ENTRY_POINT | INS_DH | ATIVO | DELETED | NAME |
---|---|---|---|---|---|---|---|---|
1 | OS | Ação de Integração de OS | {"text": "Novo Details","icon_class": "fa fa-plus","url" : "/details/new/{{ seqDb }}/{{ seqQii }}/{{ seqPanel }}","button_class": "btn-primary"} | 2019-07-30 18:42:56 | 1 | 0 |
Resultado:
Galeria Simova
A Galeria Simova foi criada para permitir que o usuário selecione tanto fotos do computador como fotos padrão do sistema cadastradas na nova tabela nfs_lib_image situada na nfs_cloud.
Alterações no Banco de Dados
- nfs_lib_image: Inserida no
nfs_cloud
com os campos:- IMAGE: Base64 da imagem;
- IMAGE_THUMBNAIL: Thumbnail da Imagem;
- ENABLED: Imagem deve ser exibida (1) ou não (0);
- CATEGORY: Categoria da imagem;
- DESCRIPTION: Palavras chave utilizadas para filtrar as imagens da Galeria.
Alterações no CRUD - campo UPLOAD: Exibe a Galleria Simova ou utilizar o Drag and Drop files para arrastar arquivos, função galleryPreview(); - campo IMG_MOBILE: Padrão, seleciona arquivos do computador, função simplePreview().
[!WARNING] Na tabela nfs_ds_core_tabela_campo quando este for do tipo UPLOAD e se quer fazer o upload/download de arquivos que não sejam imagens precisa configurar o campo VALIDAÇÃO no formato desejado sem misturar extensões de imagem com extensões de arquivos Ex: **(0:*pdf;1:docx;2:doc;) E para que funcione, as extensões configuradas precisam estar também na tabela nfs_par_parametros nos campos: para arquivos de texto, e arquivos que não sejam imagens CRUD_EXTENSOES_PERMITIDAS_UPLOAD -> 0:txt;1:jpeg;2:png;3:docx para arquivos de imagens-> CRUD_EXTENSOES_UPLOAD_PERMITIDAS_VISUALIZACAO -> png:image/png;jpeg:image/jpeg
Melhorias
-
Barra de Ferramentas:
- Rotação da imagem: Rotaciona a imagem em 90 graus tanto para a direi quanto para a esquerda. Necessário salvar.
- Excluir imagem: Adicionar a tabela a qual a botão irá pertecenter.
- Cancelar seleção: Importante adicionar para diferenciar de outros botões.
Exemplo:
Exemplo:
Imagem Selecionada:
Imagem Rotacionada:
Após rotacionar clicar em Salvar; Mensagem:
Estrutura
Fluxo da Aplicação:
Ao passar pela criação do campo no CrudController
é retornado um <button id="simova_gallery">
;
O button é acionado através do evento de click no arquivo Gallery.js
;
Ao passar pelo evento de click
é feita uma requisição para a GalleryController
a fim de buscar as imagens dafault cadastradas na nfs_lib_image
;
Populando a simovagallery.twig
e retornado para a requisição esta preenchida;
Ao retornar (conteúdo) é inserido no modal que é carregado.
Modal: Contém duas abas: Importar Imagem | Biblioteca do Sistema
Na aba Biblioteca do Sistema contém as fotos (base64) cadastradas na tabela nfs_lib_image
,
enquanto em "Importar Imagem" abre o seletor de arquivos do computador.
Como é feito o preview das imagens selecionadas
Na tabela nfs_core_ds_tabela_campo
existe o campo VALIDACAO
que é preenchido da seguinte maneira quando se refere a um campo que fará upload de arquivos ou imagens exemplo:
0:*gif;1:*png;2:*jpg
Neste campo são definidas os tipos de extensões que o campo permitirá, quando estiver nos formatos de arquivos de imagem, como os do exemplo acima será feito uma tratativa no sistema verificando o tipo de campo:
-> caso seja UPLOAD será exibida a galeria simova (galleryPreview); -> caso seja IMG_MOBILE será exibido apenas o botão para selecionar arquivos do computador (simplePreview)
Quando forem definidos exempo:
0:*txt;1:*xml;2:*docx;3:*html
Neste caso será feita a verificação destes campos e o preview será de uma imagem padrão, localizada em public/assets/img/file-selected.png
Logo, se não estiver aparecendo imagem ao selecionar algum arquivo de acordo com os exemplos acima deve-se verificar se a extensão do arquivo bate com as descritas neste documento ou definidas na tabela nfs_core_par_parametros
nos campos CRUD_EXTENSOES_UPLOAD_PERMITIDAS_VISUALIZACAO
e CRUD_EXTENSOES_PERMITIDAS_UPLOAD
.
Configurações
1-Criar a tabela nfs_lib_image
no Banco de Dados NFS_CLOUD
Executar o comando abaixo:
USE NFS_CLOUD;
create table nfs_lib_image (
SEQ_DB bigint(20) unsigned not null auto_increment,
IMAGE mediumblob null,
IMAGE_THUMBNAIL blob null,
ENABLED tinyint(1) null,
CATEGORY varchar(250) null,
DESCRIPTION varchar(100) null,
PRIMARY KEY (`SEQ_DB`)
) ENGINE = InnoDB default CHARSET = utf8 collate = utf8_general_ci;
2-Campo adicionado na tabela nfs_upload
:
Executar o comando abaixo:
select distinct concat('ALTER TABLE ', t.TABLE_SCHEMA, '.', '`nfs_upload` ADD LIB_IMAGE_SEQ_DB INT NULL')
from information_schema.TABLES t
where t.TABLE_NAME = 'nfs_core_sys_tipo_campo';
3-Campo LIB_IMAGE_SEQ_DB
deve ser adicionado também na nfs_core_ds_tabela_campo
:
Executar o comando abaixo:
select distinct concat('INSERT INTO ', t.TABLE_SCHEMA, '.', '`nfs_core_ds_tabela_campo` (TABELA_NOME, NOME, SEQ, SYS, SEND_XMOVA, GRID, GRID_MOBILE, DESCRICAO, DESCRICAO_RESUMIDA, TIPO, OBRIGATORIO, TAMANHO, TAMANHO_DECIMAL, MASCARA, INSERT_UPDATE, DISABLED, HINT, LINK, VALIDACAO, OPCOES, VALOR_DEFAULT, VALIDACAO_VIEW, FILTRO_VIEW, TOOLTIP_MESSAGE, PROPERTIES) VALUES (\'UPLOAD\', \'LIB_IMAGE_SEQ_DB\', 1, 0, 1, 1, 1, \'SEQ LIB IMAGE\', \'NFS_CLOUD SEQ LIB IMAGE\', null, null, null, null, null, \'IU\', 0, null, null, null, null, null, null, null, null, null)')
from information_schema.TABLES t
where t.TABLE_NAME = 'nfs_core_sys_tipo_campo';
CRUD da Galeria
ADICIONAR/EDITAR:
Para adicionar imagens na Galeria, por enquanto deve ser inserido diretamente no NFS_CLOUD -> nfs_lib_image
através dos comandos INSERT
e UPDATE
no Banco de Dados,
tendo como padrão os seguintes campos:
SEQ_DB BIGINT(21) UNSIGNED NOT null AUTO_INCREMENT, | AUTO INCREMENT
IMAGE MEDIUMBLOB NULL, | BASE64 || NULL
IMAGE_THUMBNAIL BLOB NULL, | BASE64 Redimensionado || NULL
ENABLED TINYINT(1) NULL | ATIVO (0 || 1) || NULL
CATEGORY VARCHAR(250) NULL | NOME, COR, TIPO...
DESCRIPTION VARCHAR(100) NULL | NOME, COR, TIPO...
EXCLUIR:
Basta deletar a linha desejada através do comando DELETE
diretamente no Banco de Dados.
ARQUIVOS RELACIONADOS:
Gallery.scss
Gallery.js
GalleryController.php
base_layout.twig (contém o modal-gallery)
simovagallery.twig (contém o conteúdo do modal-gallery)
Observações
- Imagens Trazidas: Só serão trazidas imagens
ENABLED = 1
, e com oBASE64 IS NOT NULL
;
Botões dos campos de data e hora
A configuração é feita na tabela core_par_parametros
as chaves são separadas para os campos de data e campos de data e hora.
Campos tipo: DH, DHS (data e hora)
OPCAO_DATA_AGORA
Preenche a data e hora atuais.
Conteúdo: F:agora;DESC:Agora
OPCAO_DATA_HOJE
Preenche a data atual.
Conteúdo: F:hoje;DESC:Hoje
OPCAO_DATA_ONTEM
Preenche a data de ontem.
Conteúdo: F:ontem;DESC:Ontem
Campos tipo: DATA, DATE (data)
OPCAO_DATA_HOJE
Preenche a data atual.
Conteúdo: F:hoje;DESC:Hoje
OPCAO_DATA_1_DIA
Preenche a data atual + 24horas.
Conteúdo: F:addHours;P:24;DESC:Hoje + 1
OPCAO_DATA_2_DIA
Preenche a data atual + 48horas.
Conteúdo: F:addHours;P:48;DESC:Hoje + 2
Config
INSERT INTO suzano_sal_bobagro.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'OPCAO_DATA_1_DIA', 'F:addHours;P:24;DESC:Hoje + 1', 1);
INSERT INTO suzano_sal_bobagro.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'OPCAO_DATA_2_DIAS', 'F:addHours;P:48;DESC:Hoje + 2', 1);
INSERT INTO suzano_sal_bobagro.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'OPCAO_DATA_AGORA', 'F:agora;DESC:Agora', 1);
INSERT INTO suzano_sal_bobagro.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'OPCAO_DATA_HOJE', 'F:hoje;DESC:Hoje', 1);
INSERT INTO suzano_sal_bobagro.nfs_core_par_parametros
(EMPRESA, FILIAL, `LOCAL`, NOME, CONTEUDO, TIPO)
VALUES(1, 9999, 9999, 'OPCAO_DATA_ONTEM', 'F:ontem;DESC:Ontem', 1);
Usando o setFields para manipular campos e suas propriedades:
Exemplo:
"setFields": {
"PROC_ST": {
"SYS": 0,
"DESCRICAO":"Teste de gravação",
"TIPO":"LOV1",
"LOV":{"0":"Pendente","1":"Liberado Int.","4":"Integrado","9":"Processado ERP"}
},
"PROC_DESC": {
"SYS": 0,
"DISABLED":1
},
"ID": {
"DESCRICAO":"ID DO BOLETIM"
}
}
Vídeo de exemplo:
🔗 Configurar Campo FK para Receber Múltiplos Valores
Para permitir que um campo do tipo **FK ** aceite múltiplos valores, é necessário configurar a propriedade allowMultipleFk
como true
no JSON armazenado na coluna CONFIG
da tabela nfs_core_ds_tabela_campo
.
🗂️ Local da Configuração
- Tabela:
nfs_core_ds_tabela_campo
- Coluna:
CONFIG
(tipo JSON) - Propriedade:
allowMultipleFk
✅ Exemplo de Configuração
Se o campo já possuir outras configurações, como customStyle
ou recognition
, a propriedade allowMultipleFk
deve ser incluída dentro do mesmo objeto JSON:
{
"customStyle": {
"color": "blue",
"fontSize": "14px"
},
"recognition": {
"pattern": "^[0-9]+$"
},
"allowMultipleFk": true
}