 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 09 Jun, 2005 10:17 pm Asunto: Problema con procedimiento almacenado y disparador |
|
|
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 )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.
 _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 10 Jun, 2005 2:23 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Vie 10 Jun, 2005 3:59 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 11 Jun, 2005 2:00 pm Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Mar 14 Jun, 2005 4:59 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|