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)
-   -   ¿Como leer el registro recien incluido? (https://www.clubdelphi.com/foros/showthread.php?t=12859)

sitrico 29-07-2004 16:41:46

¿Como leer el registro recien incluido?
 
Buenas, necesito saber como leer el registro que acabo de de agregar a la tabla (uso un query con in INSERT INTO).

El problema es que el campo clave es de tipo AutoInc y por eso no sé que valor tiene hasta después de agregarlo y como la aplicación puede ser usada en redes es posible que se agregen varios y por tanto no sea el último registro.

Lo que realmente quisiera saber es si un INSERT INTO devuelve algun valor que apunte al registro recien incluido.

__marcsc 29-07-2004 16:55:10

Hola,

un Insert into no va a devolverte el codigo de registro, para esto te haría falta tener una tabla o Query.

Creo que lo que puedes hacer si necesitas conocer el código de lo que acabas de insertar sería hacer el insert via

Query.Insert

conra la caché y confirmar via post (momento a partir del cual ya podrías conocer el código si no trabajas con ApplyUpdates) en lugar de lanzar el INSERT directo contra la BD.

Hay algun motivo que te impida hacerlo??

Saludos!

ruina 29-07-2004 18:14:38

Cita:

Hay algun motivo que te impida hacerlo??
por un post anterior, y si los avatares no me engañan, creo que está trabajando con bde

quizas lo mas compatible sea preguntar, inmediatamente despues de la inserción por el max(CampoAutoincremento) que cumpla que sus campos son los que acabas de insertar. ej:

Código:

insert into mitabla (campo1,campo2,campo3)
values ('hola','que tal estas',12/12/2004)
 
select max(codigo)
from mitabla
where campo1='hola' and campo2 = 'que tal estas' and campo3 = 12/12/2004

ya que los métodos especificos de cada servidor sql para recuperar ese valor son muy distintos, por ejemplo MSSQL pone en una variable global (que no recuerdo como se llama) el nº del contador, interbase ni tan siquiera tiene campos autoinc y oracle... no tengo ni idea de como lo hace.

eso si, con este método hay que tener en cuenta que hay que eliminar los campos cuyos posibles triggers modifiquen los valores insertados. en el ejmplo anterior si tubieramos un trigger que cambiase el campo 1 a mayusculas al insertar obtendriamos... un bonito valor null como resultado de la consulta.

sitrico 29-07-2004 18:24:51

En cuanto a mi primer mensaje,
Cita:

en redes es posible que se agregen varios
creo que en la práctica es un tanto exajerado y con recuperar el último registro de la tabla inmediatamente despues del INSERT sería suficiente.

Estaba escribiendo esta respuenta mientras llegó la solución de Ruina:

Cita:

inmediatamente despues de la inserción por el max(CampoAutoincremento)
y para asegurar la maxima velocidad usaré 2 querys para lanzarlos inmediatamente uno despues del otro.

Gracias.

__marcsc 29-07-2004 18:42:02

Hola,

pues imaginate que estás añadiendo un nuevo Cliente en tu Tabla.

Pondrías un Query con una sentencia tipo

Código SQL [-]
SELECT *
FROM Clientes /*No me cruficiqueis gurus, please :D */

Abres el Query mediante Open y ahora quieres agregar un registro:

Código Delphi [-]

QryClientes.Insert;
QryClentes.FieldByName('Nombre').AsString:= 'PEPE';
QryClientes.FieldByName('Direccion').AsString:= 'Calle Bla bla bla';
....
QryClientes.FieldByName('Email').AsString:= 'pepe@yahoo.com';
QryClientes.Post; // en este punto el registro ya se habrá enviado a la BD
 
ShowMessage(FieldByName('Id').AsString); //te devuelve el código del registro que acabas de añadir

Espero que te sirva.

Saludos!

EDIT: En teoría este método te serviría en multiusuario ya que quien se encarga de asociar tu registro con el autonumérico son los componentes de acceso y no el programador...

sitrico 29-07-2004 19:31:11

Vaya! no sabia que un tQuery podía trabajar como un tTable, supongo que esta funcionalidad la incorpora el BDE. Como no quiero depender tanto del BDE me quedo con la sujerencia de Ruina.

Gracias a ambos

ruina 30-07-2004 13:44:06

solo un par de apuntes:

para MSSQL la variable que mencionaba antes es @@identity.

un query puede comportarse como una tabla siempre que tenga marcada la propiedad RequestLive a true y en ese caso ¡mejor usar un ttable!

Puedes "espiar" los mecanismos del BDE con el SQLMonitor, quizas pueda darte una idea de como reproducir un determinado comportamiento en una base de datos determinada.

Otro método de inserción/actualización es encerrarla en procedimientos almacenados, claro que si tienes que lidiar con X bases de datos tendrias que currante X*tablas procedimientos almacenados distintos (ahi si que no se parecen na de na)


La franja horaria es GMT +2. Ahora son las 15:57:23.

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