none
limite de registros en access con vb.net RRS feed

  • Pregunta

  • hola, necesito ayuda. este es mi problema: tengo una aplicacion en visual basic ke me permite ingresar ventas en access, pero resulta ke solo me deja ingresar 154 registros mas no. encima cuano quiero hacer el digamos 155 ingreso, me lo toma pero no me aparece ( ya ke en la aplicacion tengo un grid ke me muetras los ingresos )
    ayudaaa, gracias diaz julian

    Julian Diaz
    viernes, 8 de julio de 2011 22:09

Respuestas

  • "julix94" escribió:

    > resulta que al querer usarlo en el proceso "Nuevo" (es decir,
    > cuando se ingresa una nueva venta, el datagridview se tedria
    > que actualizar). me salta un error:
    >
    > No se ha especificado ningún argumento para el parámetro 'dt'
    > de 'Private Function ActualizarDatos(dt As System.Data.DataTable) As Integer'.
    >

    ¡Bueno! Creo que el error está bastante claro. Si tu tienes definido el procedimiento ActualizarDatos de la siguiente manera:

      Private Function ActualizarDatos(ByVal dt As DataTable) As Integer

    tendrás que pasarle un objeto DataTable cuando llames a dicho procedimiento desde el método Nuevo:

      ActualizarDatos(objetoDataTable)

    Pero en el procedimiento Nuevo, no veo por ningún lado un objeto DataTable que le puedas pasar al procedimiento ActualizarDatos. Ese es el motivo del error que estás obteniendo.

    Aparte, no le encuentro ningún sentido que ejecutes una consulta SQL de datos añadidos (INSERT INTO) para añadir nuevos registros a la tabla Ventas, y posteriormente quieras actualizar también la mencionada tabla con los datos existentes en un supuesto objeto DataTable, es decir, ejecutar el contenido del procedimiento ActualizarDatos. De esa manera te estás arriesgando a duplicar datos, porque puede suceder que estés añadiendo el mismo registro dos veces: uno mediante la consulta INSERT INTO, y otro, mediante el método Update de un adaptador de datos.

    Con el debido respeto, te diré que creo que te estás haciendo "la picha un lío". :-))

    Si añades nuevos registros mediante una consulta INSERT INTO, ¿para qué "leches" quieres también actualizar los datos mediante el método Update de un objeto OleDbDataAdapter? Puedes utilizar uno u otro método, pero no los dos a la misma vez.

    > si es la misma base de datos access "Ventas"

    Es decir, que con Microsoft Access abres la base de datos Ventas.accdb que se encuentra en la carpeta D:\Ventas. Entonces descarto que estes utilizando dos bases de datos distintas. No obstante, te diré que no es una buena idea almacenar la base de datos en la raíz de una unidad. ¿No puedes almacenarla en una subcarpeta de la unidad D? Tarde o temprano vas a tener otros problemas diferentes por almacenar la base de datos en la raíz de una unidad de tu disco duro.

    A fin de no demorar mucho la solución de tu problema, procura explicar bien los problemas que estás teniendo evitando errores en la descripción del problema, porque empezó la conversación porque no podías ingresar más de 154 registros, y vamos ahora con un error de sintaxis a la hora de llamar a un método, que es un asunto básico. A un procedimiento hay que pasarle todos los parámetros que requiera. ;-)

     


    Enrique Martínez
      [MS MVP - VB]


    jueves, 14 de julio de 2011 16:09
    Moderador
  • Desde el siguiente enlace podrás descargar el código fuente del archivo Form1.vb, con las modificaciones que he efectuado:

    http://mvp-access.es/softjaen/downloads/form1.zip

    Obviamente, deberás de hacer una copia de seguridad de tu archivo Form1.vb, para que puedas restaurarlo por si no te gustan las moficiaciones que he realizado. :-)

    Todas las líneas que he comentado (que como podrás observar son abundantes), las puedes eliminar si crees que te sirve el código fuente tal cual lo he dejado.

    El motivo de que no pudieras añadir más de 154 registros, ignoro a qué se puede deber, porque no lo he podido reproducir. Desde luego, con las modificaciones efectuadas, no he tenido problema alguno para añadir más de 154 registros a la tabla Ventas.

    Como estás utilizando valores Autonuméricos en las tablas de la base de datos, séría conveniente que compactaras las bases de datos desde el propio Microsoft Access para que se reinicialicen dichos valores, sobre todo cuando vayas a poner en producción tu aplicación. Ten en cuenta que los valores autonuméricos puede que no estén consecutivos, porque puede suceder que hayas cancelado la inserción de un nuevo registro.

    He aprovechado para modificar el código de llamada a Microsoft Excel para mostrar la hoja de cálculo. En lugar de utilizar la función API ShellEx, simplemente basta con llamar al método compartido Start de la clase Process.

    Sería conveniente que los procedimientos generales los tuvieras fuera de la clase Form1, bien en un módulo o como procedimientos compartidos de una clase. Pero ¡bueno! Esto ya no tiene nada que ver con el asunto inicial de tu mensaje.

    En fin, estudia las modificaciones que he efectuado para que observes bien cómo se muestran los datos, y cómo se tiene que actualizar los mismos. :-)

     

     

     


    Enrique Martínez
      [MS MVP - VB]


    viernes, 15 de julio de 2011 7:24
    Moderador
  • Julian, lo primero que te digo es que el formulario que te he enviado, FUNCIONA A LA PERFECCIÓN. ¿De acuerdo?

    "juliz94" escribió:

    > 1.Al principio del form declaras a "activeConn" como una
    > nueva OleDBConnection y después la declaras, también,
    > como String (Lo mismo sucede con las otras conexiones ACN,
    > ACN2, ACN3 y ACN4). El error que surge es que después las
    > conviertes en String y eso no se puede (Aparece en la lista de errores). EJ:
    > Private activeConn As New OleDbConnection
    >  Private activeConn As String

    Pero, ¡hombre! ¡No hagas eso!

    Las declaraciones OleDbConnection ESTÁN COMENTADAS. ¿Sabes lo que significa "comentar una línea"? Si una línea comienza con una comilla simple ('), esa línea NO SE COMPILA.

    Lo que tienes que hacer es ELIMINAR TODAS LAS LÍNEAS QUE COMIENZAN POR UN COMILLA SIMPLE, como por ejemplo la siguiente línea:

      '  Private activeConn As New OleDbConnection

    Insisto. Me ha llevado bastante tiempo depurar tu programa para que ahora vengas diciendo que tienes más problemas. El formulario funciona correctamente, pero si tu te limitas a quitar las comillas simples (quitar las líneas comentadas), entonces he perdido el tiempo.

    Por cierto, no estarías de más que marcaras alguna respuesta como satisfactoria, si crees que te ha sido útil.


    Enrique Martínez
      [MS MVP - VB]


    viernes, 15 de julio de 2011 15:11
    Moderador
  • He decido eliminar yo mismo las líneas comentadas porque no tengo ganas de dedicarle ésta tarde también a tu formulario.

    Si lo crees conveniente, descarga nuevamente el archivo zip. Por supuesto, nuevamente te recomiendo que efectúes una copia de seguridad de tu propio formulario.

        http://mvp-access.es/softjaen/downloads/form1.zip

    Y lo dicho, si no te gustan las modificaciones efectuadas, con restaurar tu copia de seguridad es suficiente, pero obviamente, no vuelvas a preguntarme donde se encuentra el error, porque tienes numerosos errores, no de sintaxis, si no de una utilización inadecuada de los objetos.

     


    Enrique Martínez
      [MS MVP - VB]

    • Marcado como respuesta julix94 viernes, 15 de julio de 2011 15:48
    viernes, 15 de julio de 2011 15:22
    Moderador

Todas las respuestas

  • y eso, si que es raro, Access no tiene limitaciones en cuanto a registros

    cuando ingresas este registro 155, obtienes algun error ?

    has probado haciando

    Dim afectados As Integer = cmd.ExecuteNonQuery()

    y evaluado si devuelve un 1 en la variable para avaluar si afecto a al tabla con el INSERT

     

    valida tambien que apuntas a la db correcta cuando haces esto, a veces suele suceder que alguna parte del codigo usa un connection string a una db y por error en otra parte se usa otro por eso no se notan las actualizaciones

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 9 de julio de 2011 0:46
  • mira, no me devuelve ningun error, es mas tengo dos pasos de confirmacion antes de que se registre la venta. uno confirma el mes y el medico y el otro es una notificacion de ke la venta ya se ingreso. igual el problema esque no me aparece en ningun grid de la aplicacion los ingresos que yo hago (osea los ingresos posteriores a digamos 155) ahora bien cuando habro la base de datos me aprecen esos ingresos. Asike no se cual es el problema....???

    ayuda, gracias


    Julian Diaz
    sábado, 9 de julio de 2011 14:49
  • pero cuando dices grid te refires al datagridview de tu pantalla ? pero ahs verficado abriendo la db access directamente y validando si esta alli la informacion

    ademas como validas que se inserto el registro? o sea aplcias la tecncia que comente de tomar las fials afectadas por el comando ExecuteNonQuery porque no veo otra forma de hacerlo

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 9 de julio de 2011 15:05
  • perdona me exprese mal, vuelvo a comentarte:

    La aplicacion es basicamente un sistema que me permite elegir datos de combobox y luego ingresa los textos a a una base de datos access (mes, medico, producto y cantidad). ahora bien, la aplicacion tiene varios datagridview´s que lo que hacen es mostrar los registro de la base de datos de los ingresos ("Ventas"). Cuando el usuario quiere ingresar una nueva venta (o registro...) se le hace un pregunta confirmando si el mes es: elquesea y el medico: elquesea. Luego cundo confirma tal pregunta, sale una ventana emergente (msgbox) confirmando que el ingreso de tal venta se realizo correctamente, ahora bien cuando mensaje se cierra, teoricamente tendria que aparecer en el datagridview el el ultimo ingreso, no? bueno, resulta que no aparece (pero cuando abro el access de "Ventas", si me aparecen los ingresos que realice... (digamos los que no me aparecen el grid))


    Julian Diaz
    sábado, 9 de julio de 2011 15:54
  • Hola

    Lo que pasa es que no estas refrescando los datos del datagridview, por eso es que te estan quedando como los tenías al comienzo... tienes 2 opciones, recargar toda la información cargando de nuevo todos los valores, o agregando directamente al datagridview los nuevos valores.

     

    Saludos


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    sábado, 9 de julio de 2011 16:14
  • no, alli te equivocas. mi te muestro el codigo de mi ingreso:

    Sub NUEVO()
        Dim mensaje As String = String.Format("Confirma que el medico es:'{0}' y el mes:'{1}'", cbxVentaMedico.Text, cbxVentaMes.Text)
        Dim result As DialogResult = MessageBox.Show(mensaje, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    
        If result = DialogResult.Yes Then
          sCnn.Open()
          Dim query As String = "INSERT INTO Ventas (Mes, Medico, Producto, Cantidad) VALUES (@IngresoMes, @IngresoMedico, @IngresoProducto, @IngresoCantidad)"
          Dim CMD As New OleDb.OleDbCommand(query, sCnn)
    
          CMD.Parameters.AddWithValue("@IngresoMes", cbxVentaMes.Text)
          CMD.Parameters.AddWithValue("@IngresoMedico", cbxVentaMedico.Text)
          CMD.Parameters.AddWithValue("@IngresoProducto", cbxVentaProducto.Text)
          CMD.Parameters.AddWithValue("@IngresoCantidad", txtVentaCantidad.Text)
    
          CMD.ExecuteNonQuery()
    
          sCnn.Close()
    
          <strong> Mostrar()</strong>
          MsgBox("Se ha ingresado la venta")
    
        Else
          cbxVentaMedico.Text = ""
          cbxVentaMes.Text = ""
        End If
    
        txtVentaCantidad.Clear()
        cbxVentaProducto.SelectedIndex = 0
    
      End Sub
    

    El Mostrar() es un proceso que renueva todos los datagrid, y su codigo es el siguiente (sCnn es el oledbconecction con la base access "Ventas"):

     Sub Mostrar()
        Dim DA As New OleDb.OleDbDataAdapter("Select * from Ventas", sCnn)
        Dim DS As New DataSet
        DA.Fill(DS, "Ventas")
        DataGridView1.DataSource = DS.Tables("Ventas")
        DataGridView3.DataSource = DS.Tables("Ventas")
      End Sub
    
    Julian Diaz


    Julian Diaz
    sábado, 9 de julio de 2011 16:27
  • alguna idea de porque sucede esto????
    Julian Diaz
    lunes, 11 de julio de 2011 19:24
  • "julix94" escribió:

    > cuando mensaje se cierra, teoricamente tendria que aparecer en el
    > datagridview el el ultimo ingreso, no? bueno, resulta que no
    > aparece (pero cuando abro el access de "Ventas", si me aparecen los
    > ingresos que realice... (digamos los que no me aparecen el grid))

    Hola, Julián:

    A fin de descartar posible motivos para que no se actualice tu control DataGridView, ¿podrías indicar la cadena de conexión que utiliza el objeto OleDbConnection llamado «sCnn»? Quiero entender que tanto en el procedimiento NUEVO como en el procedimiento Mostrar, estás utilizando el mismo objeto OleDbConnection, la misma cadena de conexión.

    Cuando abres la base de datos con el propio Microsoft Access, ¿es la misma base de datos que figura en el parámetro Data Source de la cadena de conexión utilizada por el objeto «sCnn»?

    Lo mismo te puedes preguntar que son unas preguntas demasiado "tontas" las que te efectuo, pero la experiencia me indica que puede suceder que los datos se están ingresando en una base de datos diferente, sobre todo, si has añadido la base de datos de Access a tu proyecto de Visual Basic .NET, y estás ejecutando tu proyecto desde el IDE de Visual Studio, cuestión ésta que ingoro porque no lo has indicado en tu mensaje. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    jueves, 14 de julio de 2011 9:24
    Moderador
  • gracias por responder enrique: en principio si leiste toda la cadena del mensaje veras que me preguntan pór algun procedimiento de actualizacion al cual yo respondi con el procedimiento denominado "Mostrar". bueno eso fue erroneo. yo si tengo un procedimiento de actualizacion y se denomina "ActualizarDatos" y resulta que al querer usarlo en el proceso "Nuevo" (es decir, cuando se ingresa una nueva venta, el datagridview se tedria que actualizar). me salta un error:

    Procedimiento "Actualiar Datos"

     

    Private Function ActualizarDatos(ByVal dt As DataTable) As Integer
    
        If (dt Is Nothing) Then Return 0
    
        Try
          '
          '
          Using cnn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\Ventas.accdb")
    
            
            '
            Dim sql As String = "SELECT * FROM Ventas"
    
            
            '
            Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, cnn)
    
            
    
            Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(da)
    
           
            '
            With da
    
              .InsertCommand = cb.GetInsertCommand()
              .DeleteCommand = cb.GetDeleteCommand()
              .UpdateCommand = cb.GetUpdateCommand()
            End With
            '
    
            Return da.Update(dt)
    
          End Using
    
        Catch ex As Exception
         
          '
          Throw
    
        End Try
      End Function
    
    Error marcado en NUEVO:

     

     

    No se ha especificado ningún argumento para el parámetro 'dt' de 'Private Function ActualizarDatos(dt As System.Data.DataTable) As Integer'.

    Procedimiento NUEVO:
    Sub NUEVO()
        Dim mensaje As String = String.Format("Confirma que el medico es:'{0}' y el mes:'{1}'", cbxVentaMedico.Text, cbxVentaMes.Text)
        Dim result As DialogResult = MessageBox.Show(mensaje, "", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    
        If result = DialogResult.Yes Then
          sCnn.Open()
          Dim query As String = "INSERT INTO Ventas (Mes, Medico, Producto, Cantidad) VALUES (@IngresoMes, @IngresoMedico, @IngresoProducto, @IngresoCantidad)"
          Dim CMD As New OleDb.OleDbCommand(query, sCnn)
    
          CMD.Parameters.AddWithValue("@IngresoMes", cbxVentaMes.Text)
          CMD.Parameters.AddWithValue("@IngresoMedico", cbxVentaMedico.Text)
          CMD.Parameters.AddWithValue("@IngresoProducto", cbxVentaProducto.Text)
          CMD.Parameters.AddWithValue("@IngresoCantidad", txtVentaCantidad.Text)
    
          CMD.ExecuteNonQuery()
    
          sCnn.Close()
    
          Mostrar() (Este lo tendría que quitar???)
          ActualizarDatos()
          MsgBox("Se ha ingresado la venta")
    
        Else
          cbxVentaMedico.Text = ""
          cbxVentaMes.Text = ""
        End If
    
        txtVentaCantidad.Clear()
        cbxVentaProducto.SelectedIndex = 0
    
      End Sub
    
    Ahora, tus preguntas:
    • cadena de conexion sCnn
     Dim sCnn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\Ventas.accdb")
    • base de access
    si es la misma base de datos access "Ventas"
    desde ya, muchas gracias
    Diaz Julian

     


    Julian Diaz
    jueves, 14 de julio de 2011 15:46
  • "julix94" escribió:

    > resulta que al querer usarlo en el proceso "Nuevo" (es decir,
    > cuando se ingresa una nueva venta, el datagridview se tedria
    > que actualizar). me salta un error:
    >
    > No se ha especificado ningún argumento para el parámetro 'dt'
    > de 'Private Function ActualizarDatos(dt As System.Data.DataTable) As Integer'.
    >

    ¡Bueno! Creo que el error está bastante claro. Si tu tienes definido el procedimiento ActualizarDatos de la siguiente manera:

      Private Function ActualizarDatos(ByVal dt As DataTable) As Integer

    tendrás que pasarle un objeto DataTable cuando llames a dicho procedimiento desde el método Nuevo:

      ActualizarDatos(objetoDataTable)

    Pero en el procedimiento Nuevo, no veo por ningún lado un objeto DataTable que le puedas pasar al procedimiento ActualizarDatos. Ese es el motivo del error que estás obteniendo.

    Aparte, no le encuentro ningún sentido que ejecutes una consulta SQL de datos añadidos (INSERT INTO) para añadir nuevos registros a la tabla Ventas, y posteriormente quieras actualizar también la mencionada tabla con los datos existentes en un supuesto objeto DataTable, es decir, ejecutar el contenido del procedimiento ActualizarDatos. De esa manera te estás arriesgando a duplicar datos, porque puede suceder que estés añadiendo el mismo registro dos veces: uno mediante la consulta INSERT INTO, y otro, mediante el método Update de un adaptador de datos.

    Con el debido respeto, te diré que creo que te estás haciendo "la picha un lío". :-))

    Si añades nuevos registros mediante una consulta INSERT INTO, ¿para qué "leches" quieres también actualizar los datos mediante el método Update de un objeto OleDbDataAdapter? Puedes utilizar uno u otro método, pero no los dos a la misma vez.

    > si es la misma base de datos access "Ventas"

    Es decir, que con Microsoft Access abres la base de datos Ventas.accdb que se encuentra en la carpeta D:\Ventas. Entonces descarto que estes utilizando dos bases de datos distintas. No obstante, te diré que no es una buena idea almacenar la base de datos en la raíz de una unidad. ¿No puedes almacenarla en una subcarpeta de la unidad D? Tarde o temprano vas a tener otros problemas diferentes por almacenar la base de datos en la raíz de una unidad de tu disco duro.

    A fin de no demorar mucho la solución de tu problema, procura explicar bien los problemas que estás teniendo evitando errores en la descripción del problema, porque empezó la conversación porque no podías ingresar más de 154 registros, y vamos ahora con un error de sintaxis a la hora de llamar a un método, que es un asunto básico. A un procedimiento hay que pasarle todos los parámetros que requiera. ;-)

     


    Enrique Martínez
      [MS MVP - VB]


    jueves, 14 de julio de 2011 16:09
    Moderador
  • el error es que no me aparecen en el datagridview las ventas ingresadas despues de 154 registros. pero a la hora de abrir la base de datos, esos registros ingresados (pero que no aparcen) SI aparecen en la base.

    si lo deseas te puedo mandar el proyecto en rar, o todo el codigo del proyecto...

     


    Julian Diaz
    jueves, 14 de julio de 2011 16:40
  • Tienes más de un error. :-)

    Mejor será que publiques el proyecto completo en SkyDrive, o en cualquier otro sitio público donde no sea necesario registrarse para descargar el archivo rar.

     


    Enrique Martínez
      [MS MVP - VB]

    jueves, 14 de julio de 2011 16:58
    Moderador
  • mira ya lo subi a skydrive con la base de datos Ventas, este es el link: https://skydrive.live.com/redir.aspx?cid=89ca90132c64d87d&resid=89CA90132C64D87D!117        (archivo proyecto)

    las bases de datos deben ir en D

    Realmente aprecio que me ayudes con este problema, y por el tiempo que te quita.

    gracias


    Julian Diaz
    jueves, 14 de julio de 2011 18:05
  • ¡Buf! ¡Vaya lío que tienes! Esto me va a llevar un buen rato.

    En principio, te diría que elimines de Form1 la siguiente declaración:

      ' Inherits System.Windows.Forms.Form

    No es necesario que heredes dos veces de la clase Form, porque la declaración de herencia ya se hace en el archivo Designer de dicho formulario.

        'Public Sub New()
        '   MyBase.New()
        '    Application.EnableVisualStyles()
        '    Application.DoEvents()
        '
        '    InitializeComponent()
        'End Sub

    El procedimiento New sobra por completo, porque eso ya lo hace Visual Basic de manera automática.

    > Dim sCnn As New OleDb.OleDbConnection( _
    > "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\Ventas.accdb")

    Si a nivel del formulario creas e instancias una nueva clase del tipo OleDbConnection, ¿para qué "leches" haces también ésto?

    > Using sCnn As OleDbConnection = New OleDbConnection( _
    >    "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\Ventas.accdb")

    Estás duplicando las variables objeto. Como ya se encuentra iniciada la clase, simplemente ejecutarías:

         Using sCnn

         End Using

    Pero como estás utilizando un bloque Using, al finalizar éste se destruye el objeto Connection, con lo cual tendrías problemas a la hora de abrir la conexión en el método Nuevo.

    El código fuente hay que depurarlo BASTANTE. :-(

    En la tabla Ventas de la base de datos del mismo nombre, tienes dos índices: uno que forma la clave principal, y otro llamado Id. Elimina éste último índice desde el propio Microsoft Access, y deja únicamente el índice que forma la clave principal llamado PrimaryKey.

     


    Enrique Martínez
      [MS MVP - VB]


    jueves, 14 de julio de 2011 18:30
    Moderador
  • no entiendo el maldito error: porque elimine la clave principal (Id) y depure devuelta, el ingreso no me aparecía en el datagridview ni en en la base (cosa que antes si). entonces volvi a colocar la clave principal, realice lo mismo y si me aparece en  la base, pero no en el datagridview. ademas volví a contar los ingresos y son 150. obviamente es un problema en el datagrid, porque en la base el ingreso aparece....
    Julian Diaz
    jueves, 14 de julio de 2011 19:05
  • La clave principal de la tabla llamada PrimaryKey, NO TIENES QUE ELIMINARLA. Y no creo que por eliminar el índice llamado ID (que no es la clave principal), tengas problemas con el número de registros que se ingresan o dejan de ingresar. Entiendo que no tiene nada que ver que elimines o no de la tabla el índice llamado ID.
     
    Otra cosa que he visto en el diseño de la tabla es que tienes campos Requeridos y a su vez permites que tengan longitud cero. Si el campo es Requerido, ¿para qué permites que puedan ingresarse valores NULL? Creo que no tiene sentido.
     
    Tienes un "buen jaleo" en el código fuente. Estoy tratando de depurarlo pero no te impacientes. ¿De acuerdo?
     
     
     
     
     
     

    Enrique Martínez
      [MS MVP - VB]

    jueves, 14 de julio de 2011 19:16
    Moderador
  • si enrique, te pido disculpas.

    es que yo soy nuevo en esto de programar, y es muy nuevo para mi. perdoname si me exalte en el comentario anterior

    gracias


    Julian Diaz
    jueves, 14 de julio de 2011 19:22
  • Prueba lo siguiente

    Crea un form Prueba

    y en las propiedades del proyecto lo pones como Inicio para que se cargue de primero

    luego pon un Grid y un Boton

    y manda a llenar el grid con los datos de la tabla a ver que pasa.

    si te los miestra todos el error es de codigo en caso contrario el error es de base

    jueves, 14 de julio de 2011 19:46
  • Revise tu codigo y pude ver que tienes todo en el form, te recomiendo que uses las clases para que tengas tu codigo bien organizado, tambien puede ver que exportar registros a excel y tienes un monton de codigo ahi,

    ok.

    Si te fijas bien en Sub NUEVO() tienes un error de codigo en

    ActualizarDatos() te falta el parametro para el parametro dt

    jueves, 14 de julio de 2011 20:01
  • Desde el siguiente enlace podrás descargar el código fuente del archivo Form1.vb, con las modificaciones que he efectuado:

    http://mvp-access.es/softjaen/downloads/form1.zip

    Obviamente, deberás de hacer una copia de seguridad de tu archivo Form1.vb, para que puedas restaurarlo por si no te gustan las moficiaciones que he realizado. :-)

    Todas las líneas que he comentado (que como podrás observar son abundantes), las puedes eliminar si crees que te sirve el código fuente tal cual lo he dejado.

    El motivo de que no pudieras añadir más de 154 registros, ignoro a qué se puede deber, porque no lo he podido reproducir. Desde luego, con las modificaciones efectuadas, no he tenido problema alguno para añadir más de 154 registros a la tabla Ventas.

    Como estás utilizando valores Autonuméricos en las tablas de la base de datos, séría conveniente que compactaras las bases de datos desde el propio Microsoft Access para que se reinicialicen dichos valores, sobre todo cuando vayas a poner en producción tu aplicación. Ten en cuenta que los valores autonuméricos puede que no estén consecutivos, porque puede suceder que hayas cancelado la inserción de un nuevo registro.

    He aprovechado para modificar el código de llamada a Microsoft Excel para mostrar la hoja de cálculo. En lugar de utilizar la función API ShellEx, simplemente basta con llamar al método compartido Start de la clase Process.

    Sería conveniente que los procedimientos generales los tuvieras fuera de la clase Form1, bien en un módulo o como procedimientos compartidos de una clase. Pero ¡bueno! Esto ya no tiene nada que ver con el asunto inicial de tu mensaje.

    En fin, estudia las modificaciones que he efectuado para que observes bien cómo se muestran los datos, y cómo se tiene que actualizar los mismos. :-)

     

     

     


    Enrique Martínez
      [MS MVP - VB]


    viernes, 15 de julio de 2011 7:24
    Moderador
  • hola enrique, en principio muchisimas gracias por haberte tomado el tiempo de realizar un nuevo codigo para mi proyecto. lo apfrecio mucho....

    pero me surgieron algunas dudas en base a errores cuando coloque el nuevo codigo en el proyecto.

    1. Al principio del form declaras a "activeConn" como una nueva OleDBConnection y después la declaras, también, como String (Lo mismo sucede con las otras conexiones ACN, ACN2, ACN3 y ACN4). El error que surge es que después las conviertes en String y eso no se puede (Aparece en la lista de errores). EJ:
      Private activeConn As New OleDbConnection
        Private activeConn As String
      
    2. Luego en el método NUEVO (donde el problema era la actualización del datagridview para que muestre los nuevos ingresos), el proceso "ActualizarDatos()" lo marcaste como un comentario y yo saque la comilla, dejándolo como parte del método. sin embargo, me salta este error: No se ha especificado ningún argumento para el parámetro 'dt' de 'Private Function ActualizarDatos(dt As System.Data.DataTable) As Integer'.
    3. y en el método del botón "btnVentaIngreso" al final colocaste como comentario esto: Dim n As Integer = ActualizarDatos(ds), supongo que lo pusiste como comentario porque el método del botón llama al método de NUEVO (y en este ya esta especificado que los datos se actualicen).

    Desde ya muchas gracias


    Julian Diaz
    viernes, 15 de julio de 2011 14:29
  • Julian, lo primero que te digo es que el formulario que te he enviado, FUNCIONA A LA PERFECCIÓN. ¿De acuerdo?

    "juliz94" escribió:

    > 1.Al principio del form declaras a "activeConn" como una
    > nueva OleDBConnection y después la declaras, también,
    > como String (Lo mismo sucede con las otras conexiones ACN,
    > ACN2, ACN3 y ACN4). El error que surge es que después las
    > conviertes en String y eso no se puede (Aparece en la lista de errores). EJ:
    > Private activeConn As New OleDbConnection
    >  Private activeConn As String

    Pero, ¡hombre! ¡No hagas eso!

    Las declaraciones OleDbConnection ESTÁN COMENTADAS. ¿Sabes lo que significa "comentar una línea"? Si una línea comienza con una comilla simple ('), esa línea NO SE COMPILA.

    Lo que tienes que hacer es ELIMINAR TODAS LAS LÍNEAS QUE COMIENZAN POR UN COMILLA SIMPLE, como por ejemplo la siguiente línea:

      '  Private activeConn As New OleDbConnection

    Insisto. Me ha llevado bastante tiempo depurar tu programa para que ahora vengas diciendo que tienes más problemas. El formulario funciona correctamente, pero si tu te limitas a quitar las comillas simples (quitar las líneas comentadas), entonces he perdido el tiempo.

    Por cierto, no estarías de más que marcaras alguna respuesta como satisfactoria, si crees que te ha sido útil.


    Enrique Martínez
      [MS MVP - VB]


    viernes, 15 de julio de 2011 15:11
    Moderador
  • He decido eliminar yo mismo las líneas comentadas porque no tengo ganas de dedicarle ésta tarde también a tu formulario.

    Si lo crees conveniente, descarga nuevamente el archivo zip. Por supuesto, nuevamente te recomiendo que efectúes una copia de seguridad de tu propio formulario.

        http://mvp-access.es/softjaen/downloads/form1.zip

    Y lo dicho, si no te gustan las modificaciones efectuadas, con restaurar tu copia de seguridad es suficiente, pero obviamente, no vuelvas a preguntarme donde se encuentra el error, porque tienes numerosos errores, no de sintaxis, si no de una utilización inadecuada de los objetos.

     


    Enrique Martínez
      [MS MVP - VB]

    • Marcado como respuesta julix94 viernes, 15 de julio de 2011 15:48
    viernes, 15 de julio de 2011 15:22
    Moderador