Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Trigger con resta de dos campos

Estas en el tema de Trigger con resta de dos campos en el foro de Oracle en Foros del Web. Hola, Es la primera vez que utilizo triggers, tengo que hacer uno que cada vez que se modifique un campo numerico en donde hay un ...
  #1 (permalink)  
Antiguo 04/03/2013, 13:22
 
Fecha de Ingreso: febrero-2011
Mensajes: 22
Antigüedad: 13 años, 10 meses
Puntos: 0
Pregunta Trigger con resta de dos campos

Hola,

Es la primera vez que utilizo triggers, tengo que hacer uno que cada vez que se modifique un campo numerico en donde hay un numero de horas se ejecute el trigger y haga la resta entre el campo horas modificado y otro campo que son las horas restantes.

ejemplo:

horashechas=0
horasrestantes=317

Cuando haga un update donde modifique horashechas se tiene que ejecutar el trigger haciendo el calculo horasrestantes=(horasrestantes-horashechas).

A ver si alguien me puede ayudar, muchas gracias!!
  #2 (permalink)  
Antiguo 04/03/2013, 13:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Trigger con resta de dos campos

El trigger en sí no es muy complejo, pero ¿para qué guardas un dato calculable?
Es un dato que puedes verificar en la consulta donde necesites recuperar esa cuenta. ¿QUé sentido tiene almacenarlo?
Pregunto, porque una de las reglas más conocidas de las bases de datos es que no se guardan campos calculables.
- Ocupan espacio innecesario.
- Requieren rutinas de mantenimiento.
- No aportan ventajas en las consultas...
O sea, son "trash data".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/03/2013, 05:21
 
Fecha de Ingreso: febrero-2011
Mensajes: 22
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Trigger con resta de dos campos

De entrada agradecerte tu respuesta y ayuda.

Estoy de acuerdo en lo que dices, el problema es que lo tengo que hacer mediante un trigger porque se trata de un ejercicio académico que el profesor nos manda hacer de esta forma.

De manera que si supieras indicarme una idea de como hacerlo o algún sitio con ejemplos claros, porque los que he encontrado de oracle y triggers no me aclaro mucho.

Muchas gracias
  #4 (permalink)  
Antiguo 05/03/2013, 07:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Trigger con resta de dos campos

Mirá, técnicamente hablando, la cosa es extremadamente simple:
En un trigger sólo hay parámetros de entrada, y todos los parámetros son los campos del registro que se inserta, se modifica o se borra. Pero no se puede acceder a ellos en forma directa sino a través de una o dos estructuras propias de los TRIGGER. Estas estructuras son dos pseudovariables NEW (INSERT y UPDATE) y OLD (UPDATE y DELETE).
El NEW es un especie de "puntero" hacia el bloque de un registro entrante, sea nuevo como en el INSERT o actualizando como el UPDATE. En ambos casos, si alguno de los campos no está siendo enviado por la sentencia, su valor de entrada es NULL (las restricciones de NOT NULL operan diferente en los distintos DBMS).
El OLD apunta al registro que ya existe y que se está accediendo, pero dependiendo de su situación, ese registro puede ser de lectura/escritura o de sólo lectura.
¿De qué depende?
De si en TRIGGER es AFTER o BEFORE.
En otras palabras, un registro accedido por OLD no puede modificarse en un AFTER, porque para ese momento la inserción o actualización ya terminaron, ergo, es de sólo lectura.
¿Se entiende la lógica?
Entonces, para tu caso hay algunos detalles a cumplir:
1) El TRIGGER es BEFORE UPDATE.
2) Los valores a sumar o restar provienen de campos apuntados por NEW.
3) El campo a actualizar se apunta por OLD.
3) El UPDATE no debe incluir el campo a actualizar.
El código, en general contendría algo como:

Código SQL:
Ver original
  1. SET OLD.camposuma = OLD.camposuma + NEW.campo_a_sumar;

Nota final:
Realmente me asombra que un profesor haya pedido para un modelo dado un campo calculable. En las clases de BBDD I que cursé, ese ejercicio hubiera debido ser respondido como "El ejercicio no se puede resolver, porque no deben existir campos calculables."
Si el profesor Vinjoy hubiese encontrado un alumno que escribiera el código que te piden, ese alumno hubiese reprobado sin necesidad de seguir leyendo el examen... Por lo menos, porque significaría que ni prestó atención en clase.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/03/2013, 10:25
 
Fecha de Ingreso: febrero-2011
Mensajes: 22
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Trigger con resta de dos campos

Muchas gracias por la ayuda.

He estado haciendo pruebas con el trigger que comente en el foro y no consigo ningun resultado.

Si fueras tan amable de poder orientarme con el siguiente codigo me seria de gran ayuda, te paso el type y el trigger.

TYPE:

Código SQL:
Ver original
  1. CREATE OR REPLACE
  2. TYPE alumnos_t AS OBJECT(
  3. idAlumno NUMBER,
  4. nombreAlumno VARCHAR2(100),
  5. fctAlta VARCHAR2(10),
  6. horasHechas NUMBER,
  7. horasRestantes NUMBER,
  8. profesor REF profesores_t,
  9. poblacion poblaciones_t
  10. );

TRIGGER:


Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER calculo
  2. BEFORE UPDATE horasHechas ON alumnos_tab
  3. BEGIN
  4. UPDATE  alumnos_tab SET NEW.horasRestantes = OLD.horasRestantes - OLD.horasHechas
  5. END;


PD: El professor sabe menos que los alumnos... :S

Última edición por gnzsoloyo; 06/03/2013 a las 10:44
  #6 (permalink)  
Antiguo 06/03/2013, 10:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Trigger con resta de dos campos

No puedes hacer operaciones de UPDATE/INSERT/DLETE contra la misma tabla que tiene el TRIGGER.
Lo que debes hacer es recordar que ya estás posicionado en el registro a actualizar, porlo que no hay ninguna consutla que hacer en el. Hay que realizar la operación.
Probemos:
Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER calculo
  2. BEFORE UPDATE horasHechas ON alumnos_tab
  3. BEGIN
  4.     :NEW.horasRestantes := (:OLD.horasRestantes - :OLD.horasHechas);
  5. END
  6. \
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/03/2013, 12:40
 
Fecha de Ingreso: febrero-2011
Mensajes: 22
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Trigger con resta de dos campos

Muchas gracias por la ayuda gnzsoloyo!

Me ha resultado muy útil para entender el funcionamiento de los trigger!

Etiquetas: campos, resta, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:15.