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

Прогрузка нескольких файлов

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
СообщениеПн Окт 08, 2012 10:02    Ответить с цитатой
Полезность: Нет оценки
http://www.cftclub.ru/viewtopic.php?t=937&highlight=%EE%E1%F5%EE%E4+%F4%E0%E9%EB%EE%E2+%ED%E0+%F1%E5%F0%E2%E5%F0%E5
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 - вот это тема, спасибо. Попробую её поюзать. Very Happy
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Окт 09, 2012 05:40    Ответить с цитатой
Полезность: 3
yaffil пишет:
hornet пишет:

Я так понял файлы то на серваке ?! Нет ?
Тогда
str := stdio.FILE_LIST(DIR_PATH, ...); - получаешь стоку с файлами через пробел. Парсишь его и закидываешь в массив. По этому массиву делаешь цикл и выполняешь операцию.


Да на серваке, FILE_LIST - вот это тема, спасибо. Попробую её поюзать. Very Happy


Не, 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 пишет:

вот кусочек моей функции:



Спасибо, плюсанул Smile С лупом в теле вообще красота, то что доктор прописал.
Код:

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

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