Postagem em destaque
- Gerar link
- X
- Outros aplicativos
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())) |
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.
e chamá-la no filtro da consulta SXB como:
@#U_E2FastFilter() |
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_ |
Dica: consulte a tabela SXB e verifique outras formas de definir filtro utilizando “@”.
Para obter os exemplos que utilizados no “post” clique aqui.
[]s
иαldσ dj
- Gerar link
- X
- Outros aplicativos
Comentários
Postagens mais visitadas
BlackTDN :: RLeg ~ Desvendando a Função ParamBox
- Gerar link
- X
- Outros aplicativos
Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login
- Gerar link
- X
- Outros aplicativos
Boa,
ResponderExcluirpq isso nao funciona na dbsetfilter, ou filbrowse?
ResponderExcluirPorque a forma de chamada é diferente. Para melhores detalhes e exemplos Consulte o "Post" :: Protheus :: Advpl :: Otimizando o Filtro de Browse com @
ResponderExcluir(http://naldodjblogs.blogspot.com/2011/09/protheus-advpl-otimizando-o-filtro-de.html)
Puts, vlw cara..
ResponderExcluirtinha me esquecido desse exemplo e olha que nesse link que vc passou fiz uma pergunta sobre a SXB.
Valeu.
No Browse tem a opção filtro, salvar, Limpar...Onde ficam salvos os filtros ???
ResponderExcluirTem 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...
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.
ExcluirValeu Naldo, muito obrigado...
Excluiré parecido com uma query isso, tem como fazer relação com outra tabela?
ResponderExcluirparece uma query isso, tem como relacionar duas tabelas?
ResponderExcluirSeria interessante se pudesse relacionar com outras tabelas !! Valeu, Naldo! Abraços!!
ResponderExcluirNaldo 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???
ResponderExcluirCordialmente,
John L
Naldo,
ResponderExcluirExiste 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
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.
ExcluirVale 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.
Sanches,
ExcluirConsultando 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.
Bom dia Naldo,
ResponderExcluirUma dúvida simples, qual seria o nome da função que chama a tela de construtor de expressões?
Obrigado,
Ruann Carlos
http://www.blacktdn.com.br/2012/09/fwfilter-linha-microsiga-protheus-tdn.html
ExcluirEstou tentado montar um filtro com um JOIN de outra tabela, exemplo:
ResponderExcluirSA2->A2_COD IN (COD. FORNECEDOR QUE ESTA EM OUTRA TABELA)
Tentei com OR loopando todos os códigos, mas também não deu, excedeu 2000 bytes
Alguém poderia ajudar?
Obrigado!
Usei o operador $ e deu certo!
ResponderExcluirPessoal, Sobre o assunto filtro, preciso criar um filtro obrigatório para o usuário, exemplo: usuário vai acessar a rotina, sempre que ele abrir, o filtro é executado sem ele pode alterar.
ResponderExcluir