Instrucciones para enlazar en Visual Basic una base de datos creada en el Access 2000

O días de antemano te agradezco el tiempo de leer este mensaje mi problema es el siguiente estoy programando en visual basic 6 (soy nueva en este lenguaje) y tengo una base de datos en access 2000 la cual la tengo mediante un adodc el problema es que necesito de alguna enlazar la consulta que me muestra en el combo2 al datagrid1 pero hasta ahorita no he tenido resultado, a su vez necesito hacer las siguientes operaciones en la datagrid2
Private Sub Text3_Change()
If Val(Text3.Text) < Val(Text2.Text) And Val(Text2.Text) >= 100000 And Val(Text3.Text) < 100000 Then
Text4.Text = 1000000 - Val(Text2.Text) + Val(Text3.Text)
Else
If Val(Text3.Text) < Val(Text2.Text) And Val(Text2.Text) >= 100000 And Val(Text3.Text) >= 100000 Then
Text4.Text = 1000000 - Val(Text2.Text) + Val(Text3.Text)
Else
Text4.Text = Val(Text3.Text) - Val(Text2.Text)
End If
End If
If Val(Text4.Text) < 0 Then
     Text4.BackColor = vbRed
   Else
    If Val(Text3.Text) < Val(Text2.Text) Then
   Text4 = MsgBox("Hay un error en la lectura actual", vbCritical)
   Text4.BackColor = vbRed
     Else
     If Val(Text3.Text) > Val(Text2.Text) Then
    Text4.BackColor = vbGreen 'CAMBIAR POR VERDE
   End If
    End If
     End If
End Sub
Y este es el codigo que tengo en el programa
Public Sub Combo1_Click()
    If Combo1.Text = "No hay ninguna estación seleccionada " Then Exit Sub
    Combo3.ListIndex = Combo1.ListIndex
    LINEAS.RecordSource = "SELECT * FROM TORNIQUETES WHERE TORNIQUETES.ID =" & Val(Combo3.Text)
    LINEAS.Refresh
    Combo2.Clear
    Do While Not LINEAS.Recordset.EOF
        Combo2.AddItem LINEAS.Recordset.Fields(2)
        LINEAS.Recordset.MoveNext
    Loop
    Combo2.ListIndex = 0
End Sub
Private Sub Command1_Click()
 Load Form3
 Form3.Show
 Unload Me
End Sub
Private Sub DataGrid1_Click()
 If Combo1.Text = "No hay ninguna estación seleccionada " Then Exit Sub
    Combo3.ListIndex = Combo1.ListIndex
    LINEAS.RecordSource = "SELECT * FROM TORNIQUETES WHERE TORNIQUETES.ID =" & Val(Combo3.Text)
    LINEAS.Refresh
     Do While Not LINEAS.Recordset.EOF
        DataGrid1.Items.Add(dtcolumns(0).LINEAS.Recordset.Fields(2)
        LINEAS.Recordset.MoveNext
    Loop
End Sub
Private Sub DataGrid2_Click()
Set cn = New Connection
    cn.CursorLocation = adUseClient
    ' usa la base de datos Nwind del directorio de visual basic
   cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                          "C:\SLT.MDB;Persist Security Info=False"
    ' Abre la conexión ado
    Con.Open
    ' Crea un nuevo recordset
    Set rs = New Recordset
    ' Abre el conjunto de registros
    rs.Open "Select FECHA,LINEA,ESTACION,TORNIQUETE,USUARIOS_INGRESARON,LECTURA_ACTUAL From SLT ", _
                            cn, adOpenStatic, adLockOptimistic
    ' enlaza el datagrid
    Set DataGrid2.DataSource = rs
End Sub
Private Sub Form_Load()
    On Error GoTo captura
    LINEAS.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\slt.mdb;Persist Security Info=False"
    LINEAS.RecordSource = "select * from lineas"
    LINEAS.Refresh
    Combo1.AddItem "No hay ninguna estación seleccionada "
    Combo2.AddItem "No hay ningun torniquete seleccionado "
    Exit Sub
captura:
    buscabase.DialogTitle = "Indica la ruta de la base de datos"
    buscabase.ShowOpen
    LINEAS.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
    buscabase.FileName & ";Persist Security Info=False"
    LINEAS.RecordSource = "select * from lineas"
    LINEAS.Refresh
End Sub
Private Sub Option1_Click(Index As Integer)
    Combo1.Clear
    Combo2.Clear
    Combo3.Clear
    X = Index + 1
    If X = 10 Then X = "A"
    If X = 11 Then X = "B"
    If X = 11 Then X = "C"
    LINEAS.RecordSource = "SELECT * FROM LINEAS WHERE LINEAS.LINEA = '" & X & "'"
    LINEAS.Refresh
    Do While Not LINEAS.Recordset.EOF
        Combo1.AddItem LINEAS.Recordset.Fields(1)
        Combo3.AddItem LINEAS.Recordset.Fields!orden
        LINEAS.Recordset.MoveNext
    Loop
    Combo1.ListIndex = 0
End Sub

1 Respuesta

Respuesta
1
En primer lugar disculpa la demora. Llevo un par de semanas desconectado de esta tarea porque me tienen loco con el trabajo.
Por lo que dices quieres enlazar el 'combo2' con el 'datagrid1'.
He visto que tienes algo así en el combo1. En este caso lo que tendrías que modificar es el 'recordsource' del 'datagrid1' y refrescarlo desde el evento "combo2_click".
Tengo la sensación que no es eso lo que quieres. Aclarame un poco más el tema si lo he entendido mal.
Disculpa se me olvido mandarte la imagen del programa
http://www.4shared.com/file/207034838/dc93d1d6/Dibujo.html
¿Hola muchas gracias por contestar y si tenias razón lo hice como dices y ya funciono o.o pero tengo otra pregunta como puedo sumar o restar los datos en las columnas del datagrid?.
Necesito hacer estas operaciones:
Private Sub Text3_Change()
If Val(Text3.Text) < Val(Text2.Text) And Val(Text2.Text) >= 100000 And Val(Text3.Text) < 100000 Then
Text4.Text = 1000000 - Val(Text2.Text) + Val(Text3.Text)
Else
If Val(Text3.Text) < Val(Text2.Text) And Val(Text2.Text) >= 100000 And Val(Text3.Text) >= 100000 Then
Text4.Text = 1000000 - Val(Text2.Text) + Val(Text3.Text)
Else
Text4.Text = Val(Text3.Text) - Val(Text2.Text)
End If
End If
If Val(Text4.Text) < 0 Then
     Text4.BackColor = vbRed
   Else
    If Val(Text3.Text) < Val(Text2.Text) Then
   Text4 = MsgBox("Hay un error en la lectura actual", vbCritical)
   Text4.BackColor = vbRed
     Else
     If Val(Text3.Text) > Val(Text2.Text) Then
    Text4.BackColor = vbGreen 'CAMBIAR POR VERDE
   End If
    End If
     End If
End Sub
Ya me he roto la cabeza tratando de averiguar como hacerlo y hasta ahorita no he tenido suerte u.u. de antemano muchas gracias
A ver, los campos que pones en tu código (text2, text3, etc...) entiendo que son textBox, no campos del datagrid.
Para hacer operaciones con el datagrid, lo que yo hago (no digo que no haya otras formas), es hacerlas en la consulta del recordsource. Por ejemplo:
select numeroUnidades,precioUnidad,numeroUnidades*precioUnidad as precioTotal from...
Con ello tendría la columna 'precioUnidad' como resultado del producto de las dos anteriores.
Veo que también haces operaciones con los campos 'text2', 'text3', etc... Ten cuidado con un tema: la función 'val()' devuelve el valor numérico de un campo de texto pero a veces lo hace mal (dependiendo del separador de decimales). Si no convierte bien los importes, entonces tendrás que usar la función 'cDbl()' o generarte una función propia que haga la conversión.
¿Si es cierto lo que pasa es que yo tenia 4 textbox en los cuales hacia esas operaciones pero me pidieron que lo hiciera con un datagrid me lo complicaron un poco xD pero con la pista que me diste ya tengo una idea mucho más clara muchas gracias otra preguntota cuando yo pongo un dato en la columna 1 del datagrid (porque lo columna cero la tengo bloqueada) me lo actualiza pero en todos los registros de la base de datos que contengan por ejemplo 1 como puedo decirle que solo actualice los registros que se están visualizando y no todos los que contengan 1?
Así es como me muestra la consulta
Numero linea usuarios
1 a 47
2 b 57
3 c 85
4 d 66
5 e 23
Agradezco mucho el tiempo que me otorgas en verdad muchas gracias
A ver si me aclaro con lo que tienes.
Me parece entender que tienes un grid y un data que te presentan los datos en un formulario y, a parte, una serie de campos que, supongo, te presentan los datos del registro seleccionado. ¿Es eso?
De ser así, ¿Supongo qué intentarás actualizar los datos modificando los campos 'text? ' Y después ejecutarás una instrucción SQL sobre la tabla (es la forma que se me ocurre por la cual te actualizaría todos los registros).
Prueba a ver si puedes actualizar los datos directamente sobre el objeto 'data' con algo así:
data.recordset.fields("nombreDelCampo") = text??
De esa forma sólo actualizarías el registro activo.
Es posible que al final tuvieras que hacer un update sobre el recordset asignado al 'data'.
Te comento eso como posibilidades porque no sé como tienes montado el programa y sin verlo es difícil asegurar lo que te va a funcionar o no.
Aquí te envío una imagen del programa, cundo el usuario lecciona un option botón, en el combo aparece la estación y en el data grid me muestra los registros de esa estación el problema es que si yo pongo un dato en el registro 7 guarda esa actualización automáticamente y los pone en todos los registros numero 7 que existen en la base la verdad no se como decirle que actualice solo los de un registro en especifico y los texbox por el momento no los tengo en uso lo que pasa es que pidieron modificación del programa u_u!.
http://img715.imageshack.us/img715/305/17845095.jpg
Un saludo y gracias n.n
Entiendo que los datos los pones en los campos que hay debajo del grid y quieres que modifique sólo el registro que está activo. ¿Es eso?
Digo eso porque supongo que si los modificases en el mismo grid no habría problemas.
¿Cómo haces para que se graben los datos? ¿Es automático o hay que pulsar en algún sitio?
¿Cómo se llama el 'data' al que está asociado el grid?
¿Qué código estás poniendo para que te modifique los datos?
Ya sé que son muchas preguntas pero es para intentar ver cómo lo estás haciendo e intentar localizar el problema.
Piensa que para actualizar 'exactamente' el registro marcado en la instrucción SQL tienes que indicar el 'torniquete' y ADEMAS el resto de condiciones que tenga puesto el dataGrid (¿número de línea, estación y fecha?). Con lo que te he preguntado creo que lo podremos ver.
Hola disculpa la demora pero tuve unos problemas de salud un poco fuertes, o.o respondiendo a cada una de tus preguntas
¿Cómo haces para que se graben los datos?
R= Es automático cuando se escribe en la grid automáticamente modifica la base de datos y me sale un mensaje que dice que ha modificado varios registros
¿Es automático o hay que pulsar en algún sitio?
R= Si es automático aunque creo que mejor voy a tener que hacer una consulta
¿Cómo se llama el 'data' al que está asociado el grid?
R= el data se llama LINEAS
¿Qué código estás poniendo para que te modifique los datos?
R= De hecho ninguno creo que por ahí esta el error no he programado como debe de guardar la base de datos
Muchas gracias por tu tiempo n.n un saludo
Sólo se me ocurre que me envíes el programa y una prueba de la base de datos para buscarte una solución.
Si quieres me lo envías a [email protected] y me avisas por aquí para que entre a mirarlo.
Yo siempre que uso un grid lo asocio a un data y los cambios los pongo para que se realicen en campos de texto separados. De esa forma controlo totalmente no sólo cuando quiero que se graben los datos, sino que también puedo hacer todo tipo de controles sobre ellos.
Hola ya te envíe la base junto con el programa el nombre del formulario se llama captura
Ayer por la tarde estuve mirando lo de tu programa y, la verdad, has conseguido desconcertarme.
Pienso que el primer, y principal, problema está en el diseño de la base de datos.
Estuve viendo que has hecho una serie de tablas que no parecen relacionarse correctamente y tengo muchas dudas sobre las relaciones que has definido.
No puedo asegurarte al 100% que sea ese el causante del error, pero sí que puede ser problema gordo según vayas avanzando con el proceso.
Tras esta pequeña 'charla', vamos a lo importante: resolver el problema.
Y para ello, si te parece correcto, empezaremos por el principio. La definición de las tablas y de sus relaciones.
Me imagino que intentas llevar un control sobre las líneas de metro, las estaciones y los torniquetes que hay en cada una de ellas. Supongo que será para controlar el número de accesos en cada torniquete.
Conozco dos formas de organización de líneas - estaciones: la que tenemos en Madrid y la que 'me despistó' en Moscú.
No sé si habrá otras formas, pero son las dos que conozco.
Veamos las diferencias.
En Madrid tenemos ... no sé cuantas líneas y en cada línea un montón de estaciones. Cada estación puede tener varias entradas y en cada entrada una serie de torniquetes.
En moscú la cosa varía. Allí también tienen varias líneas, pero una estación determinada sólo está en una línea. Cuando se unen varias estaciones de diferentes líneas cada estación tienen un nombre diferente. Luego el número de entradas y torniquetes es similar.
Supongo que allí usáis el primer sistema: en la misma estación puede haber varias líneas. Es la diferencia con el otro sistema que, a nivel de definición de datos, es muy importante.
Si realmente se trata del sistema de aquí (Madrid), tus tablas deberían tener una estructura de este estilo:
Estaciones:
- Estación (*)
Líneas:
- Nº de línea (*)
- Estación (*)
- Nº de orden de la estación en la línea (mejor que un número secuencial para todos sería una secuencia por líneas)
Torniquetes:
- Estación (*)
- Nº de torniquete (*)
Lecturas:
- Estación (*)
- Nº de torniquete (*)
- Fecha (*)
- Lectura Actual
(*) Este campo o conjunto de campos debería declararse como clave del registro (marcar los campos y pulsar el botón con un dibujo de una llave)
Después se definirían las relaciones entre todas las tablas:
- Entre estaciones y líneas por el campo 'estación'.
- Entre estaciones y torniquetes por el campo 'estación'.
- Entre lecturas y torniquetes por los campos 'estación' y 'torniquete'.
A través de estas 4 tablas podrías obtener el cuadro que buscas por días de la semana, ya que se puede saber si es lunes, martes, miércoles... a través de una función aplicada a la fecha de la lectura.
Bueno, creo que esa sería la estructura que buscas.
Echa un vistazo a esto y, si quieres, revisamos lo que no te parezca correcto y, cuando esté bien la base de datos, nos metemos con el programa.
(Menudo rollo que te he metido)
Pero el problema que tengo es que varias estaciones se repiten ya que son tranbordos así que no podría poner las estaciones como clave principal ya lo intente y la verdad fue la única solución que se me ocurrió, de hecho no hay ningún problema en volver hacer la base de datos pero ese pequeño detalle es el que me da dolor de cabeza.
Una estación es siempre única, independientemente de la línea a la que pertenezca. Por ese motivo está puesta en la tabla de 'estaciones' que te propongo como clave.
Después, en la tabla de línea, podrás repetir la estación tantas veces como líneas pasen por ella. O lo que es lo mismo, pondrás la relación entre la estación y las líneas a las que pertenezca.
Una cosa es la definición de la estación y otra la de las líneas (un conjunto de estaciones).
Según te comentaba el otro día, la diferencia en la organización de los dos metros que te decía (Madrid y Moscú) está precisamente ahí: en Madrid una estación puede pertenecer a varias líneas mientras que en el metro de Moscú cada estación pertenes sólo a una línea y, si haces un transbordo lo que haces es ir andando de una estación a otra (ya veo que ese no es tu caso).
Lo dicho, comencemos por el diseño de la base de datos porque es lo realmente importante. Después las cosas saldrán mucho más fácilmente.
He intentado hacer la base de datos como me indicas pero tengo problemas ya eu en estaciones tengo por ejemplo pantitlan que se repite en linea 1, A, 5 y 9 y me dice que hay duplicados y así como pantitlan tengo varias mínimo 10.
Un saludo y agradezco mucho tu paciencia
Te acabo de enviar una base de datos con las tablas que te comentaba y las relaciones entre ellas.
Echa un vistazo y comentamos los detalles antes de entrar en programarla.
Hola ya cheque la base de datos que me mandaste y de hecho esta mucho mejor que la mia; si nuestra red del metro es muy parecida a la madrid sin embargo no le entiendo muy bien por ejemplo en la tabla torniquetes tengo duda nuevamente en los transbordos en este caso son:
Pino Suarez lineas 1 y 2
Balderas             lineas 1 y 3
Candelaria          lineas 1 y 4
Pantitlan             lineas 1,5,9 y A
Tacubaya            lineas 1,7 y 9
Salto del Agua    lineas 1 y 8
San Lazaro         lineas 1 y B
Hidalgo               lineas 2 y 3
Tacuba               lineas 2 y 7
Chabacano         lineas 2,8 y 9
Bellas Artes        lineas 2 y 8
La Raza              lineas 3 y 5
DPTVO: 18 de Marzo   lineas 3 y 6
Centro Medico            lineas 3 y 9
Guerrero                    lineas 3 y B
Consulado                 lineas 4 y 5
Martin Carrera           lineas 4 y 6
Santa Anita               lineas 4 y 8
Jamaica                     lineas 4 y 9
Morelos                     lineas 4 y B
Inst. del Petroleo      lineas 5 y 6
Oceania                    lineas 5 y B
El rosario                  lineas 6 y 7
Garibaldi                   lineas 8 y B
¿En estas estaciones el numero de torniquetes se incrementaría como pondría los números?
No se si puedas aclararme las dudas que tengo acerca de la base de datos es que no entiendo como las relacionas
Un cordial saludo.
El número de torniquete está puesto por estación, no por estación-línea.
Entiendo que los torniquetes son los mismos si entras en Pantiplan para ir a la línea 1, 5, 9 o A.
Quizás en Pantiplan pueda haber más de un torniquete con el número 1, si es que esa estación tiene más de un vestíbulo de entrada. Según esto, el número de torniquete dependería del vistíbulo pero no de la línea.
Si yo tuviera que hacer la estructura de torniquetes de Madrid lo haría bien a nivel de estación o bien de vestíbulo.
Si el número depende de la estación-vestíbulo, entonces tendrías que crear una tabla de 'Vestibulos' con dos campos: Estación y Vestíbulo. Y después la tabla de torniquetes sería: Estación - Vestíbulo - Torniquete.
Lógicamente la tabla de lecturas también debería incluir el Vestíbulo dentro de su clave.
Tu dirás si el número de torniquete depende sólo de la estación, si depende de la estación-vestíbulo o si es de la estación-linea (esta última opción dudo que sea).
Te comento, voy a salir de viaje un par de semanas. Voy a Rusia y, entre trabajos y papeles, pienso hacer una escapada para conocer el metro de San Petersburgo (según he oído debe ser el más bonito del mundo).
Espero que puedas ir avanzando. Si tienes problemas escríbeme, aunque no te aseguro que pueda responderte desde allí.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas