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)
-   -   Algo interesante Evitar el mismo nombre en un registro (https://www.clubdelphi.com/foros/showthread.php?t=11095)

carlosmoralesm 05-06-2004 03:04:24

Algo interesante Evitar el mismo nombre de un registro
 
estoy haciendo una pantalla de actualizacion de dispositivos tipo ABC

pero cuando edito un registro no puede tener el mismo nombre de dispositivo que otro entonces cuando doy de alta checo que el record count no sea mayor que 0 pero cuando edito uno existente y repito el nombre aproposito antes de guardarlo ya se que hay uno como puedo hacer para que no se incluya el mismo en caso de que la condicion diga que es >1


Código Delphi [-]
procedure TPropdis.Valida(Sender: TObject);
begin
  tabled.Filter:='Nombre = ' + quotedstr(ednom.Text);
  tabled.Filtered:=true;
  tabled.RecordCount;
  if ednom.Text = '' then
  begin
    showmessage('Tiene que escribir un Nombre Nuevo de dispositivo');
    customform.Formcustom.wwTableD.CancelUpdates;
    ednom.SetFocus;
  end;
  if n=True then
  begin
    if tabled.RecordCount >0 then
      showmessage('ya existe un dispositivo con este nombre');
    customform.Formcustom.wwTableD.CancelUpdates;
    tabled.Filtered:=False;
    edNom.SetFocus;
  end;
  if n=False then
  begin
    if tabled.RecordCount > 1 then
      showmessage('ya existe un dispositivo con este nombre');
    tabled.Filtered:=False;
    edNom.SetFocus;
  end;

Gracias de Antemano

roman 05-06-2004 05:16:23

Creo que estás optando por un método demasiado rebuscado. Si requieres que el nombre de dispositivo no se repita puedes simplemente establecer un índice único (índice sin duplicados) sobre dicho campo y manejar el evento OnPostError:

Código Delphi [-]
procedure TForm1.Table1PostError(
  DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction
);
begin
  ShowMessage('ya existe un dispositivo con este nombre');
  Action := daAbort;
end;

Este evento se disparará si se repite el nombre de dispositivo tanto si es por una inserción como por una edición.

Únicamente tendrías que fijarte en el evento si el error realmente se debe a eso o bien a otra cosa.

// Saludos

roman 05-06-2004 05:35:47

Cita:

Empezado por roman
Únicamente tendrías que fijarte en el evento si el error realmente se debe a eso o bien a otra cosa.

Creo que esto no es muy claro.

El evento OnPostError puede generarse por varias razones; una de ellas es la repetición de un campo con índice único, pero puede haber otras, por ejemplo, que no se proporcione valor para un campo requerido. En general, el evento se puede generar por cualquier cosa que contravenga a las restricciones impuestas en la estructura de la tabla.

Por ello es que debes determinar qué tipo de error es el que generó el evento y actuar de acuerdo a ello.

Para determinar el error debes hacer uso del parámetro E del evento. Este parámetro es un objeto excepción. Qué clase de objeto sea dependerá de la forma en que accedas a la base de datos. En tu caso, dado que accedes por medio del BDE, E será de clase EDBEngineError por lo que debes hacer un moldeo de tipos y usar la propiedad Error del objeto para determinar el tipo de error. Un ejemplo sencillo:

Código Delphi [-]
procedure TForm1.Table1PostError(
  DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction
);
begin
  if E is EDBEngineError then
    case EDBEngineError(E).Errors[0].ErrorCode of
      eKeyViol:
      begin
        ShowMessage('ya existe un dispositivo con este nombre');
        Action := daAbort;
      end;

      eRequiredFieldMissing:
      begin
        ShowMessage('falta el valor de un campo requerido');
        Action := daAbort;
      end;
    end;
end;

Si el error que genera el evento no es ninguno de los especificados entonces el parámetro Action seguirá con su valor por defecto que es daFail que ocasionará que aparezca el mensaje por defecto para ese error.

Las constantes eKeyViol, eRequiredFieldMissing tienes que definirlas tú. Puedes consultar este hilo para más detalles de esto último.

// Saludos

cbrrr 05-06-2004 08:13:41

Hola a todos

Cita:

Empezado por roman
Las constantes eKeyViol, eRequiredFieldMissing tienes que definirlas tú. Puedes consultar este hilo para más detalles de esto último.

De hecho no es necesario definir estas constantes ya que las tienes todas definidas en la unit BDE. La lástima es que no hay los fuentes de la misma para verlas, pero con el codi insght y poniendo DBIERR_ podrás verlas todas

En concreto, la de clave duplicada sería DBIERR_KEYVIOL

Espero que te seriva

roman 05-06-2004 08:37:02

Cita:

Empezado por cbrrr
De hecho no es necesario definir estas constantes ya que las tienes todas definidas en la unit BDE.

Vaya que tienes mucha razón. Y recuerdo que en versiones anteriores de Delphi, si bien bde.pas no se proporcionaba, sí venía un archivo bde.int que contenía la parte de interface de bde.pas pero al menos en la versión 7 ya no encuentro ese archivo. :(

Gracias por la info.

cbrrr 05-06-2004 09:29:39

Cita:

Empezado por roman
Vaya que tienes mucha razón. Y recuerdo que en versiones anteriores de Delphi, si bien bde.pas no se proporcionaba, sí venía un archivo bde.int que contenía la parte de interface de bde.pas pero al menos en la versión 7 ya no encuentro ese archivo. :(

Gracias por la info.

Correcto, el bde.int se proporciona hasta la versión 6 de Delphi. Si trabaja con esa versión (o una inferior) puede verlas todas allí

Este archivo lo tenéis en la carpeta ..\Borland\DelphiX\Doc donde DelphiX es la versión de Delphi no superior a la 6

carlosmoralesm 05-06-2004 22:14:31

Tienes Razon Roman te agradezco el consejo ya lo arregle con un try y exception y con eso me quite el problema ya que si lo etaba haciendo de una forma rebuscada y mal analizada


Try
customform.Formcustom.wwTableD.ApplyUpdates;
customform.Formcustom.wwTableD.Refresh;
Except
customform.Formcustom.wwTableD.CancelUpdates;
customform.Formcustom.wwTableD.RevertRecord;
//showmessage('ya existe un dispositivo con este nombre');
Abort;


End;


Gracias A todos


La franja horaria es GMT +2. Ahora son las 13:03:51.

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