Копирование файла на сервер и открытие его в одной функции
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 от этого джоба.
Этот джоб пишет письмо пользователю с просьбой подойти к рабочему месту и скопировать с локальной станции на сервер некий файл, средства на усмотрение пользователя. Теоретически, можно даже настроить почтовую программу, чтобы она реагировала на подобные письма автоматически. Когда файл будет скопирован, джоб отправит ожидаемый алерт ожидающей функции. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|