PDA

Ver la Versión Completa : Trigger como lo armo?


marceloalegre
10-06-2005, 14:25:55
Buenos dias, en este caso les molesto por lo siguiente:
tengo que armar un trigger antes que se active al incertar, pero tengo muchas dudas, les comento el caso, considero que es simple para los que tienen un poco de experiencia:

nombre de la tabla: autorizacion
campos: nrodeauth (varchar) , fechahoradesde fechahorahasta (timestamp)

el usuario ingresaria el nrodeauth y el trigger tendria que poner la fecha desde en ese momento y ponerle fechahasta al anterior al vencer. ej:

usuario ingresa el 1:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005

despues el usuario ingresa el 2 al otro dia:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005 02/01/2005
2 02/01/2005

O sea me ponga la fechahora hasta la que tuvo vigencia y la fecha desde de la que esta actualmente en vigencia.
pongo solo la fecha en el ejemplo pero es fechahora ya que declare como timestap.

alguien me puede ayudar a contruir este trigger? gracias!!!

(Edite el mensaje asi saco las Mayusculas)

Ing Harry
10-06-2005, 16:14:40
Seria bueno saber

El manejador de BD que estas usando.

Y si el lenguaje que estas manejando es delphi o cualquier otro.

Estamos en contacto.

marceloalegre
10-06-2005, 16:38:29
El lenguaje es dephi obviamente... y uso Interbase... lo que necesito es un before insert,,, que haga eso, no se como armarlo.... HELPPP!

jachguate
10-06-2005, 16:53:36
Hola kanvictor.

Creo que ya tenes la edad suficiente en los foros para respetar totalmente a la guia de estilo (estas gritando en el mensaje original). Además, también es momento que uses las etiquetas. Tu mensaje original es imposible de entender debido a la ausencia de la etiqueta [ code ] en donde has querido formatear en columnas el resultado.

Te pido que edites el mensaje original para cambiar estas cosas.

No está de mas que también leas el hilo de la calidad de las preguntas.

Hasta luego.

marceloalegre
10-06-2005, 17:04:08
es cierto, lo que dices, pero en este mensaje no escribi sintaxis sql, sino solo mi problematica, ya me alertaron de esto que me comentas igualemente, sobre el tema de las mayusculas no estaba informado que estaba gritando :) jajaj soy demasiado tranquilo para gritar por un problemilla de sql igual gracias por tu observacion...

Mas alla de esto sigo sin poder resolver mi consulta, espero que alguien me pueda dar una mano en esto...
Gracias!!

jachguate
10-06-2005, 17:50:28
pero en este mensaje no escribi sintaxis sql, sino solo mi problematica

Cuando te sugerí el uso de la etiqueta code lo hice para que se mantenga el formato de las columnas (creí decirlo claramente).

Aqui te muestro la diferencia:

Sin etiqueta code:
usuario ingresa el 1:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005

despues el usuario ingresa el 2 al otro dia:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005 02/01/2005
2 02/01/2005

Con etiqueta code:

usuario ingresa el 1:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005

despues el usuario ingresa el 2 al otro dia:
nrodeauth fechahoradesde fechahorahasta
1 01/01/2005 02/01/2005
2 02/01/2005


¿notas la diferencia?
Mas fácil de entender, no?

sobre el tema de las mayusculas no estaba informado que estaba gritando
sesenta y pico de mensajes sin leer la guia de estilo!! :confused: Creo que estas compitiendo por el record...
espero que alguien me pueda dar una mano en esto...

De eso mismo se trata!! (espero que hayas leido el hilo que te recomendé).

Ahora, y para que no te vayas simplemente regañado.. :D

El trigger tendrá que ser algo asi (lo siento si hay errores de sintaxis, pero no tengo tiempo para comprobarlo ahora).


Create trigger aut_asigna_fechahasta Active
After insert on autorizacion
position 50
AS

Begin
Update Autorizacion
set fechahorahasta = :new.fechahoradesde
where nordeauth = (Select max(nrodeauth)
from Autorizacion
where nrodeauth < :new.nrodeauth);
end;


Hasta luego.

;)
end;

marceloalegre
10-06-2005, 17:58:56
jajaj! si creo que gane el record! mil disculpas ante todo, ahora esta todo bien claro!, y gracias por ayudarme!!

marceloalegre
10-06-2005, 18:32:58
Volviendo al tema del trigger (y ahora escribiendo con propiedad :) )

Quizas no fui muy claro, estaba mirando el trigger que posteaste jachguate pero no se ajustaria a lo que ando necesitando, voy a explicarme un poco mas como seria:

En la tabla manejo 3 campos como comente anteriormente:
campos: nrodeauth (varchar) , fechahoradesde,fechahorahasta (timestamp)
de la tabla autorizacion

yo necesito que cuando se cargue un nuevo nrodeauth , el trigger actualize fechahorahasta del que no la tiene porque estaba en vigencia y genere siempre desde la hora del sistema la fechahoradesde para el nuevo nrodeauth, muestro con varios ejemplos

El usuario ingresa por primera vez un nrodeauth : (ingresa solo un 1 en nrodeauth) y el trigger que ponga la fechahoradesde de tipo timestamp, no recuerdo como queda el formato exactamente pero escribo fecha y hora, validos para el ejemplo


NRODEAUTH FECHAHORADESDE FECHAHORAHASTA
1 8/06/200513:25


ahora el usuario igresa otro dato: un 2 de nrodeauth


NRODEAUTH FECHAHORADESDE FECHAHORAHASTA
1 8/06/200513:25 9/06/200513:28
2 9/06/200513:28


ahora el usuario ingresa un 3 de nrodeauth:


NRODEAUTH FECHAHORADESDE FECHAHORAHASTA
1 8/06/200513:25 9/06/200513:28
2 9/06/200513:28 10/06/200512:26
3 10/06/200512:26


En resumen quiero que el trigger actualize la fecha hora hasta solo del que no la tenia, que siempre va a ser uno, el ultimo y me genere una nueva fechahoradesde cuando pongo mi nro de auth, espero haber sido un poco mas claro esta vez :confused: , Muchas Gracias!! .

jachguate
10-06-2005, 19:24:00
espero haber sido un poco mas claro esta vez :confused: ,

si que lo has sido!!!

habia olvidado la parte de la nueva hora en automático. El trigger anterior sigue siendo válido, habrá que añadir el siguiente:


Create trigger aut_asigna_fechahasta Active
before insert on autorizacion
position 50
AS

Begin
:new.fechahoradesde := 'now';
end;


Lo dejo así porque tengo por regla general usar los triggers before para todo lo que valide/modifique los datos del registro que se inserta, y todos los triggers after para realizar cualquier actualización necesaria a partir de dicho registro.

Hasta luego.

;)

marceloalegre
10-06-2005, 20:11:23
ahora sii ;) lo unico que me faltaria saber porque desconosco es el :

position 50


que no se que hace! :rolleyes: Y MUCHAS GRACIAS!!

jachguate
10-06-2005, 20:32:01
ese parámetro que te permite controlar el orden de ejecución de los triggers. Si no lo especificas, creo que el motor le asigna 0. Asi, cuando se inserta un registro, primero se ejecuta el 0, luego el 1, luego el 2, etc.

Si hay varios triggers con la misma posición, el orden de ejecución entre ellos es aleatorio.

Te recomiendo descargar y leer algo de la documentación del motor, si planeas trabajar en serio con él.

Hasta luego.

;)

maeyanes
10-06-2005, 20:42:40
El position 50 es solo para indicar la prioridad del trigger (por decirlo de alguna forma).

Si tienes 2 trigger AfterInsert para una tabla, puede indicarle a Interbase en que orden quieres que se ejecuten usando position.


Saludos.

maeyanes
10-06-2005, 20:44:35
Si hay varios triggers con la misma posición, el orden de ejecución entre ellos es aleatorio.


Corrigiendote un poco luego de leer la documentación... jejeje

Si dos o más triggers tienen el mismo número de posición, estos se ejecutan en orden alfabético de acuerdo a su nombre...



Saludos...



P.D.: Por cierto, contestaste antes que yo lo de posición... :P

jachguate
10-06-2005, 22:10:39
Si dos o más triggers tienen el mismo número de posición, estos se ejecutan en orden alfabético de acuerdo a su nombre...

Definitivamente esto es nuevo para mi. Yo me quedé en esto:

The optional sequence indicator, POSITION number, specifies the order in which the trigger fires in relation to other triggers on the same table and event. number can be any integer between zero and 32,767. The default is zero. Lower-numbered triggers fire first. Multiple triggers can have the same position number; they will fire in random order.

Que está en la página 182 del Data Definition Guide.

¿donde leiste lo nuevo?

hasta luego.

;)

Crandel
10-06-2005, 23:26:21
La instrucción position indica el orden en el cual se va a dispara este trigger en el caso que exista mas de uno.

un número más bajo indica prioridad más alta. Si no recuerdo mal, la más alta es el 1.

jachguate
11-06-2005, 00:15:53
Si no recuerdo mal, la más alta es el 1.

Creo que en esta ocasión si recordas mal...

Tal como dice mi post anterior, en la cita de la documentación:

can be any integer between zero and 32,767


Hasta luego.

;)

Crandel
11-06-2005, 00:33:46
bueno ... cero ... uno ... estan cerquita :D

oops ... me acabo de dar cuenta que cuando conteste, no leí toda la segunda pagina (tengo configurado 10 post por pagina).

jachguate
11-06-2005, 01:17:59
bueno ... cero ... uno ... estan cerquita :D

Esto no siempre es cierto... no es lo mismo tener
0 millones de dolares que
1 millón de dolares

0 demandas judiciales que
1 demanda judicial por 1 millón de dolares...

etc, etc.. .:D

Hasta luego.

;)

maeyanes
11-06-2005, 20:11:57
¿donde leiste lo nuevo?

hasta luego.

;)

Bueno, yo uso la versión 7 del Interbase, tal vez de la 6 a la 7 hubo ese cambio en la forma en que se disparan los triggers cuando tienen la misma posición... ;)


Saludos...