Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Crear campo consecutivo por medio de codigo

Tengo un problema acerca de como generar un campo consecutivo por medio de codigo.Lo que quiero hacer es que dependiendo de las veces que el usuario presente un cuestionario se incremente un campo.Por ejemplo:

cuestionario para vigilante..presentado el 28 de septiembre..campo consecutivo=1
Cuestionario para vigilante..presentado el 23 de octubre......campo consecutivo=2
cuestionario para vigilante..presentado el 3 de noviembre...campo consecutivo=3

Para despues guardarlo en la bd.Espero haberme dado a entender
Responder Con Cita
  #2  
Antiguo 04-11-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Elite237, puedes hacer que tu campo sea autoincremental, así no haces nada por codigo, ya que se generara solito.

Ahora otra forma sería que hicieras una consulta obteniendo el Max de tu campo.

Código Delphi [-]
 Query.Close;
 Query.Text := 'Select Max(CampoConsecutivo)+1 AS NUM From Tabla'; 
 Query.Open;
 
 NumeroSig := Query.FieldByName('NUM').AsInteger;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 04-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Elite237,
Déjame ver si comprendo tu problema. ¿Deseas que cada vez que alguien presente su cuestionario se actualice algún campo (de alguna tabla) para llevar el registro de los test que ha realizado?

Si es eso, lo mejor sería crear un trigger AFTER INSERT. Según recuerdo, tu haces uso de Firebird. Un trigger podría ser así:
Código SQL [-]
SET TERM ^ ;

CREATE TRIGGER ACTUALIZA_CUESTIONARIOS FROM PRESENTACIONES
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
   UPDATE HISTORICO_CUESTIONARIOS SET CANTIDAD = CANTIDAD + 1 WHERE CODIGO = NEW.CODIGO
END ^

SET TERM ; ^

La explicación es como sigue:
1. ACTUALIZA_CUESTIONARIOS es el nombre del trigger.
2. PRESENTACIONES es el nombre de la tabla en donde se procede a llevar el registro de cada presentación. De este modo cada ver que se inserte un nuevo registro en esta tabla (por ello el AFERT INSERT), se dispara el trigger ejecutando las sentencias correspondiente.
3. Supongamos que existe una tabla HISTORICO_CUETIONARIOS en donde se lleva el manejo de algunas estadísticas, Entre sus campos existe uno llamado CANTIDAD, y se lo emplea para llevar la cuenta de cuestionarios. Por ello, se lanza una instrucción UPDATE que incremente dicho valor.
4. Como nos estamos refiriendo a una persona en particular, debemos indicar que sólo aplice dicha actualización a un registro en particular. Por ello se añade la cláusula WHERE indicandole que sólo aplique los cambios a aquel registro cuyo campo CODIGO sea igual al del campo CODIGO del registro previamente insertado en la tabla PRESENTACIONES. Por ello, en el WHERE viene acompañado un NEW.CODIGO.


Si no es eso lo que buscas, por favor te pediría que explicases más profundamente el problema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 04-11-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Asi es delphius, acertaste en lo que pretendo hacer.El guardado de los registros se haria asi:

evaluacion version usuario fecha resultado consecutivo
vigilante 1 pedro 3/11/2008 45 1


Del cuestionario, yo solo guardo lo que tengo en 3 combobox..fecha,usuario,evaluacion...el resultado lo guardo con una suma de todos los valores de cada respuesta que selecciono el usuario.Y el consecutivo es lo que tengo duda de como guardarlo, ya que tengo que checar si es el mismo usuario el que esta contestando, pues que genere en el campo el numero consecutivo,osea 2. Y en caso de que lo vuelva a presentar quedaria asi:

evaluacion version usuario fecha resultado consecutivo
vigilante 1 pedro 4/11/2008 50 2

Uso Firebird,entonces Delphius con el trigger que me dices ya quedaria resuelto lo que acabo de explicar?Espero haberme dado a entender
Responder Con Cita
  #5  
Antiguo 04-11-2008
Elite237 Elite237 is offline
Miembro
 
Registrado: jul 2007
Posts: 162
Poder: 17
Elite237 Va por buen camino
Error en Trigger

Acaco de tratar de implementar el trigger en firebird pero me manda el siguiente error:
Código SQL [-]
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, char 1.
SET.

el trigger lo deje asi:
Código SQL [-]
SET TERM ^ ;
CREATE TRIGGER ACTUALIZA_CUESTIONARIOS FROM TRESULTADOS
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
   UPDATE TRESULTADOS SET RESU_CONSECUTIVO = RESU_CONSECUTIVO + 1 WHERE RESU_USUARIO = NEW.RESU_USUARIO
END ^
SET TERM ; ^
Responder Con Cita
  #6  
Antiguo 04-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Bueno Elite237, un trigger como ese es lo que necesitarías.

Por otro lado, creo que sería mejor que analizaras bien la estructura y el fin de uso de la tabla que mencionas.

Por el modo en como describes tu situación, me da a entender que pisas los datos. ¿Es eso lo que buscas? O por el contrario, necesitas llevar un registro de las presentaciones. ¿Entiendes a lo que me refiero?

Digamos que una persona presente su examen o cuestionario hoy. En forma breve veríamos algo así:
IDPersona - Fecha - CONSECUTIVO
1 - 04/11/2008 - 1

Hagamos de cuenta que tras una semana vuelve a presentar el examen. Si pisamos los datos vemos esto:
1 - 11/11/2008 - 2

Uno lee el campo CONSECUTIVO y se pregunta: "Veo que hizo el exámen dos veces, pero cuando y que resultado obtuvo en la primera oportunidad?"

Entiendes a lo que quiero llegar: ¿Necesitas pisar los datos, o llevar un histórico de cada vez que alguien presente un examen?

Y aquí, hay otra cuestión: si tenemos el histórico, aquel campo CONSECUTIVO está demás. ¿Porqué? Porque Este valor puede obtenerse consultando todos los exámenes de la persona.
A menos de que CONSECUTIVO tenga otro significado (y uso), es muy posible que esté demás.

Deberías analizar objetivamente el diseño de tus tablas. Hay algo allí que me está indicando que tu diseño no responde a tus objetivos. Además estoy viendo que guardas el "Nombre" de la persona, ¿No sería adecuado guardar el ID que corresponde a dicha persona?

Y otra pregunta interesante ¿Cómo sabes a que examen o tipo de examen, y sus respuestas ha dado la persona en cada una de sus presentaciones?
No veo como de dicha tabla, con dichos campos puedas recuperar dicha información.

Analiza bien el tema Elite237, hay algo que se te está escapando.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 04-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Elite237 Ver Mensaje
Acaco de tratar de implementar el trigger en firebird pero me manda el siguiente error:
Código SQL [-]Dynamic SQL Error. SQL error code = -104. Token unknown - line 5, char 1. SET.


el trigger lo deje asi:
Código SQL [-]SET TERM ^ ; CREATE TRIGGER ACTUALIZA_CUESTIONARIOS FROM TRESULTADOS ACTIVE AFTER INSERT POSITION 0 AS BEGIN UPDATE TRESULTADOS SET RESU_CONSECUTIVO = RESU_CONSECUTIVO + 1 WHERE RESU_USUARIO = NEW.RESU_USUARIO END ^ SET TERM ; ^
¡Ups! ¡Grave error mio!
En vez de FROM debería ser FOR. Y las sentencias a ejecutar deben finalizar con punto y coma (;).
Bueno eso veo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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
crear un scrip desde codigo con campo blob Lupita Firebird e Interbase 7 20-07-2007 21:41:55
Crear componente por medio de codigo Markoz Firebird e Interbase 2 24-05-2006 21:46:13
Como crear un campo que sea un consecutivo? JuanErasmo Firebird e Interbase 5 10-11-2005 13:45:34
Como crear un consecutivo. JCarlos Varios 1 03-05-2005 22:31:34
Como crear un campo en una tabla a traves de código URBANO Conexión con bases de datos 1 16-03-2004 10:39:06


La franja horaria es GMT +2. Ahora son las 16:45:29.


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