on 06-21-2011 3:30 PM
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,
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
sera que esto ya lo resolvieron es q a mi me pasa lo mismo y no se q hacer....
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
null
Edited by: Enrique Hurtado on Jul 29, 2011 3:30 PM
Edited by: Enrique Hurtado on Jul 29, 2011 3:31 PM
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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
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.
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.
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
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
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,
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
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
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
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
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
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
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
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
90 | |
8 | |
7 | |
4 | |
4 | |
3 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.