Como usar o FOR XML PATH via AdvPL

No artigo de hoje, vou demonstrar como usar o comando FOR XML PATH em uma query num código AdvPL.

Recentemente, um aluno veio me perguntar, se era possível executar o FOR XML PATH, diretamente numa query dentro de um código em AdvPL.

E sim, é possível pessoal, mas você precisa executar a query com o comando TCQuery, para que dessa forma, seja executado diretamente no banco de dados.

No caso, montei um exemplo simples, que monta uma busca na SBM (Grupo de Produtos), e traz a lista de produtos com o FOR XML PATH, o resultado será conforme o print abaixo:

Resultado da query

Abaixo o código montado em AdvPL:

//Monta a query, buscando também a lista de produtos do grupo
cQuery := " SELECT " + CRLF
cQuery += "     BM_GRUPO, " + CRLF
cQuery += "     BM_DESC, " + CRLF
cQuery += "     ISNULL( " + CRLF
cQuery += "         CONVERT(VARCHAR(400), " + CRLF
cQuery += "             ( " + CRLF
cQuery += "                 SELECT " + CRLF
cQuery += "                     RTRIM(B1_COD) + ', ' " + CRLF
cQuery += "                 FROM " + CRLF
cQuery += "                     " + RetSQLName('SB1') + " SB1 " + CRLF
cQuery += "                 WHERE " + CRLF
cQuery += "                     B1_FILIAL = '" + FWxFilial('SB1') + "' " + CRLF
cQuery += "                     AND B1_GRUPO = BM_GRUPO " + CRLF
cQuery += "                     AND SB1.D_E_L_E_T_ = '' " + CRLF
cQuery += "                 FOR XML PATH ('') " + CRLF
cQuery += "             ) " + CRLF
cQuery += "         ) " + CRLF
cQuery += "     , '') AS PRODUTOS " + CRLF
cQuery += " FROM " + CRLF
cQuery += "     " + RetSQLName('SBM') + " SBM " + CRLF
cQuery += " WHERE " + CRLF
cQuery += "     BM_FILIAL = '" + FWxFilial('SBM') + "' " + CRLF
cQuery += "     AND SBM.D_E_L_E_T_ = ' ' " + CRLF
TCQuery cQuery New Alias "QRY_SBM"
 
//Enquanto houver dados
While ! QRY_SBM->(EoF())
    //Se tiver produtos, exibe
    If ! Empty(QRY_SBM->PRODUTOS)
        MsgInfo(QRY_SBM->PRODUTOS, "Atenção")
    EndIf
 
    QRY_SBM->(DbSkip())
EndIf
QRY_SBM->(DbCloseArea())

Update (12/08/2022): Como lembrando pelo grande Eurai do Universo do Desenvolvedor, você pode usar outras funções sem ser o TCQuery como o DbUseArea com TCGenQry, a grande questão que pode acarretar problemas é a utilização do ChangeQuery, conforme exemplificamos no nosso artigo sobre Qual a diferença entre TCQuery e PLSQuery?.

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 Responses

  1. Rafael disse:

    Estava com dificuldade para executar o TCQUERY, identifiquei que era devido a falta de um include (topconn). Porém agora, apesar da query executar, o campo não apresenta conteudo, diferente quando executado via banco.

    • Rafael, tente executar a query direto via APSDU e veja se traz conteúdo.
      Entre no APSDU, vá em Query Analyzer, e execute por lá, tanto com Change query marcado como desmarcado.
      Se por lá trouxer os dados, é algo no seu fonte. Se não trouxer, nos mande os prints e o fonte para avaliarmos.

Deixe uma resposta