DataList con Ado

Tengo hecho ésto y no encuentro la manera de que los TexBox de frmdatos se me llenen cada uno con los datos de su campo correspondiente cuando pico en el nombre del DataList. De esta manera se me repiten todos con los del primero.
Creo que todo está enlazado bien.
Saludos baps.
Private Sub DataListDatosmoprilab_Click()
frmdatos.txtnombre(0).Text = DataListDatosmoprilab.BoundText
frmdatos.txtformula(1).Text = DataListDatosmoprilab.BoundText
frmdatos.txtcodigo(2).Text = DataListDatosmoprilab.BoundText
frmdatos.txtestado(3).Text = DataListDatosmoprilab.BoundText
...etc
End Sub

1 Respuesta

Respuesta
1
Lo que necesitas, es hacer una búsqueda dentro de tu ADODC (supongo que enlazado con todos los otros controles), el cual se posicione en el item según hayas seleccionado en el datacombo (por lo menos, eso entendí).
Por lo tanto, en el mismo evento del datacombo, debes quitar esas lineas de código que pusiste y poner algo así como:
adodc1.RecordSet.Find "elcampoquedesasfiltrar ='" & datacombo1.text & "'"
Adodc1. Refresh
Con esto, cada vez que cambias de item en el datacombo, se dispara una búsqueda dentro del control data enlazado que se posiciona en el registro de "elcampoquedeseasfiltrar" igual al que aparece en tu datacombo.
Espero haberte ayudado. Cualquier cosa, me lo comentas y te amplio la solución.
Pablo
¡Hola Pablo!
Lo he probado con tu planteamiento que me parece muy lógico, pero me da Error 3001 "Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros"
Quizás necesitemos algún retoque con las conexiones o alguna propiedad, no sé.
Verás que el Control es un DataList no un DataCombo aunque supongo que da igual.
También les he cambiado el nombre a los Controles Adodc1, DataList1 por lo de la longitud del código.
El DataList lo tengo en "frmListado" y los TextBox en otro formulario "frmdatos" con sus Ados conectados.
Private Sub DataList1_Click()
On Error GoTo Interrupcion
Adodc1.Recordset.Find "Materia Activa ='" & DataList1.Text & "'"
Adodc1.Recordset.Find "Formula ='" & DataList1.Text & "'"
Adodc1.Recordset.Find "Codigo ='" & DataList1.Text & "'"
Adodc1.Recordset.Find "Estado ='" & DataList1.Text & "'"
Adodc1.Refresh
Exit Sub
Interrupcion:
MsgBox Err.Description
Tambíen he probado con esto:
Adodc1.Recordset.Find "Materia Activa = '" & frmdatos.txtnombre(0).Text & "'"
... etc
Me da el mismo error.
Hasta pronto saludos Alfonso.
Hola Pablo he probado con esto y me funciona.
Gracias por todo.
Private Sub DataList1_Click()
On Error GoTo Interrupcion
Dim strQuery As String
strQuery = "Select * FROM Datosmoprilab WHERE [Codigo] ='" & _
DataList1.BoundText & "'"
With frmdatos.Adodc1
frmdatos.Adodc1.RecordSource = strQuery
frmdatos.Adodc1.Refresh
End With
With DataList1
DataList1.Refresh
End With
Exit Sub
Interrupcion:
MsgBox Err.Description
End Sub
En el ListFild del DataList se pone el nombre de campo a seleccionar, en el BoundColumn otro distinto, en el strQuery el mismo campo del BoundColumn para que busque, así se llenan todos los TexBox con su registro correspondiente.
Lo he visto por casualidad en MSDNLibrey Visual punto 9 "Crear una cuadricula vinculada a un control DataList"
¡Ah! tengo esta otra cosilla.
Es un rótulo que pretendo sea intermitente y se me queda fijo dice "Producto Caducado" ¿Cómo lo ves?
Private Sub Form_Load()
On Error GoTo Interrupcion
Label18.Caption = Date
Dim alarma As Boolean
Dim i As Integer
Timer2.Enabled = True
Timer2.Interval = 500
If txtfcaducidad(5) = Date Then
For i = 0 To 10
Beep
alarma = True
Label20(0).Visible = True
Label20(0).Visible = False
alarma = False
Label20(0).Visible = False
Label20(0).Visible = True
alarma = True
Next i
End If
Exit Sub
Interrupcion:
MsgBox Err.Description
End Sub
Perdona Pablo, pero creo que tenia que haber terminado y valorado la primera pregunta antes de hacerte otra nueva. Cosas de novato. Así es que dime algo y la cerramos y te la vuelvo hacer en otra pregunta, la del rótulo.
Saludos Alfonso.
No te preocupes... no ando detrás de puntuación por respuestas, así que no hace falta empezar un nuevo "hilo" para la pregunta.
Ayer intenté enviarte la respuesta sobre el tema de la alarma, pero no me dejó el servidor. Se ve que estaba con problemas. Te lo pego aquí mismo porque lo tengo resuelto en un txt.
Un saludo grande y por cualquier cosa no dudes en consultarme.
Pero, ya que entras en tema de las preguntas en este web, sacame una duda que tuve siempre... ¿cómo es que te decidiste por preguntarme a mi al principio?, es decir, ¿qué te llevó a pensar que podría yo responderte? ¿O solo fue al azar?
Gracias.
-------Te pego la respuesta que tenia preparada de ayer-----
Alfonso, antes que nada, disculpame por no haberte podido ayudar antes. Ayer fue un día de locos. Me alegro que hayas solucionado el tema del combo. Yo no te plantee algo así porque realmente no sabia si estabas trabajando con ado, dao, etc.
Respecto a la alarma intermitente, te he hecho algunas modificaciones sobre el código para que funcione. No te olvides que las acciones se ejecutan dentro del timer.
Lo que he hecho es validar el textbox de la fecha cuando se intenta perder el foco.
Con lo cual, al ver que el valor de la fecha es idéntico al del label, inicia un timer que, mediante un contador (j) declarado globalmente, se ejecuta 7 veces y cambia según el estado de otra variable (también global) (op).
Fíjate que lo del evento validate del textbox, como otra opción, lo puedes pegar en un botón para que valide este u otro dato al mismo tiempo, pero siempre lo recomendable es que cada control tenga su propia validación en su evento.
Una cosa más, que es ventaja de usar el evento validate, es que puedes cancelar la acción de salir del textbox si es que no se cumple la condición de validación. Es la linea que veras con Cancel = false y es un parámetro propio de la función.
Bueno, va el código. Espero haberte ayudado.
Un abrazo grande y cuenta conmigo para lo que necesites en un futuro.
(Pega esto tal cual en tu formulario)
Dim op As Integer
Dim j As Integer
Private Sub Form_Load()
op = 1
j = 1
Label18.Caption = Date
End Sub
Private Sub Timer2_Timer()
Select Case op
Case 1
Label20(0).Visible = True
op = op - 1
j = j + 1
Case 0
Label20(0).Visible = False
op = op + 1
j = j + 1
End Select
If j = 7 Then Timer2.Enabled = False
End Sub
Private Sub txtfcaducidad_Validate(Index As Integer, Cancel As Boolean)
On Error GoTo Interrupcion
Dim alarma As Boolean
Dim i As Integer
If txtfcaducidad(5) = Date Then
j = 1
Timer2.Interval = 500
Timer2.Enabled = True
End If
Cancel = True
Exit Sub
Interrupcion:
MsgBox Err.Description
End Sub
Hola Pablo, antes de meternos en faena, nada de disculpas, en todo caso te las tendría que pedir yo a ti. Bueno, para ser sincero, no recuerdo si fue por azar, sé que buscaba a alguien con cocimientos en Base de Datos simplemente.
¡Bien! Vamos a lo nuestro, de momento no rula, seguro que algo he hecho mal. Lo he pegado tal cual me has dicho.
-Aclaraciones y dudas- la acción ocurre en el frmdatos donde están los TexBox de entrada de datos. Cuando me muevo por ellos o selecciono uno que cuincide, aparece el rótulo.
-Dudas. -Los Dim op, j cuando los has dejado fuera, ¿Los debo situar en ¿Option Explicit?, en Propiedades de los objetos Time y Label el Enabled e Interval ¿qué valor les doy?
los Dim alarma y Dim i, el Procmto.Private Sub txtfcaducidad_Validate ¿para q nos sirven?
Veras que aparte de novato soy un poco bruto de mollera, m lo tienen que dar mascao.
No me tardes te espero con impaciencia.
Adiós, Pablo.
Alfonso
Alfonso, me extraña que no te funcione, yo lo probé y funcionaba... pero veamos... si quieres, te mando el ejemplo a un mail... no tengo problemas, así se te aclaran las dudas.
Las variables j y op si están a nivel global, es decir, bajo option explicit (o si quieres, las puedes poner en un modulo vas)...
Las propiedades de los controles, las paso en tiempo de ejecución, es decir, el interval es 500. Lo que si, el timer en tiempo de diseño es disabled y el label del mensaje que titila es visible=false en tiempo de diseño. Me olvide de decírtelo.
Dim alarma y Dim i los puedes borrar, quedaron de tu anterior codigo.
El procedimiento txtcaducidad_Validate es el evento del cuadro de texto, que valida el código cuando intentas salir del textbox en donde pusiste la fecha.
Resumiendo: para que el proyecto te funcione, debes pegar un formulario:
- un label con la propiedad Nombre = Label18
- un label con la propiedad Nombre = Label20, la propiedad index = 0 y la propiedad visible = false
- un timer con la propiedad Nombre = Timer2, la propiedad Interval = la que viene por defecto (o 500, como quieras) y la propiedad enabled = false
- Un textbox con la propiedad Nombre = txtfcaducidad y la propiedad text = vacío (es decir, borra todo el contenido de la propiedad en tiempo de diseño)
- Por ultimo un botón cualquiera sin ninguna particularidad ni función de código incluido, porque, cuando escribas la nueva fecha en el campo de texto (txtfcaducidad), necesitarás hacer foco en otro control, o lo que es lo mismo, salir de ese control de texto para que se active el evento validate (txtfcaducidad_Validate) que ejecutara las instrucciones que verifican si esa fecha es igual a la del label, que, en caso afirmativo, activan el evento timer, muestra el mensaje titilando 3 veces, y te devuelve el foco al control de texto (txtfcaducidad) es decir, no te deja salir hasta que introduzcas una fecha válida (que pase la condición if del evento validate)
Bueno, eso es todo, cualquier cosa me lo preguntas o me mandas un mail a [email protected]
Yo me estoy yendo de mi trabajo así que recién podré volverte a responder el lunes en caso de que lo necesites.
Un abrazo grande, suerte con esto y buen fin de semana.
Pablo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas