none
Consultas sobre listas genéricas.

    Pregunta

  • Hola a todos:

    Tengo una duda si se puede o no se puede hacer que es la siguiente, tengo muchas consultas de selección en las que el where solo lleva una o dos condiciones, y querría saber si es posible utilizar una lista genérica, que resuelva ese tema con el fin de ahorrar muchas líneas de código redundante en que en la select solo cambia el where con lo comentado.

    Un ejemplo de la select que tengo es el siguiente:

    ublic Shared Sub FormulasBalances_AccionesPropiasReduccCapital_FdosPropios_PAT()
    
            '//IV. (Acciones y particip.en patrimonio propias)
            'Creamos el acceso a datos mediante el nombre de la cadena de conexión existente en el archivo de configuración de la aplicación.
            Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(Configuracion.CadenaConexion)
            Dim valor As Integer = AccesoLogica.ObtenerPeriodos()
    
            Try
                ' Declaramos una variable Connection
                Using cnn As DbConnection = da.CreateConnection()
    
                    ' Creamos el Commando
                    Dim cmd As DbCommand = cnn.CreateCommand
    
                    ReDim AccionesPropiasReduccCapital_FdosPropios_PAT(AccionesPropiasReduccCapital_FdosPropios_PAT.Length - 1)
    
                    If VarGlobal.StrCodPais = "34" Then
                        If VarGlobal.StrPlanConta = "PLAN 2007" Then
                            cmd.CommandText = "SELECT Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, Ejer_06, Ejer_07, Ejer_08, Ejer_09, Ejer_10, Ejer_11, Ejer_12  " &
                                "FROM Balances WHERE IdEmpresa = @empresa AND PlanConta = 'PLAN 2007'  " &
                                "AND Cód_GC IN ('108','109')"
    
                        ElseIf VarGlobal.StrPlanConta = "FISCAL" Then
                            cmd.CommandText = "SELECT Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, Ejer_06, Ejer_07, Ejer_08, Ejer_09, Ejer_10, Ejer_11, Ejer_12  " &
                                "FROM Balances WHERE IdEmpresa = @empresa AND PlanConta = 'FISCAL'  " &
                                "AND Cód_GC = '21400'"
                        Else
                            Return
                        End If
    
                    Else
                        Return
                    End If
    
                    'Creamos el parametro
                    cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
    
                    ' Asignamos la conexión al comando
                    cmd.Connection = cnn
                    cnn.Open()
    
                    Using dr As DbDataReader = cmd.ExecuteReader()
                        While dr.Read
                            For i = 0 To valor
                                AccionesPropiasReduccCapital_FdosPropios_PAT(i) += dr.GetDecimal(i)
                            Next i
                        End While
                    End Using
                End Using
    
            Catch ex As Exception
                MessageBox.Show("Bloqueo en carga de Fórmula: '1414'" & vbCrLf & ex.Message & vbCrLf &
                           "Acepte para continuar.", "FINANCIAL SYSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    Ya utilizo las listas en las instrucciones Insert Into y Update y realmente son una maravilla, por su rapidez y por la facilidad de uso, pero no se como construir lo mismo para las consultas de selección. Os pongo también un ejemplo de una lista para consultas update para ver el sistema que utilizo.

    Aquí creamos la clase para la consulta:

    #Region "ActualizarTablaVarios_AnalFinancieroLargoPlazo"
    
    Imports System.Data.Common
    Imports System.Drawing
    
    Public Class ActualizarTablaVarios_AnalFinancieroLargoPlazo
        Private m_ejer1 As Decimal
        Private m_ejer2 As Decimal
        Private m_ejer3 As Decimal
        Private m_ejer4 As Decimal
        Private m_ejer5 As Decimal
        Private m_ejer6 As Decimal
        Private m_ejer7 As Decimal
        Private m_ejer8 As Decimal
        Private m_ejer9 As Decimal
        Private m_ejer10 As Decimal
        Private m_ejer11 As Decimal
        Private m_ejer12 As Decimal
        Private m_empresa As String
        Private m_orden As String
    
    
    
        Public Sub New(orden As String, ejer1 As Decimal, ejer2 As Decimal, ejer3 As Decimal, ejer4 As Decimal, ejer5 As Decimal, ejer6 As Decimal, ejer7 As Decimal, ejer8 As Decimal, ejer9 As Decimal, ejer10 As Decimal, ejer11 As Decimal, ejer12 As Decimal, empresa As String)
    
            m_orden = orden
            m_ejer1 = ejer1
            m_ejer2 = ejer2
            m_ejer3 = ejer3
            m_ejer4 = ejer4
            m_ejer5 = ejer5
            m_ejer6 = ejer6
            m_ejer7 = ejer7
            m_ejer8 = ejer8
            m_ejer9 = ejer9
            m_ejer10 = ejer10
            m_ejer11 = ejer11
            m_ejer12 = ejer12
            m_empresa = empresa
    
        End Sub
    
        Public ReadOnly Property ejer1 As Decimal
            Get
                Return m_ejer1
            End Get
        End Property
    
        Public ReadOnly Property ejer2 As Decimal
            Get
                Return m_ejer2
            End Get
        End Property
    
        Public ReadOnly Property ejer3 As Decimal
            Get
                Return m_ejer3
            End Get
        End Property
    
        Public ReadOnly Property ejer4 As Decimal
            Get
                Return m_ejer4
            End Get
        End Property
    
        Public ReadOnly Property ejer5 As Decimal
            Get
                Return m_ejer5
            End Get
        End Property
    
        Public ReadOnly Property ejer6 As Decimal
            Get
                Return m_ejer6
            End Get
        End Property
    
        Public ReadOnly Property ejer7 As Decimal
            Get
                Return m_ejer7
            End Get
        End Property
    
        Public ReadOnly Property ejer8 As Decimal
            Get
                Return m_ejer8
            End Get
        End Property
    
        Public ReadOnly Property ejer9 As Decimal
            Get
                Return m_ejer9
            End Get
        End Property
    
        Public ReadOnly Property ejer10 As Decimal
            Get
                Return m_ejer10
            End Get
        End Property
    
        Public ReadOnly Property ejer11 As Decimal
            Get
                Return m_ejer11
            End Get
        End Property
    
        Public ReadOnly Property ejer12 As Decimal
            Get
                Return m_ejer12
            End Get
        End Property
    
        Public ReadOnly Property empresa As String
            Get
                Return m_empresa
            End Get
        End Property
    
        Public ReadOnly Property orden As String
            Get
                Return m_orden
            End Get
        End Property
    
    
        Public Function Update() As String
    
            Return String.Format("UPDATE Varios Set Ejer_01={0}, Ejer_02={1}, Ejer_03={2}, Ejer_04={3}, Ejer_05={4}, Ejer_06={5}, Ejer_07={6}, Ejer_08={7}, Ejer_09={8}, Ejer_10={9}, Ejer_11={10}, Ejer_12={11} WHERE Cod_Empresa='{12}' AND Orden='{13}'",
                                 m_ejer1.ToString().Replace(",", "."), m_ejer2.ToString().Replace(",", "."), m_ejer3.ToString().Replace(",", "."), m_ejer4.ToString().Replace(",", "."), m_ejer5.ToString().Replace(",", "."), m_ejer6.ToString().Replace(",", "."),
                                m_ejer7.ToString().Replace(",", "."), m_ejer8.ToString().Replace(",", "."), m_ejer9.ToString().Replace(",", "."), m_ejer10.ToString().Replace(",", "."), m_ejer11.ToString().Replace(",", "."), m_ejer12.ToString().Replace(",", "."), m_empresa, m_orden)
    
        End Function
    End Class
    #End Region

    y aquí es como relleno la lista y la grabo mediante UPDATE: La he acotado para hacerla mas corta, pero los items son casi iguales.

    Public Shared Sub ListOF_AnalFinancieroLargoPlazo_ActualizacionValoresTabla()
            Try
                Dim lst As New List(Of ActualizarTablaVarios_AnalFinancieroLargoPlazo)
                Dim empresa As String = VarGlobal.StrCodEmpresa
    
    
                lst.Add(New ActualizarTablaVarios_AnalFinancieroLargoPlazo("181", Capital(0), Capital(1), Capital(2), Capital(3), Capital(4), Capital(5), Capital(6), Capital(7), Capital(8), Capital(9), Capital(10), Capital(11), empresa))
                        lst.Add(New ActualizarTablaVarios_AnalFinancieroLargoPlazo("182", PrimaEmision(0), PrimaEmision(1), PrimaEmision(2), PrimaEmision(3), PrimaEmision(4), PrimaEmision(5), PrimaEmision(6), PrimaEmision(7), PrimaEmision(8), PrimaEmision(9), PrimaEmision(10), PrimaEmision(11), empresa))
    
                        Using cnn As DbConnection = da.CreateConnection()
                    cnn.Open()
    
                    ' Creamos el Commando
                    Dim cmd As DbCommand = cnn.CreateCommand()
    
                    For Each item As ActualizarTablaVarios_AnalFinancieroLargoPlazo In lst
    
                        cmd.CommandText = item.Update()
    
                        cmd.ExecuteNonQuery()
    
                    Next
                End Using
    
            Catch ex As Exception
                MessageBox.Show("Bloqueo en carga de Fórmula:          'ListasOF AnalFinancLgoPzo.'" & vbCrLf & ex.Message & vbCrLf &
                       "Acepte para continuar.", "FINANCIAL SYSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    Bueno esa es la duda, he mirado por google y no h encontrado nada que ayude a entender como puedo evitar las select a través de la consulta en una lista.

    Un saludo a todos.

    Gemma

    domingo, 20 de noviembre de 2016 8:35

Respuestas

  • gemma_campillo,

    Para el caso puntual que presentas basta reemplazar únicamente las partes variables, hay muchas formas de lograrlo y una de ellas es utilizando el método Format(), el objetivo final es lograr una cadena que represente una consulta sql válida, por ejemplo:

    If VarGlobal.StrCodPais = "34" Then
    	cmd.CommandText = String.Format("SELECT Ejer_01, Ejer_02, Ejer_03, ... " &
    			"FROM Balances WHERE IdEmpresa=@empresa AND PlanConta='{0}' AND Cód_GC {1}",
    				VarGlobal.StrPlanConta,
    				If(VarGlobal.StrPlanConta = "PLAN 2007", "IN ('108','109')", "'21400'"))
    Else
    	Return
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 20 de noviembre de 2016 17:11
    domingo, 20 de noviembre de 2016 16:10

Todas las respuestas

  • Si vas a generar lista desde la base de datos necesitas un mediador que extraiga de la base de datos y llene tus listas, por facilidad de uso puedes emplear Entity Framework.

    1) añade un nuevo item a tu proyecto (en Datos)  Modelo de Ado.Net y especifica tus datos de conexion.

    2) Se te creará una clase (con el nombre que elgiste para la conexion) la cual podras usar para tus consultas utilizando Linq. (en este ejemplo MiBd)

    using (MiBd contexto = new MiBd())
    {
         List<Cliente> MiLista = contexto.Clientes.Where(c => c.Id == 1).ToList();
    }

    domingo, 20 de noviembre de 2016 11:22
  • gemma_campillo,

    Para el caso puntual que presentas basta reemplazar únicamente las partes variables, hay muchas formas de lograrlo y una de ellas es utilizando el método Format(), el objetivo final es lograr una cadena que represente una consulta sql válida, por ejemplo:

    If VarGlobal.StrCodPais = "34" Then
    	cmd.CommandText = String.Format("SELECT Ejer_01, Ejer_02, Ejer_03, ... " &
    			"FROM Balances WHERE IdEmpresa=@empresa AND PlanConta='{0}' AND Cód_GC {1}",
    				VarGlobal.StrPlanConta,
    				If(VarGlobal.StrPlanConta = "PLAN 2007", "IN ('108','109')", "'21400'"))
    Else
    	Return
    End If


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 20 de noviembre de 2016 17:11
    domingo, 20 de noviembre de 2016 16:10
  • Hola querido Williams.

    Ahora con tu código creo que la he comprendido, tenía problemas en sber como meter los códigos del Where que  veces es 1 o pueden ser 100 por ejemplo, de esa forma la lista nada más tiene el item Cód_GC y se le pone como has indicado.

    Muchas gracias como siempre y a ve si me sale bien.

    Un cordial saludo.

    Gemma

    domingo, 20 de noviembre de 2016 17:11