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
  #21  
Antiguo 11-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Estoy en ello. fjcg02, te diré el resultado.
Responder Con Cita
  #22  
Antiguo 12-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Aver, a ver...

compruebo que no soy el único friki trabajando

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #23  
Antiguo 12-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Bueno, no estás sólo.
He aquí lo que he hecho. Activé la llamada a tu función de Usuario GENERADOR, en el evento onKeyDown, Key = VK_INSERT, y la impido para VK_DOWN and CDS1.EOF. A la función GENERADOR le paso el parámetro IBQuery1 y como devolución el GEN_ID (sin modificarlo), tal como proponías. No he entendido la línea NumGet:= Query1.Fields[0].AsInteger. Yo usaba esta: NUmGet := Query1.Params[0].AsInteger; pero me daba "Arguement out of Range". ¿Por qué ocurre ésto?.
En fin que luego coloco ese valor en el campo NUM del DBGrid y luego lo quito con BeforePost para que el Trigger haga su trabajo. Ha sido un placer aprender de ti. Espero que te resulte grato. Saludos. Bulc.
Espero que el moderador no me suelte el perro por no usar formáto de código estándar y que se entienda.
Responder Con Cita
  #24  
Antiguo 12-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Código Delphi [-]
Function GET_GEN ( IBQuery1 : TIBQuery ) : Integer;  // You can add more parameters like: GEN_NAME : String, and TDBGrid, etc...
// Called by KeyDown event using Key = VK_INSERT  
Begin
    IBQuery1.Close;
   IBQuery1.Clear;
   IBQuery.SQL.Add( 'Select GEN_ID( 'GEN_NUM_TALLER', 0) FROM RDB$DATABASE' ); //Extract without alteration
   IBQuery.Open;
   Result := IBQuery1.Fields[0].AsInteger; // ¿Se podría extraer el dato de algún otro modo?
End;

Última edición por bulc fecha: 12-01-2014 a las 15:19:47. Razón: Añadir etiqueta Delphi
Responder Con Cita
  #25  
Antiguo 12-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Funciona a la pefección

Código Delphi [-]
 // Código que he usado. Llamado por el evento OnKeyPress al detectar la tecla VK_INSERT
 FUNCTION GENERADOR( IBQuery1: TDBQuery; Gen_Name: String) : Integer;
 Begin
     IBQuery1.Close;
     IBQuery1.Clear;
     IBQuery1.Add('Select GEN_ID( Gen_Name,0) FROM RDB$DATABASE');
     IBQuery1.Open;
     Result: = IBQuery1.Fields[0].AsInteger;
     // Usaba Result:= IBQuery1.Params[0].AsInteger; pero daba: "Arguement Out of Range" Error. ¿Sabes por qué?
    // ShowMessage(' GEN_ID =  ' + IntToStr (Result ) );
 End;
Gracias por tu ayuda. Bulc
Responder Con Cita
  #26  
Antiguo 12-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
//Llamada a la función Generador (con Posterioridad a la función)
// en el evento OKeyDown o en BeforePost...
GenNUm:= GENERADOR( IBQuery1, 'GEN_NUM_TALLER');
Responder Con Cita
  #27  
Antiguo 12-01-2014
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
Código Delphi [-]
     Result: = IBQuery1.Fields[0].AsInteger;      // Usaba Result:= IBQuery1.Params[0].AsInteger; pero daba: "Arguement Out of Range" Error. ¿Sabes por qué?
Porque Params[] es para pasarle parámetros antes de ejecutar y Fields[] es para recoger valores después de ejecutar
Responder Con Cita
  #28  
Antiguo 12-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Agradecido

Agradecido por tu información. Gracias.
Responder Con Cita
  #29  
Antiguo 13-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Cita:
Empezado por bulc Ver Mensaje
//Llamada a la función Generador (con Posterioridad a la función)
// en el evento OKeyDown o en BeforePost...
GenNUm:= GENERADOR( IBQuery1, 'GEN_NUM_TALLER');
En principio la llamada sólo es necesaria en el evento BeforePost y cuando el campo que alimenta el generador es nulo. Es decir, cuando aceptas el cambio en un registro, si lo estás editando, ya tiene un valor, el que haya traído de la tabla al leer el registro. Cuando haces un post y el campo que alimenta el generador es nulo, entonces es un registro nuevo, por loq ue debes disparar el generador y darle el valos al campo que hece de primary key.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #30  
Antiguo 16-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
¿Cómo asignar a NULL un campo? o algo así....

Me funciona el GENERATOR y el trigger asociado a él. Pero como el campo NUM Integer lleva la clave primaria, resulta que si se deja vacío da error al salir de la edición del DBGrid.
Ejecuto el generador (sin modificarlo) con:
SELECT GEN_ID(GEN_NAME_TABLE, 0) FROM RDB$DATABASE;
//Recojo el dato
//Luego lo asigno al campo NUM del DBGrid. Para ello uso el DBDataSource con la línea:
DataSourcex.DataSet.FieldByName('NUM').AsIngeger := Value_Generator;

Lo compruebo en el evento BeforePost. Y es ahí cuando salta el error motivado por la asignación a NULL del campo.
DataSourcex.DAtaSet.FieldByName('NUM').AsInteger := NULL,
Lo hago así para no entregar al TIBQuery ese campo en el intento de que así salte el Trigger y rellene el campo con el número siguiente al que guarda el generador.
Entiendo que dicho campo se ha de dejar vació para ello.
Osea que estoy en un lío.
Con anterioridad había usado una tabla de control secundaria para llevar a cabo los autoincrementos y me iba bien. Pero he querido usar los triggers y ya ves.
Reitero:
Osea primero pongo un nº en el DBGrid y luego lo quito para llevarlo al servidor y que salte el Trigger. ¿Es lo correcto?
Saludos, bulc
Responder Con Cita
  #31  
Antiguo 16-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Quitar el valor al campo primary key

Primero relleno el campo en el DBGrid para que no salte el error debido a ausencia de dato en clave primaria (NUM).
Para ello saco el valor del generador sin alterarlo. Uso un Query con:
Select gen_id( Gen_Name,0) from rdb$database
Luego lo guardo como valor de salida con:
Result :=Query1.Fields[0].AsInteger // en una función.
Luego aplico el evento BeforePost para controlar los valores que van al ClientDataSet.
En el intento de que el Trigger haga su papel, quiero vaciar el campo NUM que el de clave primaria.
Utilizo en ese evento esto:
IBDataSourcex.DataSet.FieldByName('NUM').AsInteger := NULL;
pero me da un error. Y si lo dejo lleno -el valor está incrementado- y además es correcto.
Pero el generador no salta (+1) por insertar dato en ese campo.
¿Entiendes lo paradógico del caso?
Uno parece que se explica pero luego el lector no se aclara. Muy de risa.
¿Qué se te ocurre? ¿Por dónde me voy?
Gracias por tu tiempo.
Un saludo, bulc
Responder Con Cita
  #32  
Antiguo 16-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Creo que va a ser difícil que desde el programa delphi dejes el valor de la pk a nulo. Creo que siempre te dará error. Los triggers que ponen la clave con el valor de un generador te funcionarán desde el ibexpert o desde el isql.

Si desde el programa cliente quieres recuperar el valor de la pk generado por el trigger, le tienes que decir que el campo no es requerido y después de hacer la excritura hacer un refresh de ese registro. Ahora, no sé si será capaz de recuperar el registro, ya que lo guardas con la pk en blanco , el motor le asigna un valor y luego te lo devuelve.

No sé si habrá alguien que pueda aportar otra experiencia, esta es la mía.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #33  
Antiguo 16-01-2014
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 bulc.

Solo a fin de responder al título de tu mensaje #30, el método Clear lo hace.

Un ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  with IBDataSet1 do
  begin
    Edit;
    FieldByName('PRODUCTO').Clear;
    if VarIsNull(FieldByName('PRODUCTO').Value) then
      ShowMessage('El valor del campo ahora es NULL')
    else
      ShowMessage('Debería dedicarme a otra cosa...');
    Cancel;
  end
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #34  
Antiguo 17-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Gracias egfisa

Muchas gracias por tu apunte, egfisa
bulc
Responder Con Cita
  #35  
Antiguo 09-03-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Lo he probado y me ha ido a la perfección...

Bueno, por fin he comprendido como se efectúa la llamada al Trigger enviando y recibiendo parámetros.
El basado en el Trigger lo he completado usando cero (0) en el momento de la inserción. Así, el Trigger compara para valores null y para cero. En ese caso asigna el Trigger que toca sin problemas. Luego, en otra DBF, he optado por usar una función que llama al generador para que autoincremente el nº de registro que uso como índice de clave primaria.
En el momento del nuevo registro (ALTA) uso el generador sin cambiarlo y le añado un uno. Cuando el Alta se guarda entonces se efectúa otra llamada al generador con aumento +1. Hay una variable global EsAlta:=False/True según que la llamada sea definitiva o no, en el botón de altas. Se pasa a la funcion como segundo parámetro (SeRevisa).
En número del generador se pasa a un TLabel para estar informado en todo momento del nº de final de registros; el último GEN_ID.
Si se necesita el código completo...a pedir.

nRec:=REVISA_GEN( IBQuery1:TIBQuery; SeRevisa: Boolean; Label1: TLabel): Integer;

Gracias a todos los participantes. Ha sido muy ilustrativo. bulc
Responder Con Cita
  #36  
Antiguo 09-03-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Lo he probado y me ha sido de gran ayuda...

Además de usar esa técnica(la del Trigger) he probado otra con una función.
En la del Trigger he usado la inserción provisional de un cero. Así se llena el campo que por ser NOT NULL no puede dejarse vació. Luego el Trigger lo detecta e inserta el nº que toca en la serie.
Como segunda técnica, en otro .FBD he usado una función de usuario que llama al GEN_ID.
SELECT GEN_iD( GEN_JOT, 0) FROM RDB$DATABASE
El botón de ALTAS usa la variable EsAlta (boolean). Así si el ALTA se confirma con el botón GUARDAR, se pasa al generador un +1 y si no se queda como está
La función es
nRec:=REVISA_GEN( IBQuery1: TIBQuery; SeRevisa: Boolean; TLabel1:TLabel): integer;
El nº se ve en el TLabel para controlar los registros de la tabla y el resto es historia.
Si alguien quiere el código...
Saludos y gracias a todos los que han intervenido. Ha sido un mazazo saber de los parámetros de entrada y salida en IBQuery... Muy bueno.
Doy, pues, el hilo por acabado.
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
esta function no me funciona en XE2 y si funciona en D6 darkbits Varios 1 06-11-2012 17:00:45
IP de la PC en Trigger noelia89 Firebird e Interbase 5 04-09-2012 17:03:41
Trigger en Firebird no funciona payo7 SQL 2 06-11-2011 00:19:24
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 16:24:50
Un trigger que dispara un procedimiento que dispara un trigger... sitrico Firebird e Interbase 5 04-06-2007 22:05:13


La franja horaria es GMT +2. Ahora son las 17:10: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