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 05-06-2004
carlosmoralesm carlosmoralesm is offline
Miembro
 
Registrado: feb 2004
Posts: 94
Poder: 21
carlosmoralesm Va por buen camino
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

Última edición por roman fecha: 05-06-2004 a las 04:40:16. Razón: formato de código
Responder Con Cita
  #2  
Antiguo 05-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 05-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 05-06-2004
Avatar de cbrrr
cbrrr cbrrr is offline
Miembro
 
Registrado: jun 2004
Posts: 57
Poder: 20
cbrrr Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 05-06-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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.
Responder Con Cita
  #6  
Antiguo 05-06-2004
Avatar de cbrrr
cbrrr cbrrr is offline
Miembro
 
Registrado: jun 2004
Posts: 57
Poder: 20
cbrrr Va por buen camino
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
__________________
Si no tienes algo que decir más importante que el silencio, cállate

Última edición por cbrrr fecha: 05-06-2004 a las 09:31:59.
Responder Con Cita
  #7  
Antiguo 05-06-2004
carlosmoralesm carlosmoralesm is offline
Miembro
 
Registrado: feb 2004
Posts: 94
Poder: 21
carlosmoralesm Va por buen camino
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

Última edición por carlosmoralesm fecha: 05-06-2004 a las 22:21:20. Razón: agregar codigo
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 20:07:56.


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