none
Modificar registro en datatable RRS feed

  • Pregunta

  • Hola a todos:

    Tengo el datatable siguiente:

     Private Function RellenarObjetoDataTable() As DataTable
    
            Dim rutaArchivo As String = ruta
    
            ' Datos necesarios de las celdas de la hoja de cálculo
            '
            'Dim nombreHoja As String = strnomrbehoja
            'Dim celdaInicio As String = CeldaInicial
            'Dim celdaFinal As String = celdaFinal
            Dim rangoCeldas As String = String.Format("[{0}${1}:{2}]",
                                                      strNombreDeHoja, CeldaInicial, CeldaFinal)
    
            ' Índice en base 1 de las columnas donde se encuentran los siguientes datos
            '
            Dim columnaCuentas As Integer = intGruposContables
            Dim columnaSaldosDeudores As Integer = intSaldoDeudor
            Dim columnaSaldosAcreedores As Integer = intSaldoAcreedor
    
            ' Construir la sintaxis de la consulta SQL de selección.
            Dim sql As String = String.Format("SELECT F{0} AS [Cód_GC], F{1} + F{2} AS [{3}] FROM {4}",
                                              columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, VarEjercicio, rangoCeldas)
    
            ' Cadena de conexión, donde indicamos que la primera fila del
            ' rango de celdas NO CONTIENE el nombre de los campos.
            '
            Dim cadenaConexion As String =
                "Provider=Microsoft.ACE.OLEDB.12.0;" &
                "Extended Properties='Excel 12.0 Xml;HDR=No;IMEX=1';" &
                "Data Source=" & rutaArchivo
    
            ' DataTable que contendrá los datos creados por el programa de contabilidad
            ' y localizados en el rango de celdas sin nombre indicado por el usuario.
            '
            Dim dt As New DataTable("DatosExternos")
    
            Using cnn As New OleDbConnection(cadenaConexion)
                Dim cmd As OleDbCommand = cnn.CreateCommand()
                cmd.CommandText = sql
                Dim da As New OleDbDataAdapter(cmd)
                da.Fill(dt)
            End Using
    
            Return dt
    
        End Function

    el cual importa los datos de una hoja de excel perfectamente, pero se me suscitan dos problemas de momento, uno es que tengo un grupo contable en mi datagridview que no se corresponde con el del datatable. El grupo, por ejemplo en mi datagridview es 551D o 551H, según presente saldo deudor o acreedor.

    En el datatable cuando realiza la suma de los campos lo hace bien, pero tendría que añadir o mejor dicho sustituir dicho grupo 551 del datatable por el 551D o 551H que se corresponde a los utilizados después en el Datagridview.

    La pregunta es como puedo realizar esta cuestión con el fin de que el datable presente ya esos cambios, es decir tenga añadido el grupo 551D o 551H según el saldo que presente la tabla de Excel en su grupo 551 (Deudor o Acreedor).

    Para el segundo tema iniciaré una segunda pregunta en el foro para no mezclar posibles soluciones.

    La tabla a importar de excel está colgada aquí: https://mega.nz/#!dd5ixAqZ!H6vNDQ9W6XoivMLM1JGbGki9GsDBWzP2QJL625nZBRM

    Un saludo.

    Gemma

    domingo, 21 de mayo de 2017 5:31

Respuestas

  • "gemma_campillo" preguntó:

    > ..., pero se me suscitan dos problemas de momento, uno es que tengo un grupo contable
    > en mi datagridview que no se corresponde con el del datatable. El grupo, por ejemplo
    > en mi datagridview es 551D o 551H, según presente saldo deudor o acreedor.
    >
    > En el datatable cuando realiza la suma de los campos lo hace bien, pero tendría que
    > añadir o mejor dicho sustituir dicho grupo 551 del datatable por el 551D o 551H que
    > se corresponde a los utilizados después en el Datagridview.
    >

    ¡Madre mía! ¿Pero no decías que los valores de las columnas de saldos deudor y acreedor se tenían que unificar en una sola columna?

    [...] de dicha hoja de Excel, solamente aprovecho 3 columnas: Cuenta , Saldo Deudor, Saldo Acreedor, pero estas dos últimas se han de incluir en una sola columna Ejer_zz que recoge el saldo sea deudor o acreedor. [...]

    ¿Y qué tiene de especial la cuenta 551 (cuentas corrientes con socios y administradores) para tenerla que diferenciar de otras cuentas diferentes donde el Plan General de Contabilidad les permite tener saldo deudor o acreedor?

    Pues si es así, de nada te sirve la sintaxis de la siguiente consulta SQL de selección:

        ' Construir la sintaxis de la consulta SQL de selección.
        Dim sql As String = String.Format("SELECT F{0} AS [Cód_GC], F{1} + F{2} AS [{3}] FROM {4}",
                 columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, VarEjercicio, rangoCeldas)

    porque esa consulta te la indiqué debido a que comentabas que querías unificar los valores de las dos columnas en una sola, pero ahora observo que no es así, ya que hay una "cuenta privilegiada" que parece ser que "es más bonita que las demás".

    Tendrías que recuperar los datos de Excel rellenando el objeto DataTable mediante la ejecución de ésta otra consulta: 

       ' Construir la sintaxis de la consulta SQL de selección.
        Dim sql As String = String.Format("SELECT F{0} AS [Cód_GC], F{1} AS [Deudor], F{2} AS [Acreedor] FROM {3}",
                             columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)

    Con ella recuperarías un objeto DataTable con los datos existentes en el rango de celdas especificadas por el usuario, el cual tendría tres columnas: Cód_GC, Deudor, Acreedor.

    > La pregunta es como puedo realizar esta cuestión con el fin de que el datable presente
    > ya esos cambios, es decir tenga añadido el grupo 551D o 551H según el saldo que presente
    > la tabla de Excel en su grupo 551 (Deudor o Acreedor).

    Acto seguido, mientras recorres el conjunto de filas de ese objeto DataTable, tendrías que ir ANALIZANDO los valores de cada fila individual para ir asignando los valores que desees (individual o colectivo) a las cuentas que figuran en tu control DataGridView. No veo yo otra manera de hacerlo debido a que parece ser que existen "cuentas privilegiadas", por calificarlas de alguna manera, en tu control DataGridView. ;-)

    > La tabla a importar de excel está colgada aquí:

    Si publicas un documento de cualquier programa de Office con la intención de que otras personas puedan acceder al mismo, procura que NO CONTENGA MACROS, porque no están las cosas para ir abriendo documentos que provienen de Internet. Yo, como me fío de ti, lo he abierto, aunque me han aparecido un montón de errores debido a un módulo oculto existente en el documento. He querido abrir el módulo, pero parece ser que tienes protegido el código VBA con una contraseña.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 21 de mayo de 2017 11:14
    Moderador
  • "gemma_campillo" escribió:

    > Por lo tanto la cosa es complicada o muy complicada, te comento que se que hay
    > una persona programadora de una importante distribuidora de software que lleva
    > 2 meses y aún no ha conseguido solucionarlo, me ofrecí a ayudarles pero en vista
    > de que molestan los aportes externos, me comentaron que ellos ya podrían
    > solucionarlo y que yo les pasase algunos datos de los campos que intervienen.

    Yo ya no entiendo nada, me pierdo, y si te soy sincero y sin que te molestes por ello, pienso que la solución al problema no está en preguntar por foros cómo se hace esto o aquello, porque deduzco que más bien es un tema de hacer compatible unos datos externos (los datos de Excel) con la estructura de datos que tú manejas en tu programa, por lo que de nada sirve que nos calentemos la cabeza en buscar una solución sin estar "pegando palos de ciego". Tendrías que comenzar por sentarte tranquilamente, coger papel y lápiz, y mientras te tomas una taza de café (o más de una si es necesario), analizar bien la casuística que se puede presentar y buscar un diseño, más o menos eficaz, para llevar a buen término la importación de datos, porque puede suceder (repito, puede, no que sea cierto) que tu programa no esté preparado para recibir datos de otras fuentes cuya estructura es diferente a la que tú manejas en tu programa, por tanto, tendrás que hacerlo compatible, bien tu programa para adaptarlo a la estructuras de datos externas (que puede que no merezca la pena), o bien hacer que esos datos externos sean compatibles con la estructura de datos de tu programa, sopesando muy bien los pros y los contras.

    Y si a pesar de lo anterior, encima me comentas que hay encargado de ello "una persona programadora de una importante distribuidora de software", pues entonces sí que ya no voy a entrar más en el asunto, porque aunque yo buscase una solución (para ello primero me tendría que enterar bien del problema, de la casuística que se puede presentar y de sus pros y contras), considero que no debería entrometerme en sus asuntos, y menos sin su consentimiento, por lo que solamente me queda desearte ¡suerte! ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 21 de mayo de 2017 14:02
    Moderador

Todas las respuestas

  • "gemma_campillo" preguntó:

    > ..., pero se me suscitan dos problemas de momento, uno es que tengo un grupo contable
    > en mi datagridview que no se corresponde con el del datatable. El grupo, por ejemplo
    > en mi datagridview es 551D o 551H, según presente saldo deudor o acreedor.
    >
    > En el datatable cuando realiza la suma de los campos lo hace bien, pero tendría que
    > añadir o mejor dicho sustituir dicho grupo 551 del datatable por el 551D o 551H que
    > se corresponde a los utilizados después en el Datagridview.
    >

    ¡Madre mía! ¿Pero no decías que los valores de las columnas de saldos deudor y acreedor se tenían que unificar en una sola columna?

    [...] de dicha hoja de Excel, solamente aprovecho 3 columnas: Cuenta , Saldo Deudor, Saldo Acreedor, pero estas dos últimas se han de incluir en una sola columna Ejer_zz que recoge el saldo sea deudor o acreedor. [...]

    ¿Y qué tiene de especial la cuenta 551 (cuentas corrientes con socios y administradores) para tenerla que diferenciar de otras cuentas diferentes donde el Plan General de Contabilidad les permite tener saldo deudor o acreedor?

    Pues si es así, de nada te sirve la sintaxis de la siguiente consulta SQL de selección:

        ' Construir la sintaxis de la consulta SQL de selección.
        Dim sql As String = String.Format("SELECT F{0} AS [Cód_GC], F{1} + F{2} AS [{3}] FROM {4}",
                 columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, VarEjercicio, rangoCeldas)

    porque esa consulta te la indiqué debido a que comentabas que querías unificar los valores de las dos columnas en una sola, pero ahora observo que no es así, ya que hay una "cuenta privilegiada" que parece ser que "es más bonita que las demás".

    Tendrías que recuperar los datos de Excel rellenando el objeto DataTable mediante la ejecución de ésta otra consulta: 

       ' Construir la sintaxis de la consulta SQL de selección.
        Dim sql As String = String.Format("SELECT F{0} AS [Cód_GC], F{1} AS [Deudor], F{2} AS [Acreedor] FROM {3}",
                             columnaCuentas, columnaSaldosDeudores, columnaSaldosAcreedores, rangoCeldas)

    Con ella recuperarías un objeto DataTable con los datos existentes en el rango de celdas especificadas por el usuario, el cual tendría tres columnas: Cód_GC, Deudor, Acreedor.

    > La pregunta es como puedo realizar esta cuestión con el fin de que el datable presente
    > ya esos cambios, es decir tenga añadido el grupo 551D o 551H según el saldo que presente
    > la tabla de Excel en su grupo 551 (Deudor o Acreedor).

    Acto seguido, mientras recorres el conjunto de filas de ese objeto DataTable, tendrías que ir ANALIZANDO los valores de cada fila individual para ir asignando los valores que desees (individual o colectivo) a las cuentas que figuran en tu control DataGridView. No veo yo otra manera de hacerlo debido a que parece ser que existen "cuentas privilegiadas", por calificarlas de alguna manera, en tu control DataGridView. ;-)

    > La tabla a importar de excel está colgada aquí:

    Si publicas un documento de cualquier programa de Office con la intención de que otras personas puedan acceder al mismo, procura que NO CONTENGA MACROS, porque no están las cosas para ir abriendo documentos que provienen de Internet. Yo, como me fío de ti, lo he abierto, aunque me han aparecido un montón de errores debido a un módulo oculto existente en el documento. He querido abrir el módulo, pero parece ser que tienes protegido el código VBA con una contraseña.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 21 de mayo de 2017 11:14
    Moderador
  • Hola Enrique:

    Si, efectivamente al trabajar el programa con una sola columna de saldos, da el problema que esa cuenta 551 y un par o tres más de ellas, las tengo que calificar como 551D o 551H, debido a que existe la misma cuenta el activo y en el pasivo, por lo que según el saldo que tengan en la hoja de excel, tendría que ser 551D para el saldo del Debe y 551H para el saldo del Haber o acreedor.

    Es complicado por que el tema no acaba ahí y me dirás como que no acaba ahí, pues mira, de quererlo hacer correctamente sin marear al usuario, resulta que por un lado verás que hoja de excel tiene el grupo 6 y 7 cerrado, por lo que se entiende que el usuario ha entregado una hoja de excel con los ejercicios cerrados, pues bien, para el análisis esos saldos cerrados los tengo que pasar a la columna nuestra de saldo, es decir, lo que irá en el Ejer_xx por ejemplo y por último se tendrá que mirar que el usuario exporta a 3 y dígito quizás unas veces en la misma hoja de excel u otras como es el caso el dos hojas de Excel: Cuentas de nivel 4 y Cuentas de nivel 3. por lo que el programa que usa el plan contable oficial, tiene que distinguir dichas cuentas y borrar las innecesarias y cuáles son las innecesarias, pues bien, cuando el programa de contabilidad exporta a excel un balance de sumas y saldos los hace a nivel de 3 y 4 dígitos, por lo tanto cuando exporta las de 3 dígitos exporta también las de 4 dígitos. Ahora cuando se compara con el plan contable oficial hay una buena cantidad de cuentas a 4 dígitos que no existen, ya que su nivel contemplado son de nada más que 3 dígitos, así es como lo tengo en el programa. Por lo tanto la cosa es complicada o muy complicada, te comento que se que hay una persona programadora de una importante distribuidora de software que lleva 2 meses y aún no ha conseguido solucionarlo, me ofrecí a ayudarles pero en vista de que molestan los aportes externos, me comentaron que ellos ya podrían solucionarlo y que yo les pasase algunos datos de los campos que intervienen.

    Bueno, la cosa esta así, difícil pero bueno, lo tengo que intentar por nuestro bien.

    Enrique voy a seguir trabajando en ello toda la tarde de hoy a ver si voy sacando un poco más de luz sobre esto.

    Un abrazo muy fuerte y gracias como siempre querido amigo.

    Gemma


    domingo, 21 de mayo de 2017 11:39
  • "gemma_campillo" escribió:

    > Por lo tanto la cosa es complicada o muy complicada, te comento que se que hay
    > una persona programadora de una importante distribuidora de software que lleva
    > 2 meses y aún no ha conseguido solucionarlo, me ofrecí a ayudarles pero en vista
    > de que molestan los aportes externos, me comentaron que ellos ya podrían
    > solucionarlo y que yo les pasase algunos datos de los campos que intervienen.

    Yo ya no entiendo nada, me pierdo, y si te soy sincero y sin que te molestes por ello, pienso que la solución al problema no está en preguntar por foros cómo se hace esto o aquello, porque deduzco que más bien es un tema de hacer compatible unos datos externos (los datos de Excel) con la estructura de datos que tú manejas en tu programa, por lo que de nada sirve que nos calentemos la cabeza en buscar una solución sin estar "pegando palos de ciego". Tendrías que comenzar por sentarte tranquilamente, coger papel y lápiz, y mientras te tomas una taza de café (o más de una si es necesario), analizar bien la casuística que se puede presentar y buscar un diseño, más o menos eficaz, para llevar a buen término la importación de datos, porque puede suceder (repito, puede, no que sea cierto) que tu programa no esté preparado para recibir datos de otras fuentes cuya estructura es diferente a la que tú manejas en tu programa, por tanto, tendrás que hacerlo compatible, bien tu programa para adaptarlo a la estructuras de datos externas (que puede que no merezca la pena), o bien hacer que esos datos externos sean compatibles con la estructura de datos de tu programa, sopesando muy bien los pros y los contras.

    Y si a pesar de lo anterior, encima me comentas que hay encargado de ello "una persona programadora de una importante distribuidora de software", pues entonces sí que ya no voy a entrar más en el asunto, porque aunque yo buscase una solución (para ello primero me tendría que enterar bien del problema, de la casuística que se puede presentar y de sus pros y contras), considero que no debería entrometerme en sus asuntos, y menos sin su consentimiento, por lo que solamente me queda desearte ¡suerte! ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 21 de mayo de 2017 14:02
    Moderador
  • Hola Enrique:

    No te preocupes, se que siempre me has ayudado en todo. Eres genial.

    Si te comento que estoy obligada a seguir, porque eso es para el programa no para una empresa que solamente lo utilizará ella, yo lo hago para que lo pueda utilizar todo el mundo. Por otro lado, el diseño siempre ha funcionando y así me ha funcionado siempre. Voy a intentar seguir porque no me puedo rendir, no lo he hecho nunca ni tampoco lo haré ahora.

    No le falta mucho a esto, pero los conocimientos que me falten los buscaré porque la solución basada en el esquema que me implantaste ayer es una maravilla y a partir de esa maravilla tengo que seguir.

    Te agradezco como siempre enormemente lo que has llegado ha hacer por mí, nunca te estaré bastante agradecida por lo que me has llegado a ayudar siempre y sobre todo a enseñar.

    Bueno, no me quiero enrollar más, tu ya sabes lo que opino de ti.
    Te quiero mucho y eres un gran amigo y mejor persona aunque sea en la distancia.

    Un fuerte agrazo como siempre.

    Gemma.

    domingo, 21 de mayo de 2017 14:19