Identificador de Regra
GER-075CAMPO03
Módulo: GER - Gerais.
Finalidade: Em complemento ao identificador "GER-075CAMPO01", este identificador permite montar um filtro personalizado para o conteúdo dos campos personalizados exibidos na tela de "F075EPP".
Na regra do identificador "GER-075CAMPO01" são informados quais os campos cujos valores devem ter o filtro montado na regra. Os mesmos campos e seus dados são repassados para a regra deste identificador (GER-075CAMPO03). O seguinte processo para esses campos ocorre então
1) O identificador "GER-075CAMPO03" recebe as mesmas variáveis que são passadas ao identificador "GER-075CAMPO01". Além destas variáveis, é passado o valor informado de cada campo na tela pela variável "VSVALOR" [número campo]. São passados valores campos zerados ou vazios para a regra (caso haja necessidade de se forçar a informação de algum via regra). Então, deve-se ter um cuidado de verificar se o valor dessa variável para campo está nulo antes de montar o filtro. Outro detalhe é a forma com que são passados os valores: são sempre alfanuméricos. O sistema converte os valores numéricos (inteiros ou com decimais) para a representação dos mesmos no banco de dados (removendo separadores de milhares e ajustando o separador de decimais). Para campos data (DATE) o sistema converte a data para a expressão ou função específica do banco. Então, para variáveis data, deve ser somente concatenado o valor fornecido pela variável diretamente no comando sendo montado (por exemplo, vscomando = vscomando + vscampo01 + "="
+ VSValor). O mesmo é válido para campos numéricos (NUMBER). No caso de campos alfanuméricos, é necessário concatenar as aspas simples no comando (por exemplo vscomando = vscomando + vscampo01 + "=" + "'" + VSValor + "'").
2) Após a execução da regra, a rotina obtem o comando montado nesta regra e concatena ao final do comando SQL nativo que retorna os registros. O comando não deve iniciar com cláusula SQL com "AND" ou "OR", simplesmente deve ser montadas cláusula "EXISTS" ou apenas as condições normais.
Características: Exemplo1: "EXISTS (SELECT 1 FROM E075EPP.DESNFV = 'Exemplo' AND E075EPP.CODEMP = E075DER.CODEMP AND E075EPP.CODPRO = E075DER.CODPRO AND E075EPP.CODDER = E075DER.CODPRO)". Nesse exemplo, foi montada uma ligação com a tabela de ligação produto x cliente, onde se sabia previamente via teste na regra que essa é a tabela desejada. Observa-se que foi efetuado o relacionamento de chaves da tabela informada na regra com a tabela de produtos ou derivação, podendo ser usado diretamente o nome da tabela de produtos ou derivação e seus campos. Sem essa ligação, poderá ocorrer a exibição de registros duplicados na tela. Essa deve ser uma regra a ser seguida, e significa que sempre será possível apenas utilizar tabelas relacionadas com as tabelas de produto e derivação (que contenham chave primária ou estrangeira referênciando essas tabelas).
Exemplo2: "(E075PRO.PERIPI < 0.75) AND (E075PRO.PERICM > 1.20) AND (E075DER.DESDER LIKE 'Exemplo%')...". Esse exemplo ilustra a possibilidade de definir campos da tabela de produtos ou derivação na regra "GER-075CAMPO01" mas não usar diretamente na pesquisa nativa (montada pelo sistema). Basta para isso utilizar nas definições desses campos a opção de personalização do filtro e assim esses campos serão repassados diretamente à regra "GER-075CAMPO03", para montar um filtro com condições diferentes. No caso do exemplo, foram utilizados os operadores ">" (maior que), "<" (menor que) e "LIKE". No caso da tabela ser definida na regra como tabela de produtos ou derivações (ou assumindo o padrão da tabela de produtos), mesmo que se personalize o filtro dos mesmos eles continuam aparecendo na grade.
Observação: [número do campo] significa o número do campo (de 1 até 8) que corresponde ao campo na tela.
Dicas:
- Sempre testar se o "VSVALOR" [número campo], que é alfa, tem valor.
- Não manipular datas, pois o conteúdo em "VSValor" já está formatado em um comando específico para o banco.
- O comando final não deve possuir "AND" ou "OR" como primeira cláusula
- Se existir mais de uma condição no filtro, sempre concatenar as mesmas com "AND". Caso seja usado "OR", entre as expressões deve ser usado parênteses.
Exemplo: (Campo > 10 or Campo = 100).
- Valores de campos do tipo "STRING" devem ser concatenados ao comando delimitadas por aspas simples
Exemplo: Campo = 'Conteúdo'
Campos que permitem realizar filtro para mais de um depósito.
Definir Alfa VSFiltroSqlEstoque;
Definir Alfa VSFiltroSqlOrdemCompra;
VSFiltroSqlEstoque = "(E210EST.CODDEP IN ('DEP01'))";
VSFiltroSqlOrdemCompra = "(E420IPO.CODDEP IN ('DEP01'))";
Tela: F075EPP
Transação: Não se aplica.
Regra:
/*
Exemplo resumido devido a restrição no tamanho da
documentação. Nem todos os campos estão sendo usados
*/
@ Nome dos campos @
Definir ALFA VSCAMPO05;
Definir ALFA VSCAMPO06;
Definir ALFA VSCAMPO07;
Definir ALFA VSCAMPO08;
@ Tipo de cada campo @
Definir ALFA VSTIPO05;
Definir ALFA VSTIPO06;
Definir ALFA VSTIPO07;
Definir ALFA VSTIPO08;
@ Tabelas ao qual cada campo pertence. @
Definir ALFA VSTABELA05;
Definir ALFA VSTABELA06;
Definir ALFA VSTABELA07;
Definir ALFA VSTABELA08;
@ Indicativo se personaliza o filtro do campo@
Definir ALFA VSPERSON05;
Definir ALFA VSPERSON06;
Definir ALFA VSPERSON07;
Definir ALFA VSPERSON08;
@ Valores dos campos informados na tela @
Definir ALFA VSVALOR05;
Definir ALFA VSVALOR06;
Definir ALFA VSVALOR07;
Definir ALFA VSVALOR08;
Definir NUMERO VSCODCLI;
/* Este exemplo demonstra 2 cenários possíveis:
1) Personalização de campos das tabelas de produto e derivação,
devido a necessidade de uma montagem mais específica, por exemplo uma comparação
diferenciada ( ">=", "<=", "<>", etc..)
2) Utilização de tabelas diferentes das tabelas de produto ou derivação,
montado filtros com a cláusula EXISTS
Definir ALFA VSFILTROSQL; @ Filtro a ser aplicado @
Definir ALFA VFILTROAND; @ Filtro aplicado sem cláusula EXISTS, pois são as tabelas E075PRO ou E075DER @
Definir ALFA VFILTROEXISTS; @ Filtro aplicado com cláusula EXISTS, pois não são as tabelas E075PRO ou E075DER @
Definir NUMERO VALORNULO;
Definir ALFA VCODCLI;
@ Exemplo que monta uma cláusula EXISTS pois a tabela é diferente da E075PRO ou E075DER @
EstaNulo(VSVALOR05, VALORNULO);
se ((VSPERSON05 = "S") E (VALORNULO = 0))
inicio
se (VSTIPO05 = "STRING")
VSVALOR05 = "'" + VSVALOR05 + "'";
se ((VSTABELA05) = "E012FAM")
inicio
VFILTROEXISTS = VFILTROEXISTS +
"EXISTS (SELECT 1 FROM E012FAM " +
"WHERE " + VSTABELA05 + "." + VSCAMPO05 + " = " + VSVALOR05 +
" AND E012FAM.CODEMP = E075PRO.CODEMP" +
" AND E012FAM.CODFAM = E075PRO.CODFAM)";
fim;
fim;
EstaNulo(VSVALOR06, VALORNULO);
se ((VSPERSON06 = "S") E (VALORNULO = 0))
inicio
se (VSTIPO06 = "STRING")
VSVALOR06 = "'" + VSVALOR06 + "'";
se ((VSTABELA06 = "E075PRO") OU (VSTABELA06 = "E075DER"))
VFILTROAND = VFILTROAND + VSTABELA06 + "." + VSCAMPO06 + " = " + VSVALOR06;
fim;
@ Exemplo de uma comparação diferenciada ( > )@
EstaNulo(VSVALOR07, VALORNULO);
se ((VSPERSON07 = "S") E (VALORNULO = 0))
inicio
se (VSTIPO07 = "STRING")
VSVALOR07 = "'" + VSVALOR07 + "'";
se ((VSTABELA07 = "E075PRO") OU (VSTABELA07 = "E075DER"))
inicio
EstaNulo(VFILTROAND, VALORNULO);
se (VALORNULO = 0)
VFILTROAND = VFILTROAND + " AND ";
VFILTROAND = VFILTROAND + VSTABELA07 + "." + VSCAMPO07 + " > " + VSVALOR07;
fim;
fim;
/*
Outro exemplo de montagem de cláusula EXISTS.
Usada a variável de cliente disponibilizada quando a tela é chamada pelo pedido
*/
EstaNulo(VSVALOR08, VALORNULO);
se ((VSPERSON08 = "S") E (VALORNULO = 0))
inicio
se (VSTABELA08 = "E075PPC")
inicio
IntParaAlfa(VSCodCli, VCodCli);
EstaNulo(VFILTROEXISTS, VALORNULO);
se (VALORNULO = 0)
VFILTROEXISTS = VFILTROEXISTS + " AND ";
VFILTROEXISTS = VFILTROEXISTS +
"EXISTS (SELECT 1 FROM E075PPC " +
"WHERE " + VSTABELA08 + "." + VSCAMPO08 + " = " + VSVALOR08 +
" AND E075PPC.CODEMP = E075PRO.CODEMP" +
" AND E075PPC.CODPRO = E075PRO.CODPRO" +
" AND E075PPC.CODCLI = " + VCODCLI + ")";
fim;
fim;
@ Concatena os comandos @
VSFILTROSQL = VFILTROAND;
EstaNulo(VSFILTROSQL, VALORNULO);
se (VALORNULO = 0)
inicio
EstaNulo(VFILTROEXISTS, VALORNULO);
se (VALORNULO = 0)
VSFILTROSQL = VSFILTROSQL + " AND " + VFILTROEXISTS;
fim;
senao
VSFILTROSQL = VFILTROEXISTS;
Variáveis Disponibilizadas:
Nome | Tipo | Observações | Retorna Valor |
---|---|---|---|
VSVALOR01 | ALFA | Valor do campo 01 para montar o filtro | N |
VSVALOR02 | ALFA | Valor do campo 02 para montar o filtro | N |
VSVALOR03 | ALFA | Valor do campo 03 para montar o filtro | N |
VSVALOR04 | ALFA | Valor do campo 04 para montar o filtro | N |
VSVALOR05 | ALFA | Valor do campo 05 para montar o filtro | N |
VSVALOR06 | ALFA | Valor do campo 06 para montar o filtro | N |
VSVALOR07 | ALFA | Valor do campo 07 para montar o filtro | N |
VSVALOR08 | ALFA | Valor do campo 08 para montar o filtro | N |
VSCAMPO01 | ALFA | Nome do campo 01 | N |
VSCAMPO02 | ALFA | Nome do campo 02 | N |
VSCAMPO03 | ALFA | Nome do campo 03 | N |
VSCAMPO04 | ALFA | Nome do campo 04 | N |
VSCAMPO05 | ALFA | Nome do campo 05 | N |
VSCAMPO06 | ALFA | Nome do campo 06 | N |
VSCAMPO07 | ALFA | Nome do campo 07 | N |
VSCAMPO08 | ALFA | Nome do campo 08 | N |
VSTIPO01 | ALFA | Indica o tipo do campo 01 | N |
VSTIPO02 | ALFA | Indica o tipo do campo 02 | N |
VSTIPO03 | ALFA | Indica o tipo do campo 03 | N |
VSTIPO04 | ALFA | Indica o tipo do campo 04 | N |
VSTIPO05 | ALFA | Indica o tipo do campo 07 | N |
VSTIPO06 | ALFA | Indica o tipo do campo 06 | N |
VSTIPO07 | ALFA | Indica o tipo do campo 07 | N |
VSTIPO08 | ALFA | Indica o tipo do campo 08 | N |
VSTABELA01 | ALFA | Indica a que tabela o campo 01 pertence | N |
VSTABELA02 | ALFA | Indica a que tabela o campo 02 pertence | N |
VSTABELA03 | ALFA | Indica a que tabela o campo 03 pertence | N |
VSTABELA04 | ALFA | Indica a que tabela o campo 04 pertence | N |
VSTABELA05 | ALFA | Indica a que tabela o campo 05 pertence | N |
VSTABELA06 | ALFA | Indica a que tabela o campo 06 pertence | N |
VSTABELA07 | ALFA | Indica a que tabela o campo 07 pertence | N |
VSTABELA08 | ALFA | Indica a que tabela o campo 08 pertence | N |
VSPERSON01 | ALFA | Indica se o conteúdo do campo 01 deve montar o filtro personalizado | N |
VSPERSON02 | ALFA | Indica se o conteúdo do campo 02 deve montar o filtro personalizado | N |
VSPERSON03 | ALFA | Indica se o conteúdo do campo 03 deve montar o filtro personalizado | N |
VSPERSON04 | ALFA | Indica se o conteúdo do campo 04 deve montar o filtro personalizado | N |
VSPERSON05 | ALFA | Indica se o conteúdo do campo 08 deve montar o filtro personalizado | N |
VSPERSON06 | ALFA | Indica se o conteúdo do campo 08 deve montar o filtro personalizado | N |
VSPERSON07 | ALFA | Indica se o conteúdo do campo 08 deve montar o filtro personalizado | N |
VSPERSON08 | ALFA | Indica se o conteúdo do campo 08 deve montar o filtro personalizado | N |
VSCODCLI | NÚMERO | Código do cliente do pedido (quando a tela F075EPP é chamada das rotinas de pedido) | N |
VSFILTROSQL | ALFA | Retorna o filtro personalizado em forma de comando SQL | S |
VSFiltroSqlEstoque | ALFA | Define o filtro para o depósito no estoque E210EST | S |
VSFiltroSqlEstoqueOC | ALFA | Define o filtro do depósito para quantidade aberta na ordem de compra E420IPO | S |
VSVALOR09 | ALFA | Valor do campo 09 para montar o filtro | S |
VSCAMPO09 | ALFA | Nome do campo 09 | S |
VSTIPO09 | ALFA | Indica o tipo do campo 09 | S |
VSTABELA09 | ALFA | Indica a que tabela o campo 09 pertence | S |
VSPERSON09 | ALFA | Indica se o conteúdo do campo 09 deve montar o filtro personalizado | S |
VSVALOR10 | ALFA | Valor do campo 10 para montar o filtro | S |
VSCAMPO10 | ALFA | Nome do campo 10 | S |
VSTIPO10 | ALFA | Indica o tipo do campo 10 | S |
VSTABELA10 | ALFA | Indica a que tabela o campo 10 pertence | S |
VSPERSON10 | ALFA | Indica se o conteúdo do campo 10 deve montar o filtro personalizado | S |
VSConsFiltroEst | ALFA | Indica se considera o filtro de depósito no cálculo do estoque disponível para os produtos | S |
Atenção
Caso o parâmetro global LisVarReg esteja habilitado, a variável ListaVariaveis estará disponível em todos os identificadores de regras do sistema. O conteúdo desta variável lista os campos disponibilizados no identificador de regras em questão.
Não é aconselhada a ativação desse parâmetro global para o uso cotidiano. Esse recurso de listagem dos campos de identificadores auxilia a construção de regras e o Suporte para, por exemplo, depuração ou quando não houver acesso à documentação dos identificadores de regras.