Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Llenar un listbox en Visual Basic.

Estas en el tema de Llenar un listbox en Visual Basic. en el foro de Visual Basic clásico en Foros del Web. Que tal Sres, tengo este codigo: Private Sub cmdConectar_Click() CommonDialog1.CancelError = True On Error GoTo terminar CommonDialog1.Flags = cdlOFNHideReadOnly CommonDialog1.Filter = "Base de datos Microsoft ...
  #1 (permalink)  
Antiguo 08/11/2003, 20:08
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Pregunta Llenar un listbox en Visual Basic.

Que tal Sres, tengo este codigo:

Private Sub cmdConectar_Click()
CommonDialog1.CancelError = True
On Error GoTo terminar

CommonDialog1.Flags = cdlOFNHideReadOnly
CommonDialog1.Filter = "Base de datos Microsoft Access" & _
"(*.mdb)|*.mdb|"
CommonDialog1.ShowOpen
pathBase = CommonDialog1.FileName

abrir
Label1.Caption = pathBase

Set rst = New ADODB.Recordset

Do While Not rst.EOF
List1.AddItem rst.Fields(0).Name
rst.MoveNext
Loop
rst.Close

terminar:

End Sub

la funcion abrir setea y abre un aconexion con la base access. La idea es insertar un codigo que introduzca en List1 los nombres de las tablas de la base conexionada.
Lo que puse para el List1 no funciona, me falta codificar algo mas?.

Saludos.
__________________
Carlunchos

Última edición por carlunchos; 08/11/2003 a las 20:10
  #2 (permalink)  
Antiguo 09/11/2003, 17:28
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola carlunchos,

en tu código no veo que hayas abierto la base de datos, imagino que lo habrás hecho en otro lado, tampoco abres el recordset, solo le asignas memoria con SET, te pongo una forma de recuperar las tablas:

---------------------------------------------------------------
Private Sub Form_Load()

Dim con As New ADODB.Connection
Dim rec As New ADODB.Recordset

Dim s_cad As String

s_cad = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\tubasededatos.mdb;Persist Security Info=False"

con.Open s_cad

Set rec = con.OpenSchema(adSchemaTables)

While Not rec.EOF

List1.AddItem rec!TABLE_NAME

rec.MoveNext
Wend

rec.Close
con.Close
End Sub
---------------------------------------------------------------

Un saludo
Pablo
  #3 (permalink)  
Antiguo 10/11/2003, 10:49
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Al peluche pabli y aprovecho para preguntarte como deberia codificar lo siguiente:

que al dar un click al nombre de una tabla en el List1 cargue los datos de esa tabla en un ListView? Se entiende lo que pretendo?


Gracias.
__________________
Carlunchos
  #4 (permalink)  
Antiguo 10/11/2003, 12:34
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Cita:
Mensaje Original por carlunchos
Al peluche pabli y aprovecho para preguntarte como deberia codificar lo siguiente:

que al dar un click al nombre de una tabla en el List1 cargue los datos de esa tabla en un ListView? Se entiende lo que pretendo?


Gracias.
Haber si entiendo...

Con un que las tablas de la base de datos carguen en un List, y si le haces click, que te muestre lo que tiene esa tabla?
  #5 (permalink)  
Antiguo 10/11/2003, 13:07
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Asi es culd, segun el codificado del inicio la idea es cargar los nombres de tablas de una base y luego dar un click en el List1 (que contiene los nombres de las tablasde dicha base) para que se desplieguen los datos de esa tabla en un ListView.

Se entiende?
__________________
Carlunchos
  #6 (permalink)  
Antiguo 11/11/2003, 02:34
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola carlunchos,

porque tiene que ser en un Listview?, pues es un control para imágenes, iconos, descripciones. Creo que la parte de la derecha del explorador de windows es un listview, entonces no tendría sentido, a lo mejor te refieres a un datagrid.
Comenta si realmente te refieres a un listview.

Un saludo
Pablo
  #7 (permalink)  
Antiguo 11/11/2003, 06:47
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola Pablo, la idea era un listview pero creo que es lo mismo que un datagrid o algo similar que permita ver los registros de la tabla en filas y columnas. Solo habria que tener en cuenta que todo debe ser desde la orbita de ADO.

Dicho esto espero una idea de como encarar lo planteado mas arriba.

Saludos.
__________________
Carlunchos
  #8 (permalink)  
Antiguo 11/11/2003, 13:35
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola carlunchos,

copia y pega,
ajusta los nombres de los controles y formulario,
ten a punto las librerías de ADO(activex data objects library y activex data objects recordset)
y ya esta.
El código está desnudo, pues falta tratamiento de errores y muchas más cosas.
IMPORTANTE, te saldrán en el combo tablas del sistema que darán error si las seleccionas. O no las cargas en el combo con las opciones de ADO(busca la ayuda, se llama "ado200.chm"), o manejas el error y sacas un mensaje(esto es más chapucero).
Está probado pero si te da error escribe...
-------------------------------------------------------------------------
Option Explicit

Dim Gado_conn As ADODB.Connection
Dim Gado_rec As ADODB.Recordset
Dim Gado_rec_tmp As ADODB.Recordset

Private Sub Combo1_Click()

'Me aseguro que está cerrado para cerrarlo
If Gado_rec.State <> adStateClosed Then
Gado_rec.Close
End If
'Defino la consulta
Gado_rec.Source = "SELECT * FROM " & Combo1.Text
'Abro el recordset
Gado_rec.Open

Set dtgUsuarios.DataSource = Gado_rec
'No debo cerrar el recordset mientras quiera los datos en el datagrid
End Sub

Private Sub Form_Load()

Dim S_cad As String

'Creo un objeto Connection para abrir la conexión mediante ADO
Set Gado_conn = New ADODB.Connection
Gado_conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\siene.mdb;Persist Security Info=False"

'Creo un objeto Recordset
Set Gado_rec = New ADODB.Recordset
Gado_rec.ActiveConnection = Gado_conn
Gado_rec.CursorLocation = adUseClient
Gado_rec.CursorType = adOpenKeyset
'Creo un objeto Recordset
Set Gado_rec_tmp = New ADODB.Recordset
Gado_rec_tmp.ActiveConnection = Gado_conn
Gado_rec_tmp.CursorLocation = adUseClient
Gado_rec_tmp.CursorType = adOpenKeyset

'Abro el recorset
Set Gado_rec_tmp = Gado_conn.OpenSchema(adSchemaTables)
While Not Gado_rec_tmp.EOF

Combo1.AddItem Gado_rec_tmp!TABLE_NAME

Gado_rec_tmp.MoveNext
Wend
Gado_rec_tmp.Close
End Sub
-------------------------------------------------------------------------


Un saludo
Pablo
  #9 (permalink)  
Antiguo 13/11/2003, 10:12
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola pabli, lo que me pasaste funciona, solo lo adapte a lo que necesito. Todo bien. Ahora me queda saber como hago para que al dar click sobre un item del listbox se muestre el contenido de la tabla seleccionada en un datagrid, listview o algun control que muestre filas y columnas.

Saludos. y gracias.
__________________
Carlunchos
  #10 (permalink)  
Antiguo 13/11/2003, 13:16
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola carlunchos,

te lo puse también en el mensaje anterior, pero en vez de un listbox, en un combobox, a efectos prácticos es lo mismo. El código está en el click. Los datos los despliego en el datagrid "dtgUsuarios".
Te pongo una mejora del código que abre la consulta que devuelve las tablas, es para que no muestre las de sistema, pues no interesan y dan problemas:

Set Gado_rec_tmp = Gado_conn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))

Saludos
Pablo
  #11 (permalink)  
Antiguo 14/11/2003, 15:53
 
Fecha de Ingreso: noviembre-2003
Ubicación: H. Matamoros, Tamaulipas, Mexico
Mensajes: 10
Antigüedad: 20 años, 5 meses
Puntos: 0
mi problema es ke no los muestra en el listbox , solo me presenta el encabezado pero no me lista los datos de mi base de datos
  #12 (permalink)  
Antiguo 14/11/2003, 17:51
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola Margarita, pon los nombres de tus controles, la base de datos en la cadena de conexión y la tabla a la que quieres acceder

Private Sub Form_Load()

Dim Gado_conn As ADODB.Connection
Dim Gado_rec As ADODB.Recordset
Dim S_cad As String
Dim I_num as Integer

'Creo un objeto Connection para abrir la conexión mediante ADO
Set Gado_conn = New ADODB.Connection
Gado_conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\tubasededatos.mdb;Persist Security Info=False"

'Creo un objeto Recordset
Set Gado_rec = New ADODB.Recordset
Gado_rec.ActiveConnection = Gado_conn
Gado_rec.CursorLocation = adUseClient
Gado_rec.CursorType = adOpenKeyset

'Me aseguro que está cerrado para cerrarlo
If Gado_rec.State <> adStateClosed Then
Gado_rec.Close
End If
'Defino la consulta
Gado_rec.Source = "SELECT * FROM tabla"
'Abro el recordset
Gado_rec.Open
While Not Gado_rec_tmp.EOF

'SI SOLO QUIERES METER EN EL LIST UN CAMPO
tulist.AddItem Gado_rec(0)

' 'SI QUIERES METER EN EL LIST TODOS LOS CAMPOS
' 'Este código valdrá para cualquier consulta(tenga los campos que 'tenga)
' S_cad=""
' For I_num = 0 To Gado_rec.Fields.Count - 1
' S_cad=S_cad & Gado_rec(I_num) & " - "
' Next
' tulist.AddItem S_cad

Gado_rec.MoveNext
Wend

Gado_rec.Close
End Sub
-------------------------------------------------------------------------

Un saludo
  #13 (permalink)  
Antiguo 14/11/2003, 19:46
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Hola Pablo:

Cita:
Set dtgUsuarios.DataSource = Gado_rec
esto me tira el siguiente error:
"El conjunto de registros no admite marcadores."

No logro mostrar en el datagrid el conjunto de registros cuando doy un click en el combo al seleccionar una tabla. Alguna otra idea?. Creo que mi error es de concepto respecto del datagrid.

Saludos.
__________________
Carlunchos
  #14 (permalink)  
Antiguo 15/11/2003, 12:49
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
carlunchos,

siento decirte que ese error es un gran conocido mio, pero a pesar de conocerlo, todavía no se porque sale.
Cambiando el código acabo arreglándolo, pero siempre sin saber como lo he hecho. El código que te he pasado a mi me funciona.
Mira a ver si alguna de estas soluciones te funciona:

1-crea otro recordset nuevo y se lo pasas al datagrid.
2-si no funciona, pasa las declaraciones y las configuraciones de conexión y recordsets a un módulo normal, como esto:

------------------------------------------------
Option Explicit

'********************
'Variables de la BBDD
Global Gado_conn As ADODB.Connection 'Abre una conexión
Global Gado_rec As ADODB.Recordset 'Para mandatos Select
Global Gado_rec_tmp As ADODB.Recordset 'Para mandatos Select

Public Function FUN_Abrir_BBDD() As Integer

Dim S_cad As String

On Error GoTo CONTROL_ERRORES

'Creo un objeto Connection para abrir la conexión mediante ADO
Set Gado_conn = New ADODB.Connection
Gado_conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TUbbdd.mdb;Persist Security Info=False"

'Creo un objeto Recordset para consultar
Set Gado_rec = New ADODB.Recordset
Gado_rec.ActiveConnection = Gado_conn
Gado_rec.CursorLocation = adUseClient
Gado_rec.CursorType = adOpenKeyset
Gado_rec.LockType = adLockOptimistic
'Creo un objeto Recordset para consultar
Set Gado_rec_tmp = New ADODB.Recordset
Gado_rec_tmp.ActiveConnection = Gado_conn
Gado_rec_tmp.CursorLocation = adUseClient
Gado_rec_tmp.CursorType = adOpenKeyset
Gado_rec_tmp.LockType = adLockOptimistic

FUN_Abrir_BBDD = 0

Exit Function
CONTROL_ERRORES:
FUN_Abrir_BBDD = 1
MsgBox "No es posible establecer la conexión con la BBDD", vbCritical
End
End Function
----------------------------------------------

y por último llamas a la función desde el load del form principal.


Saludos
  #15 (permalink)  
Antiguo 16/11/2003, 17:55
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Mi estimado Pablo debo decir que arrojo la toalla: el visual basic acaba de cobrar una nueva victima.
No he logrado, pese a tu ayuda, lograr el objetivo. No he podido dar cuenta de "Error 91". Lo que rescato de todo esto es tu voluntad de ayuda a los novatos como yo.
Intentare mas adelante , cuando haya acumulado mas experiencia en este rubro.

Gracias por tu atencion y probamos en otra oportunidad.

Saludos.
__________________
Carlunchos
  #16 (permalink)  
Antiguo 17/11/2003, 03:22
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0

Carlunchos, todavía no puedes tirar la toalla.

Visual Basic te ha ganado el primer round pero hay que seguir.

ERROR 91: La variable de objeto o la variable de bloque With no está establecida

No has declarado o no has reservado memoria correctamente. El error 91 es otro gran conocido.

Te voy a poner el código entero:

***Código para el formulario***
-----------------------------------------------
Option Explicit

Private Sub Combo1_Click()

'Me aseguro que está cerrado para cerrarlo
If Gado_rec.State <> adStateClosed Then
Gado_rec.Close
End If
'Defino la consulta
Gado_rec.Source = "SELECT * FROM " & Combo1.Text
'Abro el recordset
Gado_rec.Open

Set DataGrid1.DataSource = Gado_rec
'No debo cerrar el recordset mientras quiera los datos en el datagrid
End Sub

Private Sub Form_Load()

'Abro la base de datos
FUN_Abrir_BBDD

'Abro el recorset
Set Gado_rec_tmp = Gado_conn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
While Not Gado_rec_tmp.EOF

Combo1.AddItem Gado_rec_tmp!TABLE_NAME

Gado_rec_tmp.MoveNext
Wend
Gado_rec_tmp.Close

End Sub

Private Sub Form_Unload(Cancel As Integer)

'Cierro la base de datos
FUN_Cerrar_BBDD
End Sub
-----------------------------------------------

***Código para el módulo***
-----------------------------------------------
Option Explicit
'********************
'Variables de la BBDD
Global Gado_conn As ADODB.Connection 'Abre una conexión
Global Gado_rec As ADODB.Recordset 'Para mandatos Select
Global Gado_rec_tmp As ADODB.Recordset 'Para mandatos Select

Public Function FUN_Abrir_BBDD() As Integer

Dim S_cad As String

On Error GoTo CONTROL_ERRORES

'Creo un objeto Connection para abrir la conexión mediante ADO
Set Gado_conn = New ADODB.Connection
Gado_conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TUBBDD.mdb;Persist Security Info=False"

'Creo un objeto Recordset para consultar
Set Gado_rec = New ADODB.Recordset
Gado_rec.ActiveConnection = Gado_conn
Gado_rec.CursorLocation = adUseClient
Gado_rec.CursorType = adOpenKeyset
Gado_rec.LockType = adLockOptimistic
'Creo un objeto Recordset para consultar
Set Gado_rec_tmp = New ADODB.Recordset
Gado_rec_tmp.ActiveConnection = Gado_conn
Gado_rec_tmp.CursorLocation = adUseClient
Gado_rec_tmp.CursorType = adOpenKeyset
Gado_rec_tmp.LockType = adLockOptimistic

FUN_Abrir_BBDD = 0

Exit Function
CONTROL_ERRORES:
FUN_Abrir_BBDD = 1
MsgBox "No es posible establecer la conexión con la BBDD", vbCritical
End
End Function

Public Function FUN_Cerrar_BBDD()

Gado_conn.Close
Set Gado_conn = Nothing
Set Gado_rec = Nothing
Set Gado_rec_tmp = Nothing
End Function
-----------------------------------------------

Esto tiene que funcionar, pues lo he copiado en un proyecto nuevo y sin problemas. No he configurado nada en diseño, solo añadir un combo(Combo1) y un datagrid(Datagrid1), asegúrate que tienen esos nombres y que cambias la BBDD en la cadena de conexión.

Saludos

Última edición por pabli; 17/11/2003 a las 03:24
  #17 (permalink)  
Antiguo 17/11/2003, 19:44
 
Fecha de Ingreso: noviembre-2003
Ubicación: H. Matamoros, Tamaulipas, Mexico
Mensajes: 10
Antigüedad: 20 años, 5 meses
Puntos: 0
gracias

gracias pero no no me ha ganado es soslo ke se me cerro el mundo por completo
  #18 (permalink)  
Antiguo 17/11/2003, 20:36
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Margarita83, tenes que tener fe en el pai Pablo: abre caminos, acerca amigos y destraba visual!! ja, ja.

Hermano Pablo tenias razon , funciona y aqui pongo lo que queria conseguir:

Option Explicit
Private conexion As ADODB.Connection
Private rst As ADODB.Recordset

Dim pathBase As String
Dim sql As String
Dim NombreTabla As String
Dim dato As ListItem
Dim p As Integer


Public Function abrir_base() As Integer

On Error GoTo ver_errores

Set conexion = New Connection
conexion.Open "Provider=Microsoft.jet.OLEDB.3.51;Data Source=" & pathBase
Set rst = New ADODB.Recordset
rst.ActiveConnection = conexion
rst.CursorLocation = adUseClient
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic

Set rst_tmp = New ADODB.Recordset
rst_tmp.ActiveConnection = conexion
rst_tmp.CursorLocation = adUseClient
rst_tmp.CursorType = adOpenKeyset
rst_tmp.LockType = adLockOptimistic

abrir_base = 0
Exit Function


ver_errores:
abrir_base = 1

MsgBox "No es posible conectarse con la base " & pathBase, vbCritical
End

End Function


Public Function centra(Form1 As Form)

Form1.Left = (Screen.Width - Form1.Width) \ 2
Form1.Top = (Screen.Height - Form1.Height) \ 2

End Function


Private Sub cboTablas_Click()
Dim tot_reg As Integer

If rst.State <> adStateClosed Then
rst.Close
End If

rst.Source = "Select * from " & cboTablas.Text
rst.Open

Progreso.Visible = True
Progreso.Value = 0
Timer1.Enabled = True

End Sub

Private Sub cmdConectar_Click()

CommonDialog1.Filter = "Base de datos Microsoft Access" & _
"(*.mdb)|*.mdb|"
CommonDialog1.ShowOpen
pathBase = CommonDialog1.FileName

abrir_base

lblPathBase.Caption = pathBase

Set rst_tmp = conexion.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))

While Not rst_tmp.EOF
cboTablas.AddItem rst_tmp!TABLE_NAME
rst_tmp.MoveNext
Wend

rst_tmp.Close


End Sub

Private Sub cmdSalir_Click()
End

End Sub

Private Sub Command1_Click()

End Sub

Private Sub Form_Activate()
centra Me

End Sub


Private Sub Form_Load()
Timer1.Enabled = False
Progreso.Visible = False

End Sub

Private Sub Timer1_Timer()
With Progreso
If .Value < .Max Then
.Value = .Value + 1
StatusBar1.Panels("reg").Text = "Cargando Tabla " & cboTablas.Text

Else
Timer1.Enabled = False
Set DataGrid1.DataSource = rst
tot_reg = rst.RecordCount
StatusBar1.Panels("reg").Text = "Cant de Reg: " & Str(tot_reg)
Progreso.Visible = False
End If
End With

End Sub

y el modulo:

Option Explicit

Global conexion As ADODB.Connection
Global rst As ADODB.Recordset
Global rst_tmp As ADODB.Recordset
Global tot_reg As Integer

Con tu ayuda he comprendido algunas cosas pero han surgido otras que detallo:

1) hubo que declarar las variables de conexion y recordset en un modulo.

2) hubo que declarar dos recordset, ya que si queria usar el mismo para todo daba error en la asignacion del DataGrid.

3) Si la tabla tiene un nombre compuesto ( ej: Datos viejos) da un error 80040e37: No se encuentra la tabla. Como deberia salvar este tema?. Probe cambiando el nombre de la tabla poniendo un guion bajo que una las dos palabras, pero creo que no es lo ideal.

4) si doy Cancelar y no conecto con una base me avisa diciendo "No es posible conectarse con la base" y se detiene la ejecucion. Se puede hacer que el programa continue para esperar otra seleccion de base de datos?

5) el codigo me quedo un poco despelotado, alguien tendra ganas de mejorarlo?

Pablo un saludo, un gracias y hasta pronto.

__________________
Carlunchos
  #19 (permalink)  
Antiguo 18/11/2003, 04:01
Avatar de pabli  
Fecha de Ingreso: octubre-2003
Mensajes: 381
Antigüedad: 20 años, 6 meses
Puntos: 0
margarita,

cuando se cierra el mundo, nos levantamos, no damos una vueltecita y que nos de el aire, o lo dejamos para otro día, muchas veces el cerebro se me encoje y hay que relajarlo.

carlunchos,

tener fe, más que en el Pablo, en uno mismo.

1-las variables tipo recordset, conexión, command y algunas otras deben declararse a nivel de módulo, pues deberían estar disponibles para todo el programa. Yo intento utilizar los menos recordset posibles, y si solo necesito uno para todo mejor que mejor. Se pueden declarar en el formulario o incluso en un evento pero solo por temas muy concretos y discutibles.

2-el problema creo que solo está en el recordset que se utiliza con openschema, el rst que utilizas para querys normales lo puedes reutilizar, es lo que hago yo siempre. Lo normal es abrir el rec, utilizarlo, y por último cerrarlo, es lo normal. Pero cuando se lo asignas a un Datagrid, no lo puedes cerrar hasta que dejes de utilizar el Datagrid, pues se borrarían los datos. Yo he determinado cerrarlo antes de abrirlo, así me aseguro que esté cerrado y que no de un error, así

If rec.State <> adStateClosed Then
rec.Close
End If

y después de esto abrirlo. Yo lo tengo metido en una función que reutilizo, donde le paso el rec que quiera cerrar.

3-A mi no me gusta definir nombres de (tablas, archivos, variables, etc) con espacios, acentos, "ñ", caracteres raros, pero si me los encuentro no hay más remedio que hacerles frente, utiliza [] para todas las tablas, así te quitas de problemas. Así

rst.Source = "Select * from [" & cboTablas.Text & "]"
rst.Open

4-Deberías sacar el código de apertura del load y meterlo en un botón, menú, etc. Pero es muy importante que si no está abierta la BBDD desactives todo lo relacionado con ella(recordsets, commands, etc), por ejemplo, que no puedan hacer click en el combo, o acceder al formulario donde esté.

5-Las mejoras que te propongo son de filosofía, veo que no comentas el código, muuuuy mal, gran error, es poco código, pero cuando tengas 100 líneas o más y pasen 3 semanas sin tocarlo te va a costar retomarlo o retocarlo un mundo. El último programa que he hecho ocupa 100 páginas de código impresas(solo una cara) y tengo que aumentarlo, casi al doble, imagínate si no lo hubiese comentado, para morirme.
Otro consejo, veo que tienes un END

Private Sub cmdSalir_Click()
End
End Sub

no es buena idea, END finaliza drásticamente el programa, dejando todo bailando. Cuando reservas memoria con SET tienes que liberarla con NOTHING, o sea

Public Function FUN_Cerrar_BBDD()
Gado_conn.Close
Set Gado_conn = Nothing
Set Gado_rec = Nothing
Set Gado_rec_tmp = Nothing
End Function

Sub Form_Unload()
FUN_Cerrar_BBDD
EndSub

no utilices END.

Saludos
Pablo
  #20 (permalink)  
Antiguo 18/11/2003, 07:59
Avatar de carlunchos  
Fecha de Ingreso: enero-2002
Ubicación: no tengo, soy un desubicado?.
Mensajes: 438
Antigüedad: 22 años, 3 meses
Puntos: 1
Si bien este codigo es muy simple, he aprendido cosas que no tenia en cuenta como lo del OpenSchema en el recordset.
He tomado nota de todas las sugerencias.

Nos vemos.
__________________
Carlunchos
  #21 (permalink)  
Antiguo 19/06/2004, 19:19
 
Fecha de Ingreso: junio-2004
Mensajes: 1
Antigüedad: 19 años, 10 meses
Puntos: 0
te acerco esta solucion ( a ver si te funciona...)

Private Sub Combo1_Click()

If rs.State <> adStateClosed Then
rs.Close

End If

rs.CursorLocation = adUseClient
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "select * from " & Combo1.Text
Set DataGrid1.DataSource = rs
DataGrid1.Refresh

End Sub

Private Sub Form_Load()
Dim cadena_conexion As String

Set cn = New ADODB.Connection
cadena_conexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\autos.mdb;Persist Security Info=False"
cn.Open cadena_conexion

Set rs = New ADODB.Recordset
Set rs = cn.OpenSchema(adSchemaTables)

If rs.BOF And rs.EOF Then
MsgBox "No existen tablas para mostrar.."

Else
rs.MoveFirst
While Not rs.EOF
Combo1.AddItem (rs!TABLE_NAME)
rs.MoveNext
Wend

End If

End Sub


'en el modulo le puse...

Option Explicit

Dim cn As ADODB.Connection
Public rs As ADODB.Recordset

'Bueno, me falto filtrar las tablas de sistema que levanta el openschema...
'en todo caso avisame y te paso el codigo (es cortito)

Saludos, y espero que esto evite un suicidio...jajja


Emiliano
  #22 (permalink)  
Antiguo 10/07/2006, 09:30
 
Fecha de Ingreso: noviembre-2003
Ubicación: H. Matamoros, Tamaulipas, Mexico
Mensajes: 10
Antigüedad: 20 años, 5 meses
Puntos: 0
De acuerdo como llenar un listbox

mira hace unos años tube esa duda y unos compañeros me mandaron esto espero te sirva:

Si no entendi mal queres llenar un listbox con los datos de un campo de una tabla, si es asi es esto:

While Not rst_tmp.EOF
List1.AddItem rst_tmp.Fields(1)
rst_tmp.MoveNext
Wend

donde rst_tmp es tu recordset, List1 tu listbox y el valor 1 es el orden del campo del cual queres extraer los datos. Los campos se numeran de izquierda a derecha empezando por cero. Es decir si tu tabla tiene 3 campos se numeraran 0, 1, 2.
************************************************
pon los nombres de tus controles, la base de datos en la cadena de conexión y la tabla a la que quieres acceder

Private Sub Form_Load()

Dim Gado_conn As ADODB.Connection
Dim Gado_rec As ADODB.Recordset
Dim S_cad As String
Dim I_num as Integer

'Creo un objeto Connection para abrir la conexión mediante ADO
Set Gado_conn = New ADODB.Connection
Gado_conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\tubasededatos.mdb;Persist Security Info=False"

'Creo un objeto Recordset
Set Gado_rec = New ADODB.Recordset
Gado_rec.ActiveConnection = Gado_conn
Gado_rec.CursorLocation = adUseClient
Gado_rec.CursorType = adOpenKeyset

'Me aseguro que está cerrado para cerrarlo
If Gado_rec.State <> adStateClosed Then
Gado_rec.Close
End If
'Defino la consulta
Gado_rec.Source = "SELECT * FROM tabla"
'Abro el recordset
Gado_rec.Open
While Not Gado_rec_tmp.EOF

'SI SOLO QUIERES METER EN EL LIST UN CAMPO
tulist.AddItem Gado_rec(0)

' 'SI QUIERES METER EN EL LIST TODOS LOS CAMPOS
' 'Este código valdrá para cualquier consulta(tenga los campos que 'tenga)
' S_cad=""
' For I_num = 0 To Gado_rec.Fields.Count - 1
' S_cad=S_cad & Gado_rec(I_num) & " - "
' Next
' tulist.AddItem S_cad

Gado_rec.MoveNext
Wend

Gado_rec.Close
End Sub
*************************************************
saludos
  #23 (permalink)  
Antiguo 13/07/2006, 19:55
 
Fecha de Ingreso: febrero-2006
Mensajes: 37
Antigüedad: 18 años, 3 meses
Puntos: 0
A ver si le atino

Si lo que deseas es

1.- Abrir cualquier base de datos Access MSsql Etc
2.- Localmente / de servidor / de internet
3.- Mostrar en un listbox todas las tablas que contiene
4.- dar click a una Tabla en el listbox
5.- Mostrar los campos de la tabla en msflexgrid con sus propiedades
6.- Mostra los datos de la tabla en otro msflexgrid
7.- Poder editar y guardar los cambios de esos datos

Entonces dime a que correo te mando el programa , porque es algo extenso y
si realmente quieres aprender , analizalo en lugar de estarlo tecleandolo

Saludos
__________________
Jerico
  #24 (permalink)  
Antiguo 14/07/2006, 09:14
 
Fecha de Ingreso: noviembre-2003
Ubicación: H. Matamoros, Tamaulipas, Mexico
Mensajes: 10
Antigüedad: 20 años, 5 meses
Puntos: 0
Pregunta

mi problema no es con el list box, mas bien es que nose nada de visual .net y de java me puedes orientar
  #25 (permalink)  
Antiguo 14/07/2006, 10:09
Avatar de Eärandir  
Fecha de Ingreso: junio-2006
Ubicación: Torreón, México
Mensajes: 21
Antigüedad: 17 años, 10 meses
Puntos: 0
jeje, es divertido cuando hilo resucita despues de 3 años de existencia y más cuando ya había resucitado un año despues de su creación
__________________
If you want to know the answers, then u gotta ask the questions
  #26 (permalink)  
Antiguo 14/07/2006, 11:09
 
Fecha de Ingreso: noviembre-2003
Ubicación: H. Matamoros, Tamaulipas, Mexico
Mensajes: 10
Antigüedad: 20 años, 5 meses
Puntos: 0
Pregunta temas de Java y visual.net

hola si regreso pero con otras dudas sabras de casualidad algo sobre los temas de java o visual .net eske nose nada y si lo necesito mucho bueno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:15.