none
Parser xml e insertar datos en SQL RRS feed

  • Pregunta

  • Saludos y de antemano gracias por la ayuda 

    tengo un webservice con un método donde solicito un usuario y una estructura xml (el código de la estructura es un pedido) que proviene de un apps Android el genera el xml que deposita en mi método. Yo capturo los datos los envió a una función donde hago el parser a la variable que contiene todo el xml con la intension de extraer los datos y guardarlo en  2 tablas sql una tabla donde guardare las generales del pedido (numero, vendedor, total del pedido, cliente, código de cliente....) y una tabla llamada detalle del pedido donde irán los productos que contiene el pedido (n cantidad de filas con numero de pedido, id producto, nombre de prod, cantidad, costo unitario) 

    aqui el codido donde hago el parser y guardo las generales

    en la variable mensaje envio el siguente codigo 

    <?xml version="1.0" encoding="utf-8"?>

    <order><order_code>Z25-A-1408945171212</order_code>

    <seller_name>asanchez</seller_name>

    <client_code>025306</client_code>

    <client_limit>0.01</client_limit>

    <client_aviable>0.01</client_aviable>

    <client_spend>0.0</client_spend>

    <term>30</term>

    <total>382.75</total>

    <store>David, Agricola, 26</store>

    <products><product><product_code>0012112718</product_code><product_name>10-3-22-14.4Ca-0.1S</product_name>

    <product_units>8</product_units><product_price>26.1</product_price><product_subtotal>208.8</product_subtotal></product>

    <product><product_code>0012112718</product_code><product_name>10-3-22-14.4Ca-0.1S</product_name>

    <product_units>7</product_units><product_price>24.85</product_price><product_subtotal>173.95</product_subtotal></product>

    </products>

    <notes>fjdtdcnjk</notes></order>

    y esta es la funcion donde saco las generales del pedido y las guardo en sql 

     Public Function guardarped(ByVal usuario As String, ByVal mensaje As String) As String
    
    dimmsg as string
    Dim xmldata As String = mensaje
    
    Dim doc As XElement = XElement.Parse(xmldata)
    
            Dim ordercode = doc.Element("order_code").Value
            Dim codigocliente = doc.Element("client_code").Value
            Dim limite = doc.Element("client_limit").Value
            Dim disponible = doc.Element("client_aviable").Value
            Dim termino = doc.Element("term").Value
            Dim monto = doc.Element("total").Value
            Dim bodega = doc.Element("store").Value
            Dim nota = doc.Element("notes").Value
    
    'obtengo el nombre del cliente mediante el codigo del mismo en una funcion aparte donde hago un query a la tabla de clientes
            Dim nombrecliente = obtenernombre(codigocliente).Trim
            Cerrar()
    
    'envio a un sp donde inserto los valores de las generales del pedido 
    
     Dim cmd As SqlCommand
            Try
                Abrir()
                cmd = New SqlCommand("GuardargenPedido", con)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@par_numped", ordercode)
                cmd.Parameters.AddWithValue("@par_user", usuario)
                cmd.Parameters.AddWithValue("@par_codigocliente", codigocliente)
                cmd.Parameters.AddWithValue("@par_nombrecliente", nombrecliente)
                cmd.Parameters.AddWithValue("@par_limite", limite)
                cmd.Parameters.AddWithValue("@par_disponible", disponible)
                cmd.Parameters.AddWithValue("@par_termino", termino) 
                cmd.Parameters.AddWithValue("@par_monto", monto)
                cmd.Parameters.AddWithValue("@par_bodega", bodega)
                cmd.Parameters.AddWithValue("@par_nota", nota)
                cmd.Parameters.Add("@msg", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output
                cmd.ExecuteNonQuery()
                msg = cmd.Parameters("@msg").Value.ToString()
                Cerrar()
            Catch ex As Exception
    
                Throw ex
            End Try
    
        Return msg
    
        End Function

    hasta aqui todo bien pero como hago para extraer los productos debido a que son filas que contienes varias columnas como se observa en el xml. en teoria deberia generar una estructura para luego hacer los insert dentro de un for each pero he intentado y solo logro extraer las columnas individualmente y no las filas estoy intentando hacer esto 

    Public Function guardarped(ByVal usuario As String, ByVal mensaje As String) As String
            Dim msg As String
            msg = "Correcto"
            Dim ordercode As String
            Dim xmldata As String = mensaje
    
            
    
            Dim doc As XElement = XElement.Parse(xmldata)
            Dim products As IEnumerable(Of XElement) = doc.Descendants("product_code")
    
    For Each product As XElement In products
                Dim prodped = product.Value
            Next

    si alguien sabe de algún caso similar le agradezco la ayuda


    Erick Sanchez G.

    lunes, 1 de septiembre de 2014 14:34

Respuestas

  • bien resuelto 

    declare un xelement para cada columna devuelta x registro y saque la cuenta de registros existente en el rango de productos luego mediante un ciclo hice el inser en mi tabla 

    Public Function guardarped(ByVal usuario As String, ByVal mensaje As String) As String
            Dim msg As String
            msg = "Correcto"
            Dim ordercode As String
            Dim xmldata As String = mensaje
    
            
            Dim doc As XElement = XElement.Parse(xmldata)
    'identifico cuantas lineas de productos van en el xml
            Dim filas As IEnumerable(Of XElement) = doc.Descendants("product")
            Dim codigo As IEnumerable(Of XElement) = doc.Descendants("product_code")
            Dim nomprod As IEnumerable(Of XElement) = doc.Descendants("product_name")
            Dim unidades As IEnumerable(Of XElement) = doc.Descendants("product_units")
            Dim precio As IEnumerable(Of XElement) = doc.Descendants("product_price")
            Dim subtotal As IEnumerable(Of XElement) = doc.Descendants("product_subtotal")
    
    'declaro la variable tope del ciclo
    Dim cuenta As Integer
    'le resto 1 porque los registros comienzan en 0 
            cuenta = filas.Count - 1
            
            For i = 0 To cuenta
    'preparo mis variables
                Dim codprod = codigo(i).Value
                Dim nomproducto = nomprod(i).Value
                Dim uniprod = unidades(i).Value
                Dim precprod = precio(i).Value
                Dim subtprod = subtotal(i).Value
    'inserto con data reader
                Dim ssql As String
                Dim ocmd As New SqlCommand
                Dim odr As SqlDataReader
                Abrir()
                ssql = "insert into CWINT_Detallepedido values('" & ordercode & "', '" & codprod & "','" & _
                    nomproducto & "','" & uniprod & "','" & precprod & "','" & subtprod & "')"
                ocmd.Connection = con
                ocmd.CommandText = ssql
                ocmd.CommandType = CommandType.Text
                odr = ocmd.ExecuteReader
    
                While odr.Read()
    
                End While
                Cerrar()
            Next

    esto lo añadi en el codigo vb anterior y listo agrego los 2 datos en mis 2 tablas 

    hay les queda el ejemplo 


    Erick Sanchez G.

    • Marcado como respuesta Erick Sanchez lunes, 1 de septiembre de 2014 21:38
    lunes, 1 de septiembre de 2014 21:38

Todas las respuestas

  • bien resuelto 

    declare un xelement para cada columna devuelta x registro y saque la cuenta de registros existente en el rango de productos luego mediante un ciclo hice el inser en mi tabla 

    Public Function guardarped(ByVal usuario As String, ByVal mensaje As String) As String
            Dim msg As String
            msg = "Correcto"
            Dim ordercode As String
            Dim xmldata As String = mensaje
    
            
            Dim doc As XElement = XElement.Parse(xmldata)
    'identifico cuantas lineas de productos van en el xml
            Dim filas As IEnumerable(Of XElement) = doc.Descendants("product")
            Dim codigo As IEnumerable(Of XElement) = doc.Descendants("product_code")
            Dim nomprod As IEnumerable(Of XElement) = doc.Descendants("product_name")
            Dim unidades As IEnumerable(Of XElement) = doc.Descendants("product_units")
            Dim precio As IEnumerable(Of XElement) = doc.Descendants("product_price")
            Dim subtotal As IEnumerable(Of XElement) = doc.Descendants("product_subtotal")
    
    'declaro la variable tope del ciclo
    Dim cuenta As Integer
    'le resto 1 porque los registros comienzan en 0 
            cuenta = filas.Count - 1
            
            For i = 0 To cuenta
    'preparo mis variables
                Dim codprod = codigo(i).Value
                Dim nomproducto = nomprod(i).Value
                Dim uniprod = unidades(i).Value
                Dim precprod = precio(i).Value
                Dim subtprod = subtotal(i).Value
    'inserto con data reader
                Dim ssql As String
                Dim ocmd As New SqlCommand
                Dim odr As SqlDataReader
                Abrir()
                ssql = "insert into CWINT_Detallepedido values('" & ordercode & "', '" & codprod & "','" & _
                    nomproducto & "','" & uniprod & "','" & precprod & "','" & subtprod & "')"
                ocmd.Connection = con
                ocmd.CommandText = ssql
                ocmd.CommandType = CommandType.Text
                odr = ocmd.ExecuteReader
    
                While odr.Read()
    
                End While
                Cerrar()
            Next

    esto lo añadi en el codigo vb anterior y listo agrego los 2 datos en mis 2 tablas 

    hay les queda el ejemplo 


    Erick Sanchez G.

    • Marcado como respuesta Erick Sanchez lunes, 1 de septiembre de 2014 21:38
    lunes, 1 de septiembre de 2014 21:38
  • Lo mejor que puedes hacer es utilizar la serialización/deserialización de objetos, te olvidarás de complejos recorridos por xml, en este caso lo que deberías de hacer es una deserialización (convertir XML a objeto)

     Un ejemplo en: http://msdn.microsoft.com/es-es/library/ms172872.aspx
    
    

    Si te vale marca la respuesta como válida. Saludos

    miércoles, 3 de septiembre de 2014 16:23