Á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/6062824/tecnologia.css

Pagetitle
DBSetFilter
DBSetFilter

...

Nome

Tipo

Descrição

Obrigatório

Referência

bCond

bloco de código

Bloco de

código AdvPL

código 

Inclusão de trecho
advpl
advpl
nopaneltrue
avaliado para determinar a visibilidade dos registros.

X

 


cCond

caractere

Condição de filtro expressada no bloco de código como string.

X

 


Retorno

Nome

Tipo

Descrição

uRet

nil

Retorno sempre é nulo.

...

A função DBSetFilter() é chamada internamente a partir do comando SET FILTER TO <cExp>. A utilização deste comando recebe a expressão AdvPL expressão 

Inclusão de trecho
advpl
advpl
nopaneltrue
de filtro, e na pré-compilação do código-fonte AdvPLfonte 
Inclusão de trecho
advpl
advpl
nopaneltrue
, realiza a chamada explícita da função DBSetFilter() com o bloco de código montado a partir da condição informada. A utilização do comando SET FILTER TO torna a codificação mais simples e legível, mesmo que internamente o resultado seja o mesmo.

...

O contexto de execução de filtros AdvPL filtros 

Inclusão de trecho
advpl
advpl
nopaneltrue
em sua origem é independente de RDD, e por se tratar de um comportamento da linguagem, a expressão de filtro é avaliada pelo servidor de aplicação (Application Server
Inclusão de trecho
application server
application server
nopaneltrue
), na execução das instruções de movimentação de ponteiro de registro. Quando utilizada uma arquitetura client/server de banco de dados (como por exemplo ADS Server, c-tree Server , TOPConnect, DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
), isto torna necessária a leitura dos registros no banco de dados e o tráfego dos registros para a avaliação da expressão de filtro no Application Server
Inclusão de trecho
application server
application server
nopaneltrue
, onde está sendo executado o programa AdvPL programa 
Inclusão de trecho
advpl
advpl
nopaneltrue
que definiu o filtro.

A linguagem AdvPL linguagem 

Inclusão de trecho
advpl
advpl
nopaneltrue
possui otimizações para atender a determinadas condições de filtro, onde o filtro é aplicado total ou parcialmente diretamente na aplicação servidora de banco de dados, sendo mais eficiente, performático e eliminando o overhead de rede gerado pelo tráfego de registros. Em linhas gerais, tabelas utilizando uma RDD com componentes client/server (ADS Server, c-tree Server e/ou DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
) executam a expressão de filtro na íntegra diretamente na aplicação servidora de banco, desde que o filtro não faça uso de nenhuma função da linguagem AdvPL
Inclusão de trecho
advpl
advpl
nopaneltrue
, mesmo que função básica e/ou nativa da linguagem, e utilize apenas os operadores binários > (maior), >= (maior ou igual), < (menor), <= (menor ou igual), <> ou != (diferente) e = (igual), e expressões lógicas com os operadores .AND., .OR. e/ou .NOT., e devem preferencialmente utilizar na condição de filtro campos da tabela que façam parte da ordem de índice em uso no momento.

...

Ambos os engines suportam o uso de funções básicas da linguagem AdvPL linguagem 

Inclusão de trecho
advpl
advpl
nopaneltrue
na montagem da expressão de filtro, e executam de modo nativo o filtro na aplicação servidora. Funções como AllTrim(), DToS(), Left(), Right(), operador $ (contido em), Str(), StrZero() e afins são tratadas diretamente pelo ADS Server e/ou c-tree Server. Englobam os acessos realizados através das seguintes RDDs sob as seguintes condições:

  • RDD DBFCDX - em ambiente configurado com LocalFiles=CTREE, utilizando um c-tree Server para controle dos dicionários.
  • RDD DBFCDXAX - em ambiente configurado para base de dados principal com ADS Server e repositório ADS (RpoDb=ADS).
  • RDD CTREECDX - em ambiente configurado para base de dados principal com c-tree Server e repositorio repositório c-tree (RPODB=CTREE).

Filtros em tabelas utilizando

...

Inclusão de trecho
dbaccess
dbaccess
nopaneltrue

Através do DBAccess

Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
, criamos e acessamos tabelas em bancos de dados relacionais usando a RDD TOPCONN, em diversos bancos de dados homologados. As funcionalidades extendidas estendidas de filtro, como suporte a algumas funções básicas da linguagem AdvPL foram implementadas no DBAccess linguagem 
Inclusão de trecho
advpl
advpl
nopaneltrue
foram implementadas no 
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
de forma diferenciada para cada banco de dados, de acordo com os recursos disponíveis nos bancos, capazes de prover ou emular o comportamento original de um filtro AdvPL
Inclusão de trecho
advpl
advpl
nopaneltrue
.

Quando setada uma expressão de filtro em uma tabela acessada pela RDD TOPCONN, através de um programa AdvPL

Inclusão de trecho
advpl
advpl
nopaneltrue
, caso existam comparações suportadas e não suportadas na mesma expressão, o DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
faz uma redução do filtro, tentando aproveitar todas as partes da expressão suportadas, para filtrar o que for possível através das queries de busca de dados do DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
, e minimizar tráfego de rede e recuperação desnecessária de registros. Qualquer condição não suportada pelo DBAccess pelo 
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
e enviada a ele resultará em uma comparação sempre verdadeira considerando o primeiro campo da tabela (no ERP, em geral é o campo _FILIAL).

Observe, a seguir, o suporte para funções AdvPL funções 

Inclusão de trecho
advpl
advpl
nopaneltrue
em filtro implementado no DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
:

Funções

AdvPL

Inclusão de trecho
advpl
advpl
nopaneltrue
/Banco

Microsoft SQLOracle

Oracle</div>

IBM DB2

Informix

Sybase

PostgreSQL

DB2</div>

Informix</div>

Sybase</div>

PostgreSQL</div>

MySQL</div>MySQL

$ (operador)

SIM

SIM

SIM

SIM

SIM

SIM

SIM

AllTrim()

SIM

SIM

SIM

SIM

NÃO

NÃO

NÃO

ASC()

SIM

SIM

SIM

NÃO

NÃO

NÃO

NÃO

CHR()

SIM

SIM

NÃO

NÃO

NÃO

NÃO

NÃO

DToS (cpo)

SIM

SIM

SIM

SIM

SIM

SIM

SIM

Empty()

SIM

SIM

SIM

SIM

NÃO

SIM

NÃO

Left()

SIM

SIM

SIM

NÃO

NÃO

NÃO

NÃO

Len()

NÃO

SIM

SIM

SIM

NÃO

NÃO

NÃO

Lower()

SIM

SIM

SIM

SIM

NÃO

SIM

NÃO

Right()

SIM

NÃO

SIM

NÃO

NÃO

NÃO

NÃO

Space()

SIM

SIM

SIM

NÃO

NÃO

NÃO

NÃO

StrTran()

SIM

SIM

SIM

SIM

NÃO

SIM

NÃO

SubStr(s,n,n)

SIM

SIM

SIM

SIM

SIM

SIM

SIM

Upper()

SIM

SIM

SIM

SIM

NÃO

SIM

NÃO

As únicas funcionalidades suportadas de modo nativo ao aplicar um filtro AdvPL filtro 

Inclusão de trecho
advpl
advpl
nopaneltrue
em todos os bancos de dados são: DToS (campo) -> Onde a expressão é removida, pois o DBAccess
Inclusão de trecho
dbaccess
dbaccess
nopaneltrue
grava um campo “D” Data do AdvPL do 
Inclusão de trecho
advpl
advpl
nopaneltrue
no banco como string, no formato “AAAAMMDD”, SubStr(campo ,nStart ,nLen) , e o operador $ (contido em expressão string). Quaisquer outras funções utilizadas em uma condição de filtro serão avaliadas no servidor de aplicação (TOTVS/ByYou Application Server
Inclusão de trecho
application server
application server
nopaneltrue
).

Exemplos
 

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
FUNCTIONfunction insert()

  Local cT1 := "T1"
  Local idx := 0
  Local name := ""
  Local tp := ""
  Local age := "2"
  
  DBUseArea(.F., 'TOPCONN', cT1, (cT1), .F., .F.)
  WHILE (idx <= 5)
  
  name += "BA"
  tp += "T"
  age += "2"
  
  (cT1)->( DBAppend( .F. ) )
  (cT1)->FIELD_NAME := name
  (cT1)->FIELD_TYPE := tp
  (cT1)->FIELD_AGE := age
  (cT1)->( DBCommit() )
  
  idx++
  ENDDO
  DBCloseArea()
  
return

FUNCTIONfunction Exampleexample()
  Locallocal cT1 := "T1"
  
  TCLink()
  
  DBCreate("T1", {{"FIELD_NAME", "C", 10, 0}, ;
                  {"FIELD_TYPE", "C", 10, 0}, ;
                  {"FIELD_AGE", "C", 10, 0}, ;
                  {"FIELD_NICK", "C", 10, 0}, ;
                  {"FIELD_COL", "C", 10, 0}}, "TOPCONN")
                  
  U_insert()
  
  DBUseArea(.F., 'TOPCONN', cT1, (cT1), .F., .T.)
  
  (cT1)->(DbSetFilter( { || leftLeft( FIELD_NAME, 4 ) = "BABA" }, "'Left(FIELD_NAME=ABAB"), 4) = "BABA"' ) )
  
  (cT1)->(DBGoTop())
                  
  IF ((cT1)->FIELD_AGE == "222       ")
    conout("Found!")
  ENDIF
  
  DBCloseArea()
  
  TCUnlink()
RETURNreturn

Veja também