Identificando possíveis erros em consultas SQL via PLSQuery | Ti Responde 0159

No vídeo de hoje, vamos demonstrar uma dica de como identificar um erro em uma query usando PLSQuery.

A dúvida de hoje, nos perguntaram, que mesmo executando uma query no PLSQuery o resultado às vezes é incorreto, e como poderíamos validar e identificar isso.

 

Pensando nisso, montamos um exemplo, onde vamos demonstrar em como usar as funções ChangeQuery e ShowLog para verificar a query real que esta sendo executada.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "tlpp-core.th"

//Declaração da namespace
Namespace custom.terminal.youtube

#Define CRLF Chr(13) + Chr(10) //Carriage Return Line Feed
    
/*/{Protheus.doc} User Function video0159
Exemplo de teste de query com PLSQuery
@type Function
@author Atilio
@since 05/06/2024
@example custom.terminal.youtube.u_video0159()
/*/

User Function video0159()
    Local aArea         := FWGetArea()                   As Array
    Local aParameters   := {}                            As Array
    Local cInitID       := Space(TamSX3('B1_COD')[1])    As Character
    Local cLastID       := StrTran(cInitID, " ", "Z")    As Character

    //Adicionando os parâmetros da tela de perguntas
    aAdd(aParameters, {1, "Produto De",         cInitID,  "",        ".T.", "SB1", ".T.", 070, .F.})
    aAdd(aParameters, {1, "Produto Até",        cLastID, "",        ".T.", "SB1", ".T.", 070, .T.})

    //Somente se a tela de parâmetros for confirmada, que será aberto a tela
    If ParamBox(aParameters, "Informe os parâmetros", /*aRet*/, /*bOk*/, /*aButtons*/, /*lCentered*/, /*nPosx*/, /*nPosy*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        runQuery()
    EndIf

    FWRestArea(aArea)
Return

Static Function runQuery()
    Local aArea    := FWGetArea()                   As Array
    Local cQuery   := ""                            As Character
    Local cMessage := ""                            As Character

    //Monta a Query de Produtos
    cQuery += " SELECT " + CRLF
    cQuery += "     B1_COD, " + CRLF
    cQuery += "     B1_DESC " + CRLF
    cQuery += " FROM " + CRLF
    cQuery += "     " + RetSQLName("SB1") + " SB1 " + CRLF
    cQuery += " WHERE " + CRLF
    cQuery += "     B1_FILIAL = '' " + CRLF
    cQuery += "     AND SB1.D_E_L_E_T_ = ' ' " + CRLF
    cQuery += "     --Abaixo os parâmetros informados pelo usuário " + CRLF
    cQuery += "     AND B1_COD >= '" + MV_PAR01 + "' " + CRLF
    cQuery += "     AND B1_COD <= '" + MV_PAR02 + "' " + CRLF
    //ShowLog(ChangeQuery(cQuery))
    PlsQuery(cQuery, "QRY_PROD")

    //Se houver dados
    If ! QRY_PROD->(EoF())
        cMessage := "Abaixo os produtos encontrados: " + CRLF + CRLF

        //Percorre os dados
        While ! QRY_PROD->(EoF())
            //Incrementa a mensagem de log
            cMessage += QRY_PROD->B1_COD + "|" + Alltrim(QRY_PROD->B1_DESC) + CRLF

            QRY_PROD->(DbSkip())
        EndDo
    Else
        cMessage := "Não há dados na Query"
    EndIf
    QRY_PROD->(DbCloseArea())

    //Mostra o log no fim do processamento
    ShowLog(cMessage)

    FWRestArea(aArea)
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