https://foro.gambas-es.org/viewtopic.php?f=3&t=1695&p=9903#p9903
-----------------------------------
shordi
Viernes, 24 Junio 2011, 07:27

Re: Consultas
-----------------------------------
Veo tu código muy confuso y con errores de concepto graves. Permíteme una puñado de consejos, que no dan la solución exacta a lo que quieres, pero que si los sigues te ayudarán a encontrar dicha solución de forma sencilla.
Por ejemplo:

[code linenumbers=false syntax=gambas]

PRIVATE asiscon AS Connection
PRIVATE asisresul AS Result
PUBLIC SUB Form_Open()
IF coneccion.conectarbase() THEN RETURN   'Aquí te conectas a la base de datos (supongo) Si no es así, esta línea sobra 
ValueBox4.Value = Format(Now(), "dd/mm/yy") 'das valor al control...
ValueBox4.Value = Now()                                 'y se lo vuelves a dar otra vez. Te sobra la línea de arriba
ValueBox1.Value = Format(Now(), "hh:mm:ss") 'y esta...
ValueBox1.Value = Now()
ValueBox3.Value = Format(Now(), "hh:mm:ss")  'y esta
ValueBox3.Value = Now()     'Por otra parte aquí tienes tres valuebox con la fecha y hora del día. Si lo que quieres es dejar constancia del momento de la grabación, te basta con uno...
Message.Info("BIENVENIDO Ó BIENVENIDA AL REGISTRO DE ASESORES") 'uno...
Message.Info("POR FAVOR RECUERDE ACTUALIZAR CONSTATEMENTE SEA NECESARIO EL FORMULARIO DE ASESORES PARA ACTUALIZAR FECHAS Y HORAS") 'dos...
Message.Info("POR FAVOR AGREGUE UN NÚMERO SECUENCIAL COMO IDENTIFICADOR PARA PODER GUARDAR LA ASISTENCIA CON ÉXITO") 'tres...
Message.Info("TODOS LOS CAMPOS ESTAN DESHABILITADOS")    'y... ¡¡¡¡CUATRO!!!
TextBox1.Enabled = FALSE
TextBox2.Enabled = FALSE
TextBox3.Enabled = FALSE
TextBox4.Enabled = FALSE
TextBox5.Enabled = FALSE
ComboBox1.Enabled = FALSE
ComboBox2.Enabled = FALSE
ValueBox2.Enabled = FALSE
TextBox6.Enabled = FALSE
asiscon = NEW Connection
asiscon.Type = "sqlite"
asiscon.Host = "/home/jousseph/DESARROLLO-JOU/GAMBAS/control_asistencia"
asiscon.Name = "asistencia_asesores"
TRY asiscon.Open()    'Aquí te vuelves a conectar a la base de datos ¿Para qué, entonces la conexión de la segunda línea?
IF ERROR THEN
Message.Error("ERROR AL CONECTAR BASE DE DATOS DEBE SER EL CODIGO MAL COMPILADO.") 'el mensaje es confuso y erróneo. Si falla el open no tiene nada que ver la compilación del código, será que no existe el fichero de la base de datos o los permisos de usuario...
asiscon = NULL
ELSE
asisresul = asiscon.Exec("Select * from asesores")  'Te has conectado y buscas a Todos los asesores....
IF asisresul.Available THEN MostrarCampos             '....y los muestras en el formulario el primero ¿Para qué, y si hay 200?

END IF
END

PUBLIC SUB MostrarCampos()
TextBox6.Text = asisresul["codigo"]
TextBox1.text = asisresul["cedula"]
TextBox2.text = asisresul["nombres"]
TextBox3.text = asisresul["apellidos"]
TextBox4.text = asisresul["direccion"]
TextBox5.text = asisresul["telefono"]
ComboBox1.text = asisresul["sexo"]
ComboBox2.Text = asisresul["programa"]
ValueBox2.Value = asisresul["fecha_ingreso"] 
'aquí te falta el END

PUBLIC SUB Button3_Click() 
asisresul = coneccion.asiscon.Exec("SELECT * FROM asesores") 'primero haces la consulta contra la base de datos y te traes la tabla entera ¿para qué?¿Y si hay 30.000 asesores?
IF asisresul.Available THEN MostrarCampos()  'mostrarcampos muestra los campos del registro actual (el primero) en los controles de pantalla  ¿Para qué quieres todos los demás registros?

IF TextBox8.Text = ""  'si el textbox8.text está vacío no es que no lo haya tecleado es que estaba vacío en la tabla de asiscon, no tiene sentido avisar aquí al usuario porque lo que tiene el campo no es lo que él ha tecleado sino lo que ha grabado en él mostrarcampos
Message.Info("DEBE LLENAR EL CAMPO REQUERIDO ")
ELSE
IF TextBox8.Text = asisresul!codigo THEN
MostrarCampos()   '¿otra vez? Si los acabas de mostrar cuatro líneas más arriba
TextBox6.Text = asisresul["codigo"]  '¿¿otra vez?? Estas líneas y las siguientes hacen lo mismo que mostrarcampos
TextBox1.text = asisresul["cedula"]
TextBox2.text = asisresul["nombres"]
TextBox3.text = asisresul["apellidos"]
TextBox4.text = asisresul["direccion"]
TextBox5.text = asisresul["telefono"]
ComboBox1.text = asisresul["sexo"]
ComboBox2.Text = asisresul["programa"]
ValueBox2.Value = asisresul["fecha_ingreso"]
ENDIF
ENDIF

END

[/code]

Otra cosa: ¿De verdad le sacas al usuario cuatro mensajes de texto de los de pulsar enter cada vez que abre el formulario?¿Nadie te ha intentado asesinar aún?  :mryellow:  :mryellow:  (es broma)
Deberías plantearte primero la lógica del programa, antes de ponerte a codificar.
Otra cosa, deberías indentar tu código, es muchísimo más sencillo de seguir y leer que tal como lo has puesto aquí.
[code linenumbers=false syntax=gambas]
IF TextBox8.Text = "" 
      Message.Info("DEBE LLENAR EL CAMPO REQUERIDO ")
ELSE
       IF TextBox8.Text = asisresul!codigo THEN
           MostrarCampos() 
           TextBox6.Text = asisresul["codigo"] 
           TextBox1.text = asisresul["cedula"]
           TextBox2.text = asisresul["nombres"]
           TextBox3.text = asisresul["apellidos"]
           TextBox4.text = asisresul["direccion"]
           TextBox5.text = asisresul["telefono"]
           ComboBox1.text = asisresul["sexo"]
           ComboBox2.Text = asisresul["programa"]
           ValueBox2.Value = asisresul["fecha_ingreso"]
    ENDIF
ENDIF

END 
[/code]
Queda mucho más claro.
Por otra parte deberías cambiar el nombre de los controles para que signifiquen algo. Las líneas:
[code linenumbers=false syntax=gambas]
IF TextBox8.Text = ""
    Message.Info("DEBE LLENAR EL CAMPO REQUERIDO ")
ELSE 
....
[/code]
No tienen sentido por sí mismas. En cambio si textBox8 es llamado algo así como TBcodigo_asesor, las líneas:
[code linenumbers=false syntax=gambas]
IF TBCodigo_Asesor.Text = ""
    Message.Info("DEBE LLENAR EL CAMPO REQUERIDO ")
ELSE 
....
[/code]
Dicen claramente qué estás comparando....
Hay otros errores de concepto que son más graves por cuanto en ellos te juegas la integridad de tu base de datos: Dejas al usuario la responsabilidad de teclear un número secuencial para identificar el registro... cosa que debería hacer la propia base de datos (campo INTEGER PRIMARY KEY AUTOINCREMENT, revisa las ayudas de SQLite). 
Dejas al usuario el horrible trabajazo de actualizar constantemente el formulario para que se actualizen las fechas y horas... (¿Cuales?), cuando eso lo puede hacer tu programa (control Timer) de forma automática... etc. 
Creo que todos tus fallos vienen de las prisas por ponerse uno a dibujar controles en la pantalla y a teclear código sin un planteamiento serio de lo que quieres que el programa haga. Es mejor perder un poco de tiempo al principio que toooodo el tiempo al final.

Saludos.


