No artigo de hoje, vamos mostrar como criar os campos S_T_A_M_P_ e I_N_S_D_T_ direto via código fonte em AdvPL ou TLPP.
Recentemente, me perguntaram se seria possível criar esses campos direto via código fonte, e o grande Sangar Zucchi ( LinkedIn ), comentou nesse artigo um trecho de exemplo: Para que serve os novos campos S_T_A_M_P_ e I_N_S_D_T_ e como utilizá-los no Protheus
Basicamente a lógica para fazer o procedimento seria a seguinte:
- É utilizado a TCConfig para “ativar” os recursos que serão usados na tabela
- É aberto a tabela em modo exclusivo
- É executado o comando TCRefresh para atualizar as informações da tabela no banco de dados
Abaixo o código fonte de exemplo conforme a lógica acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} zStamp
Criação de campos S_T_A_M_P_ e I_N_S_D_T
@type user function
@author Atilio
@since 23/12/2024
@param cTabAlias, Caractere, Alias da tabela (exemplo SB1)
@param lStamp, Lógico, Se .T. tenta criar o campo S_T_A_M_P_
@param lInsDt, Lógico, Se .T. tenta criar o campo I_N_S_D_T_
@example
u_zStamp("SB1")
@obs Foi construído essa função baseado no comentário do Sangar Zucchi nesse link: https://terminaldeinformacao.com/2023/01/25/para-que-serve-os-novos-campos-s_t_a_m_p_-e-i_n_s_d_t_-e-como-utiliza-los-no-protheus/
/*/
User Function zStamp(cTabAlias, lStamp, lInsDt)
Local cTabSQL := ""
Local lOkStamp := .F.
Local lOkInsDt := .F.
Default cTabAlias := ""
Default lStamp := .T.
Default lInsDt := .T.
//Se veio algum alias e ele existir na base
If ! Empty(cTabAlias) .And. ExisteSX2(cTabAlias)
//Valida se consegue ativar o recurso no BD
lOkStamp := (lStamp .And. (TCConfig('SETAUTOSTAMP = ON') == 'OK') .And. (TCConfig('SETUSEROWSTAMP = ON') == 'OK'))
lOkInsDt := (lInsDt .And. (TCConfig('SETAUTOINSDT = ON') == 'OK') .And. (TCConfig('SETUSEROWINSDT = ON') == 'OK'))
If lOkStamp .Or. lOkInsDt
//Busca o nome real da tabela, exemplo SB1 => SB1010
cTabSQL := RetSQLName(cTabAlias)
//Se a tabela já estiver aberta, fecha para depois abrir em modo exclusivo
If Select(cTabAlias) > 0
(cTabAlias)->(DbCloseArea())
EndIf
//Tenta Abrir em modo Exclusivo
USE (cTabSQL) ALIAS (cTabAlias) EXCLUSIVE NEW VIA "TOPCONN"
If ! NetErr()
//Aciona o Refresh na tabela
TCRefresh(cTabSQL)
Else
FWAlertError('Tabela "' + cTabAlias + '" - não foi possível abrir em modo Exclusivo', 'Falha #1')
EndIf
(cTabAlias)->(DbCloseArea())
//Desativa os recursos
TCConfig('SETAUTOSTAMP = OFF')
TCConfig('SETUSEROWSTAMP = OFF')
//Senão, não será possível criar os campos
Else
FWAlertError('Não foi possível ativar os recursos no BD', 'Falha #2')
EndIf
EndIf
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.