Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

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

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
  11. Estou tentado montar um filtro com um JOIN de outra tabela, exemplo:
    SA2->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!

    ResponderExcluir
  12. Pessoal, 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

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA