No artigo de hoje, vou falar um pouco sobre as funções ExistCPO e ExistChav, qual a diferença das duas e como usar nas customizações.
Ambas as funções citadas, servem para validar se um registro existe na base de dados. A diferença é que a ExistCPO valida se a informação existe em algum alias informado. Já a ExistChav, valida se a informação existe na mesma tabela posicionada.
Trazendo para um exemplo mais simples, vamos imaginar o cadastro de clientes, se você quisesse validar se o código e loja do cliente existem, enquanto o usuário está digitando, você deve usar a ExistChav, com o alias SA1 e os campos A1_COD + A1_LOJA (índice 1 padrão).
Agora, se você tiver em um pedido de venda, e quer validar se o cliente digitado existe, ai você deve utilizar a função ExistCPO, passando o alias SA1 e os campos C5_CLIENTE e C5_LOJACLI.
Resumindo então, ExistChav valida se a informação existe na mesma tabela posicionada no momento do cadastro e ExistCPO valida se a informação existe em alguma tabela buscada que não está sendo manipulada no momento.
Abaixo irei demonstrar alguns exemplos de ambas as funções.
ExistCPO
Documentação: https://tdn.totvs.com/pages/viewpage.action?pageId=24346640
//Exemplo colocando na validação do campo: ExistCPO( "SA1", &(ReadVar()) ) //Exemplo colocando na validação de uma tela em MVC (campo não está posicionado): ExistCPO( "SA1", FWFldGet("CAMPO_CLI") + FWFldGet("CAMPO_LOJ") ) //Exemplo, usando o índice 3 (CNPJ / CPF) ExistCPO( "SA1", cCampoCNPJ, 3 ) //Exemplo usando dentro de um programa em AdvPL cCodigo := "000001" cLoja := "01" If ExistCPO("SA1", cCodigo + cLoja) MsgInfo("Cliente existe!", "Atenção") Else MsgStop("Cliente não existe!", "Atenção") EndIf
ExistChav
Documentação: https://tdn.engpro.totvs.com.br/pages/viewpage.action?pageId=24346638
//Exemplo colocando na validação do campo: ExistChav( "SA1", &(ReadVar()) ) //Exemplo colocando na validação de uma tela em MVC (campo não está posicionado): ExistChav( "SA1", FWFldGet("CAMPO_CLI") + FWFldGet("CAMPO_LOJ") ) //Exemplo, usando o índice 3 (CNPJ / CPF) ExistChav( "SA1", cCampoCNPJ, 3 ) //Exemplo usando dentro de um programa em AdvPL cCodigo := "000001" cLoja := "01" If ExistChav("SA1", cCodigo + cLoja) MsgStop("Cliente não existe!", "Atenção") Else MsgInfo("Cliente já existe!", "Atenção") EndIf
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa Tarde Daniel,
Este 2 comandos substituem a utilização do dbseek?
Bom dia Wanderson, tudo joia?
Depende, se você utilizar eles direto na validação de usuário do campo (X3_VLDUSER), sim.
Agora se você for fazer em uma customização em uma User Function, ai o recomendado é usar o MsSeek devido a performance que ele traz. Abaixo alguns links de apoio:
Vídeo sobre ExistChav: https://terminaldeinformacao.com/2024/01/06/validando-se-um-registro-ja-existe-na-mesma-tabela-com-existchav-maratona-advpl-e-tl-157/
Vídeo sobre ExistCpo: https://terminaldeinformacao.com/2024/01/07/validando-se-um-registro-existe-em-outra-tabela-com-existcpo-maratona-advpl-e-tl-158/
Vídeo sobre DbSeek e MsSeek: https://terminaldeinformacao.com/2023/12/15/posicionando-em-um-registro-com-uma-expressao-atraves-de-dbseek-e-msseek-maratona-advpl-e-tl-129/
Link de apoio explicando o motivo do MsSeek ser mais performático que o DbSeek: https://terminaldeinformacao.com/2020/07/23/voce-sabia-que-o-msseek-e-mais-performatico-que-o-dbseek-em-advpl/
Um grande abraço.