on 04-09-2010 3:45 PM
Buenos días,
Recientemente creé en las oportunidades de venta, un campo definido por el usuario llamado almacen (alfanumérico); necesito que éste me valide junto con el usuario logueado, que correspondan el uno con el otro, por tanto hice este Sp:
if @object_type in ('97') and @transaction_type in ('A', 'U')
begin
if (select count(*)
FROM OOPR T0 WHERE T0.U_almacen = '1' AND T0.[UserSign] =1
AND @list_of_cols_val_tab_del = T0.DocEntry )>0
begin
set @error = 10
set @error_message = '***** INGRESE EL ALMACÉN EN EL QUE SE ENCUENTRA... ****'
end
end
Pero no me está funcionando. Me podrían ayudar con este inconveniente? Les agradezco la ayuda.
Hola Mauricio,
Esta vez por lo menos está sacando el error, pero lo saca con todos los campos; al ver esto cambie ambas variables por Int y coloqué le código de los usuarios (que son los mismos de los almacenes) pero el error sigue saliendo para todos los usuarios. Revisé en la tabla OOPR el campo docentry y aparece todo en NULL, eso es normal? Intenté cambiando la validación de docentry por docnum=@list_of_cols_val_tab_del, pero menos.
EL Sp que usé fue este (haciendo todas las validaciones y usando la busqueda formateada que me pusiera el código en el campo U_almacen dentro de la oportunidad):
IF @transaction_type in ('U','A') AND @object_type IN ('97') -
-
OPORTUNIDADES
BEGIN
declare @usuario INT
declare @almacen INT
set @usuario=(select b.userid from OOPR a join ousr b on a.usersign=b.userid
where a.docnum=@list_of_cols_val_tab_del)
set @almacen= (select u_almacen from OOPR where docnum=@list_of_cols_val_tab_del)
if @almacen not in (select from .[@USUARIOS_ALMACENES] where = @usuario) --@usuario= 'manager'
begin
--envia error
set @error=(99)
set @error_message='Seleccione el almacen correcto'
end
end
Decidí hacer ese cambio porque al probar la consulta con el nombre del almacén no me arrojaba datos, pero con numérico funcionaba mejor.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Cambia el docentry del codigo del transaction por OpprId, esa es como el docentry de las oportunidades
El campo de docentry es el numero de documento que enlazaste en tu etapa que te sirvio para ganar dicha oportunidad o para alcanzar al 100.
Entonces, del codigo que te mande, o el tuyo, utiliza el campo OpprID para amarrar con la variable @list_of_cols_val_tab_del
Excelente!!! ESE ERA EL DETALLE, estabamos cogiendo el campo docentry y por eso no validaba las consultas. Muchas gracias Mauricio por tu ayuda. El único detalle es que si ingreso mal el usuario, tengo que cerrar la oportunidad y volverla a abrir, de resto quedó funcionando al 100%.
SALUDOS!!!
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 la ayuda, pero resulta que el campo U_almacen es diferente al usersign; por tanto me toca configurarle un SP a cada usuario. Es por esto que había diseñado un SP de ejemplo al usuario manager, suponiendo que el almacén fuera 1.
El que me pusiste no me funcionó, intenté estableciendo una variable que tomara el valos del select, pero tampoco me funciona. No sé como hacer...
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Lo que se entiende es que necesitas validar que el amacen y el usuario sean iguales no?
Esto te debe funcionar con el codigo que te puse.
Independientemente, claro de como alimentes el campo de almacen. Quizas una tabla de usuarios, en la que pongas, usuario y almacen que le corresponde, puedas controlar esto. Ademas del stored
Buenos días, muchas gracias Mauricio:
Resulta que le creé una tabla en donde cruzo el número del usuario con el nombre del almacén, estoy haciendo la prueba con usuario manager (1) y cuando escojo uno diferente del 1, igual se deja tanto guardar como actualizar.
Estuve revisando las oportunidades y el campo Docentry es NULL a excepción de una oportunidad, tiene algo que ver?
Le agradezco la ayuda.
Buenos días Mauricio, el SP es el siguiente:
if @object_type in ('97') and @transaction_type in ('A', 'U') -
-
OPORTUNIDADES
begin
declare @usuario as int
declare @almacen as int
select @usuario=usersign,@almacen=u_almacen
FROM OOPR WHERE DocEntry=@list_of_cols_val_tab_del
end
if @usuario <> @almacen
begin
set @error = 10
set @error_message = '***** INGRESE EL ALMACÉN EN EL QUE SE ENCUENTRA... ****'
end
el campo U_almacen es un campo definido por el usuario que me trael el nombre del almacen y el código es el mismo de la tabla OUSR; yo hago la prueba con manager (userid 1) pero si selecciono cualquier almacen, el SP no lo valida.
Saludos
Pero si estas declarando la variable @almacen como int y me comentas que el u_almacen es de tipo alfanumerico, quizas por eso no esta funcionando, ya que abajo estas comparando el usuario contra el almacen.
En que momento validas lo que comentaste de tu tabla de usuario? que campos tienes ahi?? y de que tipo¡
Buenos dias
Pues la verdad no había caído en cuenta de ese detalle, pero el campo que creé está como tipo alfanumérico y le definí valores al campo; entonces en la columna valor hay números (el número del almacén en este caso) y en descripción aparece el nombre del almacén. Creo que el sistema hace la validación con el primer campo verdad?
Si está mal me puedes decir como debo hacer esta validación? Y la verdad no he probado enlazando una nueva tabla, lo voy a intentar y yo te cuento como me fue.
Cordial saludo.
Edited by: Jzuñiga on Apr 27, 2010 4:50 PM
Mira la consulta es ésta:
if @object_type in ('97') and @transaction_type in ('A', 'U') -
-
OPORTUNIDADES
begin
declare @usuario as int
declare @almacen as int
select @usuario=T0.usersign ,@almacen=T1.code
FROM OOPR T0
INNER JOIN .[@USUARIOS_ALMACENES] T1 ON T0.U_Almacen = T1.Code
WHERE DocEntry=@list_of_cols_val_tab_del
end
if @usuario <> @almacen
begin
set @error = 10
set @error_message = '***** INGRESE EL ALMACÉN EN EL QUE SE ENCUENTRA... ****'
end
Creé una tabla llamada USUARIOS_ALMACENES que enlacé al campo y que contenía los campos estandar:
Code Name
1 MANAGER
20 ALMACEN1
21 ALMACEN2
29 ALMACEN3
30 ALMACEN4
31 ALMACEN5
32 ALMACEN6
La prueba la hice con el user Manager y colocando el dato en un lugar diferente al 1.
Te agradezco la ayuda ke me puedas prestar.
Ya lo probaste asi?, sin ligar el campo a la tabla?, solo con sus valores validos, la tabla la tomarias como referencia para saber que almacen le corresponde a cada usuario
Me surge la duda
los numeros del campo code de tu tabla son los numeros de internal_k de la tabla ousr??
el dato del campo NAME de tu tabla ,que significa?
if @object_type in ('97') and @transaction_type in ('A', 'U') -----------------OPORTUNIDADES
begin
declare @usuario as int
declare @almacen as int
select @usuario=usersign ,@almacen=u_tucampodeusuario
FROM OOPR
WHERE DocEntry=@list_of_cols_val_tab_del
end
if @usuario "distinto de" @almacen
begin
set @error = 10
set @error_message = '***** INGRESE EL ALMACÉN EN EL QUE SE ENCUENTRA... ****'
end
yo creo que te serviria mas amarrar al usuario con algo asi
La idea de la tabla de usuario era para ser utilizada como referencia de que almacenes estan asignados a que usuario
creo que primero deberias almacenar el almacen y el usuario directamente de la tabla de oportunidades de ventas
Despues, con otra consulta, validas que el almacen que tienes en la variable @almacen, exista en la tabla de usuario[@usuarios_almacenes], donde el usuario de dicha tabla sea igual a tu variable @usuario.
con eso seguro amarras la validacion
Buenos días Mauricio,
Gracias por las respuestas pero la verdad lo de la tabla enlazada fue una idea desesperada para intentar que el SP me validara el campo; de hecho desde el inicio del ejercicio, yo empecé con el campo sin la tabla y con valores válidos insertados en la misma. La consultacque había creado si era un poco diferente a la que me sugeriste pero al final ninguna me ha funcionado; el inconveniente es que no puedo dejar eso abierto porque los usuarios muchas veces por la pereza no hacen las cosas correctamente y6 me veo en la obligación de tener todo absolutamente controlado por SP. Seguiré ideando formas para hacer esta validación...
Cordial saludo.
Precisamente es por Stored concretamente el transactionNotification que te comento que te debe funcionar
Aqui un ejemplo de lo que tenemos en la empresa en la cual efectivamente restringiimos el acceso a usuarios que pretendan ingresar a un almacen incorrecto.
La tabla de usuario esta de la siguiente manera tabla @almacen_users
Code Name U_user U_almacen
1 1 manager WHS30
Aqui el code y name son identicos y son unicamente como consecutivos ok? lo interesante es el u_user y el u_almacen que es donde le dices que a manager solo le permites usar el almacen con codigo WH30
Ahora, en tu documento de marketing, el campo de cabecera que usaras para capturar el almacen
seria de tipo alfanumerico ok?, como podrias alimentar dicho campo, ya sea con busqueda
formateada que te traiga el codigo de almacen que esta en la tabla de usuario
y correspondiente al usuario que esta logeado
select $[USER]
la otra seria que con tus valores validos como lo tienes, pero en donde pones el valor,
pon el codigo del almacen en lugar de un 1 o un numero cualquiera.
Insisto aqui lo interesante vendra cuando en el codigo del stored pongas lo siguiente
IF @transaction_type in ('U','A') AND @object_type IN ('97')
BEGIN
declare @usuario nvarchar(8)
declare @almacen nvarchar(8)
set @usuario=(select b.user_code from OOPR a join ousr b on a.usersign=b.userid
where a.docentry=@list_of_cols_val_tab_del)--Obtenemos el usuario que esta creando la oportunidad en SBO
set @almacen= (select u_almacen from OOPR where docentry=@list_of_cols_val_tab_del)
if @almacen not in (select u_almacen from [@almacenes_user] where u_user= @usuario) --@usuario= 'manager'
begin-- si el usuario que esta creando la oportunidad no tiene el almacen de la misma en su tabla habra error
--envia error
set @error=(99)
set @error_message='Seleccione el almacen correcto'
end
end
Asi debe funcionar, lo que importa es que almacenes en la variable de @almacen, el mismo tipo de dato que estas leyendo de tu campo de usuario o de tu tabla de usuario, yo por eso te recomiendo que uses un alfanumerico.
Intenta asi
if @object_type in ('97') and @transaction_type in ('A', 'U')
begin
declare @usuario as int
declare @almacen as nvarchar(1)
select @usuario=usersign,@almacen=u_almacen
FROM OOPR WHERE DocEntry=@list_of_cols_val_tab_del
end
if @usuario "<>" @almacen "quita las comillas y coloca el signo de diferente <>"
begin
set @error = 10
set @error_message = '***** INGRESE EL ALMACÉN EN EL QUE SE ENCUENTRA... ****'
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 |
---|---|
108 | |
12 | |
11 | |
6 | |
5 | |
4 | |
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.