Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   como evitar que se dupiquen las llaves primarias de una abla en c++ builder (https://www.clubdelphi.com/foros/showthread.php?t=58548)

airam 23-07-2008 17:19:49

como evitar que se dupiquen las llaves primarias de una abla en c++ builder
 
Hago uso deeste foro para escribir una duda que tengo y que ojala lguien pudiera ayudarme....
Bueno estoy manejando una tabla en bd en c++ builder con el componente Table, y lo que quisiera saber es como evito que a la hora de insertar nuevos datos en la tabla, el id q es la llave primaria no se duplique, o q no me interrumpa la ejecucion, si no que me permita mosrar un mensaje y que me permita cancelar todo o volver al pedir el id nuevo, ojala me hayan entendido.
alguien que pueedar ayudarme porfavor:) ,y muchas gracias de antemano.

coso 23-07-2008 17:25:48

Hola, lo suyo seria tratar de coger la excepcion por id repetido

Código Delphi [-]
var
        fet : boolean;
        id : integer;
begin
       fet := false;
       while not fet do
       begin
                 id := strtoint(Edit1.Text); 
                 try 
                    Tabla.Append;
                    Tabla.FieldValues['id'] := id;
                    ...
                    Tabla.Post; 
                    fet := true;
                except  
                    ShowMessage('identificador repetido');
                    Edit1.SelectAll;
                    Edit1.SetFocus;
               end;       
       end;
end;

algo asi. igualmente este tema esta bastante tratado. si usas el buscador del foro seguramente encontraras otros mensajes

coso 23-07-2008 17:28:20

otra manera es crearlos aleatoriamente

Código Delphi [-]
tabla.Filtered := false;

id := random(99999999999)
while tabla.locate('id',id,[]) do id := random(9999999999999);

tabla.Append;
...

o secuencialmente

Código Delphi [-]

tabla.Filtered := false;
tabla.IndexFieldNames := 'id';
tabla.Last;
id := tabla.FieldByName('id').Asinteger + 1;
...

o usar los tipos autoincrementables en el diseño de la tabla

airam 23-07-2008 17:47:47

checando las respuestas
 
hola que tal gracias por haber leido mi mensaje y aportarme una idea, lo checare y reportare mi resultado, gracias por tu ayuda y por tu tiempo

coso 23-07-2008 17:49:33

de nada ... dios me lo pague :D

airam 23-07-2008 17:50:28

sigo con lo mismo
 
oyes, disculpa por la molestia, pero me lo podrias explicar un poquito mas con el codigo de c++ builder, ya q no me se bien la sintaxis, por favor.:)

coso 23-07-2008 17:56:58

perdona que lo escribi en delphi.

Código:

void Append()
{
        bool fet = false;
        int  id;

        while !fet
        {
          id = strtoint(Edit1->Text);
          try
              Tabla->Append;
              Tabla->FieldValues['id'] = id;
              ...
              Tabla->Post;
              fet = true;
          catch
          {
              ShowMessage("identificador repetido");
              Edit1->SelectAll;
              Edit1->SetFocus;
          }
      }
}

algo asi...lo importante es que pilles la idea :)

airam 23-07-2008 19:16:27

gracias por tu ayuda, me distes una idea, pero mira en el trabajo q estoy realizando, la idea es esta:
tengo un boton la cual es para insertar, ahi le doy el codigo de insertar, y en otro boton el de guardar.bueno pues mi idea es q a la hora de darle en el botonguardar realice la condicion de q no se puede repetir la llave primaria si es q se repite y si no q guarde los datos q haya insertado.
No se si me entiendas bien, ojala y puedas ayudarme, te lo agradezco mil veces.

airam 23-07-2008 19:21:37

gracias por tu ayuda, me distes una idea, pero mira en el trabajo q estoy realizando, la idea es esta:
tengo un boton la cual es para insertar, ahi le doy el codigo de insertar, y en otro boton el de guardar.bueno pues mi idea es q a la hora de darle en el botonguardar realice la condicion de q no se puede repetir la llave primaria si es q se repite y si no q guarde los datos q haya insertado.
No se si me entiendas bien, ojala y puedas ayudarme, te lo agradezco mil veces.

egostar 23-07-2008 19:57:05

Cita:

Empezado por airam (Mensaje 302736)
gracias por tu ayuda, me distes una idea, pero mira en el trabajo q estoy realizando, la idea es esta:
tengo un boton la cual es para insertar, ahi le doy el codigo de insertar, y en otro boton el de guardar.bueno pues mi idea es q a la hora de darle en el botonguardar realice la condicion de q no se puede repetir la llave primaria si es q se repite y si no q guarde los datos q haya insertado.
No se si me entiendas bien, ojala y puedas ayudarme, te lo agradezco mil veces.

A ver, si es una llave primaria, no puede repetirse, la propia base de datos te invalida ese insert, o me equivoco?

El ejemplo que te ha puesto nuestro amigo coso hace precisamen te eso.... no entiendo cual es el problema que tienes.

Salud OS

coso 23-07-2008 21:14:19

si, airam, solo deberias adaptar el codigo. Te quedaria algo asi, mas o menos
(no te fies de mi sintaxis de C++)

Código:


void TForm1::Button1Click(TObject Sender)
{
              // id es la id que tu quieres mirar si esta repetida
              if Repetida(id) ShowMessage("Repetida")
              else Guardar(id);
}

boolean TForm1::Repetida(integer id)
{
            Tabla->Filtered = false;
            return (Tabla->Locate('id',id,[]));
}


void TForm1::Guardar(integer id)
{
            Tabla->Append;
            Tabla->FieldValues["id"] = id;
            ...
            Tabla->Post;
}

espero haberte aclarado algo mas ; ) mil de nadas

airam 24-07-2008 01:28:46

ok, amigo coso, ya lo estuve checando y ya mas o menos va quedando, solo es cuention de entenderle mas, y bueno mil gracias por tu itempo dedicado a mi duda, me diste una gran idea amigo, bueno ya tengo mas dudas se los pedire de favor una gran ayuda....

Saludos y gracias.


La franja horaria es GMT +2. Ahora son las 20:38:29.

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