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.

Este artigo ajudou você?