Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-09-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
Se puede acceder a un dbedit a través de su datasource o dataset?

Pues poco más que decir, el asunto lo dice prácticamente todo.

Código:
for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')   then begin
   showmessage('Debe introducir un valor en '+ tabla.Fields   datos].DisplayName);
  exit;
 end;
Este es mi código, recorro todos los fields de la tabla y cuando encuentro alguno que este requerido y no esta escrito pues salto el mensage pero me gustaría que el dbedit que tiene ese campo asociado tomará el focus, de aquí mi pregunta, gracias por vuestra ayuda.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #2  
Antiguo 10-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
prueba con
Código:
for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')   then begin
   showmessage('Debe introducir un valor en '+ tabla.Fields   datos].DisplayName);
 dbgrigd.setfocus;
 dbgrigd.SelectedField:=tabla.Fields[datos];
  exit;
 end;
Responder Con Cita
  #3  
Antiguo 10-09-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola CORBATIN, entiendo de tu pregunta que tus campos están asociados a DBEdit y no a un dbgrid por lo que creo que debes utilizar el for para recorrer las componentes y pasar si dse cumple que la componente es un DBEdit entonces utilizar la propiedad Field de este objeto para saber si el campo es requerido y si esta vacío y entonces aplicar el método SetFocus al dbedit en cuestión antes de salir.
Espero te sirva esta solución cuando la implementes.
Si no me supe explicar me lo dices a ver como me explico mejor.
Saludos
Responder Con Cita
  #4  
Antiguo 10-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
Deberé aprender a leer antes de contestar.
Responder Con Cita
  #5  
Antiguo 11-09-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
Gracias por tú ayuda, pero había elegido este método debido a que es menos pesado recorrer los fields de una tabla o query que todos los componentes de un form, date cuenta que mientras en este ejemplo solo recorro 6 campos, en el form en realidad tiene que recorrer pues unos 20 componentes. No sé si en realidad recorrer todos los componentes de un form es tan pesado para el programa como pienso, pero creo que sería más rápido hacerlo a través de los fields de la tabla.

De todas formas te invito a que sigas aportando alguna otra idea, gracias.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #6  
Antiguo 11-09-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Tienes razón debe demorarse más pero ¿cuanto mas? sobre esto existen criterios variados que andan por el histórico del foro.
Te sugerí esta solución porque no encuentro la manera de asociar el campo al dbedit, en cambio en sentido contrario sí.
Revisaré un poco a ver si encuentro algo pero... no se donde.
Veremos que pasa.
Saludos
Responder Con Cita
  #7  
Antiguo 11-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
Una solución mixta puede ser llenar una lista de componentes asociados a los campos del dataset

Código:
//Definimos las variables y las funciones
 private
   Lista:TstringList;
   procedure CanvioFoco(NombreCampo:string);

//llenamos la lista con los objetos y los nombre del campo
//si hay diferentes dataset con nombres de campo igual se deberá cambiar un poco el código
procedure TForm1.FormCreate(Sender: TObject);
Var
 i:integer;
begin
 Lista:=TstringList.Create;
 For i:=0 to ComponentCount-1 do
  if Components[i] is TDbEdit then
   Lista.AddObject(TDbEdit(Components[i]).DataField,Components[i]);
end;

//en el código original añadimos tan solo una línea
for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')   then begin
   showmessage('Debe introducir un valor en '+ tabla.Fields   datos].DisplayName);
//cambiamos el foco
   TDbEdit(Lista.Objects[Lista.IndexOf(tabla.Fields[datos].FieldName)]).setfocus;
exit;
 end;

//liberamos la lista al cerrar
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Lista.Free;
end;
si el código no es correcto ahora me tocará aprender a escribir
Responder Con Cita
  #8  
Antiguo 11-09-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola Julià T., CORBATIN está evitanto los bucles y ahora le propones dos. Creo que con uno solo se logra, por supuesto recorriendo las componentes.
Bueno en un final el que decide es CORBATIN
Saludos
Responder Con Cita
  #9  
Antiguo 11-09-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
Muchisimas gracias Julia es una solución muy buena pero al final he octado por la opción de de Ruben, es casi la misma que la tuya pero a diferencia no hace falta crear esa lista para introducir los dbedits que encuentra sino que directamente hace referencia a ellos, al final el código ha quedado así:

Código:
procedure TForm1.aceptar;
var
componente: integer;
Data:Tdataset;
begin
Data := nil;
for componente := 0 to ComponentCount - 1 do begin
 if Components[componente] is TDBedit then begin
  Data := (Components[componente] as TDBedit).DataSource.DataSet;
  if ( Data.Fields[componente].Required) and (Data.Fields[componente].Text = '') then begin
   showmessage('Debe introducir un valor en el campo '+ Data.Fields[componente].DisplayName);
   (Components[componente] as TDBedit).setfocus;
   Exit;
  end;
 end;
end;
Data.post;
Data.Free;
end;
Una última pregunta, es necesario hacer el free de la variable creada del tipo Dataset?

De nuevo gracias a los dos que habeis dado vuestras soluciones a este problemilla que había planteado, saludos.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #10  
Antiguo 11-09-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Que tal.

No he seguido todo el hilo... pero he visto que la respuesta mas óptima no esta dada... y es que el TField tiene un método llamado FocusControl que hace precisamente lo que preguntabas al inicio, de manera que podes hacer un

Código:
for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')   then 
  begin
   showmessage('Debe introducir un valor en '+ tabla.Fields   datos].DisplayName);
  Tabla.Fields[Datos].FocusControl;
  exit;
 end;
La ventaja de llamar a este método, es que hara que el control asociado al Field tome el foco independientemente de si se trata de un Grid, un DBEdit, un DBLookupCombo, etc.

Por demás... creo que tu verificación no es necesaria, pues al intentar hacer un post, el mismo TDataSet hace algo similar para verificar los campos required.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 11-09-2003 a las 09:06:14.
Responder Con Cita
  #11  
Antiguo 11-09-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
Esto es lo que yo buscaba, es la solución ideal pero que no había conseguido dar con ella.

Con respecto al último comentario que haces, decirte que tienes toda la razón, pero ese aviso que da el dataset por sí solo es en inglés y no deja el foco sobre el campo que esta sin rellenar, de estar forma el error es controlado por mí y le doy el foco al control que esta sin meter datos.

Gracias de nuevo a todos por vuestra colaboración, mi duda ha quedado solucionada, saludos.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #12  
Antiguo 11-09-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola a todos, sin duda la solución de jachguate, es la ideal, ese es el método que no vimos. Por acá decimos que se puede mirar y mirar pero no ver.
Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:23:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi