Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Actualizar un único registro (https://www.clubdelphi.com/foros/showthread.php?t=8149)

Muten 10-03-2004 13:22:02

Actualizar un único registro
 
Hola a todos!
Tengo un Trigger en una base de datos Firebird que cuando lee que la clave primaria es 0 (cero), llama a un procedimiento almacenado que busca el último nº disponible y se lo asigna. Todo esto ocurre a nivel de la base de datos, por lo que el usuario sigue viendo en el campo de la clave primaria un 0 y para actualizar esta vista es necesario refrescar los datos del DataSet cerrándolo y abriéndolo..
El problema es que cuando vuelvo a abrir el dataset, el cursor activo se sitúa en el primer registro y no en el recién insertado. He probado con la función locate, pero no me vale, ya que no sé que valor le da la base de datos a esa clave primaria. Tampoco me sirven los bookmarks ni nada parecido.. La cosa es q no quiero usar un procedimiento almacenado al que llame desde el programa, ya que el método lo uso en muchas pantallas y tampoco quiero complicarlas con objetos StoredProc y sus parámetros y su correspondiente tráfico de datos entre cliente y servidor.

¿Alguien tiene alguna idea??

Gracias.

PD. Uso fibPlus.

guillotmarc 10-03-2004 14:30:19

Personalmente utilizo el sistema de un procedimiento almacenado. No le veo tantos problemas :

A) Objetos StoredProc y sus parámetros. Yo utilizo herencia visual, por lo que ya tengo por defecto un StoredProc en cada formulario, a punto para usarlo para esto (junto con todo el código necesario). Aunque si no quieres usar herencia visual, y tampoco quieres tener un StoredProc en cada pantalla, simplemente puedes crearte una función genérica, a la que le pasas un nombre de generador y te devuelva el siguiente código para ese generador.

Ejplo. para la pantalla de clientes :

procedure frmClientes.qryClientesAfterInsert(Dataset: TDataset);
begin
Dataset.FieldValues['CODIGO'] := General.NuevoCodigo('GEN_CLIENTES');
end;

Como puedes ver, solo necesitarás un StoredProc (o un Query), en la función Genérica NuevoCodigo.

B) Tráfico de datos entre cliente y servidor. El tráfico será mas bien menor. Tal como lo estás haciendo ahora, tienes que volver a cargar el Dataset para poder ver el nuevo registro con su código de clave primaria. En cambio consultar el nuevo código desde la aplicación Delphi para asignarlo al nuevo registro, comporta un tráfico muy pequeño (solo hay que recoger un valor entero) y implica que ya no es necesario volver a cargar el Dataset, y posicionarnos en el ultimo registro.

Saludos.

Jvilomar 16-03-2004 16:03:30

Hola...


Una opcion para tu problema seria utilizando el Objeto Bookmark. Primero tienes que agregar a tu clausula Uses: DB.

el codigo seria el siguiente: en el Evento AfterPost de tu Tabla le agregas el siguiente Codigo:

var
Marca : TbookMark;
begin
with DataSet do
begin
DisableControls; // Desactivamos los Controles para evitar los Gaps
Marca := GetBookMark; // Apuntamos al Registro que hemos Insertado
Close; // Cerramos y Abrimos el DataSet
Open;
GoToBookmark(Marca); // Vamos al Registro Previamente Marcado
EnableControls; //Activamos Los Controles otra Vez
FreeBookmark(Marca); // Liberamos la Marca en Memoria
End;
End;

Espero que te sirva


La franja horaria es GMT +2. Ahora son las 20:23:28.

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