Há sempre algumas dúvidas sobre Ini. Padrão e Ini. Browse, no artigo de hoje irei fazer um overview sobre o assunto.
Basicamente, temos duas opções de inicializar um campo no Protheus, a Inicialização Padrão e a Inicialização no Browse. Os alunos sempre me perguntam qual usar, então vou explicar brevemente sobre cada um deles.
Inicialização no Browse: Inicia um valor em um campo do tipo Virtual, no browse de navegação do cadastro
Inicialização Padrão: Inicia um valor em um campo do tipo Real, no momento da inclusão do valor. Ou inicia um valor em um campo do tipo Virtual em qualquer operação feita (inclusão, alteração, visualização, etc).
Então aí que entra a dúvida, se eu criei um campo, coloquei o Inicializador Padrão nele, por qual motivo ele não está “inicializando”? Pois bem jovens, se você criou o campo como Real, ele só será iniciado na inclusão, pois o conteúdo não existe ainda. Então quando você clica em alterar, como o campo já tem o conteúdo salvo (mesmo com espaços em branco), ele não vai inicializar a informação.
Resumindo para usar um Inicializador padrão, você tem dois cenários:
Cenário 1 (usando campo Virtual)
1 – O contexto do campo deve ser Virtual (ou seja, não irá salvar no banco de dados)
2 – Você precisa utilizar alguma função no Ini. Padrão (como um Posicione)
* Irá funcionar em qualquer operação (inclusão, alteração, visualização, etc)
Cenário 2 (usando campo Real)
1 – O contexto do campo deve ser Real (ou seja, a informação será salva no banco de dados)
2 – Você precisa utilizar alguma função no Ini. Padrão (como o GetSXENum)
* Irá funcionar apenas na Inclusão
Obs.: Um adendo a se fazer, é que se você for buscar informação de outra tabela, o ideal também é ter gatilhos, sendo que ao alterar uma informação, ela alterar nesse campo que será inicializado. Por exemplo, criei o campo Z00_DESCRI que é referente a descrição do produto (B1_DESC), e o campo Z00_PRODUT que é referente ao B1_COD, ao preencher o Z00_PRODUT disparar um gatilho preenchendo o Z00_DESCRI com o B1_DESC respectivo.
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa tarde Dan
Excelente conteúdo, estou aprendendo muito com você.
Caso eu tenha um campo data, que inicializa de forma padrão com o DATE () e ele é somente leitura, como eu faria para toda vez que o registro entrar em modo de edição (for alterado) ele chame o DATE () novamente. Basicamente é um campo para salvar a data da ultima alteração.
Bom dia Maurilio, tudo joia?
Opa, obrigado pelo carinho e feedback, é muita bondade e generosidade sua.
Então, depende muito do tipo de tela que você usa, por exemplo, em telas clássicas (AxCadastro ou mBrowse com AxAltera), geralmente faziam no “TudoOk” que é quando o usuário clicar no botão confirmar.
Já em MVC, você precisaria interceptar e por exemplo, manipular o AfterTTS, inclusive recentemente teve uma dúvida parecida no nosso grupo do WhatsApp ( https://terminaldeinformacao.com/grupo-no-whatsapp/ ), segue a resposta que demos na ocasião:
…
Para salvar a informação depois da transação, você precisa de duas coisas.
1. A primeira, é adicionar um InstallEvent na sua MPFormModel, nesse link aqui tem um exemplo: https://terminaldeinformacao.com/2023/03/24/como-utilizar-a-fwmodelevent-no-lugar-do-commit-em-uma-rotina-mvc/
2. A segunda, é dentro do AfterTTS da sua classe que você instalou o evento, você adiciona o RecLock na tabela gravando os campos que você desejar, nesse link tem um exemplo, mas nós usamos queries pois era uma tabela fora do dicionário, como é uma tabela dentro do dicionário que você vai manipular, você usa RecLock no lugar – https://terminaldeinformacao.com/2024/01/03/como-criar-um-cadastro-em-mvc-de-uma-tabela-fora-do-dicionario-do-protheus/
…
Um grande abraço.