Forçar a criação do campo S_T_A_M_P_ em uma tabela

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:

  1. É utilizado a TCConfig para “ativar” os recursos que serão usados na tabela
  2. É aberto a tabela em modo exclusivo
  3. É 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.

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.

Deixe uma resposta

Terminal de Informação