Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Validar contenido campo para que no se repita (https://www.clubdelphi.com/foros/showthread.php?t=77547)

fwhite 06-02-2012 18:00:48

Validar contenido campo para que no se repita
 
Hola amigos:
Estoy haciendo una aplicación y quiero validar el contenido de un campo en Paradox para que, si se repite, me envíe un mensaje y no ejecute el insert.
Además de la BD principal utilizo otra auxiliar, sobre la cual ejecuto un LOCATE, para saber si el contenido del campo ya existe.
Todo me lo hace bien, me localiza un registro que va a estgar duplicado, me envía el mensaje, me anula el registro que estoy introduciendo, pero me duplica el registro que localicé en la BD auxiliar.
El codigo es el siguiente:

Código Delphi [-]
 
procedure TdmSocios.tbSociosBeforePost(DataSet: TDataSet);
var
  vNumSoc: Integer;
begin
// Validamos el número de Socio
  vNumSoc := tbSocios.FieldValues['Id_Socio'];
  if tbValidaNumSoc.Locate('Id_Socio', vNumSoc, []) then
    if tbSocios.State in [dsInsert] then
      begin
        MessageDlg('O número de socio ' + IntToStr(vNumSoc) + ' xa está adxudicado.'
        + #13 + #13 + 'Revisa os datos e fai as correccións oportunas',
        mtConfirmation, [mbCancel], 0);
        tbSocios.Delete;
      end;
end;

Decirme que es lo que estoy haciendo mal. Graciñas.

Caro 06-02-2012 19:33:02

Hola fwhite, para cancelar el Insert puedes utilizar el procedimiento Abort y el Delete estaría demas.

Código Delphi [-]
procedure TdmSocios.tbSociosBeforePost(DataSet: TDataSet);
var
  vNumSoc: Integer;
begin
// Validamos el número de Socio
 vNumSoc := tbSocios.FieldValues['Id_Socio'];

 if tbValidaNumSoc.Locate('Id_Socio', vNumSoc, []) then

   if tbSocios.State in [dsInsert] then
    begin
      if MessageDlg('O número de socio ' + IntToStr(vNumSoc) + ' xa está adxudicado.' 
       + #13 + #13 + 'Revisa os datos e fai as correccións oportunas', mtConfirmation, [mbCancel], 0)=mrCancel then
         Abort;
     end;

Saluditos

Neftali [Germán.Estévez] 07-02-2012 12:00:56

¿Puedes crear un índice único en la tabla usando Paradox?
Si es así, eso te evitará problemas, y aumentará la eficiencia, pues te evitará tener que hacer el LOCATE.

fwhite 07-02-2012 12:39:56

Validar contenido campo para que no se repita
 
Hola a todos:
Caro, el Abort me resuelve el problema. Yo creo que la lo había intentado, pero bueno, problema resuelto. Graciñas.
Neftali, la utilización del índice único es el mejor sistema a utilizar, pero el programa lo estoy haciendo para una pequeña sociedad de mi pueblo que ya tiene 50 años de vida y, de momento el campo Número de Socio se va a introducir manualmente, primero los Socios en activo y, poco a poco, se irán introduciendo los Socios que fueron baja, con la intención de mantener el historial de la Sociedad. Graciñas por tu respuesta.
Un saludo a todos.

jafera 07-02-2012 13:15:20

Otra solución con los números de socio es que le pongas otro indice que se llame clave por ejemplo.

Este numero clave es invariable y el numero de socio puede variar si hay bajas, por ejemplo si el socio numero 1 se da de baja, el 2 pasa a ocupar el 1 pero la clave puede ser 2035, clave que no variara nunca a efectos históricos.

Evidentemente que esta clave será un campo unico, auto aumentado con cada alta, si la misma base de datos te controla este Unike key ahorrarás tiempo y problemas.

Se marca un campo con activo si/no o que al poner fecha de baja se llene automaticamente.

Saludos

Josep

Neftali [Germán.Estévez] 07-02-2012 17:14:51

Cita:

Empezado por fwhite (Mensaje 424398)
Neftali, la utilización del índice único es el mejor sistema a utilizar, pero el programa lo estoy haciendo para una pequeña sociedad de mi pueblo que ya tiene 50 años de vida y, de momento el campo Número de Socio se va a introducir manualmente, primero los Socios en activo y, poco a poco, se irán introduciendo los Socios que fueron baja, con la intención de mantener el historial de la Sociedad. Graciñas por tu respuesta.

Bueno, creo que lo uno no invalida lo otro, simplemente que el índice único pasa el control de los duplicados a la base de datos, en lugar de hacerlo tú. No cambia el sistema de introducir los datos.


La franja horaria es GMT +2. Ahora son las 08:28:20.

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