Validando se um registro existe em outra tabela com ExistCpo – Maratona AdvPL e TL++ 158

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. RAFAEL CONDIDORIO disse:

    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:

      ExistCPO("SB1", FWxFilial("SB1") + "A0001", 1)
      

      Ficaria:

      ExistCPO("SB1", "A0001", 1)
      

      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.

Deixe uma resposta

Terminal de Informação