none
Consolidar tabla eb Access RRS feed

  • Pregunta

  • Hola a todos:

    Estoy tratando de hacer una consolidación de empresas de una tabla de Access, pero me he trabado en la continuación de las misma. Se trata de que a través de ListBox el usuario chequee algunos códigos (por lo menos 2 o más) pertenecientes a las empresas que hay en la tabla con sus valores, sume sus valores y los copie en una nueva empresa(ya creada) sumando los valores de esas 2 empresas o más. Por otra parte, la instrucción la estaba adaptando desde vb6 que funcionaba perfectamente.,

    Pongo la instrucción a ver si alguien me puede ayudar.

      Public Sub Conciliar_ACCESS()
            Try
                If CheckedListBox1.Items.Count < 2 Then
                    MsgBox("Marque las tablas que desea conciliar (al menos, dos)", vbExclamation)
                    Exit Sub
                End If
                If cboTablas.SelectedIndex = -1 Then
                    MsgBox("Seleccione la tabla donde desea conciliarlas", vbExclamation)
                    Exit Sub
                End If
                If cboPlanes.SelectedIndex = -1 And VarGlobal.StrCodPais = "34" Then
                    MsgBox("Seleccione el plan contable", vbExclamation)
                    Exit Sub
                End If
                '****************************************************************************************
                Dim i As Long, j As Long
                Dim empresasO As String, empresaD As String, PLAN As String
                empresaD = cboTablas.Text
                If VarGlobal.StrCodPais = "34" Then
                    PLAN = cboPlanes.Text
                Else
                    PLAN = "PLAN 2007"
                End If
    
                'Obtener las empresas desde las que se sumarán los balances.
                For i = 0 To CheckedListBox1.CheckedItems.Count - 1
                    If CheckedListBox1.GetItemChecked(CInt(i)) Then
                        'codigos de empresas seleccionadas.
                        empresasO = "'" & CheckedListBox1.Items(CInt(i)).ToString & "',"
                    End If
                Next
                empresasO = Strings.Left(empresasO, Len(empresasO) - 1)
    
                If (InStr(1, empresasO, empresaD) > 0) Then
                    MsgBox("No puede ser la misma empresa en la que se consolida que las que se toman como orígen de consolidación.", vbExclamation)
                    Exit Sub
                End If
                '****************************************************************************************
                'HACER EL SQL.
                Dim strSQL As String, WHERE As String
                Dim strJOINS As String
    
                WHERE = " WHERE bC.PlanConta = '" & PLAN & "' AND bC.idEmpresa='" & empresaD & "'"
    
                'JOINS.
                For i = 0 To CheckedListBox1.CheckedItems.Count - 1
                    If CheckedListBox1.GetItemChecked(CInt(i)) Then
                        strJOINS = " INNER JOIN BALANCES AS B" & i & _
                            " ON BC.Cód_GC = B" & i & ".Cód_GC " & _
                            " AND BC.PlanConta = B" & i & ".PlanConta" & ")"
    
                        WHERE = WHERE & " AND B" & i & ".idEmpresa='" & CheckedListBox1.Items(CInt(i)).ToString & "',"
                    End If
                Next i
    
                strSQL = "UPDATE " & CheckedListBox1.CheckedItems.Count, "(") & "BALANCES AS BC " & _
                 strSQL & strJOINS & " SET "   'Aquí da error: Se esperaba el fin de la instrucción.
                '****************************************************************************************
                'VALORES
                For i = 1 To 12
                    strSQL = "BC.Ejer_" & Strings.Right("00" & i, 2) & "="
                    For j = 0 To CheckedListBox1.CheckedItems.Count - 1
                        If CheckedListBox1.GetItemChecked(CInt(j)) Then
                            strSQL = strSQL & "B" & j & ".Ejer_" & Strings.Right("00" & i, 2) & "+"
                        End If
                    Next j
                    strSQL = Strings.Left(strSQL, Len(strSQL) - 1) & ", "
                Next i
    
                strSQL = Strings.Left(strSQL, Len(strSQL) - 2) & 
    
                '****************************************************************************************
                'MOSTRAR LA CONSULTA ARMADA...
                '    txtSQL_CONSOLIDAR.Text = strSQL
                '    Stop
                '    Exit Sub
                '****************************************************************************************
                'EJECUTAR LA CONSOLIDACION.
                'Cn = New ADODB.Connection
                'Cn.Mode = adModeWrite
                'Cn.Open(ConexionBDatos)
                'Cn.Execute(strSQL, , adExecuteNoRecords)
                'Cn = Nothing
                MsgBox("Conciliación finalizada", vbInformation)
                '****************************************************************************************
    
            Catch
    
    btnConciliar_Click_Error:
                MsgBox("Error " & Err.Number & " (" & Err.Description & ") in procedure btnConciliar_Click of Formulario frmConciliacion")
            End Try
        End Sub

    Muchas gracias.

    Gemma

    jueves, 3 de septiembre de 2015 8:17

Respuestas

  • La instrucción:

    New String(CChar("("), CheckedListBox1.CheckedItems.Count) 

    crea una cadena a base de repetir el carácter pasado como primer parámetro tantas veces como se indica en el segundo parámetro.

    Es decir crea una cadena con tantos paréntesis como elementos hay chequeados en el control CheckedListBox1 (si hay dos: dos paréntesis, si hay tres: tres paréntesis, etc.)


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta gemma_campillo jueves, 3 de septiembre de 2015 13:51
    jueves, 3 de septiembre de 2015 13:34

Todas las respuestas

  • La instrucción no está bien

    strSQL = "UPDATE " & CheckedListBox1.CheckedItems.Count, "(") & "BALANCES AS BC " & _
                 strSQL & strJOINS & " SET "   'Aquí da error: Se esperaba el fin de la instrucción.

    debes cambiarlo por:

    strSQL = "UPDATE " & CheckedListBox1.CheckedItems.Count & "(") & "BALANCES AS BC " & _
                 strSQL & strJOINS & " SET "  

    Has puesto una coma y por eso da el error. (No se si el resto de las cadenas strrSQL y strJOINS se forman bien).


    Saludos, Javier J

    jueves, 3 de septiembre de 2015 9:31
  • Hola Javier:

    Gracias como siempre por ayudarme, pero me está dando el mismo error. Inicia el error a partir del paréntesis ") & "BALANCES AS BC " & _es que tampoco se si las anteriores están correctas, en principio pasa bien por ahí.

    Ese trocito de sql continúa con el error: Se esperaba el fin de la instrucción.

    Bueno si ves alguna cosa cuando puedas ya me indicar´`as.

    Un cordial saludo.

    Gemma

    jueves, 3 de septiembre de 2015 9:48
  • Hola Gemma,

    ¿podrías poner la consulta ya montada? Sería más fácil localizar el error.

    Por lo que he visto en las JOINS cierras un paréntesis que no abres:

                For i = 0 To CheckedListBox1.CheckedItems.Count - 1
                    If CheckedListBox1.GetItemChecked(CInt(i)) Then
                        strJOINS = " INNER JOIN BALANCES AS B" & i & _
                            " ON BC.Cód_GC = B" & i & ".Cód_GC " & _
                            " AND BC.PlanConta = B" & i & ".PlanConta" & ")"
    
                        WHERE = WHERE & " AND B" & i & ".idEmpresa='" & CheckedListBox1.Items(CInt(i)).ToString & "',"
                    End If
                Next i


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 3 de septiembre de 2015 9:57
  • Hola Asier:

    He corregido lo que me has indicado pero el error sigue en el mismo sito.

    Cuando me dices: ¿podrías poner la consulta ya montada? , te refieres a acabar el final de la instrucción. Te lo  comento porque eso es todo lo que tengo y que es lo mismo que tenía en el Vb6 solamente faltará la parte final de la consulta, la de: EJECUTAR LA CONSOLIDACIÓN, pero no la he hecho porque voy trozo a trozo adaptándola.

    Muchas gracias como siempre Asier y si te refieres a otra cosa, por favor indícamela.

    Un saludo.,

    Gemma


    jueves, 3 de septiembre de 2015 10:09
  • Hola:

    Pongo aquí la consulta tal como la tengo en el Vb6, la cual la estoy adaptando a .net

    Public Sub Conciliar_ACCESS()
        On Error GoTo btnConciliar_Click_Error
    '    txtSQL_CONSOLIDAR.Text = ""
        
        '****************************************************************************************
        If lbxTablas.SelCount < 2 Then
            MsgBox "Marque las tablas que desea conciliar (al menos, dos)", vbExclamation
            Exit Sub
        End If
        If cboTabla.ListIndex = -1 Then
            MsgBox "Seleccione la tabla donde desea conciliarlas", vbExclamation
            Exit Sub
        End If
        If cboPlan.ListIndex = -1 And m_strCodPais = "34" Then
            MsgBox "Seleccione el plan contable", vbExclamation
            Exit Sub
        End If
        '****************************************************************************************
        Dim i As Long, j As Long
        Dim empresasO As String, empresaD As String, PLAN As String
        empresaD = cboTabla.Text
        If m_strCodPais = "34" Then
            PLAN = cboPlan.Text
        Else
            PLAN = "PLAN 2007"
        End If
        
        'Obtener las empresas desde las que se sumarán los balances.
        For i = 0 To lbxTablas.ListCount - 1
            If lbxTablas.Selected(i) Then
                'codigos de empresas seleccionadas.
                empresasO = empresasO & "'" & lbxTablas.List(i) & "',"
            End If
        Next
        empresasO = Left(empresasO, Len(empresasO) - 1)
        
        If (InStr(1, empresasO, empresaD) > 0) Then
            MsgBox "No puede ser la misma empresa en la que se consolida que las que se toman como orígen de consolidación.", vbExclamation
            Exit Sub
        End If
        '****************************************************************************************
        'HACER EL SQL.
        Dim Cn As ADODB.Connection, strSQL As String, WHERE As String
        Dim strJOINS As String, strChar As String
        
        WHERE = " WHERE bC.PlanConta = '" & PLAN & "' AND bC.idEmpresa='" & empresaD & "'"
        
        'JOINS.
        For i = 0 To lbxTablas.ListCount - 1
            If lbxTablas.Selected(i) Then
                strJOINS = strJOINS & _
                    " INNER JOIN BALANCES AS B" & i & _
                    " ON BC.Cód_GC = B" & i & ".Cód_GC " & _
                    " AND BC.PlanConta = B" & i & ".PlanConta" & ")"
                
                WHERE = WHERE & " AND B" & i & ".idEmpresa='" & lbxTablas.List(i) & "'"
            End If
        Next i
        strSQL = "UPDATE " & String(lbxTablas.SelCount, "(") & "BALANCES AS BC " & _
            strSQL & strJOINS & " SET "
        '****************************************************************************************
        'VALORES
        For i = 1 To 12
            strSQL = strSQL & "BC.Ejer_" & Right$("00" & i, 2) & "="
            For j = 0 To lbxTablas.ListCount - 1
                If lbxTablas.Selected(j) Then
                    strSQL = strSQL & "B" & j & ".Ejer_" & Right$("00" & i, 2) & "+"
                End If
            Next j
            strSQL = Left$(strSQL, Len(strSQL) - 1) & ", "
        Next i
        strSQL = Left$(strSQL, Len(strSQL) - 2) & WHERE
        '****************************************************************************************
        'MOSTRAR LA CONSULTA ARMADA...
    '    txtSQL_CONSOLIDAR.Text = strSQL
    '    Stop
    '    Exit Sub
        '****************************************************************************************
        'EJECUTAR LA CONSOLIDACION.
        Set Cn = New ADODB.Connection
        Cn.Mode = adModeWrite
        Cn.Open ConexionBDatos
        Cn.Execute strSQL, , adExecuteNoRecords
        Set Cn = Nothing
        MsgBox "Conciliación finalizada", vbInformation
        '****************************************************************************************
    
        On Error GoTo 0
        Exit Sub
    
    btnConciliar_Click_Error:
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure btnConciliar_Click of Formulario frmConciliacion"
    End Sub

    Un saludo.

    Gemma

    jueves, 3 de septiembre de 2015 10:16
  • Me refiero a la consulta SQL, es decir al contenido de la variable strSQL una vez ejecutado el código (lo que en el código llamas "la consulta armada")

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 3 de septiembre de 2015 10:31
  • Hola Asier:

    El resultado es el relleno de los códigos y valores de la empresa en la hemos sumado los valores de las otras, te pongo un ejemplo de como queda. Suponemos que la empresa 001 y la empresa 002 se han de consolidar en la 010 la cual no tiene valores ya que los mismos serán las suma de las empresas 001 y 002. En el caso del ejemplo, te lo he puesto en Excel y acotado para ver lo que se precisa, con los valores en la empresa 010 que serían el resultado de la consulta.

    Ahí vemos que la empresa 010 recoge la suma de todos los valores de las empresas 001 y 002 a través de sus códigos de cuenta, su plan contable y sus valores de los Ejer_xx.

    No se si era esto lo que preguntabas, la tabla es de Access 2010.

    Si hay alguna duda re ruego me lo indiques, pero eso es al final lo que preciso. Poder sumar varias empresas, como mínimo 2 en otra que recoja la suma de todas ellas. (Consolidación).

    Bueno Asier gracias otra vez por tu ayuda como siempre.

    Un abrazo.

    Gemma

    jueves, 3 de septiembre de 2015 10:56
  • No. A ver si conseguimos entendernos.

    En tienes comentado código para sacar, una vez construida, la consulta SQL en un TextBox txtSQL_CONSOLIDAR:

                'MOSTRAR LA CONSULTA ARMADA...
                '    txtSQL_CONSOLIDAR.Text = strSQL
                '    Stop
                '    Exit Sub

    Entiendo que para comprobar si la consulta se construye correctamente. Es a ese texto que tratas de mostrar en el TextBox al que me refiero.

    Porque el error entiendo que se produce al tratar de ejecutar la sentencia ¿no? ¿O se produce antes?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 3 de septiembre de 2015 11:12
  • Hola Asier:

    Es que la sentencia no la he llegado a ejecutar, estoy contruyéndola y no hay errores de sintaxis hasta que llego al indicado: ) & "BALANCES AS BC " & _
                 strSQL
    & strJOINS & " SET "   'Aquí da error: Se esperaba el fin de la instrucción.

    Por lo tanto no he seguido y tampoco me acuerdo de los textboxs esos ya que no existen tampoco en vb6, eso se haría nada mas que para verificar, si te fijas en la sentencia hecha en el VB6 están tildados y no existen.  He querido seguir la misma sentencia pero a lo mejor es más fácil hacerlo de otra manera pero es que no tengo más información que la que he puesto aquí, todo está en el procedimiento "Conciliar_Access".

    Lo siento, pero no se si te puedo aportar algo más.

    Gracias Asier.

    Gemma


    • Editado gemma_campillo jueves, 3 de septiembre de 2015 11:18 ampliar explicacion
    jueves, 3 de septiembre de 2015 11:15
  • Hola Asier:

    Tengo en el form 2 métodos para cargar la tabla y los planes.

     Private Sub CargarTablas()
            Dim StrTabla As String
    
            Using Cnn As New OleDbConnection(CadenaConexion)
                Dim cmd As OleDbCommand = Cnn.CreateCommand()
                cmd.CommandType = CommandType.Text
                Cnn.Open()
    
                cmd.CommandText = "SELECT DISTINCT idEmpresa FROM Balances WHERE PLANCONTA = @planconta ORDER BY idEmpresa "
                cmd.Parameters.AddWithValue("@planconta", VarGlobal.StrPlanConta)
    
                Using rst As OleDbDataReader = cmd.ExecuteReader()
                    While rst.Read
                        StrTabla = rst.GetString(0)
                        CheckedListBox1.Items.Add(StrTabla)
                        cboTablas.Items.Add(StrTabla)
                    End While
                End Using
            End Using
        End Sub
    
        Private Sub CargarPlanes()
            Dim Plan As String
    
            Using Cnn As New OleDbConnection(CadenaConexion)
                Dim cmd As OleDbCommand = Cnn.CreateCommand()
                cmd.CommandType = CommandType.Text
                Cnn.Open()
    
                cmd.CommandText = "SELECT DISTINCT PlanConta FROM Balances WHERE PLANCONTA = @planconta ORDER BY PlanConta"
                cmd.Parameters.AddWithValue("@planconta", VarGlobal.StrPlanConta)
    
                Using rst As OleDbDataReader = cmd.ExecuteReader()
                    While rst.Read
                        Plan = rst.GetString(0)
                        cboPlanes.Items.Add(Plan)
                    End While
                End Using
            End Using
        End Sub

    No se si eso puede servir de ayuda.

    Gemma

    jueves, 3 de septiembre de 2015 11:23
  • Vale, te había entendido mal. Creía que el error te daba al ejecutar la sentencia (eso pasa por no leer con más calma los mensajes, perdona).

    Sí, hay un error en la instrucción.

    Entiendo que se trata de abrir tantos paréntesis como empresas seleccionadas. Debería ser:

    strSQL = "UPDATE " & New String("(", CheckedListBox1.CheckedItems.Count) & "BALANCES AS BC " & _
                 strSQL & strJOINS & " SET "

    Viendo esta instrucción igual no sobraba el cierre de paréntesis que te había comentado antes.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 3 de septiembre de 2015 11:46
  • Hola Asier:

    He tenido que convertir a char, porque si no da error:

    strSQL = "UPDATE " & New String(CChar("("), CheckedListBox1.CheckedItems.Count) & "BALANCES AS BC " & _
                strSQL & strJOINS & " SET "

    Lo que no se si la instrucciones es para 2 empresas o más. Yo no la entiendo por lo que si tu lo sabes me lo indicas por favor.

    Gemma

    jueves, 3 de septiembre de 2015 12:02
  • La instrucción:

    New String(CChar("("), CheckedListBox1.CheckedItems.Count) 

    crea una cadena a base de repetir el carácter pasado como primer parámetro tantas veces como se indica en el segundo parámetro.

    Es decir crea una cadena con tantos paréntesis como elementos hay chequeados en el control CheckedListBox1 (si hay dos: dos paréntesis, si hay tres: tres paréntesis, etc.)


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta gemma_campillo jueves, 3 de septiembre de 2015 13:51
    jueves, 3 de septiembre de 2015 13:34
  • Hola Asier:

    Ahora la he entendido, muchas gracias por tu explicación.

    Te quedo muy agardecida por todo.

    Un abrazo.

    Gemma

    jueves, 3 de septiembre de 2015 13:52
  • Hola Asier:

    Estoy muy pesada con esto pero no me acabo de aclarar.

    Si pudieras serías tan amable de indicarme como ejecuto la sentencia, estoy probando con la cdm.executenonquery y nada. Estoy confusa con la misma y no atino a ejecutarla.

    Por favor si puedes y discúlpame me indicas que tengo o como lo puedo hacer, la sentencia corre perfectamente y voy viendo los datos que lleva, pero al final le pongo cmd.CommandText= srtsql y nada, con executenonquery me da error de que se esperaba Insert, Update, etc.

    No se como acabarla.

    Bueno, de cualquier manera te agradezco enormemente tu apoyo. Pero nunca he hecho sentencias así y no me aclaro.

    Un saludo.

    Gemma

    jueves, 3 de septiembre de 2015 14:55