Ver Mensaje Individual
  #4 (permalink)  
Antiguo 02/10/2007, 08:22
mankel
 
Fecha de Ingreso: marzo-2007
Ubicación: Celayork
Mensajes: 38
Antigüedad: 17 años, 2 meses
Puntos: 3
Re: MySQL con InnoDB

Foreros, pues despues de mucho buscar encontre lo que parece ser la solución al error que marcaba:
Código:
OUT or INOUT argument 8 for routine sglamesa.ProcInsCta is not a variable or NEW pseudo-variable in BEFORE trigger
No entindi porque devuelve ese error, pero esto fue lo que hice siguiendo un ejemplo que encontre en el foro oficial de mysql:

Agregue un nuevo SP, el cual seria llamado desde la aplicacion VB, este solamente recibiria los valores que serian evaluados y posteriormente grabados en la BD si todo salia bien. Este SP a su vez llamaba a otro SP al cual enviaba esos mismos parametros y ademas agregaba un parametro INOUT (la cual era la que marcaba error):

Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcGetMsg`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9))
BEGIN
	DECLARE a INT DEFAULT 0;
	CALL ProcInsCta(numcta, nombcta, tcuenta, ctamayor, fechacuenta, clase, subcta, a);
	SELECT a;
END

Aca esta el otro SP que llama ProcGetMsg:

Código:
CREATE DEFINER=`root`@`localhost` PROCEDURE `ProcInsCta`(numcta char(9), nombcta varchar(90), tcuenta char(1), ctamayor int, fechacuenta char(10), clase char(1), subcta char(9), INOUT mensaje int(1))
BEGIN
        #declare mensaje int;
        set @numerocta= NULL, @subctade= NULL, @cmayscta=NULL;
	set autocommit=0;
	start transaction WITH CONSISTENT SNAPSHOT;
	select cuenta into @numerocta from `cont-cuenta` where `cuenta`=numcta;
	if @numerocta = numcta then
		#select 'La cuenta que intenta agregar ya existe';
                set mensaje = 1;
	else
		insert into `cont-cuenta` (cuenta,nombre,tipo,mayor,fechalta,clase) values (numcta,nombcta,tcuenta,ctamayor,fechacuenta,clase);
		show count(*) errors;
		if @@error_count > 0 then
			rollback;
                        set mensaje = 2;
		else
			if ctamayor<>1 then
				select cuenta, mayor into @subctade, @cmayscta from `cont-cuenta` where `cuenta`=subcta;
				if @subctade <> subcta then
					rollback;
                                        set mensaje = 3;
				else
					if @cmayscta <= ctamayor then
						insert into `cont-ctasoc` (ctasup,subcta) values (subcta,numcta);
						show count(*) errors;
						if @@error_count > 0 then
							rollback;
							#select 'Error al insertar registro en cont-ctasoc. No se agrego el registro';
                                                        set mensaje = 4;
						else
							commit;
							#select 'El registro se ha guardado con exito. cont-cuenta y cont-ctasoc';
                                                        set mensaje = 5;
						end if;
					else
						rollback;
						#select 'La cuenta superior no puede ser de menor rango que la cuenta que intenta agregar';
                                                set mensaje = 6;
					end if; ########
				end if;
			else
				commit;
				#select 'El registro se ha guardado con exito. cont-cuenta';
                                set mensaje = 7;
			end if;
		end if;
	end if;
END
Sorpresivamente ya no me marca error, y obviamente ya graba en la BD si los valores son validos.

Ahora lo que si me gustaria saber, es como demonios rescato ese valor de "a" que esta en el SP ProcGetMsg y lo tome VB... alguien sabe?

Se supone que en consola, esta instruccion despliega en pantalla el valor de la variable "a":

Código:
SELECT a;
Como rescato ese valor y vaya a VB????

Gracias