none
Trabajo con Webmethod y Ajax RRS feed

  • Pregunta

  • Os cuento. Tengo el siguiente webmethod

    <WebMethod()>
        Public Shared Function mostrarDatosSucurProov(ByVal ps As String, ids As Integer) As List(Of provee) ' ps: texto escrito  ids: idSucursalEmpresa
            Dim constr As String = ConfigurationManager.ConnectionStrings("cytsd").ConnectionString
            Using con As New SqlConnection(constr)
                Using cmd As SqlCommand = New SqlCommand("SELECT A.idSucursalProveedor, A.nombre, A.idProvincia, A.poblacion, A.dire, A.cPostal, A.web, A.tel,
                                                            B.descr AS nombreProvincia,
                                                        C.idPais, C.descr AS nombrePais
                                                        FROM tbl_sucursal_proveedor AS A, tbl_provincia AS B, tbl_pais AS C
                                                        WHERE A.idProvincia = B.idProvincia AND B.idPais = C.idPais
                                                        AND A.eli = 0 AND A.act = 1 AND A.idSucursalEmpresa
     = @idSucursalEmpresa
                                                        AND LOWER(RTRIM(LTRIM(nombre))) = LOWER(RTRIM(LTRIM(@param)))")
    
    
                    cmd.Parameters.AddWithValue("param", ps.ToString.ToLower.Trim)
                    cmd.Parameters.AddWithValue("idSucursalEmpresa", ids)
    
                    cmd.Connection = con
                    Dim provees As New List(Of provee)()
                    con.Open()
                    Using sdr As SqlDataReader = cmd.ExecuteReader()
                        While sdr.Read()
                            provees.Add(New provee() With {
                            .nombrec1proov = sdr("nombre").ToString(), .idProvincia = sdr("idProvincia"), .direprovee = sdr("dire").ToString(), .poblaprovee = sdr("poblacion").ToString(),
                            .cpprovee = sdr("cPostal").ToString().Trim(), .telefprovee = sdr("tel").ToString().Trim(), .idPais = sdr("idPais").ToString().Trim(), .provincia
     = sdr("nombreProvincia"),
                            .pais = sdr("nombrePais").ToString().Trim(), .webprovee = sdr("web").ToString().Trim(), .idCDSocial1 = sdr("idSucursalProveedor").ToString().Trim(),
                            .idTempo = sdr("idSucursalProveedor")
                        })
                        End While
                    End Using
                    con.Close()
                    Return provees
                End Using
            End Using
        End Function

    El caso es que la consulta me puede devolver 3 valores y mi pregunta es ¿Como consigo el trato de cada registro devuelto independientemente? Lo digo porque si me devuelve 3 registros, estos se sobreescribirán y no podré tener acceso a los 3.

    La clase a la que hace referencia la función es esta por si es necesario saberlo

    Public Class provee
            Public Property idProveedor As Integer
            Public Property idsc As Integer ' idSucursalEmpresa
            Public Property activoProveedor As Boolean
            Public Property rsocial As String
            Public Property logoproov As String
            Public Property nproov As String
            Public Property aliasproov As String
            Public Property cifnifproov As String
            Public Property direprovee As String
            Public Property idProvincia As Integer
            Public Property provincia As String
            Public Property idPais As Integer
            Public Property pais As String
            Public Property idEstadoProveedor As Integer
            Public Property estadoProveedor As String
            Public Property poblaprovee As String
            Public Property cpprovee As String
            Public Property telefprovee As String
            Public Property webprovee As String
            Public Property social As Boolean
    
            Public Property idCDSocial1 As Integer
            Public Property nombrec1proov As String
            Public Property telec1proov As String
            Public Property mcargoc1proov As Integer
            Public Property mailc1proov As String
            Public Property extc1proov As Integer
            Public Property comenc1proov As String
    
            Public Property idCDSocial2 As Integer
            Public Property nombrec2proov As String
            Public Property telec2proov As String
            Public Property extc2proov As Integer
            Public Property mailc2proov As String
            Public Property comenc2proov As String
    
            Public Property idCDSocial3 As Integer
            Public Property nombrec3proov As String
            Public Property telec3proov As String
            Public Property extc3proov As Integer
            Public Property mailc3proov As String
            Public Property comenc3proov As String
    
            Public Property idTempo As Integer
        End Class

    Si os fijáis hay un idSocial1, un 2 y un 3, pero claro, no se como pasar el 2º registro y el 3º

    Espero que esté bien explicado

    Gracias


    martes, 19 de noviembre de 2019 10:20

Respuestas

  • Hola, me parece que se puede mejorar el diseño de tu clase implementando una Lista de Elementos relacionados.

    Fíjate en la clase que he denominado MiEntidadRelacionada. Tenemos una lista de N elementos que podemos rellenar al realizar la consulta. NOTA: Si siempre son 3 se puede definir como un Array de 3 elementos.

    Public Class provee
        Public Property idProveedor As Integer
        Public Property idsc As Integer
        Public Property activoProveedor As Boolean
        Public Property rsocial As String
        Public Property logoproov As String
        Public Property nproov As String
        Public Property aliasproov As String
        Public Property cifnifproov As String
        Public Property direprovee As String
        Public Property idProvincia As Integer
        Public Property provincia As String
        Public Property idPais As Integer
        Public Property pais As String
        Public Property idEstadoProveedor As Integer
        Public Property estadoProveedor As String
        Public Property poblaprovee As String
        Public Property cpprovee As String
        Public Property telefprovee As String
        Public Property webprovee As String
        Public Property social As Boolean
        Public Property listRelacion As List(Of MiEntidadRelacionada)
        Public Property idTempo As Integer
    End Class
    
    Public Class MiEntidadRelacionada
        Public Property idCDSocial As Integer
        Public Property nombrecproov As String
        Public Property telecproov As String
        Public Property mcargocproov As Integer
        Public Property mailcproov As String
        Public Property extcproov As Integer
        Public Property comencproov As String
    End Class
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 19 de noviembre de 2019 13:42
    Moderador
  • hola

    >>¿Como consigo el trato de cada registro devuelto independientemente? Lo digo porque si me devuelve 3 registros, estos se sobreescribirán y no podré tener acceso a los 3

    Tu webmethod esta devoviendo como respuesta un List(Of provee) no necesitas poner propiedades con numero, tu entidad deberia ser

    Public Class provee
    
       //otras propiedades
       
    	Public Property idCDSocial As Integer
    	Public Property nombrecproov As String
    	Public Property telecproov As String
    	Public Property mcargocproov As Integer
    	Public Property mailcproov As String
    	Public Property extcproov As Integer
    	Public Property comencproov As String
    
    
    End Class
    

    quita las propiedades duplicadas con 1,2, etc solo deja una

    Cuando haces el while que itera los registros

    While sdr.Read()
         provees.Add(New provee() With {

    estas creando una nueva instancia, por lo tanto los valores que asignes no se pisan

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 19 de noviembre de 2019 13:46

Todas las respuestas

  • Hola, me parece que se puede mejorar el diseño de tu clase implementando una Lista de Elementos relacionados.

    Fíjate en la clase que he denominado MiEntidadRelacionada. Tenemos una lista de N elementos que podemos rellenar al realizar la consulta. NOTA: Si siempre son 3 se puede definir como un Array de 3 elementos.

    Public Class provee
        Public Property idProveedor As Integer
        Public Property idsc As Integer
        Public Property activoProveedor As Boolean
        Public Property rsocial As String
        Public Property logoproov As String
        Public Property nproov As String
        Public Property aliasproov As String
        Public Property cifnifproov As String
        Public Property direprovee As String
        Public Property idProvincia As Integer
        Public Property provincia As String
        Public Property idPais As Integer
        Public Property pais As String
        Public Property idEstadoProveedor As Integer
        Public Property estadoProveedor As String
        Public Property poblaprovee As String
        Public Property cpprovee As String
        Public Property telefprovee As String
        Public Property webprovee As String
        Public Property social As Boolean
        Public Property listRelacion As List(Of MiEntidadRelacionada)
        Public Property idTempo As Integer
    End Class
    
    Public Class MiEntidadRelacionada
        Public Property idCDSocial As Integer
        Public Property nombrecproov As String
        Public Property telecproov As String
        Public Property mcargocproov As Integer
        Public Property mailcproov As String
        Public Property extcproov As Integer
        Public Property comencproov As String
    End Class
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 19 de noviembre de 2019 13:42
    Moderador
  • hola

    >>¿Como consigo el trato de cada registro devuelto independientemente? Lo digo porque si me devuelve 3 registros, estos se sobreescribirán y no podré tener acceso a los 3

    Tu webmethod esta devoviendo como respuesta un List(Of provee) no necesitas poner propiedades con numero, tu entidad deberia ser

    Public Class provee
    
       //otras propiedades
       
    	Public Property idCDSocial As Integer
    	Public Property nombrecproov As String
    	Public Property telecproov As String
    	Public Property mcargocproov As Integer
    	Public Property mailcproov As String
    	Public Property extcproov As Integer
    	Public Property comencproov As String
    
    
    End Class
    

    quita las propiedades duplicadas con 1,2, etc solo deja una

    Cuando haces el while que itera los registros

    While sdr.Read()
         provees.Add(New provee() With {

    estas creando una nueva instancia, por lo tanto los valores que asignes no se pisan

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 19 de noviembre de 2019 13:46
  • ¿Y como hago la llamada después para leer los datos? Es decir, luego esos valores son devueltos al html, pero no se como recogerlos cuándo hago 3 instancias diferentes
    martes, 19 de noviembre de 2019 16:33
  • Hola, estás usando ASP.NET WebForms o ASP.NET MVC? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 22 de noviembre de 2019 9:24
    Moderador
  • ASP.NET WebForms
    viernes, 22 de noviembre de 2019 16:56