SQL Server - Leer campos con nombres iguales con diferentes valores de un archivo xml

 
Vista:

Leer campos con nombres iguales con diferentes valores de un archivo xml

Publicado por Pablo Almada (19 intervenciones) el 21/11/2019 22:17:14
Hola

Tengo un archivo xml y con una funcion de usuario de tabla convierte los elementos xml en campos para visualizarlo como tabla.
El inconveniente que hay nombres igules de campo que pueden aparecer mas de una vez seria como un detalle de un cabecera. Por ejemplo un archivo xml de pago que tiene un identificador pero en ese documento se puede haber pagado varias facturas. Por lo tanto tanto un documento de pago o un archivo xml de pago puede tener varias facturas relacionada.

Mi pregunta como puedo hacer para que me lea todos los valores de cada elemento con nombre igual y no que me traiga el primer valor o un solo valor de cada elemento xml.

Este es la parte de un archivo xml de pago que puede pagar varias facturas:

1
2
3
4
5
6
7
8
9
</cfdi:Conceptos><cfdi:Complemento>
<pago10:Pagos Version="1.0">
<pago10:Pago FechaPago="2018-10-09T11:06:10" FormaDePagoP="03" MonedaP="MXN" Monto="144883.20">
<pago10:DoctoRelacionado IdDocumento="7199C851-2A5A-5745-AC75-A1ACC7080536" Folio="375" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="2" ImpSaldoAnt="144883.20" ImpPagado="144883.20" ImpSaldoInsoluto="0.00" /></pago10:Pago>
<pago10:Pago FechaPago="2018-10-09T11:06:10" FormaDePagoP="03" MonedaP="MXN" Monto="144883.20">
<pago10:DoctoRelacionado IdDocumento="7199C851-2A5A-5745-AC75-A1ACC7080536" Folio="375" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="2" ImpSaldoAnt="144883.20" ImpPagado="144883.20" ImpSaldoInsoluto="0.00" /></pago10:Pago>
<pago10:Pago FechaPago="2018-10-09T11:06:10" FormaDePagoP="03" MonedaP="MXN" Monto="144883.20">
<pago10:DoctoRelacionado IdDocumento="7100C8567-2A5A-5745-AC75-A1Add9080546" Folio="375" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="2" ImpSaldoAnt="147083.20" ImpPagado="147083.20" ImpSaldoInsoluto="0.00" /></pago10:Pago>
</pago10:Pagos>

Mi función de usurio de pago es la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
create function dbo.fCfdiDatosPagosXml(@archivoXml xml)returns table
--Propósito. Obtiene los datos de la factura electrónica
--Usado por. vwCfdTransaccionesDeVenta
--Requisitos. CFDI
--25/10/17 jcf Creación cfdi 3.3
--25/01/18 jcf Agrega receptorRfc
--
return(
	WITH XMLNAMESPACES('http://www.sat.gob.mx/TimbreFiscalDigital' as "tfd",
						'http://www.sat.gob.mx/cfd/3' as "cfdi")
	select
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@Version)[1]', 'varchar(5)') [version],
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@UUID)[1]', 'varchar(50)') UUID,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@FechaTimbrado)[1]', 'varchar(20)') FechaTimbrado,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@RfcProvCertif)[1]', 'varchar(20)') RfcPAC,
	--@archivoXml.value('(//tfd:TimbreFiscalDigital/@Leyenda)[1]', 'varchar(150)') Leyenda,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@SelloCFD)[1]', 'varchar(8000)') SelloCFD,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@NoCertificadoSAT)[1]', 'varchar(20)') NoCertificadoSAT,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@SelloSAT)[1]', 'varchar(8000)') SelloSAT,
	@archivoXml.value('(//@Sello)[1]', 'varchar(8000)') Sello,
	@archivoXml.value('(//@NoCertificado)[1]', 'varchar(20)') NoCertificado,
	--@archivoXml.value('(//@FormaPago)[1]', 'varchar(50)') FormaPago,
	@archivoXml.value('(//@MetodoPago)[1]', 'varchar(21)') MetodoPago,
	@archivoXml.value('(//cfdi:Receptor/@Rfc)[1]', 'varchar(15)') receptorRfc,
	@archivoXml.value('(//cfdi:Receptor/@UsoCFDI)[1]', 'varchar(4)') UsoCFDI,
	@archivoXml.value('(//cfdi:CfdiRelacionados/@TipoRelacion)[1]', 'varchar(4)') TipoRelacion,
	@archivoXml.value('(//cfdi:CfdiRelacionado/@UUID)[1]', 'varchar(60)') UUIDrelacionado,
	--AGREGO CAMPOS
	@archivoXml.value('(//cfdi:Concepto/@ClaveProdServ)[1]', 'varchar(8)')ClaveProdServ,
	@archivoXml.value('(//cfdi:Concepto/@Importe)[1]', 'varchar(10)')Importe,
	--@archivoXml.value('//cfdi:Traslado/@Importe)[1]', 'varchar(10)')ImpuestoValorAgregado,
	--@archivoXml.value('//cfdi:Traslado/@TasaOCuota)[1]', 'varchar(10)')TasaCuota,
	@archivoXml.value('(//cfdi:Complemento/@NumParcialidad)[1]','varchar(1)')NumParcialidad,
 	@archivoXml.value('(//cfdi:Complemento/@idDocumento)[1]','varchar(50)')IdDocumento,
 	@archivoXml.value('(//cfdi:Complemento/@ImpSaldoAnt)[1]','varchar(10)')ImpSaldoAnt,
	@archivoXml.value('(//cfdi:Complemento/@ImpPagado)[1]','varchar(10)')ImpPagado,
	@archivoXml.value('(//cfdi:Complemento/@ImpSaldoInsoluto)[1]','varchar(10)')ImpSaldoInsoluto,
	@archivoXml.value('(//cfdi:Complemento/@MonedaP)[1]','varchar(3)')MonedaDelPago,
	@archivoXml.value('(//cfdi:Complemento/@FechaPago)[1]','varchar(20)')FechaDelPago,
	@archivoXml.value('(//cfdi:Complemento/@Monto)[1]','varchar(10)')Monto
	)
	go

Una vez mas agredezco su ayuda. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Leer campos con nombres iguales con diferentes valores de un archivo xml

Publicado por Javier (1 intervención) el 31/05/2021 17:26:01
Encontraste una solucion?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar