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?
- Vamos criar um campo no cadastro de Produtos, com o nome B1_X_TESTE, ele vai ser real
- Na primeira aba, na Picture Variável, iremos colocar uma função nossa, chamada u_zTstPict()
- 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
- 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
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.
Muito bom dia!
Primeiramente obrigado pelos posts são muito legais.
Duvida: Porque você concatena com “%C” ?
Bom dia Lucas, tudo joia?
Obrigado pelo feedback.
É uma tratativa interna da aplicação para o funcionamento correto, similar a usar % nas expressões de filtro do Embedded Query (BeginSQL / EndSQL).
Em um exemplo da TOTVS, eles também usam o %C, segue o link: https://centraldeatendimento.totvs.com/hc/pt-br/articles/360036874754-Cross-Segmento-TOTVS-Backoffice-Linha-Protheus-ADVPL-Mascara-customizada
Abraços.
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.
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:
Fazendo isso, nos avise se deu certo ou se o problema persistiu.
Tenha uma ótima e abençoada sexta feira.
Um grande abraço.
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.
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:
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.