🗄️ Classe TLPP para Copiar Query para SQLite — Completa e Disponível no GitHub
Segue abaixo a classe completa para cópia de dados, desenvolvida em TLPP. Ela também está disponível e atualizada no GitHub — fique à vontade para fazer fork, sugerir melhorias ou enviar commits! 😄 O objetivo é simples e útil: pegar uma query e copiar seu resultado para um banco SQLite, de forma rápida e eficiente.
#INCLUDE "TOTVS.CH"
/*/{Protheus.doc} UDERQRYTOSQLITE
Função de TESTE
24 segundo para selecionar 17078 registros com 287 coluna e copiar para sqlite
>> Beta test
@type class
@author Eurai Rapelli
@since 2021.08.14
/*/
User Function UDERQRYTOSQLITE()
Local oUDERQRYTOSQLITE := UDERQRYTOSQLITE():New() as object
Local cQuery := '' as character
Local cTime := Time() as character
Local oWriter := FWFileWriter():New( 'C:\Temp\UDERQRYTOSQLITE_' + Dtos(Date()) + '_' + StrTran(Time(),':','') + '.TXT', .F.) as object
Local cCRLF := CRLF as character
cQuery := "SELECT *FROM " + RetSQLName('SA1') + " WHERE D_E_L_E_T_ = ''"
If !oWriter:Create()
MsgInfo('Erro ao criar o arquivo de escrita: ' + oWriter:Error():Message,'UDERQRYTOSQLITE')
Return( Nil )
Endif
If !oUDERQRYTOSQLITE:Execute( cQuery, 'UDEURAI' )
MsgInfo('Problema ao criar e abrir o arquivo temporário em SQLite: ' + oUDERQRYTOSQLITE:GetError(),'UDERQRYTOSQLITE')
Return( Nil )
Endif
oWriter:Write('Tempo total: ' + ElapTime( cTime, Time() ) + cCRLF )
Do While UDEURAI->( !EOF() )
If !oWriter:Write('Nome: ' + UDEURAI->A1_NOME + cCRLF )
MsgInfo('Problema ao escrever: ' + oWriter:Error():Message,'UDERQRYTOSQLITE')
Return( Nil )
Endif
UDEURAI->( dbSkip() )
EndDo
oWriter:Write('Tempo total: ' + ElapTime( cTime, Time() ) + cCRLF )
If !oUDERQRYTOSQLITE:Close()
MsgInfo('Problema ao fechar o arquivo SQLite: ' + oUDERQRYTOSQLITE:GetError(),'UDERQRYTOSQLITE')
Return( Nil )
Endif
oWriter:Close()
Return( Nil )
/*/{Protheus.doc} UDERQRYTOSQLITE
Classe de Progresso
@type class
@author Eurai Rapelli
@since 2021.08.14
/*/
Class UDERQRYTOSQLITE
Public data cAliasName as character
Public data cAliasSQLite as character
Private data cError as character
Public Method New() Constructor
Public Method Execute( cQuery, cTmp )
Public Method Count(nReg,cSQL)
Public Method Close()
Public Method GetError()
Public Method GetRealName()
EndClass
/*/{Protheus.doc} New
Instancia da classe
/*/
Method New() Class UDERQRYTOSQLITE
::cError := ''
Return( Self )
/*/{Protheus.doc} Execute
Executa a copia para o SQLLite
/*/
Method Execute( cQuery, cAliasName ) Class UDERQRYTOSQLITE
Local lRet := .T. as logical
Local cAliasQuery := GetNextAlias() as character
Local lErro := .F. as logical
Local bError := {||} as codeblock
Default cQuery := ''
Default cAliasName := GetNextAlias()
Begin Sequence
If Empty(cQuery)
::cError := "Query enviada está vazia."
lRet := .F.; Break
Endif
::cAliasSQLite := 'TMP_' + Dtos(Date()) + '_' + StrTran(Time(),':','') + cValtoChar(Randomize(1,9999)) + FunName()
::cAliasName := cAliasName
If Select(cAliasName) > 0
(cAliasName)->( dbCloseArea() )
Endif
If Select(cAliasQuery) > 0
(cAliasQuery)->( dbCloseArea() )
Endif
ErrorBlock( { |UD| cError := UD:ErrorStack, lErro := .T., Break(UD) } )
Begin Sequence
DbUseArea(.T.,'TOPCONN',TcGenQry(,,ChangeQuery(cQuery)),cAliasQuery,.T.,.T.)
End Sequence
ErrorBlock(bError)
If lErro
::cError := "Query com erro: " + TCSQLERROR()
lRet := .F.; Break
Endif
DBSqlExec( ::cAliasSQLite , "DROP TABLE " + ::cAliasSQLite, 'SQLITE_SYS')
DBCreate( ::cAliasSQLite, (cAliasQuery)->(dbStruct()), 'SQLITE_SYS' )
DBUseArea( .T., 'SQLITE_SYS', ::cAliasSQLite, ::cAliasName, .F., .F. )
If !DBTblCopy(cAliasQuery, ::cAliasName)
::cError := "Tabela não foi copiada."
lRet := .F.; Break
Endif
(cAliasQuery)->( dbCloseArea() )
End Sequence
Return( lRet )
/*/{Protheus.doc} Close
Fecha o arquivo e deleta
/*/
Method Close() Class UDERQRYTOSQLITE
Local lRet := .T. as logical
(::cAliasName)->( dbCloseArea() )
If !DBSqlExec( ::GetRealName() , "DROP TABLE " + ::GetRealName() , 'SQLITE_SYS')
::cError := "Tabela não foi deletada"
lRet := .F.
Endif
Return( lRet )
/*/{Protheus.doc} Count
Contador de registros
/*/
Method Count(nReg,cSQL) Class UDERQRYTOSQLITE
Default cSQL := "SELECT COUNT(0)QTD FROM " + ::GetRealName()
If DBSqlExec( 'TMP_COUNT_UD' , cSQL, 'SQLITE_SYS')
nReg := TMP_COUNT_UD->QTD
TMP_COUNT_UD->( dbCloseArea() )
lRet := .T.
Else
::cError := "Erro no count da tabela"
lRet := .F.
Endif
Return( lRet )
/*/{Protheus.doc} GetError
Retorna mensagem de erro
/*/
Method GetError() Class UDERQRYTOSQLITE
Return( ::cError )
/*/{Protheus.doc} GetRealName
Retorna o nome real da tabela SQLite
/*/
Method GetRealName() Class UDERQRYTOSQLITE
Return( ::cAliasSQLite )
Gostou? Compartilhe com seus amigos e deixe um comentário! 😎
Um abraço, e até a próxima! 👋
#protheus #advpl #tlpp #sqlite #classe tlpp #totvsprotheus #query sqlite #programacaoadvpl #fwintegration #dbsqlite #copiar query #topconn