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:
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.
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.