cancel
Showing results for 
Search instead for 
Did you mean: 

Sp en Oportunidades

jonathanziga
Explorer
0 Kudos

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.

Accepted Solutions (1)

Accepted Solutions (1)

jonathanziga
Explorer
0 Kudos

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.

former_member188440
Active Contributor
0 Kudos

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

Answers (3)

Answers (3)

jonathanziga
Explorer
0 Kudos

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!!!

jonathanziga
Explorer
0 Kudos

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...

former_member188440
Active Contributor
0 Kudos

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

jonathanziga
Explorer
0 Kudos

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.

former_member188440
Active Contributor
0 Kudos

Puedes compartirme el codigo que estas utilizando?

Por otro lado te comento que el usuario que actualiza se encuentra en el campo usersign2.

jonathanziga
Explorer
0 Kudos

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

former_member188440
Active Contributor
0 Kudos

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¡

jonathanziga
Explorer
0 Kudos

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

jonathanziga
Explorer
0 Kudos

No Mauricio, definitivamente no está validando nada el SP. YA le enlacé una tabla al campo y tampoco; intenté hacer un convert sobre los datos que me estaba comparando, para que quedran en enteros pero tampoco. Ya no sé que mas hacerloe.

Cordial saludo.

former_member188440
Active Contributor
0 Kudos

Es raro, yo probe el codigo y funciono, pasame el codigo que tu estas usando y los tipos de datos que tienes definidos en la tabla de usuario.

jonathanziga
Explorer
0 Kudos

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.

former_member188440
Active Contributor
0 Kudos

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

former_member188440
Active Contributor
0 Kudos

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

jonathanziga
Explorer
0 Kudos

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.

former_member188440
Active Contributor
0 Kudos

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.

former_member188440
Active Contributor
0 Kudos

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