Ir al contenido


Foto

Código incremental, fecha y hora


  • Por favor identifícate para responder
14 respuestas en este tema

#1 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 septiembre 2011 - 05:12

saludos amigos

tengo la BD ''AGENDITA'' con la tabla CLIENTES. Ya está conectada, la veo, escribo en ella y todo....

Lo que no se es cómo puedo INSERTAR el código numerico incremental que sería el código automático para cada persona que valla agregando, además no se cómo INSERTAR la FECHA y la HORA en que se registre la persona

si alguien me puede ayudar...



GRACIAS

Archivos adjuntos


  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 septiembre 2011 - 06:08

Hola
Tienes que empezar a olvidarte del uso de IBTable y empezar a usar IBQuery.
Si quieres manejar Bases de datos la mejor manera es usar SQL.
Saludos
  • 0

#3 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 13 septiembre 2011 - 10:12

Hola
Tienes que empezar a olvidarte del uso de IBTable y empezar a usar IBQuery.
Si quieres manejar Bases de datos la mejor manera es usar SQL.
Saludos


Ok. bueno, a ver si te entendí...

hace rato tenia la conexión con un IbTable pero ya lo sustituí por un IBquery y ya la conecté..

Lo que no entiendo es cómo programar el campo CODIGO para que aparezca el número que va incrementando en +1 cuando se va agregando un registro nuevo a la tabla...
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 septiembre 2011 - 02:27

Para anotar la fecha y hora de creacion de un cliente, es mejor usar en firebird un trigger "before insert" en la tabla de clientes que fije esos dos valores usando current_date y current_time, que son valores tomados del servidor, no del cliente (eso es una ventaja si quieres que sean fiables, cambiarle la fecha al PC es demasiado facil).

Algo así:


CREATE TRIGGER CLIENTE_BI ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN 
    new.FechaAlta = current_date;
    new.HoraAlta = current_time;
END


Tambien puedes usar un datetime, en ese caso usarías: new.datetime = current_timestamp;
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 septiembre 2011 - 03:09

Para insertar el codigo incremental de cliente, lo mimso, desde el trigger de creacion:

Necesitas crear un generador con el nombre que quieras, cliente seria algo bueno:

CREATE GENERATOR CLIENTE

Y luego, en el trigger, inserta esto:

new.cliente = select Gen_ID('CLIENTE', 1) from RDB$DATABASE;

Esta sentencia te incrementa en 1 el valor del contador y te devuelve el resultado.

Si quieres consultar el valor actual del contador:

select Gen_ID('CLIENTE',0) from RDB$DATABASE

Y si quieres fijarlo en un valor concreto:

set generator 'CLIENTE' to 0

Lo unico a tener en cuenta: Si alguien intenta guardar un cliente, se le asigna numero con el contador, pero si la grabacion falla por algun motivo, el contador ya ha saltado ese numero. Te pueden quedar huecos en la numeracion si se producen grabaciones fallidas.

La otra solucion es mucho mas cutre y te puede dar problemas de varios clientes dandose de alta a la vez:

cliente = select max(e2.cliente)+1 from cliente e2

Esta solucion es MALA... la primera vez max valdra null y tendras un error, y si dos dan altas a la vez, obtienen el m,ismo contador... vamos, que mejor no usarla.
  • 0

#6 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 septiembre 2011 - 12:23

Para anotar la fecha y hora de creacion de un cliente, es mejor usar en firebird un trigger "before insert" en la tabla de clientes que fije esos dos valores usando current_date y current_time, que son valores tomados del servidor, no del cliente (eso es una ventaja si quieres que sean fiables, cambiarle la fecha al PC es demasiado facil).

Algo así:


CREATE TRIGGER CLIENTE_BI ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN 
    new.FechaAlta = current_date;
    new.HoraAlta = current_time;
END


Tambien puedes usar un datetime, en ese caso usarías: new.datetime = current_timestamp;


Cómo ejecute ese código, con un IBquery o qué ?
  • 0

#7 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 septiembre 2011 - 12:29

Para insertar el codigo incremental de cliente, lo mimso, desde el trigger de creacion:

Necesitas crear un generador con el nombre que quieras, cliente seria algo bueno:

CREATE GENERATOR CLIENTE

Y luego, en el trigger, inserta esto:

new.cliente = select Gen_ID('CLIENTE', 1) from RDB$DATABASE;

Esta sentencia te incrementa en 1 el valor del contador y te devuelve el resultado.

Si quieres consultar el valor actual del contador:

select Gen_ID('CLIENTE',0) from RDB$DATABASE

Y si quieres fijarlo en un valor concreto:

set generator 'CLIENTE' to 0

Lo unico a tener en cuenta: Si alguien intenta guardar un cliente, se le asigna numero con el contador, pero si la grabacion falla por algun motivo, el contador ya ha saltado ese numero. Te pueden quedar huecos en la numeracion si se producen grabaciones fallidas.

La otra solucion es mucho mas cutre y te puede dar problemas de varios clientes dandose de alta a la vez:

cliente = select max(e2.cliente)+1 from cliente e2

Esta solucion es MALA... la primera vez max valdra null y tendras un error, y si dos dan altas a la vez, obtienen el m,ismo contador... vamos, que mejor no usarla.


Bueno aquí me dicen qué hacer pero no cómo hacerlo...
esto se hace desde delphi o desde IBExpert o qué ??


  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 14 septiembre 2011 - 12:42

Hola.


Para insertar el codigo incremental de cliente, lo mimso, desde el trigger de creacion:

Necesitas crear un generador con el nombre que quieras, cliente seria algo bueno:

CREATE GENERATOR CLIENTE

Y luego, en el trigger, inserta esto:

new.cliente = select Gen_ID('CLIENTE', 1) from RDB$DATABASE;

Esta sentencia te incrementa en 1 el valor del contador y te devuelve el resultado.

Si quieres consultar el valor actual del contador:

select Gen_ID('CLIENTE',0) from RDB$DATABASE

Y si quieres fijarlo en un valor concreto:

set generator 'CLIENTE' to 0

Lo unico a tener en cuenta: Si alguien intenta guardar un cliente, se le asigna numero con el contador, pero si la grabacion falla por algun motivo, el contador ya ha saltado ese numero. Te pueden quedar huecos en la numeracion si se producen grabaciones fallidas.

La otra solucion es mucho mas cutre y te puede dar problemas de varios clientes dandose de alta a la vez:

cliente = select max(e2.cliente)+1 from cliente e2

Esta solucion es MALA... la primera vez max valdra null y tendras un error, y si dos dan altas a la vez, obtienen el m,ismo contador... vamos, que mejor no usarla.


Bueno aquí me dicen qué hacer pero no cómo hacerlo...
esto se hace desde delphi o desde IBExpert o qué ??


Como te han comentado, este código va en un trigger, por tanto se programa desde el IB-Expert.

Te recomiendo que leas el libro "La Cara Oculta de Delphi 6" para familiarizarte con la programación de bases de datos SQL, y conceptos como los triggers y los generadores.

Puedes descargar el libro desde la web del autor :

http://commanet.blog...e-delphi-6.html

Saludos.
  • 0

#9 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 14 septiembre 2011 - 01:56

Hola
Coloca la BD y el programa aqui, a ver si lo reviso.
Saludos
  • 0

#10 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 septiembre 2011 - 01:57

Hola.



Para insertar el codigo incremental de cliente, lo mimso, desde el trigger de creacion:

Necesitas crear un generador con el nombre que quieras, cliente seria algo bueno:

CREATE GENERATOR CLIENTE

Y luego, en el trigger, inserta esto:

new.cliente = select Gen_ID('CLIENTE', 1) from RDB$DATABASE;

Esta sentencia te incrementa en 1 el valor del contador y te devuelve el resultado.

Si quieres consultar el valor actual del contador:

select Gen_ID('CLIENTE',0) from RDB$DATABASE

Y si quieres fijarlo en un valor concreto:

set generator 'CLIENTE' to 0

Lo unico a tener en cuenta: Si alguien intenta guardar un cliente, se le asigna numero con el contador, pero si la grabacion falla por algun motivo, el contador ya ha saltado ese numero. Te pueden quedar huecos en la numeracion si se producen grabaciones fallidas.

La otra solucion es mucho mas cutre y te puede dar problemas de varios clientes dandose de alta a la vez:

cliente = select max(e2.cliente)+1 from cliente e2

Esta solucion es MALA... la primera vez max valdra null y tendras un error, y si dos dan altas a la vez, obtienen el m,ismo contador... vamos, que mejor no usarla.


Bueno aquí me dicen qué hacer pero no cómo hacerlo...
esto se hace desde delphi o desde IBExpert o qué ??


Como te han comentado, este código va en un trigger, por tanto se programa desde el IB-Expert.

Te recomiendo que leas el libro "La Cara Oculta de Delphi 6" para familiarizarte con la programación de bases de datos SQL, y conceptos como los triggers y los generadores.

Puedes descargar el libro desde la web del autor :

http://commanet.blog...e-delphi-6.html

Saludos.


Sí, lo estoy leyendo amigo
  • 0

#11 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 14 septiembre 2011 - 03:34

Hola
El codigo que propone Sergio para usar un gatito me parece muy buena y simple.
Como se hace?.
1- Se abre IBexpert.
2- Se abre la tabla que tienes.
3- En la parte de abajo de los datos esta uno que se llama (triggers)


Aqui:
Posted Image


Seguidamente con click derecho saldra una panatallita en donde estaran los tipos, asi:
Posted Image


Presionalo y te saldrá otra pantalla grande a la derecha, (como esta) donde se especifican los datos del gatito, asi:
Posted Image


Ahi colocaras los datos que necesitas para que el gatito funcione.
En tu caso tendrás que poner el nombre de la tabla que tienes.
En el código escribe la palabra (new.) y te saldrá el campo de la fecha y la hora igual que el ejemplo solo que con tus datos.
Una vez hecho todo presiona el botón para crear el tigre y listo.


Si me falto algo decidlo que nunca he hecho un gatito de estos. :D
Saludos


  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 septiembre 2011 - 03:54

Te lo has currado, Caral, muy bien explicado!

Si te fijas, en las opciones de creacion del trigger -gatito- estas "copiando" esta primera linea mia:

CREATE TRIGGER CLIENTE_BI ACTIVE BEFORE INSERT POSITION 0

Luego, en el cuerpo del trigger, ya te biene puesto esto otro:

AS
BEGIN 

END

Asi que solo te resta añadir, donde pone /* Trigger text */ tu código, que podria ser este:

    new.cliente_id = select Gen_ID('CLIENTE',0) from RDB$DATABASE
    new.FechaAlta = current_date;
    new.HoraAlta = current_time;

La idea es que new representa al nuevo record siendo grabado, y puedes manipular los valores de sus campos previo a la grabacion en si como mejor veas, en este caso dandole valor desde un generado autoincremental, o copiandole la fecha y hora del sistema.

Sobre la primera de las lineas, y asi de memoria, no se si te dara un error, quizas la forma correcta sea asi:

    select Gen_ID('CLIENTE',0) from RDB$DATABASE into new.cliente_id

Prueba de esta segunda forma mejor, creo que es la correcta.

Grabas, el trigger y zas, cada vez que haya un alta tu no te preocupas del id ni de las fechas.

En mi caso, yo no lo hago exactamente así, la llamada al generador para que me de el id la hago en el beforepost em delphi (ejecutando la misma select) para asi poder quedarme ese id en una variable y mostrarla al final, algo como "Guardado con exito con el id de cliente 38", pero si ese id no te es relevante, puedes dejarlo dentro del trigger.

  • 0

#13 lsedr

lsedr

    Advanced Member

  • Miembros
  • PipPipPip
  • 272 mensajes

Escrito 14 septiembre 2011 - 04:38

entonces con un solo Trigger me resuelve el problema del numero Incremental y Fecha y Hora cada vez que se haga un nuevo registro ??

probando el código .......

  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 septiembre 2011 - 06:54

Antes de que intentes pegarte una corrida a la velocidad de la luz.... Te pregunto ¿Ya leíste algo de lo que se dijo aquí? Concretamente me refiero a los conceptos de Generadores y Triggers o Disparadores.


Lo fundamental aquí es que comprendas que son, y no que te lo aventemos a solucionarte así como así... porque de seguir este ritmo, luego empezarás preguntando que es un SP, y etc. Tomemos al toro por los cuernos. Nuestro toro del hilo es Firebird... y para aprender a domarlo existe amplísima documentación que es PRIORIDAD Y FUNDAMENTAL leer.


Lo digo con respeto; te sientas a leer por favor. No leas de a puchitos, a cuenta gotas... hay que leerlo bien, con más profundidad, y tranquilo. ¡NADIE DIJO QUE ESTO SEA FÁCIL Y RAPIDO! Yo diría que aprender bien de programación lleva AÑOS, y tu de seguir así te seguirás dando trompezones.


No te puedo pedir ni decir que vengas sabido... ¡Porque nadie nace sabiendo! Pero hay cosas FUNDAMENTALES que son muy necesarias y esas son justamente el tener un primer contacto con la documentación y luego probar... tu haces al revés ¡te mandas a probar, y luego preguntar!


Lo que estás consiguiendo es que terminemos haciendo doble trabajo... porque indirectamente nos pones en la posición de generarte un manual completo para cada duda que te surje... ¡cuando ya existe documentación!


Será en inglés, y otro poco en español, pero nos guste o no... hay que gastar cejas en leerlo, y leerlo bien.


Invito a los demás, a hacer ese mismo llamado. ¡Lee Isedr!  ¡LEE!


Saludos,
  • 0

#15 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 14 septiembre 2011 - 07:26

Invito a los demás, a hacer ese mismo llamado. ¡Lee Isedr!  ¡LEE!



Hago eco al llamado de Delphius, amigo Isedr, si te tomas en serio la lectura de "La cara oculta de Delphi 6", como te lo hemos recomendado varias veces, con toda seguridad aclararías muchas dudas, pues es un libro muy bueno, de momento para evitarte confusiones te digo que en los capítulos en los que se  hace referencia a INTERBASE aplican perfectamente para FIREBIRD.


Saludos y ánimo.


  • 0




IP.Board spam blocked by CleanTalk.