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 29-07-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Question ¿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.
__________________
Sitrico
Responder Con Cita
  #2  
Antiguo 29-07-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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!
Responder Con Cita
  #3  
Antiguo 29-07-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
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.
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
Responder Con Cita
  #4  
Antiguo 29-07-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
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.
__________________
Sitrico

Última edición por sitrico fecha: 29-07-2004 a las 18:29:04.
Responder Con Cita
  #5  
Antiguo 29-07-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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  */

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...

Última edición por __marcsc fecha: 29-07-2004 a las 18:45:27.
Responder Con Cita
  #6  
Antiguo 29-07-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 22
sitrico Va por buen camino
Thumbs up

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
__________________
Sitrico
Responder Con Cita
  #7  
Antiguo 30-07-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
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)
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
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 07:03:45.


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