Прогрузка нескольких файлов
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Окт 08, 2012 08:54  Прогрузка нескольких файлов |
|
Полезность: Нет оценки
|
Добрый день,
Есть xml файлы с данными новых клиентов, которые присылает партнёр. В 1ом файле 1 клиент. Написал операшку по загрузке данного файла, но она работает только с одним конкретным файлом
Код: | V_FILE.[DST_PATH] := 'sprav/KLI/';
V_FILE.[DST_NAME] := 'formResult_v3.xml';
|
Как сделать так, чтобы операция отрабатывала не по конкретному файлу, а по маске *.xml ? Для того, чтобы загрузить все файлы нападавшие в эту папку. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пн Окт 08, 2012 09:46   |
|
Полезность: Нет оценки
|
через клиент-скрипт
Код: | Set fso = CreateObject("scripting.filesystemobject")
Set fso = fso.getfolder(fName)
' Для каждого файла в папке ...
For Each file In fso.Files
....
|
|
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Окт 08, 2012 09:53   |
|
Полезность: Нет оценки
|
Клиент-скрипт будет в джобе работать? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пн Окт 08, 2012 09:57   |
|
Полезность: Нет оценки
|
нет |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Окт 08, 2012 10:01   |
|
Полезность: Нет оценки
|
Мне надо в теле, чтобы джобом хватало, надо без участия пользователя всё делать. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Окт 08, 2012 10:59   |
|
Полезность: Нет оценки
|
Я так понял она используется для выбора конкретного файла по маске. Что то я там никакого цикла не вижу Моя задача - лежит много файлов *.hml джоб отрабатывает, хватает всё что есть в этой директории с расширением xml и отрабатывает по каждому операцию ::[CL_PRIV].[NEW#AUTO] |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Пн Окт 08, 2012 12:02   |
|
Полезность: Нет оценки
|
У нас так реализован импорт из локальной папки
Клиент-скрипт:
Код: | ' Диалог выбора каталога
' Title - заголовок/пояснение
' Options - настройки диалога (This can be zero or a combination of the values listed under the ulFlags
' member of the BROWSEINFO structure.
' 64 - новый стиль диалога
' 576 - новый стиль диалога и не показывать Make folder
' Возвращает путь или пустую строку, если каталог не выбран
function SelectDirectory(Title, Options)
dim objShell, fso, curpath, objFolder, objFolderItem
set fso = CreateObject("Scripting.FileSystemObject")
ssfWINDOWS = 36
set objShell = CreateObject("Shell.Application")
set objFolder = objShell.BrowseForFolder(0, Title, Options, 17)
if not (objFolder is Nothing) then
set objFolderItem = objFolder.Items.Item
SelectDirectory = objFolderItem.Path
set objFolderItem = Nothing
end if
set objFolder = Nothing
set objShell = Nothing
set fso = Nothing
end function
Public Function Main(LastControl)
If LastControl Is Nothing Then
' Действия при загрузке формы
' Действия при потере фокуса валидируемого контрола LastControl
ElseIf LastControl Is OK Then
Set fso = CreateObject("Scripting.FileSystemObject")
'сразу создадим каталог для ошибок
If Not (fso.FolderExists(PATH_LOCAL & "\ERR")) Then
Set fs = fso.CreateFolder(PATH_LOCAL & "\ERR")
End If
if fso.FolderExists(PATH_LOCAL) then
Set f = fso.GetFolder(PATH_LOCAL)
Set fc = f.Files
' Выберем файлы
On Error Resume Next ' Предохранимся от ошибок
For Each f1 in fc
FILE_LIST = f1.name
'копируем с локальной машины файл на сервер
Call Runtime.ServerValidate(nothing,"LOAD_FILE")
'запускаем копирование
Runtime.Play("<% CALL " & V_STR & " %>")
V_STR = ""
'обрабатываем выписку
Call Runtime.ServerValidate(nothing,"WORK_FILE")
if V_STR <> "" then
'запускаем копирование файла ошибок
Runtime.Play("<% CALL " & V_STR & " %>")
end if
Next
nErr = Err.Number
Err.Clear
On Error GoTo 0
set fc = Nothing
set f = Nothing
end if
set fso = Nothing
end If
Main = True 'Результат валидатора (True, False, NULL)
end Function
Sub BTN_PATH_OnClick
PATH_LOCAL = SelectDirectory("Выбор каталога", 576)
if PATH_LOCAL = "" then
MSGBOX "Ошибка! Путь к каталогу не указан"
end if
End Sub |
Секция проверка:
Код: | begin
if P_MESSAGE = 'DEFAULT' then
P_INFO := 'OK';
V_PATH_SERVER := [SYSTEM_PARAMS]::[GET]('PATH', null);
--пробуем вычитать последнее значение пути
V_PATH_LOCAL := ::[DEFVALS].[SLIB].RestoreStr(stdlib.userid,&METHOD$CLASS,&METHOD$SNAME, 'V_PATH_LOCAL');
if V_PATH_LOCAL is null then
V_PATH_LOCAL := 'C:\';
end if;
end if;
if p_message='VALIDATE' then
if p_info = 'OK' then
debug_pipe('НАЧАЛО ЗАГРУЗКИ ВЫПИСОК ИЗ ПАПКИ '||V_PATH_LOCAL, 0);
debug_pipe('Файлы из каталога '||V_PATH_LOCAL||' загружаются на сервер в каталог '||V_PATH_SERVER||'/' , 0);
n_file := 0;
[DOCUMENT]::[COPYFILES].idx := 0;
[DOCUMENT]::[COPYFILES].tbl_F$L.delete();
end if;
if p_info = 'LOAD_FILE' then
n_file := n_file + 1;
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_NAME] := V_FILE_LIST;
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_PATH] := V_PATH_LOCAL;
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_TYPE] := false; -- Забирать с клиента
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_DELETE] := false; -- Удалить
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_NAME] := V_FILE_LIST;
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_PATH] := V_PATH_SERVER||'/';
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_TYPE] := true; -- На сервер
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_DELETE] := false; -- Не удалять
V_STR := 'DOCUMENT COPYFILES ' || nvl(::[SYSTEM]%id, 1);
--stdio.put_line_buf(' <% CALL DOCUMENT COPYFILES ' || nvl(::[SYSTEM]%id, 1) || ' %> ');
debug_pipe('Загружен файл '||V_FILE_LIST , 0);
end if;
if p_info = 'WORK_FILE' then
load_1c_vip (V_FILE_LIST,V_PATH_SERVER,cnt_all,v_cnt_err,v_err); -- updated CHANGE_SHORT_NAME RA_LIB_1C_VIP->RA_LIB_1C 25/12/10
debug_pipe(' При обработке файла '||V_FILE_LIST||' получено ошибок:'||v_cnt_err , 0);
-- удаляем Файл на сервере
stdio.delete_file(V_PATH_SERVER||'/'||V_FILE_LIST);
if v_cnt_err <> 0 then
-- открыть файл на запись
file := stdio.open(V_PATH_SERVER, V_FILE_LIST||'_err', 'w');
stdio.put_line(file, 'Количество ошибок при обработке файла "'||V_FILE_LIST||'"='||v_cnt_err, false, null, stdio.WINTEXT);
stdio.put_line(file, 'Описание ошибок: '||v_err, false, null, stdio.WINTEXT);
-- закрыть файл
if file is not null and file > 0 then
stdio.close(file);
end if;
--копируем файл с ошибками в папку
n_file := n_file + 1;
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_NAME] := V_FILE_LIST||'_err';
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_PATH] := V_PATH_SERVER||'/';
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_TYPE] := true; -- Забирать с клиента
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[SRC_DELETE] := true; -- Удалить
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_NAME] := V_FILE_LIST||'_err';
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_PATH] := V_PATH_LOCAL||'\ERR';
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_TYPE] := false; -- На сервер
[DOCUMENT]::[COPYFILES].tbl_F$L(n_file).[DST_DELETE] := false; -- Не удалять
V_STR := 'DOCUMENT COPYFILES ' || nvl(::[SYSTEM]%id, 1);
debug_pipe(' Скопировали файл с ошибками '||V_FILE_LIST||'_err' , 0);
end if;
end if;
end if;
end; |
_________________ всегда есть как минимум 2 выхода
Последний раз редактировалось: Alexsey (Пн Окт 08, 2012 12:03), всего редактировалось 1 раз |
|
 |
hornet Участник со стажем
Вступление в Клуб: 24.07.2008
|
Пн Окт 08, 2012 12:02   |
|
Полезность: Нет оценки
|
yaffil пишет: | ...
Что то я там никакого цикла не вижу Моя задача - лежит много файлов *.hml джоб отрабатывает, хватает всё что есть в этой директории с расширением xml и отрабатывает по каждому операцию ::[CL_PRIV].[NEW#AUTO] |
Я так понял файлы то на серваке ?! Нет ?
Тогда
str := stdio.FILE_LIST(DIR_PATH, ...); - получаешь стоку с файлами через пробел. Парсишь его и закидываешь в массив. По этому массиву делаешь цикл и выполняешь операцию. |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Пн Окт 08, 2012 12:17   |
|
Полезность: Нет оценки
|
hornet пишет: |
Я так понял файлы то на серваке ?! Нет ?
Тогда
str := stdio.FILE_LIST(DIR_PATH, ...); - получаешь стоку с файлами через пробел. Парсишь его и закидываешь в массив. По этому массиву делаешь цикл и выполняешь операцию. |
Да на серваке, FILE_LIST - вот это тема, спасибо. Попробую её поюзать.  |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Окт 09, 2012 05:40   |
|
Полезность: 3
|
yaffil пишет: | hornet пишет: |
Я так понял файлы то на серваке ?! Нет ?
Тогда
str := stdio.FILE_LIST(DIR_PATH, ...); - получаешь стоку с файлами через пробел. Парсишь его и закидываешь в массив. По этому массиву делаешь цикл и выполняешь операцию. |
Да на серваке, FILE_LIST - вот это тема, спасибо. Попробую её поюзать.  |
Не, FILE_LIST не тема, 4000 символов - достаточно четырёх сотен файлов с восемью символами в имени и тремя в расширении, чтобы она сломалась.
вот кусочек моей функции:
Код: |
type arr$str is table of varchar2(32767) index by binary_integer;
function GetFileList(p_path varchar2
) return arr$str is
v$dir integer;
v$state integer;
v$name varchar2(32767);
v$attrs varchar2(32767);
v$user varchar2(32767);
v$group varchar2(32767);
v$date varchar2(32767);
v$size number;
v$ret arr$str;
begin
-- Открываем каталог
v$dir := stdio.opendir(p_path,null,1);
if nvl(v$dir,-1) <= 0 then
бросить исключение FILELIST_EXCEPT, 'Ошибка открытия каталога ['||p_path||']: '||v$dir;
end if;
-- Сбрасываем список на всякий случай
v$state := stdio.resetdir(v$dir);
if nvl(v$state,-1) <> 0 then
бросить исключение FILELIST_EXCEPT, 'Ошибка сброса каталога ['||p_path||']: '||v$state;
end if;
loop
v$state := stdio.readdir( v$dir, v$name, v$attrs, v$user, v$group, v$date, v$size );
if nvl(v$state,-1) < 0 then
бросить исключение FILELIST_EXCEPT, 'Ошибка чтения каталога ['||p_path||']: '||v$state;
end if;
exit when v$state = 0;
v$ret(v$ret.count + 1) := v$name;
end loop;
v$state := stdio.closedir(v$dir);
if nvl(v$state,-1) <> 0 then
бросить исключение FILELIST_EXCEPT, 'Ошибка закрытия каталога ['||p_path||']: '||v$state);
end if;
return v$ret;
end;
|
|
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Вт Окт 09, 2012 08:24   |
|
Полезность: Нет оценки
|
Random пишет: |
вот кусочек моей функции:
|
Спасибо, плюсанул С лупом в теле вообще красота, то что доктор прописал.
Код: |
mas_file := GetFileList(V_FILE.[DST_PATH]);
for i in 1 .. mas_file.count
loop
debug_pipe(mas_file(i)||chr(10),0);
end loop;
|
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|