Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-02-2017
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por las respuestas,

Uso un generador asi que no asigno ningun id_producto a "mano".
Respecto a si posiciono bien, ya lo he resuelto, tuve que usar un locate para posicionarme.
Y, sobre sacar el id_producto despues de hacer post y commitretaining, no tengo más remedio que cerrar la tabla y volverla a abrir.

Esto es normal?. Cada vez, cerrar y abrir tablas?
Responder Con Cita
  #2  
Antiguo 28-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo utilizo la clausula RETURNING del INSERT INTO para que me devuelva el valor de Id que el generador le dio al registro que estoy insertado. De esta manera evitas problemas de concurrencia y hasta es mas eficiente, puesto que en una sola operacion insertas y obtenes el id que necesitas
Responder Con Cita
  #3  
Antiguo 28-02-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por AgustinOrtu Ver Mensaje
Yo utilizo la clausula RETURNING del INSERT INTO para que me devuelva el valor de Id que el generador le dio al registro que estoy insertado. De esta manera evitas problemas de concurrencia y hasta es mas eficiente, puesto que en una sola operacion insertas y obtenes el id que necesitas
Responder Con Cita
  #4  
Antiguo 01-03-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por anubis Ver Mensaje
Uso un generador asi que no asigno ningun id_producto a "mano".
Entonces, para obtener el ID recién generado, sin alterar su valor:
Código SQL [-]
SELECT GEN_ID(G_TUTABLA, 0) AS NEXT_ID FROM RDB$DATABASE
Y para obtener el próximo ID ( incrementando su valor ):
Código SQL [-]
SELECT GEN_ID(G_TUTABLA, 1) AS NEXT_ID FROM RDB$DATABASE
Cita:
Empezado por anubis Ver Mensaje
Y, sobre sacar el id_producto despues de hacer post y commitretaining, no tengo más remedio que cerrar la tabla y volverla a abrir.
No necesariamente. Podes obtener el último ID de forma directa, o haciéndote una función, independientemente de si la tabla está abierta o cerrada:
Código Delphi [-]
function Tmodulodatos.TuTablaGetLastID: Int64;
begin
  IBQuery1.Close;
  IBQuery1.SQL.Text := 'SELECT GEN_ID(G_TUTABLA, 0) AS NEXT_ID FROM RDB$DATABASE';
  IBQuery1.Open;
  Result := IBQuery1.FieldByName('NEXT_ID').AsInteger;
  IBQuery1.Close;
end;
Y claro que también como te indica Agustín, al momento de realizar la inserción.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 01-03-2017
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias.

Pues si, son opciones a tener en cuenta y las voy a probar .

De todas formas, el problema que tengo es que, despues de insertar un nuevo registro, si pido ese registro el, id_producto por ejemplo, me devuelve 0 y en el dbgrid me sale en blanco.
Lo soluciono cerrando la tabla y abriendola de nuevo.
Ya probe con refresh y tampoco me lo resuelve.
Responder Con Cita
  #6  
Antiguo 01-03-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por anubis Ver Mensaje
...
De todas formas, el problema que tengo es que, despues de insertar un nuevo registro, si pido ese registro el, id_producto por ejemplo, me devuelve 0 y en el dbgrid me sale en blanco.
Lo soluciono cerrando la tabla y abriendola de nuevo.
Ya probe con refresh y tampoco me lo resuelve.
Es que cuando Firebird incrementa el generador desde un trigger (vg. BEFORE INSERT) el DataSet no se entera del nuevo valor asignado hasta que lo cierres y abras nuevamente.

Una cosa que podes hacer es usar la propiedad GeneratorFielddel TIBDataSet, ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  DS: TIBDataSet;
begin
  DS := IBDataSet1;
  DS.GeneratorField.Generator   := 'G_TABLA';
  DS.GeneratorField.Field       := 'ID';
  DS.GeneratorField.IncrementBy := 1;
  DS.GeneratorField.ApplyEvent  := gamOnPost;
end;
(Configuré la propiedad en tiempo de ejecución para clarificar, pero podes hacerlo en tiempo de diseño desde el Inspector Object)


Hay dos cosas que olvidé mencionarte, la primera es que los componentes IBX para Delphi hasta la versión 7.8 inclusive, no soportan la cláusula RETURNING (no sé si es así en versiónes posteriores de IBX).

La segunda y mas importante, es que no uses el modo del mensaje #7
Código SQL [-]
SELECT MAX(ID_PRODUCTO) as ULTIMO_ID FROM PRODUCTO
para obtener el último identificador en un entorno multiusuario, por que fácilmente se podría generar incongruencia en los datos. Lo conveniente es solicitar la generación de un ID
Código SQL [-]
SELECT GEN_ID(G_PRODUCTO, 1) AS TENTATIVE_ID FROM RDB$DATABASE
, almacenarlo y luego utilizarlo (Commit) o bién descartar ese valor (Rollback).

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 01-03-2017
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Muchas gracias eficsa,
Lo voy a checar, aunque ya me has aclarado bastante, sobretodo con la duda que llevo mucho tiempo sin resolver, que el dataset no se entera del id generado hasta que no cierre y vuelva a abrir.

Y, respecto al generador, usare tu solución , es entendible y ademas, llevo con esto mucho tiempo pero sigo siendo novato, incluso no creo que llegue a esa categoria por el tiempo .
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
forma de programar no se si es la correcta ? gulder MySQL 4 05-04-2016 17:49:51
Liberar Tlist de forma correcta BDWONG Varios 3 01-11-2014 17:28:46
Forma correcta de conectar a la base.. linuxtin Conexión con bases de datos 4 19-07-2012 20:30:20
validar usuarios de forma correcta hibero PHP 3 04-01-2010 15:47:04
Cual es la Forma Correcta de Guardar Texto en un IbDataset con TcpServer???? AGAG4 Varios 0 10-12-2004 22:14:41


La franja horaria es GMT +2. Ahora son las 23:47:41.


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