Como fazer uma picture variável num campo do Protheus

No artigo de hoje, vou demonstrar duas formas de criar campo com Picture Variável no Protheus.

Algumas vezes, precisamos criar um campo, onde a máscara dele, vai depender da informação de outro campo, como o exemplo mais famoso no cadastro de clientes e fornecedores, onde se o cliente for pessoa física, o campo CGC usará a máscara do CPF, senão usará do CNPJ.

Mas como podemos fazer isso em nossas customizações?

  1. Vamos criar um campo no cadastro de Produtos, com o nome B1_X_TESTE, ele vai ser real
  2. Na primeira aba, na Picture Variável, iremos colocar uma função nossa, chamada u_zTstPict()

Criação do campo

  1. Nessa nossa função, iremos validar o Tipo colocado, se ele for PA, será uma máscara com 6 caracteres, se for PI com 4 caracteres, se for MP com 8 caracteres, senão será uma máscara default
  2. Agora ao preencher o campo B1_TIPO, ele automaticamente vai alterar a máscara do nosso campo B1_X_TESTE, abaixo um print de cada exemplo possível conforme função acima

4 Exemplos de máscaras

Abaixo o código fonte desenvolvido para o exemplo acima:

//Bibliotecas
#Include "TOTVS.ch"
 
/*/{Protheus.doc} User Function zTstPict
Teste de Picture de Campo
@type  Function
@author Atilio
@since 27/07/2022
/*/
 
User Function zTstPict()
    Local aArea    := FWGetArea()
    Local cMascara := ""
    Local cTipo    := FWFldGet("B1_TIPO")
 
    //Se for Produto Acabado
    If cTipo == "PA"
        cMascara := "@R 999999"
 
    //Se for Produto Intermediário
    ElseIf cTipo == "PI"
        cMascara := "@R 9999"
 
    //Se for Matéria Prima
    ElseIf cTipo == "MP"
        cMascara := "@R 99999999"
 
    //Senão
    Else
        cMascara := "@R 9999999999"
    EndIf
    cMascara += "%C"
 
    FWRestArea(aArea)
Return cMascara

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.

10 Responses

  1. Lucas Lopez disse:

    Muito bom dia!

    Primeiramente obrigado pelos posts são muito legais.

    Duvida: Porque você concatena com “%C” ?

  2. Carlos da Mata disse:

    Ola Daniel,

    Fiz o exemplo acima porém no meu caso está dando erro quando acesso a rotina de cadastro de produtos. E apresentado o erro:

    Called from U_ZTSTPICT(ZTSTPICT.PRW) 18/03/2025 10:38:59 line : 21
    Called from _FWMBPICTVAR(FWMBROWSE.PRW) 17/05/2024 16:58:37 line : 3122
    Called from FWSX3PICTUREUTIL:GETPICTUREBLOCKVAR(FWSX3PICTUREUTIL.PRW) 17/05/2024 16:58:37 line : 62
    Called from {|| FWSX3PICTUREUTIL():GETPICTUREBLOCKVAR(‘SB1’, ‘U_ZTSTPICT() ‘ , ‘ ‘ , ” ) }(FWMBROWSE.PRW) 17/05/2024 16:58:37 line : 1910
    Called from FWBRWCOLUMN:GETPICTURE(FWBRWCOLUMN.PRW) 17/05/2024 16:58:37 line : 478
    Called from FWBRWMODELCONFIG:GETDEFAULTS(FWBRWMODELCONFIG.PRW) 17/05/2024 16:58:37 line : 963
    Called from FWBROWSE:LOADCONFIG(FWBROWSE.PRW) 17/05/2024 16:58:37 line : 6813
    Called from FWBROWSE:ACTIVATE(FWBROWSE.PRW) 17/05/2024 16:58:37 line : 979
    Called from FWFORMBROWSE:ACTIVATE(FWFORMBROWSE.PRW) 17/05/2024 16:58:37 line : 429
    Called from FWMBROWSE:ACTIVATE(FWMBROWSE.PRW) 17/05/2024 16:58:37 line : 653
    Called from MATA010M(MATA010M.PRX) 26/09/2023 11:53:41 line : 76
    Called from MATA010(MATA010.PRX) 06/09/2023 16:09:34 line : 96
    Called from __EXECUTE(APLIB090.PRW) 17/05/2024 16:58:37 line : 735
    Called from MDIEXECUTE(APLIB260.PRW) 17/05/2024 16:58:37 line : 924

    O que pode ser.

    Grato

    Carlos da Mata

    • Bom dia Carlos, tudo joia?

      Acho que cortou o começo do error log, esta aparecendo apenas a pilha de chamadas.

      Qual erro que apareceu? (Type mismatch, invalid field name in alias, etc)

      Fico no aguardo.

      Tenha uma ótima e abençoada quarta feira.

      Um grande abraço.

      • Carlos da Mata disse:

        Bom dia Daniel,

        O erro que apresenta é stack depth overflow in function FWRETFLAV on FWRETFLAV(FWFLAVOUR.PRW).

        O erro ocorre ao acessar a tela de cadastro de Produtos.

        Muito Obrigado!

        Carlos da Mata

        • Bom dia Carlos, tudo joia?

          Que estranho, não cheguei a pegar esse erro, mas faz um teste, tenta resumir a função e deixar uma máscara chumbada, exemplo:

          User Function zTstPict()
              Local aArea    := FWGetArea()
              Local cMascara := ""
            
              cMascara := "@R 999999"
              cMascara += "%C"
            
              FWRestArea(aArea)
          Return cMascara
          

          Fazendo isso, nos avise se deu certo ou se o problema persistiu.

          Tenha uma ótima e abençoada sexta feira.

          Um grande abraço.

  3. cdamatta disse:

    Daniel,

    Bom dia!

    Fiz o teste conforme o exemplo enviado e neste caso não deu erro. O que pode estar ocasionando o problema?

    Grato!

    • Bom dia, tudo joia?

      Pode ser a FWFldGet que esteja ocasionando isso.

      O que você pode fazer para isolar o problema, é ir adicionando trecho a trecho e testando até começar a dar o erro, pra ver se é alguma função ou algum trecho.

      Ai fazendo isso, nos dê o feedback.

      Tenha uma ótima e abençoada quarta feira.

      Um forte abraço.

  4. cdamatta disse:

    Prezado Daniel,

    Boa tarde.

    Primeiramente obrigado pela ajuda. Fiz o teste aqui e o erro está ocorrendo no trecho “Local cTipo := FWFldGet(“B1_TIPO”)”.

    Na verdade usei seu exemplo pois estou implementando alguns novos campos na SA2. Nossa auditoria solicitou que no cadastro de fornecedores fosse possível incluir os dados do Quadro Societário da empresa. Seria Nome Socio, Tipo(F/J),CPF/CGC, Percentual Participação. Até ai tudo bem, criei um nova aba na SA2 chamada “Quadro Societ.” e inclui os referidos campos, que poderá ser até 10 sócios. Queria um forma de formatar o campo CPF/CGC para que, quando o sócio for pessoa física ficar no formato 999.999.999-99 e quando for Jurídica, 99.999.999/9999-99. Só que estou me deparando com este erro no FWFldGet. Alguma sugestão?

    Obrigado!

    • Bom dia, tudo joia?

      Certo, esse trecho em específico é para buscar o valor do campo B1_TIPO através da função FWFldGet.

      No seu cenário, como é cadastro de fornecedores, tente fazer um teste usando o campo A2_TIPO, ai se não funcionar, tente M-> ao invés de FWFldGet, então seria:

      //Teste #1
      Local cTipo := FWFldGet("A2_TIPO")
      
      //Se não funcionar o teste acima, Teste #2
      Local cTipo := M->A2_TIPO
      

      Tenha uma ótima e abençoada quinta feira.

      Um forte abraço.

Deixe uma resposta

Terminal de Informação