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

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.

Deixe uma resposta