Nesse vídeo demonstraremos a utilização da função TCSqlPlan, que serve para retornar o plano de execução de uma query no banco de dados.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zExe483 Retorna o plano de execução de uma query via AdvPL @type Function @author Atilio @since 03/04/2023 @see https://tdn.totvs.com/display/tec/TCSqlPlan @obs TCSqlPlan Parâmetros + cQuery , Caractere , Query que será analisada + aResult , Array , Array com o resultado do plano + nLevel , Numérico , Define o nível de detalhamento Retorno + nRet , Numérico , Retorna um número com o resultado de execução da query (se menor que 0 aconteceu algum erro) **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao **** /*/ User Function zExe483() Local aArea := FWGetArea() Local cQuery := "" Local aResult := {} Local aPlano := {} Local nAtual := 0 Local cMensagem := "" cQuery := " SELECT " + CRLF cQuery += " C5_NUM, " + CRLF cQuery += " A1_NOME, " + CRLF cQuery += " C6_ITEM, " + CRLF cQuery += " C6_PRODUTO, " + CRLF cQuery += " B1_DESC " + CRLF cQuery += " FROM " + CRLF cQuery += " " + RetSQLName("SC5") + " SC5 " + CRLF cQuery += " INNER JOIN " + RetSQLName("SA1") + " SA1 ON ( " + CRLF cQuery += " A1_FILIAL = '" + FWxFilial("SA1") + "' " + CRLF cQuery += " AND A1_COD = C5_CLIENTE " + CRLF cQuery += " AND A1_LOJA = C5_LOJACLI " + CRLF cQuery += " AND SA1.D_E_L_E_T_ = ' ' " + CRLF cQuery += " ) " + CRLF cQuery += " INNER JOIN " + RetSQLName("SC6") + " SC6 ON ( " + CRLF cQuery += " C6_FILIAL = C5_FILIAL " + CRLF cQuery += " AND C6_NUM = C5_NUM " + CRLF cQuery += " AND C6_CLI = C5_CLIENTE " + CRLF cQuery += " AND C6_LOJA = C5_LOJACLI " + CRLF cQuery += " AND SC6.D_E_L_E_T_ = ' ' " + CRLF cQuery += " ) " + CRLF cQuery += " INNER JOIN " + RetSQLName("SB1") + " SB1 ON ( " + CRLF cQuery += " B1_FILIAL = '" + FWxFilial("SB1") + "' " + CRLF cQuery += " AND B1_COD = C6_PRODUTO " + CRLF cQuery += " AND SB1.D_E_L_E_T_ = ' ' " + CRLF cQuery += " ) " + CRLF cQuery += " WHERE " + CRLF cQuery += " C5_FILIAL = '" + FWxFilial("SC5") + "' " + CRLF cQuery += " AND C5_TIPO NOT IN ('B', 'D') " + CRLF cQuery += " AND SC5.D_E_L_E_T_ = ' ' " + CRLF cQuery += " ORDER BY " + CRLF cQuery += " C5_NUM, " + CRLF cQuery += " C6_ITEM " + CRLF //Busca o plano de execução, se veio menor que zero, houve falha If TCSqlPlan(cQuery, @aResult) < 0 FWAlertInfo("Falha: " + TCSQLError(), "Teste TCSqlPlan") Else aPlano := aResult[2] For nAtual := 1 To Len(aPlano) cMensagem += "[" + StrZero(nAtual, 4) + "] " + aPlano[nAtual][1] + CRLF Next ShowLog(cMensagem) EndIf FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.