Nesse vídeo demonstraremos a utilização da função ExistCpo, que valida se uma chave de registro existe em outra tabela, ideal para validar por exemplo, se o usuário esta digitando um código válido de cliente, produto, fornecedor, etc em algum relatório ou tela.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zExe158 Verifica se a chave dos campos existe em outra tabela @type Function @author Atilio @since 18/12/2022 @see https://tdn.totvs.com/pages/viewpage.action?pageId=24346640 @obs Função ExistCpo Parâmetros + Alias , Caractere , Nome da tabela a ser verificada + Expressao , Caractere , Conteúdo dos campos a ser verificado + Indice , Numérico , Número do índice a ser verificado Retorno Retorna .T. se já existir ou .F. se o registro não existir **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao **** /*/ User Function zExe158() Local aArea := FWGetArea() Local cCodigo := "C00001" Local cLoja := "01" //Verifica se já existe na tabela essa informação If ExistCpo("SA1", cCodigo + cLoja, 1) FWAlertSuccess("Cliente verificado com sucesso!", "Teste ExistCpo") Else FWAlertError("Cliente não encontrado!", "Teste ExistCpo") EndIf FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Bom dia Dan, tudo na paz?
Tento utilizar essa função para validar se um registro existe, mas acabo por desenvolver um fonte apenas para isso, pois na maioria das vezes não funciona. Por exemplo, recentemente estava utilizanod a MATA093 e fiz uma alteração na BQ_ID para utilizar uma pesquisa padrão na tabela CZB trazendo como retorno o CZB_CDAB, então coloquei o ExistCPO(“CZB”,FWxFilial(“CZB”)+FWFldGet(“BQ_ID”),1) no campo de validação de usuário. Ambos os campos (BQ_ID e CZB_CDAB) possuem 10 caracteres, mas mesmo utilizando o F3 para selecionar um registro um Help do RENOIS é mostrado informando que o registro não existe na CZB e invalidando a seleção ou digitação. Fiz um teste susbstituindo o ExistCPO por !Empty(Posicione(“CZB”,1,FWxFilial(“CZB”)+M->BQ_ID,”CZB_NMAB”)) e funcionou, ou seja, a mesma chave de pesquisa. Fiz um outro teste e gerei o fonte U_TSTFILE() e coloquei na validação. Nele eu coloquei as seguintes linhas:
local lRet := .f.
local cNome as character
if ExistCPO(“CZB”,FWxFilial(“CZB”)+M->BQ_ID,1)
lRet := .t.
else
Help(NIL, NIL, FunName(), NIL, “Atributo nao encontrado”, 1, 0, NIL, NIL, NIL, NIL, NIL, { “Informe um atributo valido ou utilize a pesquisa (F3)” })
endif
cNome := Posicione(“CZB”,1,FWxFilial(“CZB”)+M->BQ_ID,”CZB_NMAB”)
if Empty(cNome)
Help(NIL, NIL, FunName(), NIL, “Atributo nao encontrado”, 1, 0, NIL, NIL, NIL, NIL, NIL, { “Informe um atributo valido ou utilize a pesquisa (F3)” })
else
lRet := .t.
endif
Sendo que no ExistCPO sempre mostra o Help e no Posicione sempre retornar .T.
Saberia dizer porquê isso ocorre?
Grande abraço e obrigado pelos seus excelentes conteúdos!
Bom dia Rafael, tudo joia graças a Deus e você?
Opa, agradecemos pelo carinho e comentário.
No caso, a expressão passada dentro do ExistCPO, não pode ser enviado a informação de filial.
Por exemplo, supondo que eu fosse validar se o produto na SB1 de código “A0001” existisse, ao invés de:
Ficaria:
Então faça um teste, remova a filial que está passando no ExistCPO e veja se o comportamento muda.
Ficamos no aguardo.
Tenha uma ótima e abençoada terça feira.
Um grande abraço.
Era isso mesmo Dan, obrigado pelo retorno! Grande abraço e que Deus te abençoe em nome de Jesus.
Bom dia Rafael, tudo joia?
Amém meu irmão.
Obrigado pelo feedback. Fico feliz que tenha dado certo.
Tenha uma ótima e abençoada sexta feira.
Um forte abraço.