BlackTDN Search

terça-feira, 11 de outubro de 2011

Protheus :: Advpl :: Otimização de Filtro na Consulta SXB

As consultas SXB, que possuem filtros, poderão ser otimizadas se reescritas utilizando o Filtro “@”. Um exemplo pratico poderá ser visto abaixo.

Supondo que criamos uma consulta para a Tabela SE2 em que o filtro seja: Data de emissão entre o primeiro e último dia do ano corrente.

DTOS(E2_EMISSAO)>=Dtos(FirstYDate(MsDate())) .AND. DTOS(E2_EMISSAO)<=Dtos(LastYDate(MsDate()))

image

Ao executar-mos a cosulta SXB a expressão acima será avaliada para cada registro da tabela SE2. No meu caso o dbaccess executou 2184 consultas ao SGBD para retornar os registros que atendiam a condição de filtro (2202-18) conforme trace obtido no monitor do dbaccess.

Otimizando o filtro, o I/O entre o dbaccess e o SGBD cai consideravelmente. Com a otimização o número de consultas caiu de 2184 para 813 (831-18) uma redução significativa no número de I/O. Aproximadamente  37,225274725274725274725274725275 %.

Preferi escrever a otimização da consulta através da chamada a uma função.

image

e chamá-la no filtro da consulta SXB como:

@#U_E2FastFilter()

image

Notaremos de imediato a melhoria na performance ao executar uma e/ou a outra.  Usem o Monitor do dbacces para rastrear a execução de ambas.

Quando da execução da consulta com o novo filtro o dbacces irá filtra-la conforme trace:

Set Filter to [QRYSLT('E2_EMISSAO *GE "20110101" *AND E2_EMISSAO *LE "20111231"')] on Table SE2010

retornando a consulta baseada em:

SELECT R_E_C_N_O_ FROM dbo.SE2010 WHERE D_E_L_E_T_ = ' ' AND (E2_EMISSAO >= '20110101' AND E2_EMISSAO <= '20111231') ORDER BY E2_FILIAL,E2_PREFIXO,E2_NUM,E2_PARCELA,E2_TIPO,E2_FORNECE,E2_LOJA,R_E_C_N_O_

Observem que a ordem selecionada foi:

E2_FILIAL,E2_PREFIXO,E2_NUM,E2_PARCELA,E2_TIPO,E2_FORNECE,E2_LOJA,R_E_C_N_O_

Dessa forma, se adicionarmos a Filial na Condição de Filtro otimizaremos, ainda mais, o tempo de resposta do SGBD.

Set Filter to [QRYSLT('E2_FILIAL *EQ "01" *AND E2_EMISSAO *GE "20110101" *AND E2_EMISSAO *LE "20111231"')] on Table SE2010

Resultando em:

SELECT R_E_C_N_O_ FROM dbo.SE2010 WHERE D_E_L_E_T_ = ' ' AND (E2_FILIAL = '01' AND E2_EMISSAO >= '20110101' AND E2_EMISSAO <= '20111231') ORDER BY E2_FILIAL,E2_PREFIXO,E2_NUM,E2_PARCELA,E2_TIPO,E2_FORNECE,E2_LOJA,R_E_C_N_O_

image

Dica: consulte a tabela SXB e verifique outras formas de definir filtro utilizando “@”.

image

image

Para obter os exemplos que utilizados no “post” clique aqui.

[]s

иαldσ dj

16 comentários:

  1. pq isso nao funciona na dbsetfilter, ou filbrowse?

    ResponderExcluir
  2. Porque a forma de chamada é diferente. Para melhores detalhes e exemplos Consulte o "Post" :: Protheus :: Advpl :: Otimizando o Filtro de Browse com @

    (http://naldodjblogs.blogspot.com/2011/09/protheus-advpl-otimizando-o-filtro-de.html)

    ResponderExcluir
  3. Puts, vlw cara..
    tinha me esquecido desse exemplo e olha que nesse link que vc passou fiz uma pergunta sobre a SXB.

    Valeu.

    ResponderExcluir
  4. No Browse tem a opção filtro, salvar, Limpar...Onde ficam salvos os filtros ???
    Tem como criar filtros personalizados e salva-los ? Varios Filtros pelo Status por exemplo???
    Estou precisando melhorar um filtro customizado com dbsetfilter mas esta uma "carroça".
    Me ajuda ai...

    ResponderExcluir
    Respostas
    1. O "Filtro", só é permitido 1 (pelo menos no protheus 10), é armazenado no Profile do Usuário que se encontra em pdata\profile\profile.usr. Para criar filtros personalizados e salvá-los você terá que customizar o processo e adicionar a opção no menu aRotina. Poderá continuar a salvar o Filtro no Profile do usuário usando a(s) função(ões) WriteProfDef() ou WriteNewProf() para salvar o Filtro (para saber qual usar testar com FindProfDef() ) e RetProfDef() para restaurar o Filtro.

      Excluir
    2. Valeu Naldo, muito obrigado...

      Excluir
  5. é parecido com uma query isso, tem como fazer relação com outra tabela?

    ResponderExcluir
  6. parece uma query isso, tem como relacionar duas tabelas?

    ResponderExcluir
  7. Seria interessante se pudesse relacionar com outras tabelas !! Valeu, Naldo! Abraços!!

    ResponderExcluir
  8. Naldo teria alguma forma de filtro no Protheus onde o usuário vai escrevendo a descrição e o sistema vai filtrando automaticamente a medida que ele vai digitando???

    Cordialmente,

    John L

    ResponderExcluir
  9. Naldo,
    Existe uma forma de conseguir acessar imagens armazenadas em SGBD em formato binário através do Protheus e exibi-las em tela como imagens, por exemplo, na tabela SB1?
    Por motivos de segurança a empresa em que eu trabalho não quer mais armazenar os arquivos JPEG numa pasta no servidor, como é hoje, no repositório de imagens e sim no SGBD.
    Você tem algum "case" estudado para isso?
    Abraços,
    Sanches

    ResponderExcluir
    Respostas
    1. Marcelo, até tem, o grande problema vai ser aproveitar o tratamento de imagens usando as funcionalidades atribuídas ao repositório de imagens. As imagens poderiam ser armazenadas em campo "MEMO" (BLOB) e recuperadas normalmente em campos do Tipo BITMAP no Protheus.

      Vale lembrar que o SQL Server 2008 possui o tipo de dados FILESYSTEM, que seria uma solução perfeita, mas não sei se o dbAccess (TopConnect) da suporte a isso.

      Excluir
    2. Sanches,

      Consultando o programa de Ficha de Registro (GPER460.PRX ou, o seu equivalente, FIMPFCH) verifiquei que tem uma chave, que se localizada no ini do server, irá verificar se o repositório e Local ou no SGBD. A chave é a RepositInDataBase que se estiver com o conteúdo igual a 1 irá carregar as imagens a partir da tabela protheus_reposit que possui a seguinte estrutura:

      BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,MEMO,D_E_L_E_T_,R_E_C_N_O_.

      Verifique, também, o parâmetro MV_REPOSIT, que no caso dos módulos de RH, trabalham em conjunto com a chave RepositInDataBase.

      Excluir
  10. Bom dia Naldo,

    Uma dúvida simples, qual seria o nome da função que chama a tela de construtor de expressões?

    Obrigado,

    Ruann Carlos

    ResponderExcluir
    Respostas
    1. http://www.blacktdn.com.br/2012/09/fwfilter-linha-microsiga-protheus-tdn.html

      Excluir