cancel
Showing results for 
Search instead for 
Did you mean: 

Ayuda Store Procedure

Former Member
0 Kudos

Estimados:

Me parece haber encontrado un bug, estoy con SBO8.8 PL20 - SQL 2008; y necesito poner un control que no se pueda cambie la Condicion de Pago de un SN, el SP que utilizo es el siguiente:


IF @object_type='2' AND @transaction_type='U'
BEGIN

	DECLARE @G1 AS VARCHAR(10)
	SET @G1 = (SELECT TOP 1 T1.GroupNum FROM ACRD T1	WHERE T1.CardCode = @list_of_cols_val_tab_del)
	
	DECLARE @G2 AS VARCHAR(10)
	SET @G2 = (SELECT T2.GroupNum FROM OCRD T2	WHERE T2.CardCode = @list_of_cols_val_tab_del)

	IF @G1 != @G2
		BEGIN
			set @error=1
			set @error_message='NO SE PUEDE ACTUALIZAR LA CONDICION DE PAGO' --@G1 + ' Diferente '+@G2
		END
END

El problema se presenta cuando es un SN que no tuvo ninguna actualización, y al realizar el cambio cuando leahces clic en 'Actualizar' sale el error, pero si le das clic por segunda vez te deja actualizar.

Comente la condicion para ver el error directamente y el problema es que no puedo guardar en una variable el valor anterior, a la segunda vez de actualizar me jala el nuevo valor.

Por favor si me podrían ayudar al respecto o que solucion darle, hagan la prueba; o en todo caso si consideran que deba reportar a SAP.

Gracias y Saludos,

Accepted Solutions (0)

Answers (5)

Answers (5)

felipe_loyolarodriguez
Active Contributor
0 Kudos

Lo que hice fue lo siguiente:

1.- Cree una base de datos nueva llamada SBOTemp

2.- Dentro de la SBOTemp, cree una tabla llamada SBO_ACRD_TMP con los campos de los datos maestros de los socios de negocios (cardcode, cardname, lictradnum...etc).

3.- Escribí un codigo en el TN, para que cada vez que crean un SN nuevo, se inserte en la base y tablas recien creadas y para que cuando lo modifiquen compare desde la base de datos auxiliar y no desde la ACRD en la productiva.

Este es el codigo del TN

IF @object_type=2 AND @transaction_type='A'

BEGIN

          DECLARE

                    @LogI                    SMALLINT,

                    @CardCode          NVARCHAR(15),

                    @CardName          NVARCHAR(100),

                    @LicTradNum          NVARCHAR(32)

 

          SELECT

                    @LogI =1,

                    @CardCode=T0.CardCode,

                    @CardName=T0.CardName,

                    @LicTradNum=T0.LicTradNum

 

          FROM OCRD T0

          WHERE T0.CardCode=@list_of_cols_val_tab_del

 

          IF NOT EXISTS          (

                    SELECT 'X'

                    FROM SBOTemp.dbo.SBO_ACRD_TMP A0

                    WHERE A0.LogInstanc=@LogI AND A0.CardCode=@CardCode AND A0.CardName=@CardName AND A0.LicTradNum=@LicTradNum

                    )

          BEGIN

                    INSERT INTO SBOTemp.dbo.SBO_ACRD_TMP

                    VALUES          (

                              @LogI,

                              @CardCode,

                              @CardName,

                              @LicTradNum

                    )

          END

END

 

IF @object_type=2 AND @transaction_type IN ('U')

BEGIN

          IF (SELECT T0.CardName FROM OCRD T0 WHERE T0.CardCode=@list_of_cols_val_tab_del) != (SELECT B0.CardName FROM SBOTemp.dbo.SBO_ACRD_TMP B0 WHERE B0.CardCode=@list_of_cols_val_tab_del)

          BEGIN

                    SELECT @error=-2, @error_message='No puede cambiar la razón social'

          END

END

Y este es el print de la DB auxiliar

Saludos

Felipe.

Former Member
0 Kudos

hice paso por paso lo que me dijiste... pero no me funciona..... igual agradezco la ayuda hasta ahora.....pero si logras decirme en que puedo estar fallando te lo agradeceria.... si es q debo colocar algo adicional a lo q me dijiste

felipe_loyolarodriguez
Active Contributor
0 Kudos

Reproduje el error, y puede ser por los campos que agregaste en la tabla SBO_ACRD_TMP. Yo agregue la cantidad de campos que deseaba controlar que eran 2 (CardCode y LictradNum).

Cuando yo cree la tabla en la SBOTemp y la tabla SBO_ACRD_TMP, lo hize así:

IF EXISTS(

SELECT *

FROM master..sysdatabases

WHERE name = 'SBOTemp'

)

DROP DATABASE SBOTemp

GO

CREATE DATABASE SBOTemp

COLLATE SQL_Latin1_General_CP850_CI_AS

GO

USE SBOTemp

IF EXISTS(

SELECT name

FROM sysobjects

WHERE name = 'SBO_ACRD_TMP' AND type = 'U'

)

DROP TABLE SBO_ACRD_TMP

GO

CREATE TABLE SBO_ACRD_TMP(

LogInstanc SMALLINT,

CardCode NVARCHAR(15),

CardName NVARCHAR(100),

LicTradNum NVARCHAR(32)

)

GO

Luego inserte el TN en la base productiva. Recuerda que debes cargar los socios de negocios en la nueva base para que funcione con todos los socios de negocios.

Para ello, crea una empresa nueva, con el plan de cuentas predefinido en SAP, inserta el mismo TN que la productiva y carga los todos los SN de la base productiva a la nueva base por DTW y tendras los SN en la BD auxiliar cargados. Luego elimina la base nueva y esta listo para validar.

Saludos

Former Member
0 Kudos

gracias voy hacer lo q me dices.... y gracias por tomarte el tiempo de ayudarme

Former Member
0 Kudos

ya por fin lo solucione.... lo q pasaba era q el sp esta bn no es problemas de tablas si no de version de SAP para que funcione este SP debe ser en igual o superior a 8.81 pl:09...

De todas formas agradezco tu ayuda......

felipe_loyolarodriguez
Active Contributor
0 Kudos

Si, yo tenia entendido que era desde la 8.82, pero gracias por la info.

Aunque para las versiones anteriores tendrá que ser así

Former Member
0 Kudos

sera que esto ya lo resolvieron es q a mi me pasa lo mismo y no se q hacer....

felipe_loyolarodriguez
Active Contributor
0 Kudos

En realidad aun no encuentro la solucion.

Porque no hay registro del SN en la tabla ACRD cuando se crea y lo que no entiendo es que al consultar el log de modificaciones aparece a instancia 1 pero no se de donde obtiene el dato

Former Member
0 Kudos

y entonces como solucionaste el problema..... es q en mi empresa no me aceptan ninguna de estas cosas ellos quieren los resultados... si lo averiguas me dices por favor

Former Member
0 Kudos

null

Edited by: Enrique Hurtado on Jul 29, 2011 3:30 PM

Edited by: Enrique Hurtado on Jul 29, 2011 3:31 PM

former_member188440
Active Contributor
0 Kudos

Te comento que no es un bug, lo que pasa es que el transaction toma lo que estas por crear y lo guarda temporalmente como si fuera la ultima instancia que se ha modificado, es por eso que necesitas usar el MAX(loginstanc-1) para tomar efectivamente la que ya existe en la tabla de historial, NO la que estas por crear, de ahi que no te sirve como la tienes

Former Member
0 Kudos

Gracias Mauricio por el dato, de todas formas si pudieras realizar la siguiente prueba para entenderme:

Utiliza el siguiente SP de acuerdo a lo que me pasaste:


IF @object_type in (2) and @transaction_type in ('U') 
BEGIN

	DECLARE @G1 AS VARCHAR(10)
	SET @G1 = (select T0.GroupNum from ocrd T0 where T0.cardcode=@list_of_cols_val_tab_del)
	
	DECLARE @LOG AS VARCHAR (10)
	SET @LOG = (select max (T2.loginstanc-1) 
		from acrd T2 where  T2.cardcode=@list_of_cols_val_tab_del)
	
	--DECLARE @G2 AS VARCHAR(10)
	--SET @G2 = (select top 1 T1.GroupNum from acrd T1 where T1.cardcode=@list_of_cols_val_tab_del 
	--	and T1.loginstanc = @LOG)

	set @error = 1
	set @error_message = @LOG --+ ' - ' + @G1 + ' - ' + @G2
	 
END

Ahora crea un nuevo Socio de Negocio, y a este SN intenta actualizarle la condicion de Pago que esta en la pestaña de Condicion Pago.

Como veras te jalara el número Log = 0; si quitamos todos los comentarios posteriormente no nos dara ningun valor en @G1 ni en @G2, porque el @G2 no existe esa instancia de Log.

Lo probe de varias formas y al momento de actualziar por segunda vez ya sale otro valor.

Si pudieras ayudarme a crear un SP que no me deje actualizar la condicion de pago incluso para SN recien creados y aunque intente hacer clic en actualizar varias veces te lo agradecería.

Si alguien puede hacerlo por favor copiar el código para probarlo, no encuentro ninguna forma.

Gracias.

former_member188440
Active Contributor
0 Kudos

Asi te debe funcionar


IF @object_type in ( 2) and @transaction_type in ('U') 
BEGIN
 
if 
(select GroupNum  from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
(select top 1 GroupNum  from acrd where cardcode=@list_of_cols_val_tab_del 
and loginstanc in (select max (loginstanc-1 )
 from acrd where  cardcode=@list_of_cols_val_tab_del)) 
 --AND  (select usersign2 from ocrd where cardcode=@list_of_cols_val_tab_del )!= 1 
 
 
begin
set @error = 1
set @error_message = 'No puede cambiar condiciones de pago' 
END


select @error, @error_message
END

La linea q comente es para que valide el usuario, que version de sap tienes? en version 2007 no existe la columna usersign2

Former Member
0 Kudos

Utilice el mismo SP que me pasaste y cree un nuevo socio de negocio.

Trato de actualizar ese SN con mi usaurio manager y no me sale error, recien a la cuarta vez me salio el mensaje.

Estoy con SBO8.8 PL20

former_member188440
Active Contributor
0 Kudos

Puedes pegar el codigo que estas usando?

Former Member
0 Kudos

Te paso todo mi SP:


USE [Bolivia]
GO
/****** Object:  StoredProcedure [dbo].[SBO_SP_TransactionNotification]    Script Date: 06/22/2011 09:35:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SBO_SP_TransactionNotification] 

@object_type nvarchar(20), 				-- SBO Object Type
@transaction_type nchar(1),			-- [A]dd, <u>pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)

AS

begin

-- Return values
declare @error  int				-- Result (0 for no error)
declare @error_message nvarchar (200) 		-- Error string to be displayed
select @error = 0
select @error_message = N'Ok'

--------------------------------------------------------------------------------------------------------------------------------

--	ADD	YOUR	CODE	HERE

--------------------------------------------------------------------------------------------------------------------------------

IF @object_type in ( 2) and @transaction_type in ('U') 
BEGIN
 
	if 
	(select GroupNum  from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
	(select top 1 GroupNum  from acrd where cardcode=@list_of_cols_val_tab_del 
	and loginstanc in (select max (loginstanc-1 )
	 from acrd where  cardcode=@list_of_cols_val_tab_del)) 
	 --AND  (select usersign2 from ocrd where cardcode=@list_of_cols_val_tab_del )!= 1 

	begin
		set @error = 1
		set @error_message = 'No puede cambiar condiciones de pago' 
	END

END

-- Select the return values
select @error, @error_message

end

Por favor si puedes probar en una base que tengas con un nuevo SN creado, trata de actualziar su condicion de pago y te dejara.

Espero tu ayuda, Gracias.

former_member188440
Active Contributor
0 Kudos

A mi me funciona!!

Una pregunta, no sera que tienes el log de modificaciones en 0 ??? en parametrizaciones generales, pestaña Actividades ????

Former Member
0 Kudos

El log esta con 99, y lo raro es que probe ya en 3 veces y con el mismo tema no funciona con socios de negocio creados por primera vez (osea sin log de modificaciones); la Localizacion es Chile.

Saludos,

former_member188440
Active Contributor
0 Kudos

OK si pruebas el query, asignando valores a la variable @list_of_cols...... si te funciona?

te trae datos?

Former Member
0 Kudos

Mauricio, perdon pro la demora: al realizar las pruebas con valores de igual forma los valores son los mismos.

Te indico como podas reproducirlo:

1. Uitliza el SP que me pasaste

2. Crea un nuevo SN

3. Actualiza en la pestaña Condiciones de Pago el camp condiciones de pago

4. Saldra el error

5. Vuelve a hacer clic a actualizar

6. Te dejara actualizar

Espero tu respuesta.

De antemano muchas gracias.

former_member188440
Active Contributor
0 Kudos

Quitaste los guiones que "comentan" la linea del usersign2 ???

Former Member
0 Kudos

Si hice las 2 pruebas, estoy con SBO 8.8 PL19.

Por favor verifica con los pasos que te indico, te aseguro que poras reproducirlo.

La clave es que sea en un nuevo SN (No tiene log, sin datos en la tabla ACRD) y que le des clic a actualizar más de una vez seguidamente.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Jorge tienes razon

Lo comprobe y efectivamente si creas un SN y no se ha modificado nunca, el TN no funciona

Lo revisare

SAP 8.81 PL 04

Atte

-


Bueno ya quedo


IF @object_type =  2 AND @transaction_type IN ('U') 
BEGIN 
	IF 
	(select GroupNum  from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
	(select top 1 GroupNum  from acrd where cardcode=@list_of_cols_val_tab_del 
	and loginstanc in (select max (loginstanc)
	 from acrd where  cardcode=@list_of_cols_val_tab_del))  
	BEGIN
		SET @error = 1
		SET @error_message = 'No puede cambiar condiciones de pago' 
	END 
END

Solo saque el -1 del MAX(LogInstanc)

Saludos

Edited by: Floyola on Jul 8, 2011 9:49 AM

Former Member
0 Kudos

Gracias Floyola, pero si puedes probar con el SP que me pasas que la primera vez al hacer actualziar si funciona, pero seguidamente si le haces actualizar de nuevo ya no sale el error y lo actualiza.

Alguna otra idea?

former_member188440
Active Contributor
0 Kudos

Ese stored sin el max (loginstanc-1) no va a funcionar , ya lo he probado en otros post, y no funciona

Vuelvo a explicar

el transaction si tu le pones max(loginstanc) esta tomando el dato que estas queriendo modificar, el que tienes en la variable @list_of_cols_val....,asi que si detecta error, se hace un rollback y ya no paso nada y tu max(loginstanc) no sirve de nada

El porque necesitas el max(loginstanc-1) ? ??

Pues porque de esta forma tomaras el ultimo valor que YA EXISTE en tu historial, y contra el cual efectivamente puedes comparar el dato que viene en tu @list_of_cols_val.......

Asi que sin eso , no funcionara

Former Member
0 Kudos

Mauricio, Floyola:

Como les digo, lo probe de las 2 formas; inclusive algunas mas que se me ocurrieron pero siempre el mismo resultado; lo mejor que he podido llegar es que al primer actualizar si sale el error, pero en todos los casos si le doy actualizar por segunda vez inmediatamente luego del primer actualizar me deja pasar sin ningun mensaje, ese es el problema!

Gracias y Saludos,

former_member188440
Active Contributor
0 Kudos

Intenta asi


IF @object_type in ( 2) and @transaction_type in ('U') 
BEGIN
 if (select COUNT(*) from ACRD where CardCode =@list_of_cols_val_tab_del )=0
 begin
		if 
(select GroupNum  from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
(select top 1 GroupNum  from acrd where cardcode=@list_of_cols_val_tab_del 
and loginstanc in (select max (loginstanc)
 from acrd where  cardcode=@list_of_cols_val_tab_del)) 
 --AND  (select usersign2 from ocrd where cardcode=@list_of_cols_val_tab_del )!= 1 
	begin
	set @error = 1
	set @error_message = 'No puede cambiar condiciones de pago' 
	END
end
 if (select COUNT(*) from ACRD where CardCode =@list_of_cols_val_tab_del )>0
begin
if 
(select GroupNum  from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
(select top 1 GroupNum  from acrd where cardcode=@list_of_cols_val_tab_del 
and loginstanc in (select max (loginstanc-1 )
 from acrd where  cardcode=@list_of_cols_val_tab_del)) 
 --AND  (select usersign2 from ocrd where cardcode=@list_of_cols_val_tab_del )!= 1 
 
 
begin
set @error = 1
set @error_message = 'No puede cambiar condiciones de pago' 
END
 end

Primero se valida que tiene historial, para socios nuevos, y el segundo if valida que ya tenga historial

felipe_loyolarodriguez
Active Contributor
0 Kudos

Acabo de hacer unas pruebas y obtuve los siguientes resultados, esto es en SAP 8.81 PL 04

Cuando se intenta modificar, aunque haya un TN bloqueando la modificacion, en el log de modificaciones queda guardado igual un registro de esa modificacion, por lo tanto no sirve el MAX(loginstac). Esa es la razon por la cual al pulsar 2 veces se puede actualizar.

Prueba este


IF @object_type =2 AND @transaction_type IN ('U') 
BEGIN
		IF 
			(SELECT GroupNum  FROM OCRD WHERE CardCode=@list_of_cols_val_tab_del ) !=
			(SELECT TOP 1 GroupNum  FROM ACRD WHERE CardCode=@list_of_cols_val_tab_del)
		BEGIN
			SELECT @error = -500, @error_message = 'SP: No puede cambiar las condiciones de pago'
		END
	
END

Former Member
0 Kudos

Mauricio: El problema sigue cuando no tiene logs de igual forma te deja actualizar.

Floyola: De igual forma el tema continua.

Gracias por el apoyo pero al parecer no hay solucion

Si logran probarlo en su base con el escenario que les indico y les funciona de alguna forma me avisan.

Muchas gracias

former_member188440
Active Contributor
0 Kudos

El ultimo codigo que te puse, sirve para cuando es nuevo el socio y para cuando ya tiene modificaciones previas

Yo probe el ultimo codigo que te pase y me funciona tanto con sn nuevos como con otros previamente creados

felipe_loyolarodriguez
Active Contributor
0 Kudos

Jorge como ultimo recurso prueba este, ami me funciono en la base, lo que hize fue fijar la instancia a la primera, osea con la que se creo el SN


IF @object_type =2 AND @transaction_type IN ('U') 
BEGIN	
		IF
			(SELECT GroupNum  FROM OCRD WHERE CardCode=@list_of_cols_val_tab_del ) !=
			(SELECT TOP 1 GroupNum  FROM ACRD WHERE CardCode=@list_of_cols_val_tab_del AND LogInstanc =1)
		BEGIN
			SELECT @error = -500, @error_message = 'SP: No puede cambiar las condiciones de pago'
		END
END

Pruebalo y me cuentas

Slds

Former Member
0 Kudos

Estimados, gracias nuevamente pero aun sigo con el tema, probe en otras bases pero de igual forma a la segunda me deja actualizar (usuarios sin log).

Finalmente decidi realziar una solucion alterna:

1. Crear un campo de usuario

2. Crear una BF que se actulice en caso de que se haya cambiado la condicion de pago (SELECT 1)

3. Crear un SP que indique si ese campo de usuario esta con 1 salga el mensaje de error

Se que no es la mejor pero al menos soluciona el tema por ahora.

Muchas Gracias

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado, si tiene un momento enviame un mail y lo vemos en una cesion por team viewer.

Me parece extraño, ya que en mi base funciona.

Saludos

former_member188440
Active Contributor
0 Kudos

Me parece muy extraño lo que te ocurre, el ultimo codigo que te pase, soluciona el problema tanto para socios de Negocios nuevos como para los que tienes ya creados.

Si estas colocando el codigo, identico al que te puse, deberia funcionar

felipe_loyolarodriguez
Active Contributor
0 Kudos

Jorge tienes razon y lo que me parece mas extraño es lo siguiente:

Al crear un SN y abrir el log de modificaciones, aparece la 1º instancia, si te posicionas sobre ella con la opcion visualizar info del sistema, te envia la tabla ACRD pero al buscar el registro en esta tabla, no existe, ya lo he buscardo las tablas historial con un procedimiento que dejo un forista y no se encuentra el registro, motivo por el cual puedes modificar SN recien creados.

Tiene caracter de BUG la cosa.

SAP 8.81 PL 04

Saludos

former_member188440
Active Contributor
0 Kudos

Esta raro el asunto, pues el codigo lo probe en version 88 pl 19 y en 2007 sp01 pl 08

Ambos ambientes funcionaron

felipe_loyolarodriguez
Active Contributor
0 Kudos

No lo he probado en ambiente 8.8, se que si funciona en 2007, pero esos son los resultados me arrojo en 8.81 PL 04

Si tienes un ambiente 8.8, haz la prueba.

- Crea un SN

- Ejectuta el query


SELECT * FROM ACRD WHERE CardCode='SNnuevo'

Si te arroja resultados, es porque el SP te va a funcionar.

Saludos

former_member188440
Active Contributor
0 Kudos

Y si no arroja nada es que no funciona? o como

Unicamente poniendo el escenario con el log de modificaciones en 0 fue posible que NO trajera datos

felipe_loyolarodriguez
Active Contributor
0 Kudos

Si no arroja datos, el SP_TN no bloquea nada, porque seleccionamos el MAX(LogInstanc) desde el ACRD para comparar. Y al no haber datos...¿que compara?...claro para los SN que tengan algun cambio ya hecho funcionara el bloqueo....pero para los nuevos no.

Yo tengo el log en 99 y el escenario PARA LOS SN NUEVOS es ese, los demas no tienen problema :S

Todavia usamos version 2007 asi que no me habia topado con esto...hasta que a alguien se le ocurrio xD

Atte.

Edited by: Floyola on Jul 21, 2011 9:26 PM

former_member188440
Active Contributor
0 Kudos

No pues ni como ayudar asi

former_member188440
Active Contributor
0 Kudos

Revisa este caso para evitar el cambio en razon social



IF @object_type in ( 2) and @transaction_type in ('U') 
BEGIN
 
if 
(select cardname from ocrd where cardcode=@list_of_cols_val_tab_del ) !=
(select top 1 cardname from acrd where cardcode=@list_of_cols_val_tab_del and loginstanc in (select max (loginstanc-1 ) from acrd where  cardcode=@list_of_cols_val_tab_del)) AND  (select usersign2 from ocrd where cardcode=@list_of_cols_val_tab_del )!= 1
 
 
begin
set @error = 1
set @error_message = 'Acceso denegado para cambio de Razon Social'
end
 
END