Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear campo consecutivo por medio de codigo (https://www.clubdelphi.com/foros/showthread.php?t=61321)

Elite237 04-11-2008 02:13:35

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

Caro 04-11-2008 02:35:23

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

Delphius 04-11-2008 02:36:00

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,

Elite237 04-11-2008 16:56:06

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

Elite237 04-11-2008 17:40:41

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 ; ^

Delphius 04-11-2008 17:56:48

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?:confused:

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 04-11-2008 18:07:47

Cita:

Empezado por Elite237 (Mensaje 324108)
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!:o:(
En vez de FROM debería ser FOR. Y las sentencias a ejecutar deben finalizar con punto y coma (;).
Bueno eso veo.

Saludos,


La franja horaria es GMT +2. Ahora son las 04:53:36.

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