CftClub.ru
Клуб специалистов ЦФТ-Банк

Как выполнить операцию от другого пользователя?
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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;
попробую, но вроде проверка доступа пляшет не от контекста пользователя, а от залогинившегося пользователя...

в общем необходимость отпала до следующего раза Wink
Матвеев Евгений
Профи


Вступление в Клуб: 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
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru