none
Consolidar registros en una tabla. RRS feed

  • Pregunta

  • Hola a todos:

    Tengo una sentencia sql en Access, que intento que me sume por ejemplo 2 empresas en una tercera, es decir me agrupe los valores en esa tercera. Pongo la sentencia que utilizo, la cual me está dando error en la secuencia Valor = tal como muestra la imagen con el mensaje.

    La sentencia es la siguiente y os pongo el error al final de este mensaje:

    Public Sub Consolidar_Empresas()
            Dim Transaccion As OleDbTransaction = Nothing
            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
                Dim campo As String, Valor As String, ej As Long, empresasO As String, empresaD As String
                Dim WHERE As String, PLAN As String
                empresaD = cboTablas.Text
                empresasO = ""
                PLAN = cboPlanes.Text
    
                'Obtener las empresas desde las que se sumarán los balances.
                For i = 0 To cboTablas.Items.Count - 1
                    If CBool(CheckedListBox1.GetItemChecked(CInt(i))) Then
                        'codigos de empresas seleccionadas.
                        empresasO = empresasO & "'" & cboTablas.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
    
                '****************************************************************************************
    
                Using Cnn As New OleDbConnection(CadenaConexion)
                    Dim cmd As OleDbCommand = Cnn.CreateCommand()
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = strSQL
                    Cnn.Open()
    
                    'Inicio la transacción
                    'Transaccion = Cnn.BeginTransaction()
                    'se hacen 12 UPDATES (uno por cada ejercicio), por consiguiente se inicia una TRANSACCION.
    
                    For ej = 1 To 12
                        strSQL = "UPDATE B_D set B_D."
                        campo = "Ejer_" & Strings.Right("00" & ej, 2)
                        Valor = "(SELECT SUM (" & "B_O." & campo & ") FROM Balances AS B_O WHERE B_O.IdEmpresa IN (" & _
                            empresasO & ") AND B_O.PlanConta = B_D.PlanConta AND B_O.[Cód_GC] = B_D.[Cód_GC]) FROM Balances AS B_D "
                        WHERE = "B_D.idEmpresa='" & empresaD & "' AND B_D.PlanConta='" & PLAN & "'"
                        cmd.CommandText = strSQL & campo & "=" & Valor & " WHERE " & WHERE
                        cmd.ExecuteNonQuery()
                    Next
    
                    'si llego hasta aca es porque no dio errores, entonces confirmar la transacción.
                    'Finalizamos la transaccion
                    Transaccion.Commit()
    
                    MsgBox("Consolidación finalizada", vbInformation)
    
                End Using
                Exit Sub
                '********************************************************************************************
            Catch
                'Deshacemos la transaccion si hay errror.
                Transaccion.Rollback()
                MsgBox("Error " & Err.Number & " (" & Err.Description & ") in procedure btnConciliar_Click of Formulario frmConciliacion")
            End Try
        End Sub

    Por otro lado os adjunto las imágenes del form de consolidación y del visualizador de texto.

    Visualizador del error que da:

    Os quedo muy agradecida como siempre, pero no se encontrar el error.

    Gemma

    martes, 17 de noviembre de 2015 11:38

Respuestas

  • Hola:
    Si se pasa por el analizador de SQL (ver imagen), no da errores de sintaxis.
    SQL y Acces no tienen exactamente el mismo lenguaje sql, asi que no sabria decirte pues en Acces no tengo modo de probarlo


    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta gemma_campillo miércoles, 18 de noviembre de 2015 10:55
    miércoles, 18 de noviembre de 2015 10:26

Todas las respuestas

  • Hola:

    Lo ideal sería 'imprimir' siempre la consulta que ejecutas y comprobarla en SQLServer, allí seguro que se ve mucho mejor el error:

    cmd.CommandText = strSQL & campo & "=" & Valor & " WHERE " & WHERE

    debug.print cmd.CommandText ' => Para ver lo que realmente se va a ejecutar.

    cmd.ExecuteNonQuery()

    Así por encima, tiene 'pinta' de lio con los paréntesis, pero lo dicho, mejor imprimir y comprobar la sentencia real.

    Un saludo


    • Editado LG DES martes, 17 de noviembre de 2015 12:00
    martes, 17 de noviembre de 2015 12:00
  • Hola.

    Añade una linea como esta
    Dim lsQuery As string = strSQL & campo & "=" & Valor & " WHERE " & WHERE
    antes de
    cmd.CommandText = strSQL & campo & "=" & Valor & " WHERE " & WHERE
    y posteas (o ejecutas dicha consulta en Access) que valor tiene la variable lsQuery que es lo que realmente se ejecuta.

    Un saludo desde Bilbo
    Carlos

    martes, 17 de noviembre de 2015 12:10
  • Hola Carlos:

    Ya la he puesto y en el visor de texto sale esto:

    Ese es el valor que lleva  lsQuery en la primera pasada del bucle, es decir son 12 ejercicios pues este es el Ejer_01.

    Gracias por tu ayuda como siempre.

    Un abrazo.

    Gemma

    martes, 17 de noviembre de 2015 13:55
  • Hola:
    Si se pasa por el analizador de SQL (ver imagen), no da errores de sintaxis.
    SQL y Acces no tienen exactamente el mismo lenguaje sql, asi que no sabria decirte pues en Acces no tengo modo de probarlo


    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta gemma_campillo miércoles, 18 de noviembre de 2015 10:55
    miércoles, 18 de noviembre de 2015 10:26
  • Hola Carlos:

    Vamos a dar la respuesta por buena. También la tengo hecha en sql y me funciona lo único que tiene la mala leche que no me lo suma, solo me pone en la empresa que consolida la 199,  los valores de la 001 y no de las dos (001,005), pero estoy con ello y no me levanto hasta que no salga, soy cabezona y por una tontería no me fastidia todo un form.

    Querido Carlos un fuerte abrazo y gracias como siempre.

    Gemma.

    miércoles, 18 de noviembre de 2015 10:55
  • Hola Carlos:

    En Access la tengo de esta manera también y no da ningún error, solo que no me las suma y a lo mejor el problema me viene de la selección de empresas, que me esté dejando alguna cosa.

    De todas formas te pongo la que estoy probando también:

    Public Sub Consolidar_Empresas() 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 empresasO = "" 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 cboTablas.Items.Count - 1 If CBool(CheckedListBox1.GetItemChecked(CInt(i))) Then 'codigos de empresas seleccionadas. empresasO = empresasO & "'" & cboTablas.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 strJOINS = "" strSQL = "" WHERE = " WHERE bC.PlanConta = '" & PLAN & "' AND bC.idEmpresa='" & empresaD & "'" 'JOINS. For i = 0 To CheckedListBox1.CheckedItems.Count - 1 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='" & CheckedListBox1.CheckedItems(CInt(i)).ToString() & "'" Next i strSQL = "UPDATE " & New String(CChar("("), CheckedListBox1.CheckedItems.Count) & "BALANCES AS BC " & _ strSQL & strJOINS & " SET " '**************************************************************************************** 'VALORES For i = 1 To 12 strSQL = 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 Dim lsQuery As String = Strings.Left(strSQL, Len(strSQL) - 2) & WHERE strSQL = Strings.Left(strSQL, Len(strSQL) - 2) & WHERE '**************************************************************************************** 'MOSTRAR LA CONSULTA ARMADA... ' txtSQL_CONSOLIDAR.Text = strSQL ' Stop ' Exit Sub '**************************************************************************************** 'EJECUTAR LA CONSOLIDACION. Using Cnn As New OleDbConnection(CadenaConexion) Dim cmd As OleDbCommand = Cnn.CreateCommand() cmd.CommandType = CommandType.Text cmd.CommandText = strSQL Cnn.Open() cmd.ExecuteNonQuery()

    End Using

    MsgBox("Consolidación finalizada con éxito.", vbInformation) '**************************************************************************************** Catch MsgBox("Error " & Err.Number & " (" & Err.Description & ") in procedure btnConciliar_Click of Formulario frmConciliacion") End Try End Sub

    Funciona perfectamente pero no se porqué no me la suma, no dá ningún error.

    Gemma



    • Editado gemma_campillo miércoles, 18 de noviembre de 2015 11:02 Sintaxis
    miércoles, 18 de noviembre de 2015 10:58