Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Апр 26, 2011 02:24  Как выполнить операцию от другого пользователя? |
|
Полезность: Нет оценки
|
Здравствуйте !
Нужно чтобы вызываемая простая операция отработала под другим пользователем, возможно ?
rtl.send_event(13 - похоже не подойдёт, т.к. поднимает форму....
или если операция без поднятия формы -то отработает ? |
|
 |
IBSO Профи
Вступление в Клуб: 20.08.2009
|
Вт Апр 26, 2011 09:11   |
|
Полезность: Нет оценки
|
После выполнения операции, делали подмену пользователя. Так показалось проще. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Чт Апр 28, 2011 03:10   |
|
Полезность: Нет оценки
|
Проблема в том что под текущим пользователем операцию выполнить нельзя т.к. он является пользователем другого филиала... |
|
 |
alx Участник - экстремал
Вступление в Клуб: 29.06.2007
|
Чт Апр 28, 2011 09:30   |
|
Полезность: Нет оценки
|
посмотрите, как реализовано многофилиальное закрытие дня одним пользователем |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Чт Апр 28, 2011 09:39   |
|
Полезность: Нет оценки
|
Я в Ритейле делал так:
stdlib.userid := _new_user;
_Oper_call ();
stdlib.userid := _old_user; |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Май 10, 2011 11:25   |
|
Полезность: Нет оценки
|
многофилиальное вроде закрывается пользователем без филиала.
stdlib.userid := _new_user;
попробую, но вроде проверка доступа пляшет не от контекста пользователя, а от залогинившегося пользователя...
в общем необходимость отпала до следующего раза  |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вс Июл 26, 2015 19:35   |
|
Полезность: Нет оценки
|
maestro пишет: | Я в Ритейле делал так:
stdlib.userid := _new_user;
_Oper_call ();
stdlib.userid := _old_user; |
В ИБСО так тоже работает, ФР и проводки формируются под P_USER
prev_user ref [USER];
begin
stdio.put_line_buf('Пользователь1 = ' || stdlib.user_id.[NAME]);
prev_user := ::[SYSTEM].[VARIABLES].set_system_vars_by_user(P_USER, false, true);
begin
stdlib.user_id := P_USER;
stdio.put_line_buf('Пользователь2 = ' || stdlib.user_id.[NAME]);
::[DEPN].[REG_PRC](
P_DATE_REG == P_DATE
,P_DATE_VAL == P_DATE
,P_SUMMA == 100
,P_PROV == true
);
exception
when others all then
if not prev_user is null then
stdlib.user_id := prev_user;
end if;
end;
if not prev_user is null then
if prev_user <> stdlib.user_id then
stdlib.user_id := prev_user;
end if;
end if;
stdio.put_line_buf('Пользователь3 = ' || stdlib.user_id.[NAME]);
end; |
|
 |
Pelemeshka Участник
Вступление в Клуб: 26.10.2015
|
Пн Окт 26, 2015 19:00   |
|
Полезность: Нет оценки
|
Попробовал
prev_user := ::[SYSTEM].[VARIABLES].set_system_vars_by_user(P_USER, false, true);
На примере фоновых процессов, т.е. в операции изменил пользователя , и запустил операцию под IBS, вышла ошибка, что запущено не под тем пользователем
Какие еще могут быть варианты ? |
|
 |
Pelemeshka Участник
Вступление в Клуб: 26.10.2015
|
Пн Окт 26, 2015 19:02   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: | maestro пишет: | Я в Ритейле делал так:
stdlib.userid := _new_user;
_Oper_call ();
stdlib.userid := _old_user; |
В ИБСО так тоже работает, ФР и проводки формируются под P_USER
prev_user ref [USER];
begin
stdio.put_line_buf('Пользователь1 = ' || stdlib.user_id.[NAME]);
prev_user := ::[SYSTEM].[VARIABLES].set_system_vars_by_user(P_USER, false, true);
begin
stdlib.user_id := P_USER;
stdio.put_line_buf('Пользователь2 = ' || stdlib.user_id.[NAME]);
::[DEPN].[REG_PRC](
P_DATE_REG == P_DATE
,P_DATE_VAL == P_DATE
,P_SUMMA == 100
,P_PROV == true
);
exception
when others all then
if not prev_user is null then
stdlib.user_id := prev_user;
end if;
end;
if not prev_user is null then
if prev_user <> stdlib.user_id then
stdlib.user_id := prev_user;
end if;
end if;
stdio.put_line_buf('Пользователь3 = ' || stdlib.user_id.[NAME]);
end; |
Это видимо работает для проводок под другими пользователями ? |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Пн Окт 26, 2015 20:41   |
|
Полезность: Нет оценки
|
Цитата: |
Это видимо работает для проводок под другими пользователями ?
|
Да, Вы правы, именно для этого. Общая схема:
Код: |
declare
prev_user ref [USER] := null;
begin
-- Запоминаем базового пользователя
prev_user := stdlib.user_id;
-- Меняем на нового
stdlib.user_id := ::[USER](USERNAME = 'IBS');
--...
--Что то делаем под новым пользователем
--...
------------------------------------------------------------------
------------------------------------------------------------------
-- Выводим информацию о пользователях
debug_pipe(nl$||' ---Пользователь до запуска JOB---');
debug_pipe(prev_user);
debug_pipe(prev_user.[USERNAME]);
debug_pipe(nl$||' ---Пользователь для запуска JOB---');
debug_pipe(stdlib.user_id);
debug_pipe(stdlib.user_id.[USERNAME]);
-- Выводим информацию о пользователях
------------------------------------------------------------------
------------------------------------------------------------------
-- Возвращаем обратно базового пользователя
if not prev_user is null then
if prev_user <> stdlib.user_id then
stdlib.user_id := prev_user;
end if;
end if;
exception
-- На всякий случай еще раз возвращаем обратно базового пользователя, в Exception
when others all then
if not prev_user is null then
if prev_user <> stdlib.user_id then
stdlib.user_id := prev_user;
end if;
end if;
end;
|
|
|
 |
Pelemeshka Участник
Вступление в Клуб: 26.10.2015
|
Пн Окт 26, 2015 22:51   |
|
Полезность: Нет оценки
|
Пример, очень интересный , но Вы тут разбираете пакет stdlib,
а есть ли какой нить способ, например стартовать обработчики системы-абонентов будучи в сессии IBS, т.е. запустить под другим пользователем, например user1 ?
Т.е. как я понимаю нужно копать в сторону rtl ? |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Пн Окт 26, 2015 23:00   |
|
Полезность: Нет оценки
|
Цитата: |
...стартовать обработчики системы-абонентов...
|
А поподробнее? |
|
 |
Pelemeshka Участник
Вступление в Клуб: 26.10.2015
|
Вт Окт 27, 2015 10:21   |
|
Полезность: Нет оценки
|
if P_INFO='ESB_SBBOL' then
var prev_user ref [USER]; --запомнить IBS
begin
prev_user:=INT_EKS.LIB.Set_System_Vars_by_User(::[USER](USERNAME='user2'));
msg:='VALIDATE';
ab_ref:=::[CIT_ABONENT](CODE='ESB_SBBOL');
info:='Старт обработчиков очереди'; ab_ref=>MANAGE_ENV(msg,info,p_start,p_create,p_remove,p_stop);
INT_EKS.LIB.Set_System_Vars_by_User(prev_user); --возвращает IBS
end;
Последний раз редактировалось: Pelemeshka (Вт Окт 27, 2015 11:58), всего редактировалось 1 раз |
|
 |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Окт 27, 2015 10:32   |
|
Полезность: Нет оценки
|
Pelemeshka пишет: | if P_INFO='ESB_SBBOL' then
var prev_user ref [USER]; --запомнить IBS
--1331343331981 := 'MSB_IB_SYSTEM';
begin
prev_user:=INT_EKS.LIB.Set_System_Vars_by_User(::[USER](USERNAME='MSB_IB_SYSTEM'));
msg:='VALIDATE';
ab_ref:=::[CIT_ABONENT](CODE='ESB_SBBOL');
info:='Старт обработчиков очереди'; ab_ref=>MANAGE_ENV(msg,info,p_start,p_create,p_remove,p_stop);
INT_EKS.LIB.Set_System_Vars_by_User(prev_user); --возвращает IBS
end; |
Что то не разглядел я у Вас в коде 2ух вещей:
1. Где Вы меняете текущего пользователя?
2. Где обработка нового пользователя в зависимости от филиала старого?
п.2 примерно мог бы выглядеть вот так... чуть хардкода)
declare
prev_user ref [USER] := stdlib.user_id;
begin
-- Как правило проводки группируются с учетом филиала и площадки ДО
if prev_user.[FILIAL].[CODE] = '001' and prev_user.[DEPART].[CODE] = '001-01' then
stdlib.user_id := 1234254254; -- id пользователя для проводки по указанным строкой выше филиалу и подразделению
elsif prev_user.[FILIAL].[CODE] = '001' and prev_user.[DEPART].[CODE] = '001-02' then
stdlib.user_id := 3423423423; -- id пользователя для проводки по указанным строкой выше филиалу и подразделению
elsif prev_user.[FILIAL].[CODE] = '001' and prev_user.[DEPART].[CODE] = '001-03' then
stdlib.user_id := 232522342; -- id пользователя для проводки по указанным строкой выше филиалу и подразделению
elsif prev_user.[FILIAL].[CODE] = '002' and prev_user.[DEPART].[CODE] = '002-04' then
stdlib.user_id := 43634235; -- id пользователя для проводки по указанным строкой выше филиалу и подразделению
elsif prev_user.[FILIAL].[code] = '002' and prev_user.[DEPART].[code] = '002-07' then
stdlib.user_id := 2342342; -- id пользователя для проводки по указанным строкой выше филиалу и подразделению
end if;
end; |
|
 |
Pelemeshka Участник
Вступление в Клуб: 26.10.2015
|
Вт Окт 27, 2015 14:55   |
|
Полезность: Нет оценки
|
Для проводки документов этого достаточно (stlib)
А помимо этого нужно еще сменить пользователя в rtl |
|
 |
|