Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema con procedimiento almacenado y disparador

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema con procedimiento almacenado y disparador Responder citando

Que tal colegas,

Tengo un problema que me parece muy raro. Les explico.

Utilizo Firebird 1.5, C++ Builder 6.0 y me conecto a la base de datos con los componentes de la paleta de Interbase.

Bien, pues resulta que me he creado un procedimiento almacenado que actualiza un registro, simpre suma un valor que paso como parametro. Este procedimiento lo utilizo en un disparador, especificamente despues de insertar un registro en otra tabla.

El problema que tengo es que si inserto el registro desde mi programa no actualiza el registro de manera correcta, siempre suma uno, en lugar del valor real del campo que me interesa de la otra tabla. Lo curioso es que si inserto desde el Administrador de Inerbase/Firebird de EMS (versión lite Wink )si me realiza bien los cálculos, es decir, suma el valor real de la otra tabla.

¿Alguien sabe que pueda estar pasando?, ¿necesito algun parche, o será porque utilizó los componentes de Interbase?

Por su ayuda, gracias.

Nota: El procedimiento y el disparador funcionan perfectamente, sólo si inserto desde el Administrador, pero si corro mi programa, solo suma uno.
Crying or Very sad
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Verifica el tema de las transacciones, recuerda cada vez que usas el EMS, y realizas, una operacion, le pones el boton, aplicar Transaccion, bien, por ahi, debe ser el detalle..

ya que builder 6.0, no pone de manera implicita, las transacciones, debes hacerlo tu desde tu programa..

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

De hecho asi lo hago, hago el commit de manera explicita en mi programa y me graba bien los cambios...y de hecho se ejecuta el disparador... solo que como comento en el texto original, no toma el valor real del registro recien insertado, toma siempre el valor 1, y ese valor es el que suma en el disparador.

Ej. si en mi registro que acabo de insertar cantidad = 5, este valor lo "debe" de sumar en otra tabla (esto a traves del procedimiento y disparador).

Lo anterior lo hace de manera correcta si lo inserto desde el Administrador EMS, pero, si lo inserto desde mi programa falla, es decir, en lugar de sumar 5 suma 1.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

sin codigo, es algo dificil, lo entiendo asi,
quieres que al insertar un registro dentro de una tabla, los valores que has puesto, te sirvan para llenar otra tabla, (

bien
insertas en la primera tabla, no estoy muy seguro como lo haces.. pero me imagino lo siguiente

1.- llenas los campos de la tabla
2.- el campo Cantidad, es el que te interesa digamoslo asi.
despues del post() a tu tabla 1
Código:
TuTabla1->Post()
int cant_temp = TuTabla1Cantidad->Value;

te vas a la tabla 2 y lo grabas

Código:
TuTabla2Cantidad2->Value = cant_temp;

quedado algo asi

Código:
TuTabla1->Post()
int cant_temp = TuTabla1Cantidad->Value;

TuTabla2->Open();// es un decir
TuTabla2Cantidad2->Value = cant_temp;
TuTabla2->Post();

TuTransaccion->CommitRetaining();  // aplicamos la trasaccion global





es algo asi lo que haces o estoy perdido, si puedes poner el codigo..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar, va el código

//Procedimiento que actualiza inventario
Código:

CREATE PROCEDURE ACTUALIZAINVENTARIO (
      CLAVE INTEGER,
      CANTIDAD INTEGER )
AS
BEGIN
         update Articulos
         set existencia = existencia + :CANTIDAD
         where cveArticulo = :CLAVE;
END

// Dispador que llama al procedimiento anterior para actualizar
// eL inventario
// Se ejecuta despues de insertar un registro en la tabla de detalles

CREATE TRIGGER ACTINV FOR DETALLES ACTIVE
AFTER INSERT POSITION 1
AS
     declare variable Valor integer;
BEGIN
               Valor = New.Cantidad //Este es el valor que me interesa
                                               // utilizar para actualizar el inventario
               // ejecuto el procedimiento
              execute procedure ACTUALIZAINVENTARIO
                               New.CveArticulo, :Valor;
                         
END



Como puedes observar lo que intento es que el server se encargue de actualizar el inventario, el procedimiento y disparador funcionan perfectamente sin inserto registros desde EMS, pero si lo hago desde mi programa, la variable NEW.CANTIDAD siempre toma el valor 1 y al ejectutarse el procedeimiento ese valor es el que suma y no entiendo que pasa.


La otra opción es la que tu me comentas, realizar todos los cambios y actualizaciones desde mi programa, pero lo que deseo es dejar parte de la carga del trabajo al server y para eso sirven los procedimientos almacenados y los disparadores.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.