Criar, ler e gravar usando uma tabela Ctree (DTC)


O código abaixo é bem simples, iremos demonstrar como criar uma tabela ctree, ler e gravar registros nesta tabela.

#include 'protheus.ch'
#include 'parmtype.ch'

User Function EXP0013
	Private cArquivo:= "\system\tabela123.dtc" //Gera o nome do arquivo 
	Private cIndice	:= "\system\tabela123" //indice do arquivo

    CriarDTC() //função que irá criar a tabela
    
    GravarDTC('000001') //função que irá gravar algum conteudo na tabela
        
    MsgInfo( LerDTC('000001') ,'Leitura de tabela DTC')   //ler o conteudo gravado
Return
//criar tabela
Static Function CriarDTC() 
   	Local aCampos := {}   //defino a variavel do tipo array para criar os campos                        
   	
   	if !File(cArquivo)
	   	aAdd(aCampos,{"REV_FILIAL"	,"C",  02,0})  
	   	aAdd(aCampos,{"REV_COD"		,"C",  06,0})  
	   	aAdd(aCampos,{"REV_DATA"   	,"D",  08,0})   
	   	aAdd(aCampos,{"REV_CONTA"  	,"N",  09,0})   
	   	
		If SELECT("REV") > 0
			REV->(dbCloseArea())
		Endif
		
		//Criar o arquivo Ctree
		dbCreate(cArquivo,aCampos,"CTREECDX")
		dbUseArea(.T.,"CTREECDX",cArquivo,"REV",.F.,.F.)
		IndRegua( "REV", cIndice, "REV_FILIAL + REV_COD",,,"CODIGO" )
		dbClearIndex()
		dbSetIndex(cIndice + OrdBagExt() )
		MsgInfo("Tabela Criada!")
	Endif
Return
//gravar na tabela
Static Function GravarDTC(cCodigo)
	//Verifico se o alias está aberto e fecho
	If ( SELECT("REV") ) > 0
		dbSelectArea("REV")
		REV->(dbCloseArea())
	EndIf
	
	//abro a tabela
	dbUseArea( .T.,"CTREECDX", cArquivo,"REV", .T., .F. )
	dbSelectArea("REV")
	IndRegua( "REV", cIndice, "REV_FILIAL + REV_COD",,,"CODIGO" )
	dbClearIndex()
	dbSetIndex(cIndice + OrdBagExt() )
	
    dbSelectArea("REV")
	REV->(dbSetOrder(1))
	REV->(dbGoTop())
	If( REV->(!dbSeek('01' + cCodigo)) )
	    if RecLock("REV",.T.)		     
		     REV->REV_FILIAL	:= '01'			     
		     REV->REV_COD 		:= cCodigo
		     REV->REV_DATA  	:= dDatabase
		     REV->REV_CONTA 	:= 1
		     MsUnLock("REV") 
		     MsgInfo("Registro Inserido","Sucesso")
		Else
			MsgStop("Ocorreu um erro","Erro")
	    endif                            
	Else
	    if RecLock("REV",.F.)		     
		     REV->REV_DATA  	:= dDatabase
		     REV->REV_CONTA 	:= 2
		     MsUnLock("REV")                
		     MsgInfo("Registro Alterado","Sucesso")
		Else
			MsgStop("Ocorreu um erro","Erro")
	    endif                            
    Endif
Return
//Ler tabela
Static Function LerDTC(cCodigo)
	Local cRetorno := ""
		
	If ( SELECT("REV") ) > 0
		dbSelectArea("REV")
		REV->(dbCloseArea())
	EndIf
	
	dbUseArea( .T.,"CTREECDX", cArquivo,"REV", .T., .F. )
	dbSelectArea("REV")
	IndRegua( "REV", cIndice, "REV_FILIAL + REV_COD",,,"CODIGO" )
	dbClearIndex()
	dbSetIndex(cIndice + OrdBagExt() )
	REV->(dbSetOrder(1))
	REV->(dbGoTop())
	If( REV->(dbSeek('01'+cCodigo)) )
        cRetorno := "Codigo: " + REV->REV_COD + CRLF + "Data: " + DTOC(REV->REV_DATA) + CRLF + "Conta: " +  Str(REV->REV_CONTA)
  	Endif
    
Return(cRetorno)

Simples não?