No vídeo de hoje, vamos demonstrar em como testar uma query antes de efetivamente executá-la via AdvPL.
A dúvida de hoje, nos perguntaram, se seria possível usando AdvPL, testar uma query (SELECT mesmo) antes de executar. Perguntaram isso, pois em alguns casos, ao executar uma query, pode ser que haja algum erro e a thread seja encerrada.
Pensando nisso, montamos esse exemplo, onde demonstramos em como testar a query com TCSQLExec antes de efetivamente executar com TCQuery.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} User Function zVid0076
Função que testa a query antes de executar
@type Function
@author Atilio
@since 27/11/2023
/*/
User Function zVid0076()
Local aArea := FWGetArea()
Local aPergs := {}
Local cNome := Space(30)
//Adiciona nos parâmetros que serão exibidos em tela
aAdd(aPergs, {1, "Parte do nome", cNome, "@!", ".T.", "", ".T.", 80, .T.})
//Se a pergunta for confirmada
If ParamBox(aPergs, "Informe os parâmetros para filtrar o cliente", , , , , , , , , .F., .F.)
Processa({|| fProcessa()})
EndIf
FWRestArea(aArea)
Return
Static Function fProcessa()
Local aArea := FWGetArea()
Local cQuery := ""
Local nStatus := 0
Local cMensagem := ""
Local nAtual := 0
Local nTotal := 0
//Monta a query pesquisando pelo nome dos clientes
cQuery := " SELECT " + CRLF
cQuery += " A1_COD, " + CRLF
cQuery += " A1_NOME " + CRLF
cQuery += " FROM " + CRLF
cQuery += " " + RetSQLName("SA1") + " SA1 " + CRLF
cQuery += " WHERE " + CRLF
cQuery += " A1_FILIAL = '" + FWxFilial("SA1") + "' " + CRLF
cQuery += " AND A1_MSBLQL != '1' " + CRLF
cQuery += " AND UPPER(A1_NOME) LIKE '%" + Alltrim(MV_PAR01) + "%' " + CRLF
cQuery += " AND SA1.D_E_L_E_T_ = ' ' " + CRLF
cQuery += " ORDER BY " + CRLF
cQuery += " A1_COD " + CRLF
//Tenta executar a query primeiro (mesmo sendo select)
nStatus := TCSQLExec(cQuery)
//Se houve erro
If (nStatus < 0)
cMensagem += "Erro na execução da query: " + CRLF + CRLF
cMensagem += TCSQLError()
Else
//Incrementa a mensagem e executa a query
cMensagem += "Query executada com sucesso!" + CRLF + CRLF
TCQuery cQuery New Alias "QRY_SA1"
//Define o tamanho da régua
Count To nTotal
ProcRegua(nTotal)
QRY_SA1->(DbGoTop())
While ! QRY_SA1->(EoF())
//Incrementa a régua
nAtual++
IncProc("Processando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...")
//Incrementa a mensagem
cMensagem += "[" + QRY_SA1->A1_COD + "] " + Alltrim(QRY_SA1->A1_NOME) + CRLF
QRY_SA1->(DbSkip())
EndDo
QRY_SA1->(DbCloseArea())
EndIf
//Mostra a mensagem com o resultado
ShowLog(cMensagem)
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.