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 10-10-2006
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
Unhappy Generar un valor por default distinto para cada insert

Hola, desde ya gracias de antemano, estoy con firebird 1.5 y delphi 7

Estoy probando de generar un valor por default distinto para cada insert y no recibo nada, he probado en la BD Trigger Before Insert donde ya genero el ID
pero el tema es que al darle + al Navigator no me aparece ningun valor por default en el DBEdit (ni tampoco el ID aunque si se guarda correctamente).

Lo que necesito deberia trabajar similar a como se define el valor por default en la tabla con por ejemplo CAMPO1 FLOAT DEFAULT 5, que esto si funciona, al darle + al Navigator me coloca 5

Yo necesito generar un valor por ejemplo Select max(campo1) from tabla y mandarselo como default al campo1 que estoy insertando.

Esto lo debo hacer en la base de datos, no me vale hacerlo en el Before Insert de la Tabla de Delphi

Muchas Gracias
Responder Con Cita
  #2  
Antiguo 10-10-2006
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Procedimiento Almaceando

Usa un porcedimiento almacenado en ONNEWRECORD, veras las ventajas.

Lo que pasa es que los valores por default se colocan en el servidor cuando haces el post, no antes no después y para peor no los ves hasta que abres de nuevo la tabla.

Ojo es un problema de transacciones, ahora no me acuerdo como se arregla, pero es mejor usar la solución que te di primero.
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #3  
Antiguo 10-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por fcios
Generar un valor por default distinto para cada insert
La verdad es que es una definición "curiosa" para un valor por defecto.
Si tienes concurrencia, no se si puedes tener problemas con los triggers; Otra opción es un Stored Procedure (que protegido debidamente con transacciones) te puede ofrecer un valor único.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 10-10-2006
nemesio nemesio is offline
Miembro
 
Registrado: nov 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 377
Poder: 19
nemesio Va por buen camino
Yo uso un tigger y me da un valor unico para cada registro.

Saludos
Responder Con Cita
  #5  
Antiguo 10-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Neftali
Si tienes concurrencia, no se si puedes tener problemas con los triggers; Otra opción es un Stored Procedure (que protegido debidamente con transacciones) te puede ofrecer un valor único.
La solución "natural" para la generación de valores únicos cuando hay concurrencia es el uso de generadores. En el evento OnNewRecord del dataset asociado, o bien en el evento BeforePost cuando el estado del dataset es dsInsert es donde suelo poner la generación del valor único.

Obviamente, este valor debe generarse desde delphi, en un trigger de la base de datos no resulta tan útil si la interacción se lleva a cabo solo desde el programa de delphi, pues este será incapaz de reconocer la fila que ha insertado.

Si habrá interacción desde otras fuentes, digamos isql, entonces como auxiliar pondría un trigger before insert que asigne un valor al nuevo registro solamente si el campo en cuestión viene nulo.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 10-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por jachguate
La solución "natural" para la generación de valores únicos cuando hay concurrencia es el uso de generadores.
Cierto, la solución pueden ser los generadores, aunque no siempre un generador devolverá el mismo número que un Max (Select max(campo1) from tabla es los que se proponía inicialmente).
El problema de los generadores es que si generas un número y luego deshaces el Insert o borras el registro, ese valor se pierde y al generar el siguiente tendrás un "hueco" en la numeración; Al proponer en el mensaje original un Max, pensé que quedaba desechada esa opción.

Si eso no es importante, está claro, debes usar generadores, que para eso están.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 10-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Neftali
aunque no siempre un generador devolverá el mismo número que un Max (Select max(campo1) from tabla es los que se proponía inicialmente).
¡Claro! De hecho, sería una coincidencia que un generador devuelva el mismo valor que un select max() + 1), pero precisamente es por eso es mas fiable, pues si dos usuarios insertar un registro al mismo tiempo, obtendrán valores diferentes para su llave, mientras que con un select max, ambos obtendrán el mismo valor.

Cita:
Empezado por Neftali
El problema de los generadores es que si generas un número y luego deshaces el Insert o borras el registro, ese valor se pierde y al generar el siguiente tendrás un "hueco" en la numeración
Sin importar cómo hayas obtenido el valor de la llave primaria, si borras un registro, seguramente tendrás un hueco en la numeración...

Creo que es importante tener en cuenta, al modelar un sistema, que es una mala idea usar los números de documento fiscales o contables como llave primaria. Creo que se gana mucha independencia si usas una llave totalmente artificial y luego asignas los números de documento según corresponda. Desde este punto de vista, tener un hueco en el correlativo no tiene ninguna importancia.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 10-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por jachguate
Sin importar cómo hayas obtenido el valor de la llave primaria, si borras un registro, seguramente tendrás un hueco en la numeración...
No si lo calculas a partir de Max (asegurándote de no provocar duplicados ni bloqueos); Siempre hablando del último -que es un caso especial-.

Cita:
Empezado por jachguate
Creo que es importante tener en cuenta, al modelar un sistema, que es una mala idea usar los números de documento fiscales o contables como llave primaria. Creo que se gana mucha independencia si usas una llave totalmente artificial y luego asignas los números de documento según corresponda. Desde este punto de vista, tener un hueco en el correlativo no tiene ninguna importancia.
Estoy de acuerdo contigo, pero lo que acabas de hacer es desplazar el problema. La clave primaria la calculas con un generador. OK; ¿Pero cómo calculas entonces el número de documento fiscal o contable? Es el mismo problema, pero pasado a otro campo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 10-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Neftali
No si lo calculas a partir de Max (asegurándote de no provocar duplicados ni bloqueos); Siempre hablando del último -que es un caso especial-.
Yo me refería al borrado de un registro en cualquier parte de la tabla...
Cita:
Empezado por Neftali
Estoy de acuerdo contigo, pero lo que acabas de hacer es desplazar el problema. La clave primaria la calculas con un generador. OK; ¿Pero cómo calculas entonces el número de documento fiscal o contable? Es el mismo problema, pero pasado a otro campo.
No necesariamente es el mismo problema. Hay ocasiones en que el número de documento puede calcularse en el evento before insert, cuidando que las transacciones sean muy cortas para mejorar la concurrencia. Si se requiere de alta concurrencia sin problemas de bloqueos, regularmente yo me valgo de una tabla auxiliar en la que llevo en valor del correlativo, inserto el registro y hasta después de esto pongo un bloqueo sobre la tabla del correlativo, asigno el número de documento y hago commit. El bloqueo (que podría ser un update en falso) regularmente está dentro de un ciclo que reintentará un número configurable de veces y con un tiempo de espera también configurable entre reintentos, dandole chance al usuario de cancelar en cualquier momento, de manera que la asignación se realice al final de la transacción y soporte mas o menos los típicos problemas de concurrencia...

Si al final de cuentas no puede asignarse el número, el usuario siempre tiene el chance de dejar grabado el registro y volver luego para asignarle un número, con lo que tampoco perderá trabajo...

En fin, no hay un método perfecto, pero si hay mecanismos mas o menos sofisticados para atacar este asunto...

Saludos.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 11-10-2006
fcios fcios is offline
Miembro
 
Registrado: jul 2003
Posts: 108
Poder: 21
fcios Va por buen camino
Smile

Bueno probe de hacerlo en un procedimiento almacenado en ONNEWRECORD dentro de Delphi y anda ok, Gracias a todos por las ideas aportadas
Fabian
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
¿como pasarle a un insert el valor del inputbox? Nelly Varios 1 18-01-2006 23:36:39
como hacer que una columna del dbgrid contenga un valor de un TEdit en cada celda Shidalis OOP 2 02-08-2005 12:05:35
Distinto valor de retorno en storedprocedure desde delfi y desde consola sql manolop Firebird e Interbase 4 20-07-2005 17:24:52
DBGrid. Como puedo mandar cada celda a un form distinto? gontxalo OOP 4 15-07-2005 19:41:25
Escribir 3 copias de una factura poniendo texto distinto en cada copia pacope Impresión 5 26-01-2004 08:42:47


La franja horaria es GMT +2. Ahora son las 17:52:52.


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