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

Копирование файла на сервер и открытие его в одной функции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
vek21
Участник со стажем
Неподтвержденный


Вступление в Клуб: 20.09.2007
СообщениеЧт Окт 27, 2016 06:58   Копирование файла на сервер и открытие его в одной функции Ответить с цитатой
Полезность: Нет оценки
Уважаемые Знатоки!
Возможно ли ЭТО(Копирование файла на сервер и открытие его в одной функции)? Понятно, что если я в валидаторе операции заполню реквизиты переменной типа FILE$LOAD, то в теле операции я могу работать с файлом на сервере, уже скопированном к этому времени с клиента. Аналогичная ситуация будет при использовании операции COPYFILES в типе DOCUMENT(заполнение реквизитов в валидаторе, вызов там же "stdio.put_line_buf('<% CALL DOCUMENT COPYFILES...", и далее только в теле операции я могу открыть на редактирование скопированный на сервер файл). Совершенно аналогичная ситуация при использовании операции TRANSPORT в RUNTIME.
А, может, таки есть хитрый способ, который позволил бы внутри одной функции сделать копирование файла, чтобы там же его открыть/редактировать?
kai
Профи
<Центр Финансовых Технологий>


Вступление в Клуб: 16.08.2012
СообщениеЧт Окт 27, 2016 08:49    Ответить с цитатой
Полезность: Нет оценки
vek21,

Копирование файлов в механизме ЦФТ-Навигатора происходит, когда отрабатывает тело операции, у которой есть параметр типа "Экспорт-импорт файлов" - при этом все поля параметра корректно заполнены.

Итак, вот пример. Создаётся операция, в ней параметр P_FILE типа "Экспорт-импорт файлов". На э/форме, кроме нужных полей параметра P_FILE, делаем кнопку с надписью, например, "Передать файл и обработать" и коротким именем ButSend.

Тогда, в "Теле"
Код:
begin
   debug_pipe(&METHOD$||TB$||'Операция "'||&METHOD$NAME||'" выполнена.', 0);
end;


в "Проверке"
Код:
   tStr   varchar2(32000);
   iFileId integer;
begin
   case P_MESSAGE of
   :'DEFAULT':
      P_FILE.[SRC_NAME]   := &METHOD$SNAME||'.TXT';
      P_FILE.[SRC_PATH]   := [SYSTEM_PARAMS]::[GET]('PATH_LOCAL');
      P_FILE.[DST_PATH]   := [SYSTEM_PARAMS]::[GET]('PATH', false);

   --   Если заполнить оставшиеся поля P_FILE:
   --   P_FILE.[SRC_TYPE]   := false;      -- Тип источника (false - клиент, true - сервер)
   --   P_FILE.[DST_TYPE]   := true;      -- Тип приемника (false - клиент, true - сервер)
   --   P_FILE.[DST_NAME]   := P_FILE.[SRC_NAME];
   --   P_FILE.[SRC_DELETE]   := false;
   --   P_FILE.[DST_DELETE]   := false;
   --   то копирование произойдёт и после нажатия кнопки "OK" (отработки "Тела").

      P_INFO   := 'OK,SEND';

   :'VALIDATE':
      case P_INFO of
      :'SEND'      :      InitFiles(P_FILE);

      :'PROCESS'   :
         iFileId   := stdio.open(P_FILE.[DST_PATH], P_FILE.[DST_NAME], 'r');
         loop
            if not stdio.get_line(iFileId, tStr, true, stdio.DOSTEXT, null) then
               exit;
            end if;
            debug_pipe(&METHOD$||TB$||tStr, 0);
         end loop;
         stdio.close(iFileId);
      end;
   end;
end;


в "Локальных описаниях"
Код:
   pragma macro(cp, '[DOCUMENT]::[COPYFILES]');

procedure InitFiles
         ( P_FILE      [FILE$LOAD]
         )
is
   t_rec   &cp.FILE_rec_type;
begin
   if &cp.tbl_F$L.count > 0 then
      &cp.tbl_F$L.delete;
   end if;

   -- Инициализация инструментов копирования локального файла на сервер
   t_rec.[SRC_NAME]   := P_FILE.[SRC_NAME];
   t_rec.[SRC_PATH]   := P_FILE.[SRC_PATH];
   t_rec.[SRC_TYPE]   := false;      -- Тип источника (false - клиент, true - сервер)
   t_rec.[SRC_DELETE]   := false;

   t_rec.[DST_NAME]   := P_FILE.[SRC_NAME];
   t_rec.[DST_PATH]   := P_FILE.[DST_PATH];
   t_rec.[DST_TYPE]   := true;      -- Тип приемника (false - клиент, true - сервер)
   t_rec.[DST_DELETE]   := false;
   
   &cp.tbl_F$L(1)      := t_rec;

   &cp.idx := 0;

--   for i in &cp.tbl_F$L.first .. &cp.tbl_F$L.last loop
--      stdio.put_line_buf('<% CALL DOCUMENT COPYFILES null %>');
--   end loop;

--   Передача единственного файла происходит в Клиент-скрипте (sub ButSend_OnClick)

   debug_pipe(&METHOD$||TB$
      ||LF$||TB$||'тип источника: '||case when t_rec.[SRC_TYPE] then 'сервер' when not t_rec.[SRC_TYPE] then 'клиент' else 'n/a' end
      ||LF$||TB$||'тип приемника: '||case when t_rec.[DST_TYPE] then 'сервер' when not t_rec.[DST_TYPE] then 'клиент' else 'n/a' end
   , 0);
end;


в "Клиент-скрипте"
Код:
Public Function Main(LastControl)
   If LastControl Is Nothing Then
      ' Действия при загрузке формы

   ElseIf LastControl Is OK Then

   End If

   Main = True 'Результат валидатора (True, False, NULL)   
End Function

sub ButSend_OnClick
   Runtime.ShowMonitor
   'Для последующей обработки сразу:
   Runtime.PlayEx("<% CALL DOCUMENT COPYFILES NULL%>")
   Runtime.ServerValidate Nothing,"PROCESS"
end sub
Матвеев Евгений
Профи
Неподтвержденный


Вступление в Клуб: 31.01.2012
СообщениеЧт Окт 27, 2016 08:59    Ответить с цитатой
Полезность: Нет оценки
kai пишет:

Копирование файлов в механизме ЦФТ-Навигатора происходит, когда отрабатывает тело операции


Решение не совсем вписывается в начальную постановку ...

Я так понимаю, внутри одной функции и копирование на сервер и сразу использование результатов копирования
vek21
Участник со стажем
Неподтвержденный


Вступление в Клуб: 20.09.2007
СообщениеЧт Окт 27, 2016 09:00    Ответить с цитатой
Полезность: Нет оценки
Совершенно верно, Евгений.
Матвеев Евгений
Профи
Неподтвержденный


Вступление в Клуб: 31.01.2012
СообщениеЧт Окт 27, 2016 09:13    Ответить с цитатой
Полезность: Нет оценки
vek21 пишет:
Совершенно верно, Евгений.

При такой постановке можно попробовать рассмотреть пару вариантов...
1. Погуглить библиотеки Oracle, отвечающие за копирование..., если таковые имеются, работать напрямую с ними
2. Попробовать "примапить" виндовый путь к Линухе ...
Вот тут попробуй посмотреть...
http://cftclub.ru/viewtopic.php?t=4486&postdays=0&postorder=asc&highlight=%D4%CC%D1&start=0
Мне кажется по данному вопросу у Yaffil есть компетенции...
vek21
Участник со стажем
Неподтвержденный


Вступление в Клуб: 20.09.2007
СообщениеЧт Окт 27, 2016 09:33    Ответить с цитатой
Полезность: Нет оценки
kai, твое предложение решает проблему "разрыва" обработки между валидатором и телом операции (все происходит только в валидаторе), но, к сожалению, не решает мою задачу - копирование и обработка скопированного файла внутри одной функции...
Эмиралька
Профи
Неподтвержденный


Вступление в Клуб: 09.11.2015
СообщениеЧт Окт 27, 2016 11:09    Ответить с цитатой
Полезность: Нет оценки
vek21 пишет:
kai, твое предложение решает проблему "разрыва" обработки между валидатором и телом операции (все происходит только в валидаторе), но, к сожалению, не решает мою задачу - копирование и обработка скопированного файла внутри одной функции...


В мире всё возможно.
Например, можно сделать так:
серверный процесс запускает некий джоб, после чего впадает в ожидание alert от этого джоба.
Этот джоб пишет письмо пользователю с просьбой подойти к рабочему месту и скопировать с локальной станции на сервер некий файл, средства на усмотрение пользователя. Теоретически, можно даже настроить почтовую программу, чтобы она реагировала на подобные письма автоматически. Когда файл будет скопирован, джоб отправит ожидаемый алерт ожидающей функции.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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