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)
-   -   obtener la clave del dato grabado? (https://www.clubdelphi.com/foros/showthread.php?t=9998)

maruenda 07-05-2004 17:54:50

obtener la clave del dato grabado?
 
hola. bueno, os cuento mi ultimo problema ( informatico, porque si fuera con las mujeres, no acabaria )
quiero insertar en una tabla, desde 2 maquinas. La tabla tiene el campo clave autonumerico, asi que cuando inserto un registro, me asigna el valor.
Para insertar uso tquerys, en lugar de ttables. Cuando tengo todos losdatos en el form, grabo con el tquery. bien. Lo que ocurre es que cuando he grabado, no se el valor del campo clave( numero cliente) del registro que he grabado. Lo que quiero es que una vez grabado, me salga un mensaje en pantalla que diga " ha insertado el cliente numero ....". He pensado en hacer unaconsulta una vez grabado el registro, y que me muestre el ultimo registro grabado. Pero puede darse el caso de que en el intervalo de tiempo entre mi post y la consulta, alguien inserte un cliente, con lo que el dato que me devuelve la consulta, no es correcto. Gracias a tod@s por la atencion, y por las sugerencias. :confused:

javiermorales 07-05-2004 19:32:42

Puedes incluir un campo que manejes tú de manera independiente desde delphi, por ejemplo el numero de máquina, la IP, o la descripción del equipo. Con ese dato, que guardas en un campo de la tabla, que no muestras al usuario, ya que lo rellenas tú cada vez que guardas un nuevo registro, podrías hacer una consulta que te devolviera el último registro insertado por el campo que tú manejas.

Espero que te sirva. Un saludo

delphi.com.ar 07-05-2004 20:40:03

¿Qué motor utilizas?

maruenda 07-05-2004 22:51:58

voy a usar paradox. de todas formas la solucion de incluir un campo, me parece buena. Hay algun numero que identifique de manera unica a cada maquina? y si es asi, como obtenerlo? gracias :rolleyes:

Mick 08-05-2004 00:01:06

El metodo descrito no es seguro, se podrian estar ejecutando a la vez dos programas en un mismo equipo.
Ademas obliga a añadir un campo mas en la tabla, con lo cual esta ocupara mas de lo necesario.
El problema que tienes es una de las razones (hay mas, algunas mucho mas problematicas) por las que en general, se desaconseja el uso de campos autoincrementados.
Mejor usa una tabla de contadores, o busca en la tabla el ultimo cliente y sumale uno.
Otras razon para no usar los autoincrementados de paradox:
No puedes controlar los valores, si accidentalmente se borra un cliente, no podras volverlo a dar de alta con el mismo codigo.

Saludos

sanxpue 08-05-2004 00:31:42

viendo que..
 
Viendo que lo quieres hacer con paradox (hay veces que nos deja paradox jejeje), entonces usa ls propiedad exclusive de TTable..

pero aguas aguas... tienes que atraparla con una excepcion...

Código:

Procedure MeteDato...
Var
  UnBoolean : Boolean;
Begin
  UnBoolean := True;
  Table1.Active := False; //x si esta activo
  While UnBoolean Do
  Begin       
    Try
      Table1.Exclusive := True;
      Table1.Active := True;
      Metes_los_datos;
      //despues de meter los datos
      Me_Voy_al_Final_de_la_Tabla;// y saco el numero incrementable
      //pero no te vayas a colgar ahi por que pueden que otros esten
      //esperando para meter los datos
      Table1.Exclusive := False;
      Table1.Active := False;
      UnBoolean := False;
    Except
      //aqui puedes escribirle a una etiqueta algo
      label1.Caption := 'Espere todavia no se ha metido';
    End;
  End;
  //Aqui es donde debes de mostrar el numero que sacaste
  label1.Caption := 'Esperando nuevo Dato';
End;

Otra.. si vas usar exclusive fijate que no este abierto tu dbDesktop o lo que vayas a usar para generar tus tablitas... por que si estan abiertas.. puede que te metas en un infiernito y no sepas por que... je

Por eso ya lo dijo el Santo Papa : ¡¡¡Paradox¡¡¡ que no hay otra cosa je :p

SyncMaster 11-05-2004 06:07:50

Tengo ese mismo problema sobre FireBird 1.5...actualmente uso la clase TIBTable relacionada con una tabla X de la base de datos...me baso en el siguiente truco

Código:

With TABLA Do
Begin
Append;
FieldByName('CAMPO').AsString:='BLA BLA';
Post;
// Asi obtengo el numero
Active:=False;
Active:=True;
Last;
Numero:=FieldByName('NUM').AsInteger;
End;

Funciona sin problemas....PERO tiene el inconveniente que indica Maruenda :

Cita:

Pero puede darse el caso de que en el intervalo de tiempo entre mi post y la consulta, alguien inserte un cliente, con lo que el dato que me devuelve la consulta, no es correcto.
¿Alguna sugerencia?

Saludos


La franja horaria es GMT +2. Ahora son las 02:53:15.

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