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 03-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Trigger no funciona

Saludos,
Cuando uso Firebird por comandos sí me funciona el trigger, pero cuando lo uso con Delphi en el DBGrid me da un error de campo no lleno y tengo que escribir el numero de incremento a mano.
¿Alguien sabe por qué ocurre esto? Si hacen falta más explicaciones me lo decis.
Responder Con Cita
  #2  
Antiguo 03-01-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bulc Ver Mensaje
Si hacen falta más explicaciones me lo decis.
Hacen falta más explicaciones.
Responder Con Cita
  #3  
Antiguo 03-01-2014
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 15
Caminante Va camino a la fama
Hola

Bueno adivinando la situacion creo que lo que pasa es que mediante un trigger asignas la clave primaria a la tabla. El campo del lado de la aplicacion tiene la propiedad required en true. Para evitar ese error cambialo a false. Pero debes hacer un refresh despues de grabar para poder leer la clave que se asigno.

Espero que sea lo que necesitabas.

Saludos
Responder Con Cita
  #4  
Antiguo 04-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Cita:
Empezado por bulc Ver Mensaje
Saludos,
Cuando uso Firebird por comandos sí me funciona el trigger, pero cuando lo uso con Delphi en el DBGrid me da un error de campo no lleno y tengo que escribir el numero de incremento a mano.
¿Alguien sabe por qué ocurre esto? Si hacen falta más exp"licaciones me lo decis.
Pues que usando comandos en modo texto en el prompt "SQL>" el trigger actúa correctamente disparando el generador para incrementar un campo de clave primaria en +uno. En cambio al hacerlo en un TDBGrid con Delphi, dejo ese campo vacío y al clicar en Guardar, Firebird da un error de "no hay dato en el campo Num. ¿Se entiende mejor ahora?
Responder Con Cita
  #5  
Antiguo 04-01-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero qué sentencia sql usas en cada caso y qué parámetros, etc.
Responder Con Cita
  #6  
Antiguo 04-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Pues no uso ni uno ni otro. Estoy en un DBGrid en el que introduzco nuevos datos. Y luego le doy a guardar del DBNavigator.
Responder Con Cita
  #7  
Antiguo 04-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Hola Caminante. He ido al Form y no he encontrado la propiedad Required ni en el DBGrid ni en sus columnas. Tal vez deberías decirme dónde está o si voy descaminado. Por otro lado, basado en tu idea, hallé en el componente TIBQuery una propiedad GenaratorField que usé colocando el nombre del GENERATOR. También contiene una prop. llamada ForceRefresh. La puse a True...
Pero al meter un nuevo dato en el DBGrid sigue saliendo el error: "Field 'num' must have a value".
¿Alguna otra sugerencia?
Gracias por el esfuerzo.
Bulc

Última edición por bulc fecha: 04-01-2014 a las 15:05:04. Razón: Acabar la contestación a Caminante.
Responder Con Cita
  #8  
Antiguo 04-01-2014
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Hola Bulc.

Mi sugerencia es tal y como te indica Casimiro es que nos des más datos de dónde se produce el problema y que lo puede proiducir.
En tu explicación no se acaba de entender bien lo que te sucede, tu intentas explicarte al máximo pero tienes la ventaja de que ves en cada momento lo que sucede, nosotros no.
Comentas algo de un dbgrid, recuerda que un dbgrid no es más que la representación ordenada de los datos de una tabla o consultao sea que si realizas cualquier acción en este grid, realmente estas trabajando en los datasets, post, append, cancel, update, etc.

Pon algo de código, (si es que este no es un secreto de estado), bueno bromas aparte intenta colocarnos la sentencia que te da el error y seguro que recibirás la respuesta adecuada.

Saludos

Josep
Responder Con Cita
  #9  
Antiguo 04-01-2014
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 15
Caminante Va camino a la fama
Cita:
Empezado por bulc Ver Mensaje
no he encontrado la propiedad Required ni en el DBGrid ni en sus columnas.
Bulc
La propiedad required pertenece a los campos persistentes del dataset que uses.

Saludos
Responder Con Cita
  #10  
Antiguo 04-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Cita:
Empezado por jafera Ver Mensaje
Hola Bulc.

Mi sugerencia es tal y como te indica Casimiro es que nos des más datos de dónde se produce el problema y que lo puede proiducir.
En tu explicación no se acaba de entender bien lo que te sucede, tu intentas explicarte al máximo pero tienes la ventaja de que ves en cada momento lo que sucede, nosotros no.
Comentas algo de un dbgrid, recuerda que un dbgrid no es más que la representación ordenada de los datos de una tabla o consultao sea que si realizas cualquier acción en este grid, realmente estas trabajando en los datasets, post, append, cancel, update, etc.

Pon algo de código, (si es que este no es un secreto de estado), bueno bromas aparte intenta colocarnos la sentencia que te da el error y seguro que recibirás la respuesta adecuada.

Saludos

Josep

!Es que no hay código apenas! Sólo hemos hecho la conexión. Usamos IBDataBase, IBTransaction, IBQuery, IBProvider, ClientDataSet, TDataSource y DBGrid. La conexión es correcta.
Hemos creado la DBase por código en el prompt de la aplicación en modo de comandos ISQL de Firebird (Antiguo DOS command). La Base tiene una tabla.
En ella hay cuatro campos el primero NUM es numérico; es clave primaria, not null. Luego hemos creado un generator y un trigger para que se autoincremente el camp NUM. Hemos hecho un insert y funciona el Trigger perfectamente. Sólo hay una tabla con un registro y este lleva un 1 en NUM.
El TDBGrid tiene una barra TDBNavigator. Pues bien, escribimos un dato nuevo para el registro nº 2 (el primero se ve en el Grid) del DBGrid. Al guardar el dato con el TDBNavigator, surge el error de "No hay valor para columna NUM". Entonces colocamos un botón con el código necesario para que el ClientDataSet guarde los datos. Usamos Post y ApplyUpdates, lo normal.
Pues bien, si se coloca un 2 en el campo NUM del DBGrid los datos se guardan sin problema, pero si se deja ese campo en blanco (a la espera de que el Trigger) haga su trabajo, entonces salta el error de nuevo. O sea, hay un error si se deja NUM en blanco.
Bueno, lo he intentado. Puedo poner el código pero repito solo tiene un botón de Guardar y un DBNavigator asociado al DBGrid.
El código del generator y del trigger funcionan correctamente.
Dime si hay algo que pueda ponerte más y te lo pongo.
Gracias.
Bulc
Responder Con Cita
  #11  
Antiguo 04-01-2014
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 638
Poder: 21
mRoman Va por buen camino
Hola....creo que hace falta definir a "arAutoInc" en la propiedad AutoGenerateValue del DataSet que tengas asociado a tu DbGrid.....esta propiedad las puedes observar si seleccionas el componente DataSet y le das click derecho para q te muestre un menú contextual y puedas seleccionar la opción "Fields Editor". Cuando te muestre la pantalla das nuevamente click derecho y seleccionas "Add all fields" cargara todos los campos del dataset y es ahi donde al seleccionar un campo encontraras la propiedad q te comento.....

Espero te funcione...SALUDOS.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #12  
Antiguo 04-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
Poder: 22
fjcg02 Va camino a la fama
Hola, que yo sepa, eso que te ocurre es porque no pones ningún valor en la pk. Para solventarlo, haz una función que te devuelva un nuevo valor del generador. En el evento beforpost del dataset le das valor a la pk con esa función y asunto solucionado.

Por eso cuando pones valor a mano, te funciona. Es una pequeña pega, pero es lo que hay.

Nos cuentas el resultado.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #13  
Antiguo 05-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Hola, que yo sepa, eso que te ocurre es porque no pones ningún valor en la pk. Para solventarlo, haz una función que te devuelva un nuevo valor del generador. En el evento beforpost del dataset le das valor a la pk con esa función y asunto solucionado.

Por eso cuando pones valor a mano, te funciona. Es una pequeña pega, pero es lo que hay.

Nos cuentas el resultado.

Saludos
Hola. ¿Qué es la pk? No lo pillo. Gracias...
Responder Con Cita
  #14  
Antiguo 05-01-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bulc Ver Mensaje
Hola. ¿Qué es la pk? No lo pillo. Gracias...
primary key
Responder Con Cita
  #15  
Antiguo 05-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Bueno, está bien. Pero en esa función, ¿como saco el valor del Generador? Hay algo que se me escapa... Y me quedo corto.
Lamento darte tantas idas y vueltas. Uno se queda con cara de tonto y no sabe si volver a preguntar. Al menos que por eso no quede.
Gracias.
Responder Con Cita
  #16  
Antiguo 05-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Cita:
Empezado por mRoman Ver Mensaje
Hola....creo que hace falta definir a "arAutoInc" en la propiedad AutoGenerateValue del DataSet que tengas asociado a tu DbGrid.....esta propiedad las puedes observar si seleccionas el componente DataSet y le das click derecho para q te muestre un menú contextual y puedas seleccionar la opción "Fields Editor". Cuando te muestre la pantalla das nuevamente click derecho y seleccionas "Add all fields" cargara todos los campos del dataset y es ahi donde al seleccionar un campo encontraras la propiedad q te comento.....

Espero te funcione...SALUDOS.
Creo que eso he hecho. Usé el Query, como te decía. Buscaré esa propiedad AutoGenerateValue. Supongo que estará en el IBQuery o en el ClienteDataSet...
Responder Con Cita
  #17  
Antiguo 05-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
He hallado esa prop. en el ClientDataSet (CDS). Cargué los campos y elegí NUM. Asigné a la prop. AutoGenerateValue :=arAutoInc y la prop. Required to False. Pero sigue sin funcionar. Mi pregunta es, ¿el CDS efectúa autoincrementos por su cuenta, si usar ningún Trigger?
es que además el comp. IBQuery (que uso) también activa Generators mediante la prop. GeneratorField, etc.
¿Debo efectuar el Refresh antes del Post, mediante código?
Saludos y gracias.
Bulc
Responder Con Cita
  #18  
Antiguo 05-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
Poder: 22
fjcg02 Va camino a la fama
Hola,
Respecto a la función, básicamente es la ejecución de una query que te devuelva el valor de esta select

SELECT GEN_ID( generador,1) FROM RDB$DATABASE

Pones un parámetro que sea el nombre del generador, y te vale para todos.

Como ya te decía anteriormente, en el caso de los tclientdatasets hay que hacerlo así. En el evento beforepost asignas el valor al campo pk ( num en tu caso ) y solucionado el problema.

Saludos
Pd: no estoy escribiendo desde el portátil, o sea, que no tengo el código para pegarlo. A ver sí me acuerdo y te lo paso.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #19  
Antiguo 06-01-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.412
Poder: 22
fjcg02 Va camino a la fama
Hola,
Esta es la función que te vale para cualquier generador

Código Delphi [-]
function Generador( generador: string): integer;
begin
SQLGenerador.CLose;
SQLGenerador.SQL.Clear;
SQLGenerador.SQL.Add('select  first 1 GEN_ID('+generador+',1)  from RDB$DATABASE');
SQLGEnerador.Open ;
Result:= SQLGenerador.Fields[0].AsInteger;
end;

La llamo de la siguiente manera

Código Delphi [-]
procedure TDM.CDSClienteBeforePost(DataSet: TDataSet);
begin
// si es nulo, es registro nuevo, informo pk con generador, usuario y timestamp del alta
if Dataset.FieldByName('idCliente').IsNull then
  begin
    Dataset.FieldByName('idcliente').AsInteger:= Generador('CLIENTE');
    Dataset.FieldByName('USUARIOALTA').AsString:= WUsuario;
    Dataset.FieldByName('LOGA').AsDateTime:= now;
  end;
ActualizarLog(Dataset); // informo usuario y timestamp de actualizacion
end;

function TDM.ActualizarLog(Dataset: TDataset): boolean;
begin
  Dataset.FieldByName('USUARIOMODIF').AsString:= WUsuario;
  Dataset.FieldByName('LOGM').AsDatetime:= now;
  Result:= True;
end;

Todas las tablas tienen los campos USUARIOALTA, LOGA, USUARIOMODIF y LOGM para saber quién ha dado de alta el registro y quién es el último que lo ha modificado

Espero que te sirva de ayuda.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #20  
Antiguo 06-01-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 416
Poder: 15
bulc Va por buen camino
Cita:
Empezado por fjcg02 Ver Mensaje
Hola,
Esta es la función que te vale para cualquier generador

Código Delphi [-]
function Generador( generador: string): integer;
begin
SQLGenerador.CLose;
SQLGenerador.SQL.Clear;
SQLGenerador.SQL.Add('select  first 1 GEN_ID('+generador+',1)  from RDB$DATABASE');
SQLGEnerador.Open ;
Result:= SQLGenerador.Fields[0].AsInteger;
end;

La llamo de la siguiente manera

Código Delphi [-]
procedure TDM.CDSClienteBeforePost(DataSet: TDataSet);
begin
// si es nulo, es registro nuevo, informo pk con generador, usuario y timestamp del alta
if Dataset.FieldByName('idCliente').IsNull then
  begin
    Dataset.FieldByName('idcliente').AsInteger:= Generador('CLIENTE');
    Dataset.FieldByName('USUARIOALTA').AsString:= WUsuario;
    Dataset.FieldByName('LOGA').AsDateTime:= now;
  end;
ActualizarLog(Dataset); // informo usuario y timestamp de actualizacion
end;

function TDM.ActualizarLog(Dataset: TDataset): boolean;
begin
  Dataset.FieldByName('USUARIOMODIF').AsString:= WUsuario;
  Dataset.FieldByName('LOGM').AsDatetime:= now;
  Result:= True;
end;

Todas las tablas tienen los campos USUARIOALTA, LOGA, USUARIOMODIF y LOGM para saber quién ha dado de alta el registro y quién es el último que lo ha modificado

Espero que te sirva de ayuda.

Un saludo
Parece muy claro. Lo probaré en cuanto pueda. Muchas gracias.
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 18:00:45
IP de la PC en Trigger noelia89 Firebird e Interbase 5 04-09-2012 18:03:41
Trigger en Firebird no funciona payo7 SQL 2 06-11-2011 01:19:24
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 17:24:50
Un trigger que dispara un procedimiento que dispara un trigger... sitrico Firebird e Interbase 5 04-06-2007 23:05:13


La franja horaria es GMT +2. Ahora son las 00:56:21.


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