Ajude o site desativando o bloqueador de anúncio
Cabeçalho

ADVPL - Copiando query para SQLite? Classe

Autor: Eurai Criado: 26/08/2021 Atualizado: 29/11/2025 ADVPL
Postagem

🗄️ 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

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL