Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Actualizar el Generador de Firebird

Uso el Generador y Trigger de Firebird 3.0 para añadir número a los nuevos registros. Y funciona sin problemas, pero al visionar el nuevo registro en un TDBGrid aparece un cero (0) que es lo que uso para disparar el Trigger.
No uso un NULL porque me da error al ser un campo con dato obligado.
¿Qué método puedo usar en el FDBQuery o FDConnection ( o el que sea ) para actualizar el dato? Serviría el Refresh? Porque este último me daba errores y he dejado de usarlo.
Gracias,
bulc
Responder Con Cita
  #2  
Antiguo 03-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues si no vemos cómo lo haces, poco podemos ayudar.
Responder Con Cita
  #3  
Antiguo 04-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Con más explicación de código

Así, a bote pronto algo como esto:
Código Delphi [-]
Q1.Close;
Q1.SQLText:='Insert into TableX values (:P1, :P2, :P3)';
Q1.ParamByName(('P1').Value:= '0';  // Activa el Trigger Firebird
Q1.ParamByName(('P2').AsString:=Edit2.Text;
Q1.ParamByName(('P1').AsDate:=StrToDate(MaskEdit1.Text);
Q1.ExecSQL;
Q1.SQLText:='Commit';
ShowMessage('Inserción correcta');
Y luego en el Trigger, algo parecido a
Código SQL [-]
Set term ^;
Create trigger BI_Mine for TableX
Active Before Insert position 0
as begin
 if (New.Num = 0) then new.Num = GEN_ID( GEN_MINE, -1); 
end;
commit;
Set term ; ^
Como decía todo funciona bien, pero al salir de la inserción (en Delph1), el DBGrid muestra un cero, no el número correcto real.
Cuando hago otra pasada SQL con el FDQuery, entonces sí que se muestra en nuevo número de registro correcto.
Código Delphi [-]
FDQuery1.Active :=False;
FDQuery1.SQL.Clear;
FDQuery1.Add('select * from Mine....');
FDQuery1.Active :=True;
Responder Con Cita
  #4  
Antiguo 04-03-2018
WHILENOTEOF WHILENOTEOF is online now
Miembro
 
Registrado: Mar 2008
Posts: 135
Poder: 11
WHILENOTEOF Va por buen camino
Necesitas configurar las propiedades AutoincFields (nombre del campo que se actualiza con el generador) y GeneratorName dentro de UpdateOptions del componente TFDQuery.
Responder Con Cita
  #5  
Antiguo 04-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Modestamente creo que no va por ahi la cosa

Es decir, se trata de visionar el resultado correctamente no de hacer uso del AutoIncrement en FDQuery. Pero probaré. Ya de diré del resultado.
Gracias,
bulc
Responder Con Cita
  #6  
Antiguo 04-03-2018
WHILENOTEOF WHILENOTEOF is online now
Miembro
 
Registrado: Mar 2008
Posts: 135
Poder: 11
WHILENOTEOF Va por buen camino
Modestamente puede que tengas razón

, he contestado de primeras, y es posible que tengas razón, tendría que probarlo. la idea es que hay que decirle de alguna forma a Firedac qué campo tiene que recuperar su nuevo valor, una vez que haces la inserción, en Fibplus lo tenías que configurar explícitamente para que recuperarlo. Es normal que si no configuras nada el no actualice el valor del generador, no sabe nada el componente sobre que ese campo se actualiza con un generador.
Responder Con Cita
  #7  
Antiguo 04-03-2018
manelb manelb is offline
Miembro
 
Registrado: Mar 2017
Posts: 122
Poder: 2
manelb Va por buen camino
No se si puede servirte, pero esta semana me he entrado que firebird(y otros SGBD) tienen la posibilidad que un insert te devuelva datos...
Seria algo asi como un insert/select.

Lo acabo de probar con firebird 2.1 i firedac y me ha funcionado sin problemas.
Siguiendo tu ejemplo la sentencia seria...

Código Delphi [-]
Q1.SQLText:='Insert into TableX values (:P1, :P2, :P3) returning nombre_campo';

La única cosa a tener en cuenta es que debes abrir la consulta con Open en lugar de ejecutarla con ExecSQL

Saludos todos
Responder Con Cita
  #8  
Antiguo 05-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Yo voy a probar con Refresh a ver

Si eso está claro. Asignar una declaración SQL a un TQuery es lo mismo si se hace con Text (TListString) o si se hace con el método Add. No hay diferencias.
Y tampoco las hay si se abre y activa la declaración con el método Open, o la prop. Active:= True; eso da lo mismo.
Pero ExecSQL se debe usar (según mi entender) para órdenes SQL que no retornan conjuntos de datos. Mientras que para datos (Select) basta abrir o activar el Query.
Mi problema, un poco simple, es que cuando hago un Insert, coloco un 0 (cero) en el registro del campo NUM (Integer Not Null Primary Key). Así salta el Trigger, pero el visionado en el DBGrid es Cero (0). Y tengo que volver a ejecutar la orden del Query para que se coloque en número correcto (Y no el cero).
No sé si me he expresado bien y se entiende. Yo no veo la necesidad de poner código para todo. Ya se sabe que aclara, pero los conceptos también tienen importancia.
Saludos y gracias.
bulc
Responder Con Cita
  #9  
Antiguo 05-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Has probado haciendo un refresh?
Responder Con Cita
  #10  
Antiguo 05-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Sí, he probado Refresh

Lo he probado en TFDQuery. Pero no afecta al DBGrid. Este último componente recibe los datos del TDataSource. Miraré a ver si TDataSource acepta el método Refresh. Debería funcionar.
Veremos.
bulc, gracias.
Responder Con Cita
  #11  
Antiguo 05-03-2018
manelb manelb is offline
Miembro
 
Registrado: Mar 2017
Posts: 122
Poder: 2
manelb Va por buen camino
NoSoloDelphi

Justo hoy he escuchado el último podcast de NosoloDelphi(y van 17!!) y han hablado de Firedac y de la opción del returning de la cual te he comentado más arriba...

Saludos a todos..
Responder Con Cita
  #12  
Antiguo 05-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
No es eso lo que pretendo

Léete mi propuesta porque no le veo relación con lo que me aportas. Te lo agradezco pero no veo la conexión entre las dos propuestas.
Saludos,
bulc
Responder Con Cita
  #13  
Antiguo 06-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
El Generador Gen_id es cosa pasada

Acabo de enterarme que en la versión Firebird 3.0 y siguientes no es necesario usar el Generador Gen_id ni el Trigger correspondiente.
Basta diseñar la tabla con esta nueva asignación que facilita la creación de un campo incrementado.
Código:
CREATE TABLE PRUEBA(
ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
TEXTO VARCHAR(20) NOT NULL,
CODIGO CHAR(2),
INFO  BLOB SUB_TYPE TEXT );
COMMIT;
Por supuesto en los Insert se deja el campo ID vacio.
Código:
INSERT INTO PRUEBA (TEXTO, CODIGO, INFO) VALUES ( 'NO MORE GEN_ID', '10',  'GEN_ID HAS GONE TO OBLIVION');
Es un alivio motivo de enhorabuena a los programadores que matienen Firebird vivito y coleando.
Gracias.
bulc
Responder Con Cita
  #14  
Antiguo 06-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Así es, pero ¿así sí te funciona?
Responder Con Cita
  #15  
Antiguo 06-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Pues, claro. Y a toda pastilla

Además he resuelto el problema que tenía en el sentido de que los nuevos insertos ostentaban un Cero (en el TDBGrid), cuando usaba ese número para no dejar vacío el Campo que era Not Null. Uso cero porque no es Nulo y porque no hay ningún registro que sea número cero.
Para eso se necesita que el Trigger tenga: If ( (new.id = 0 ) or (new.id is null) ) then new.id = select gen_id (gen_xxx, 1) from rdb$database;
Ahora la segunda condición sobra, realmente.
Por otro lado para que el cero no aparezca en el TDBGrid he usado:

FDM1.FDQuery1.RefreshRecord(True);

Y parece que funciona.
Hay una ganancia con eso de usar Firebird 3.0, para no tener que usar el Generador de anteriores versiones. Por otro lado a mi me iba bien con él.
Después de la matada de pasar todos los Firebird 2.5 al 3.0 y con FireDAC... ya me vale.
"Happiness do not last in homes in need."
Saludos,
bulc
Responder Con Cita
  #16  
Antiguo 06-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bulc Ver Mensaje
"Happiness do not last in homes in need."
Así es, por desgracia



Me alegro de que por fin lo hayas echado a andar
Responder Con Cita
  #17  
Antiguo 07-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Hay una inconsistencia el el Generated by Default

Al igual que pasaba con el Gen_ID y el Trigger de versiones anteriores, en el Firebird 3.0 hay que 'torear' el hecho de que no se exige un vacío como activador del Generador. Y luego, al ser un ser un campo not null no se puede dejar vacío. Se puede usar 0 (cero), pero entonces el primer cero es válido por no estar repetido. Los tres primeros registros ID serían algo así como : 1, 2, 0...
Resumiendo, quería saber si existe alguna forma de saltarse la entrada de datos en el campo Clave Primaria autoincrementado, para que Delphi no dé error de entrada.
Podría ser hacer el Insert mediante sentencias SQL y dejar ese campo vacío... ¿?
Generated by default exige un campo vacío para activar el contador, pero si se deja vacío salta un error de Delphi ya que es un campo Not Null. Esa era la contradicción.
¿Alguien sabe como soslayarla?
Saludos,
bulc
Responder Con Cita
  #18  
Antiguo 07-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La verdad es que no entiendo qué problema tienes ni qué quieres conseguir ni por qué
Responder Con Cita
  #19  
Antiguo 11-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: Jun 2010
Posts: 370
Poder: 9
bulc Va por buen camino
Utimo por la cola

Este select me va y es útil i y sencillo:
Código SQL [-]
SELECT FIRST 1 ID FROM ATable GROUP BY ID DESC;
Es de Walter, no mío.
Saludos,
bulc
Responder Con Cita
  #20  
Antiguo 11-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.238
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si lo que quieres es el último número, entonces es mejor, más rápido y eficiente:
Código SQL [-]
select max(id) from atable;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Generador de cubos en firebird erickperez6 Firebird e Interbase 1 18-09-2014 17:36:40
Actualizar un valor en un generador desde un Sp muli Firebird e Interbase 16 11-06-2008 14:56:05
Blanquear un generador autonumerico firebird Velia Firebird e Interbase 4 21-08-2007 13:58:03
Error al actualizar tabla con generador lafirma Firebird e Interbase 2 07-04-2004 00:55:21
que generador de informes es mas facil de usar con firebird/interbase? raugadel Impresión 9 25-02-2004 02:40:48


La franja horaria es GMT +2. Ahora son las 18:29:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi