Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Validar con un DBEDit (https://www.clubdelphi.com/foros/showthread.php?t=77965)

servicomp 09-03-2012 04:02:12

Validar con un DBEDit
 
Cordial saludo compañeros

estoy pasando mi antiguo programa, que tenia en delphi y paradox, y pasarlo a delphi 2010, usando firebird e IBX como conección.

Estoy usando una tabla pequeña donde hago las pruebas la cual la he creado asi

Código SQL [-]
CREATE TABLE USUARIO (
    CODIGO    CHAR(12) NOT NULL,
    NOMBRE    CHAR(30),
    APELLIDO  CHAR(30),
    CIUDAD    CHAR(20),
    TELEFONO  CHAR(12)
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE USUARIO ADD CONSTRAINT PK_USUARIO PRIMARY KEY (CODIGO);

En el IBDataset en la opción InsertSQL tenemos

Código SQL [-]
INSERT INTO USUARIO
(CODIGO, NOMBRE, APELLIDO, CIUDAD, TELEFONO)
VALUES
(:CODIGO, :NOMBRE, :APELLIDO, :CIUDAD, :TELEFONO)

Para capturar la información estamos usando unos DBEdit y un navegador. Todo funciona muy bien, pero lo que necesito es como poder capturar la información antes de escribir el DBEdit el campo en la tabla, para poder verificarla y que solo este un codigo en la tabla.

Esta opción la podemos hacer con un Edit, pero deseamos hacerlo con un DBEdit, para que el codigo haga el trabajo. Lo hemos tratado de hacer, usando los eventos OnChange y OnDataChange, y no fue posible hacerlo. De no ser posible, cual es la mejor forma de hacerlo.

Agradeciendo de antemano su colaboración

duilioisola 09-03-2012 08:45:51

La mejor opción:
En los componentes de base de datos seguramente tienes un evento BeforePost. Es este evento deberías poner tu código de validación o buscar el número que le asignarás.
Por ejemplo, en mis programas hago algo parecido a esto:
Código Delphi [-]
OnBeforePost(DataSet)
begin
   // Asigno MAX(CODIGO)+1
   if (DataSet.State = dsInsert) then
   begin
      DataSet.FieldByName('CODIGO').AsInteger := BuscaMaxCodigo + 1;
   end;
end;

Un caso real de clientes en mi aplicación:
Código Delphi [-]
procedure TDMClientes.QMClientesNewRecord(DataSet: TDataSet);
var
  ...
begin
  QMClientesEMPRESA.AsInteger := Entorno.Empresa;
  QMClientesEJERCICIO.AsInteger := Entorno.Ejercicio;
  QMClientesCANAL.AsInteger := Entorno.Canal;
  QMClientesCLIENTE.AsInteger := 0;
  ...

procedure TDMClientes.QMClientesBeforePost(DataSet: TDataSet);
var
  ...
begin
  // Si esta en modo insercion y no le ha asignado a mano un nro de cliente
  if ((DataSet.State = dsInsert) and (QMClientesCLIENTE.AsInteger = 0)) then
     QMClientesCLIENTE.AsInteger := DMMain.Contador_E('CLI');
  ...

servicomp 09-03-2012 21:54:15

Cordial saludo

Primero que todo mis mas sinceros agradeciemientos por tu respuesta, la he tenido encuenta, pero voy a exponer un poco más la necesidad.

Tenemos el DBEdit, donde capturamos el codigo, lo que necesitamos es que al momento que el usuario salga del DBEdit o Pulse la Tecla Enter, Se tome el dato digitado por el usuario, y se lleva a un Query se verifica si el codigo existe y luego se decide que se hara.

Como se puede observa necesitamos validar la información antes que se grabe en el campo del registro la información, para que no cree el error.

Espero haber explicado correctamente el problema

y Agradezco de antemano la atención prestada

guillotmarc 09-03-2012 22:01:53

El evento OnChange del campo persistente parece el lugar más adecuado donde anclar esa comprobación.

Saludos.

marcoszorrilla 09-03-2012 22:06:04

Yo al evento OnChange le veo un problema y es que se lanza por cada caracter que escribes, me parece mejor en el evento OnExit del control.

Un Saludo.

Caral 09-03-2012 22:17:36

Hola
Yo no usaría un DBEdit, si no un sencillo Edit.
Con esto lo que se escriba no tendrá relevancia hasta que se decida que hacer con el dato.
Saludos

servicomp 09-03-2012 22:36:59

Con un sencillo Edit, lo tenemos funcionando en el momento, pero queremos llevar la evolución, a usar un DbEdit mi querido amigo.

Para el evento OnExit, lo que sucede es que primero me escribe la información del Campo en la tabla, y luego me dispara el evento, lo que no serviria para el proposito, pues el problema que se presentaría es que saldria un error de SQL.

De antemano les agradezco la atención y sus respuestas, pero sigue el hilo, ya que no he podido resolver el problema.

Caral 09-03-2012 22:42:48

Hola
Me voy por la opción de duilioisola, es la lógica.
Si la tabla esta en modo insert o edit busca el dato por medio del query si lo encuentra entonces envía el mensaje y no graba nada.
Sigo pensando que la mejor opción por seguridad es el edit ya que no esta directamente ligado a la tabla, si lo tienen así no lo modificaría.
Saludos

ecfisa 09-03-2012 23:21:56

Hola.

Estoy de acuerdo con mi amigo Caral que con un TEdit se simplifica el tema. Pero si aún deseas hacerlo con un TDBEdit, creo que el evento indicado para evaluar la existencia (o no) es OnSetText del campo en cuestión.
El evento OnSetText se dispara cuando un valor es asignado a la propiedad Text del TField, pero antes de ser almacenado.

Entonces:
Código Delphi [-]
...
procedure TForm1.DataSetCpoSetText(Sender: TField; const Text: String);
begin
  with TuQuery do
  begin
    Close;
    SQL.Text:= 'SELECT TU_CAMPO FROM TU_TABLA WHERE TU_CAMPO = :DATO';
    ParamByName('DATO').AsString:= Text;  // (o convertir acorde al tipo)
    Open;
    if IsEmpty then
      raise Exception.Create('Dato inexistente');
    Close;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSet.FieldByName('TU_CAMPO').OnSetText:= DataSetCpoSetText;
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DataSet.FieldByName('TU_CAMPO').OnSetText:= nil;
end;
En el código superior asigno el evento en tiempo de ejecución para dar mayor claridad, pero si tenes creado el campo persistente lo podés hacer desde el Object Inspector.

Saludos.

servicomp 09-03-2012 23:27:27

Bueno creo que lo mejor es evolucionar a una solución dual, usar DBEdit y Edit, y seguir buscando una solución para el DbEdit, ya que no ha sido poco lo que he buscado en el foro, y como todo, alguna solución debe de tener, depronto no la he sabido buscar.

servicomp 09-03-2012 23:30:05

Gracias EcFisa, lo ensayo de inmediato y si algo publicaremos aqui el codigo para que nuestro amigo Caral lo incorpore a su foro. Te comento luego como me va con esta propuesta.

Caral 10-03-2012 00:53:38

Hola
Cita:

Empezado por servicomp (Mensaje 427286)
Gracias EcFisa, lo ensayo de inmediato y si algo publicaremos aqui el codigo para que nuestro amigo Caral lo incorpore a su foro. Te comento luego como me va con esta propuesta.

No entiendo a que te refieres con esto ?.
Saludos

Delphius 10-03-2012 15:17:24

Cita:

Empezado por servicomp (Mensaje 427286)
y si algo publicaremos aqui el codigo para que nuestro amigo Caral lo incorpore a su foro

¿En serio?
¡Cuál es el foro de Caral, que no lo conozco!

Hey, Caral que no me contaste que tenes foro propio... esa no me la sabía.

Fuera sarcamos, para tu información no hay inconvenientes en que ambos foros compartan enlaces y material. De hecho en algunas ocasiones desde ambos lados se ha remitido al otro. Y si Caral decide compartir lo que tiene y sabe en ambos sitios ¿Cuál es el problema? Aquí puede consultar sus ejemplos de facturación como así también el propio en DA, por ejemplo. Caral está en la libertad de compartir con quien se le raje la gana lo que el publique.
Y que yo sepa, nadie pero nadie, es dueño del código que se ponga en cualquier foro. Ha... y eso no es plagio. Plagio sería si uno se autonombrara autor; algo que Caral no ha hecho, y estoy seguro que nunca hará. Es más, siempre que ha sido necesario agradeció y/o citó a quien le proporcionó ayuda y le enseñó.

Si está al alcance del público ¿cuál es el problema? Para algo está el foro, favorecer a la comunidad en general y no para únicamente y en particular a quien pregunta y hay que responderte en secreto. Leete la guía de estilo.

Saludos,

Caral 10-03-2012 16:23:54

Hola
Aveces las palabras se mal interpretan, suele pasar.
Lo mejor es esperar para ver que es lo que quiso decir el amigo servicomp, tal vez fue un simple comentario.
Saludos

guillotmarc 10-03-2012 19:25:57

Hola Marcos.

Cita:

Empezado por marcoszorrilla (Mensaje 427273)
Yo al evento OnChange le veo un problema y es que se lanza por cada caracter que escribes, me parece mejor en el evento OnExit del control.

Un Saludo.

No debería. El OnChange del TEdit sí que se dispara por cada carácter escrito, pero el OnChange del campo persistente solo debería dispararse cuando el TEDit termina la modificación y la traslada al Dataset (por ejemplo, al moverte a otro control).

Saludos.

servicomp 10-03-2012 23:15:10

Solicito mil disculpas a todos ustedes y muy especialmente al señor caral, por el comentario que escribí sobre el foro suyo, en realidad lo que había querido decir es sobre el tutorial que esta realizando, y que se ha publicado por este medio, se que muchos de los compañeros lo están leyendo y siguiendo.

Por ultimo espero que las disculpas sean aceptadas, y continuar adelante en el aprendizaje.

Caral 10-03-2012 23:29:43

Hola
Gracias por la aclaración, con eso es suficiente, no hace falta disculparse, fue un mal entendido.
En lo que pueda ayudarte y este a mi alcance, con gusto.
Saludos

marcoszorrilla 11-03-2012 11:28:29

Tienes razón Marc, en el OnChange del campo persistente, no en el control de pantalla que lo muestra, pues este último se lanza por cada carácter tecleado o eliminado.

Un Saludo.

StartKill 27-03-2012 07:57:49

Duda:

Cita:

Escrito por: servicomp
Solicito mil disculpas a todos ustedes y muy especialmente al señor caral, por el comentario que escribí sobre el foro suyo, en realidad lo que había querido decir es sobre el tutorial que esta realizando, y que se ha publicado por este medio, se que muchos de los compañeros lo están leyendo y siguiendo.
Donde puedo encontrar el tutorial?? :confused:


Your Friend

StartKill
Lima-Perú
//-------------

ecfisa 27-03-2012 18:15:29

Cita:

Empezado por StartKill (Mensaje 428547)
Duda:
Donde puedo encontrar el tutorial?? :confused:

Your Friend

StartKill
Lima-Perú
//-------------

Hola StartKill.

Está en los primeros hilos del foro Firebird e Interbase: Tutorial (como empezar con Firebird) Novatos.

Un saludo. :)


La franja horaria es GMT +2. Ahora son las 19:57:24.

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