Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Composition Setup
import.css=/download/attachments/327912/newLayout.css

...

Boas práticas de filtro AdvPL com DBAccess

Evite a utilização de

...

funções em filtros.

...

Monte a expressão de filtro utilizando operadores relacionais e lógicos baseados nas informações do banco de dados do modo mais direto possível.

Ao invés de:

Bloco de código
languagecpp
titleAo invés
User Function IsValid( cTipo )
If cTipo = 
“1”
"1" 
Return .t.
EndifIf

Endif
If cTipo = 
“F”
"F" 
Return .t.
EndifReturn

Endif
Return .f.

User Function MyFiltro()
(
...)
DbSelectarea(
“TMP”
"TMP")
SET FILTER TO GRUPO = 
“0001”
"0001" .and. U_IsValid(TIPO)
(
...)

 

Utilize:

Bloco de código
languagecpp
titleUtilizar
(
...)
DbSelectarea(
“TMP”
"TMP")
SET FILTER TO GRUPO = 
“0001”
"0001" .and. ( TIPO = 
“1”
"1" .or. TIPO = 
“F”
"F")
(
...)

 

Observe que neste exemplo, somente foi possível adotar a conversão proposta, pois não havia nenhuma outra regra na função AdvPL U_IsValid() que usava outro fator a não ser uma comparação direta com um valor da tabela.

Importante

Evite realizar concatenação de campos na expressão de filtro. A operação de concatenação de campos não é suportada pelo DBAccess e pelo banco de dados, pois existe a necessidade implícita do filtro manter o comportamento original do AdvPL, e cada banco de dados possui suas características quando efetuadas concatenações entre campos char e/ou varchar e colunas calculadas.

Ao invés de:

Bloco de código
languagecpp
titleAo invés
SET FILTER TO CPOC1 + CPOC2 = M->VAR1 + M_VAR2

Utilizar :

Bloco de código
languagecpp
titleUtilizar
SET FILTER TO CPOC1 = M->VAR1 
.AND. 
CPOC2 = M->VAR2

 

Partindo da premissa que o tamanho dos campos e das variáveis de memória são os mesmos. Caso não sejam, eles podem ser adequados para que a comparação seja sempre de 1 para 1 entre os campos. No exemplo acima, tomando por base que CPOC1 é do tipo caractere, tamanho 6, e CPOC2 também é caractere, tamanho 4, e uma determinada funcionalidade fornece em uma variável de

...

memória única uma chave de 10 bytes, onde os 6 primeiros correspondem à chave CPOC1 e os 4 restantes correspondem ao CPOC2:

Ao invés de:

Bloco de código
languagecpp
titleAo invés
SET FILTER TO CPOC1 + CPOC2 = M->VARCHAVE

Utilizar :

Bloco de código
languagecpp
titleUtilizar
cFiltro := 'CPOC1 = "'+left(M->VARCHAVE,6)+'" .AND. CPOC2 = "'+substr(M->VARCHAVE,7,4)+'"'


SET FILTER TO &cFiltro.

 

Importante

Neste exemplo, criamos uma string que contém a expressão de filtro, onde trocamos os valores das variáveis de memória por constantes, para que seja possível resolver o filtro no banco de dados enviando as expressões literais já resolvidas, para não passar desnecessariamente funções para o filtro.

 

A única excessão é a função DTOS(): Quando enviada ao DBAccess, onde o conteúdo da função é um campo do tipo

...

"D" Date, na

...

linguagem AdvPL, a função é internamente removida, pois no DBAccess o campo já é gravado como string no formato

...

"AAAAMMDD". Logo, um filtro com a expressão

...

"DTOS( CAMPO ) == ‘

...

20100101’" é

...

realizado pelo DBAccess

...

uma otimização para gerar uma expressão SQL solúvel no SGDB.