Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
Como obtener valor de Campo Autoincremento...

hola...

espero me puedan ayudar con esto...

tengo una tabla de en la que almaceno "mensajes", la clave principal es un campo Autoincremento (los demas campos son para guardar, de quien vino, cuando se recibio, etc), para esto me cree en generador y el correspondiente trigger (before insert), al hacer un insert con los valores de los demas campos se realiza el proceso de manera correcta; el detalle es que necesito obtener el valor del campo Autoincremento que le fue asignado a tal registro; por lo que he ledio lo adecuado seria colocar la sentencia de Insert en un procedimiento, llamar a este procedimiento con los parametros adecuados, y obtener en un parametro de retorno el valor del campo Autoincremento pero ahi es donde no se como obtener ese valor; el procedimiento es como sigue..

Código:
CREATE PROCEDURE NEW_PROCEDURE (PMENSAJE VARCHAR(100) CHARACTER SET ISO8859_1)
RETURNS (NUEVO_ID INTEGER)
AS
begin
  INSERT INTO MENSAJES(MENSAJE) VALUES (:PMENSAJE);
  NUEVO_ID = MENSAJES.id;
  suspend;
end

y me da el siguiente Error :

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
At line 8, column 23.
la tabla si tiene un campo ID que de hecho es el campo Autoincremento, he cambiado MENSAJES.id por GEN_MENSAJES_ID pero igual me dice que la columna no la conoce; espero alguien me pueda orientar...

saludos....

PD. Utilizo Delphi 6 y Firebird 1.5 y el store procedure lo esto creando con IBExpert.
Responder Con Cita
  #2  
Antiguo 09-05-2005
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 50
Poder: 20
Toñico Va por buen camino
Hola vic_ia,

Puedes usar una secuencia SQL para recuperar el máximo valor del campo autoincrementado. Justo después de hacer el insert lanzas una secuencia parecida a: "Select max(id) as Valor_Mas_alto from mensajes".

El problema de esto es que haya mas de una aplicación grabando registros, si estas trabajando en red por ejemplo. Si no es así, te puede servir.

Un saludo.
Responder Con Cita
  #3  
Antiguo 09-05-2005
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
Como obtener el valor de campo autoincremento

Hola

Por lo que veo trabajas con SQL2000 yo tenia un caso similar al tuyo y en el procedimiento almacenado donde hago la insercion utilizo la siguiente sentencia

SELECT @id = @@IDENTITY

donde @id es una variable int Output

Espero te ayude.

Saludos
Luis Garcia

_____________________________
La mejor manera de decir es hacer
Responder Con Cita
  #4  
Antiguo 09-05-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola...

gracias toñico e Igarcia...

toniño, si la forma que comentas es factible el problema como tu mencionas es que se tendran mas de una aplicacion guadando mensajes "al mismo" tiempo...

Igracias, no no trabajo con SQL 2000 sino con Firebird 1.5 y las expresiones que me da no me las reconoce...

sigo tratando de buscarle solucion..

saludos...
Responder Con Cita
  #5  
Antiguo 09-05-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola vic_ia !

Veo un problema en lo siguiente, por medio del identificador MENSAJES.ID no puedes obtener el contenido del campo ID; recuerda que dentro de un procedimiento de Firebird solamente cuentas con la sentencia SELECT para obtener los datos contenidos en un campo.

Para corregir tu código te recomiendo lo siguiente:

Código SQL [-]
CREATE PROCEDURE NEW_PROCEDURE (PMENSAJE VARCHAR(100) CHARACTER SET ISO8859_1)
RETURNS (NUEVO_ID INTEGER)
AS
begin
  INSERT INTO MENSAJES(MENSAJE) VALUES (:PMENSAJE);
  NUEVO_ID = GEN_ID([Nombre_generador],0);/*Obtienes el valor actual del generador sin incrementarlo*/
  suspend;
end

Por otra parte si lo que deseas es obtener el valor del generador directamente desde Delphi te recomiendo que leas este hilo:

http://www.clubdelphi.com/foros/show...2152#post82152

Un saludo!

Última edición por Héctor Randolph fecha: 09-05-2005 a las 21:22:35.
Responder Con Cita
  #6  
Antiguo 10-05-2005
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola HECTOR RANDOLPH...

muchas gracias

ya habia hecho una chapuza para obtener el id, pero la verdad con tu indicación anduvo perfecto... nuevamente muchisimas gracias...

saludos...
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 12:12:25.


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