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

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


Вступление в Клуб: 22.10.2007
СообщениеВт Окт 23, 2007 01:24   Импорт из Excel в IBSO Ответить с цитатой
Полезность: Нет оценки
Добрый день, коллеги. Если кто сталкивался с вопросом загрузки данных из MS Excel в IBSO, прошу откликнитесь! Я пытаюсь наладить загрузку стоп-листа из формата xls. Выгрузка в Excel в принципе настраивается, хотелось бы знать, возможно ли загружать из Excel'я???
Rolling Eyes
Буду весьма признателен любым комментариям...
German
Профи


Вступление в Клуб: 25.06.2007
СообщениеВт Окт 23, 2007 09:53    Ответить с цитатой
Полезность: 3
Проверка:
Код:
begin
   if p_message = 'DEFAULT' then
      FILE_NAME := [REPS]::[SLIB].GetPath('PATH_PRINT_EXCEL', 'test.xlt');
      excel.init_xls;
      work_mode := excel.wmRead;
   elsif p_message = 'VALIDATE' and p_info = 'OK' then
      if excel.f_click then
         excel.f_click := false;
         if work_mode = excel.wmRead then
            excel.open_file(FILE_NAME, false);
            excel.open_sheet('test');
            read_accs;
            work_mode := excel.wmDraw;
         elsif work_mode = excel.wmDraw then
            debug(V_DATA,0);
            excel.visible;
            work_mode := excel.wmWrite;
         elsif work_mode = excel.wmWrite then
            work_mode := excel.wmStop;
         elsif work_mode = excel.wmStop then
            excel.release;
         end if;
      end if;
      if excel.exec_script(V_DEST) = 'DONE' then
         if work_mode != excel.wmStop then
            V_DEST := 'a = 1';
         else
            V_DEST := '';
         end if;
      end if;
   end if;
end;


Локальные описания:
Код:
FILE_NAME   varchar2(100);
work_mode   integer;

procedure read_accs is
begin
   excel.cmd('
       Set MyRange = sheet.UsedRange
       C_Max = MyRange.Columns.Count
       L_Max = MyRange.Rows.Count
       sRetText = ""
       aReadData = MyRange.FormulaR1C1
   
       For L = 1 To L_Max
            sCell = aReadData(L, 1)
            sCell = Trim(sCell)
         
         if sCell <> "" then
            sRetText = sRetText & "<" & sCell & ">"
         end if
       Next
   
       MyRange.FormulaR1C1 = aReadData
       V_DATA.Text = sRetText');
end;


Клиент-скрипт:
Код:
Public Function Main(LastControl)
   if LastControl is OK and V_DEST.Text <> "" then
      do
         Execute V_DEST.text
         Form1.ScriptServerValidate OK, "OK"
      loop while V_DEST.text <> ""
   end if
   Main = True 'Результат валидатора (True, False, NULL)
End Function


Переменные V_DEST, V_DATA (строки 32000) - вывести невидимыми на экранную форму, включить проверку введенного значения V_DEST и OK. В "Дополнительных свойствах" операции установить проверки "Сервер, клиент". Шаблон test.xlt с листом test положить в каталог шаблонов Excel.

Операция читает и выводит на экран содержимое первого столбца из шаблона. Дальше самостоятельно!
_________________
Homo homini
belyansky
Участник со стажем


Вступление в Клуб: 22.10.2007
СообщениеВт Окт 23, 2007 13:20    Ответить с цитатой
Полезность: Нет оценки
Спасибо большое, Олег!
но всё же я специалист начинающий...Smile
сделал всё как указано в вашем сообщении, за исключением пути к файлу - я его строго задал как файл с локального диска - 'C:\stop.xlt'. Изначально задумывалось чтение из файла xls, но для "чистоты эксперимента" я оставил расширение xlt. Но при таких дейстаиях не происходит чтение из файла....или если быть точнее, то чтение может и происходит, но сообщение со считанной информацией отсутствиет.
Ещё хотелось бы уточнить - excel.open_file(FILE_NAME, true) - при таком вводе я так понимаю файл Excel должен открыться, то есть прямо на экране должен загрузиться Excel, я правильно понял?
German
Профи


Вступление в Клуб: 25.06.2007
СообщениеВт Окт 23, 2007 15:35    Ответить с цитатой
Полезность: Нет оценки
belyansky пишет:
сделал всё как указано в вашем сообщении, за исключением пути к файлу - я его строго задал как файл с локального диска - 'C:\stop.xlt'. Изначально задумывалось чтение из файла xls, но для "чистоты эксперимента" я оставил расширение xlt.


Разницы нет

belyansky пишет:
Но при таких дейстаиях не происходит чтение из файла....или если быть точнее, то чтение может и происходит, но сообщение со считанной информацией отсутствиет.


1. На экранной форме идентификаторы переменных V_DEST и V_DATA должны быть тоже равны V_DEST и V_DATA соответственно.
2. Вместо debug(V_DATA,0); в проверке поставьте pragma error('V_DATA='||V_DATA); чтобы не было сомнений насчет сообщения
3. В вашем файле в первом столбце данные есть?

belyansky пишет:
Ещё хотелось бы уточнить - excel.open_file(FILE_NAME, true) - при таком вводе я так понимаю файл Excel должен открыться, то есть прямо на экране должен загрузиться Excel, я правильно понял?


Не помню, подсмотрите в библиотеке EXCEL
_________________
Homo homini
dnk_dz
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Окт 24, 2007 08:49    Ответить с цитатой
Полезность: Нет оценки
belyansky пишет:

Ещё хотелось бы уточнить - excel.open_file(FILE_NAME, true) - при таком вводе я так понимаю файл Excel должен открыться, то есть прямо на экране должен загрузиться Excel, я правильно понял?

На экране Excel появляется после excel.visible
belyansky
Участник со стажем


Вступление в Клуб: 22.10.2007
СообщениеСр Окт 24, 2007 09:50    Ответить с цитатой
Полезность: Нет оценки
Большое спасибо, коллеги! Smile
Разобрался с кодом Олега, начало работам положено.
Файл открывается, и формат xlt и формат xls воспринимаются нормально.
По части Excel.Visible - это равнозначно признаку true в выражении Excel.Open_file(file_name, true).
Но тему пока оставляю открытой, ведь проблемы могут возникнуть всегда, и может кому-то тоже понадобится воспользоваться выгрузкой из Excel'я.
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеВт Мар 06, 2012 11:57    Ответить с цитатой
Полезность: Нет оценки
German пишет:

Локальные описания:
Код:
FILE_NAME   varchar2(100);
work_mode   integer;

procedure read_accs is
begin
   excel.cmd('
       Set MyRange = sheet.UsedRange
       C_Max = MyRange.Columns.Count
       L_Max = MyRange.Rows.Count
       sRetText = ""
       aReadData = MyRange.FormulaR1C1
   
       For L = 1 To L_Max
            sCell = aReadData(L, 1)
            sCell = Trim(sCell)
         
         if sCell <> "" then
            sRetText = sRetText & "<" & sCell & ">"
         end if
       Next
   
       MyRange.FormulaR1C1 = aReadData
       V_DATA.Text = sRetText');
end;


Клиент-скрипт:
Код:
Public Function Main(LastControl)
   if LastControl is OK and V_DEST.Text <> "" then
      do
         Execute V_DEST.text
         Form1.ScriptServerValidate OK, "OK"
      loop while V_DEST.text <> ""
   end if
   Main = True 'Результат валидатора (True, False, NULL)
End Function


Переменные V_DEST, V_DATA (строки 32000)


А если в файле больше данных, чем 32000, что будет, когда V_DATA переполнится?
mlg
Участник со стажем


Вступление в Клуб: 23.07.2007
СообщениеВт Мар 06, 2012 12:02    Ответить с цитатой
Полезность: Нет оценки
German пишет:

А если в файле больше данных, чем 32000, что будет, когда V_DATA переполнится?


Тогда выйдет ошибка работы клиент-скрипта
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеВт Мар 06, 2012 12:04    Ответить с цитатой
Полезность: Нет оценки
mlg пишет:

Тогда выйдет ошибка работы клиент-скрипта

А как бы в таком же режиме (читаем, обрабатываем, пишем) вытащить из Excel большой объем данных, но построчно? Имеется в виду построчная обработка.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Мар 06, 2012 12:52    Ответить с цитатой
Полезность: Нет оценки
А что мешает из EXСEL выгрузить плоский CSV (можно это сделать из того же клиент скрипта, как недавно в ветке обсуждения PDF формата), а его уже построчно обрабатывать ...
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВс Мар 11, 2012 14:28    Ответить с цитатой
Полезность: 1
vtar пишет:
А что мешает из EXСEL выгрузить плоский CSV (можно это сделать из того же клиент скрипта, как недавно в ветке обсуждения PDF формата), а его уже построчно обрабатывать ...

Воф, в наш-то век науки и техники..

Вот мой вариант на суд общественности:
Код:

Public Function Main(LastControl)
   If LastControl is OK and txtFilePath.Text <> "" and txtFileName.Text <> ""  Then
      Form1.ScriptShowMonitor
      ' Открываем XL-файл
      Set app = CreateObject("Excel.Application")
      Set book = app.Workbooks.Add(txtFilePath.Text & txtFileName.Text)
      'Set ws   = book.Worksheets(1)    ' Получение ссылки на первую страницу
      Set ws   = book.ActiveSheet
      Set myRange = ws.UsedRange       ' Получени заполненого диапозона страницы
      
      Row_Count = myRange.Rows.Count
   
      
      'Инициализируем XML-контейнер
      V_XML = ""
      Set xmlDoc = CreateObject("Microsoft.XMLDOM")
      
      for ln=1 to Row_Count step 20
         xmlDoc.loadxml("<?xml version='1.0' encoding='windows-1251'?><ROOT/>")
         'Напихиваем XML-контейнер содержимым для отправки серверу (по 20 записей)
         
         'sTemp = ""         
         for i=0 to 19
            if len(ws.Cells(ln + i, 2)) = 0 then
               exit for
            end if
            
            ' создание нового узла
            Set xmlFields = xmlDoc.documentElement.appendChild(xmlDoc.createElement("ROW"))
            Set xmlField  = xmlFields.appendChild(xmlDoc.createElement("RowNumb"))
                 xmlField.Text = ln + i
                 Set xmlField  = xmlFields.appendChild(xmlDoc.createElement("IdPos"))
                 xmlField.Text = ws.Cells(ln + i, 1)
                 Set xmlField  = xmlFields.appendChild(xmlDoc.createElement("NumPos"))
                 xmlField.Text = ws.Cells(ln + i, 2)
                 Set xmlField  = xmlFields.appendChild(xmlDoc.createElement("AccReserv"))
                 xmlField.Text = ws.Cells(ln + i, 3)
                 Set xmlField  = xmlFields.appendChild(xmlDoc.createElement("AccReservDebt"))
                 xmlField.Text = ws.Cells(ln + i, 4)
                 
            
         next 'i
         'MsgBox xmlDoc.xml
         
         V_XML.Text = xmlDoc.xml
         
         'Обработать сервером 20 записей.
         Call Form1.ScriptServerValidate(nothing, "UPLOAD")
         
         'Если в валидаторе возникли ошибки, то прерываем цикл.
         if bErrors = true then
            exit for
         end if         
      next 'ln
      
      ' Деинициализируем XL
      book.Close
      app.Quit
   End if
   Main = True 'Результат валидатора
End Function


Для передачи серверу использую XML-контейнер, в который кладу в зависимости от кол-ва строк в XL от 20 до 100 записей...
Таким образом и сервер не загнется, и контейнер не переполнится, и удобно на серверной стороне разбирать посылочку запросом:
Код:

begin
   if p_message = 'VALIDATE' then
      if p_info = 'UPLOAD' then
         -- Обработаем переданные клиен-скриптом данные.
         declare
            CUR      SYS_REFCURSOR;
            type tImpRec  is record (
                 RowNumb   number,
                 IdPos      number,
                NumPos      varchar2(25),
                AccReserv   varchar2(25),
                AccReservDebt varchar2(25)
            );
            
            type tImpTbl is table of tImpRec ;
            recs         tImpTbl;
            user_filial      ref [BRANCH];
            
         begin         
            SAVEPOINT  NOM_IMP_POS_XL_SP1;
            V_ERRORS := true;    -- Флаг ошибок снимется в случае успешного выполнения процедуры.
            
            user_filial := stdlib.userid.[FILIAL];

            -- begin pl/sql
            open cur for
               select    
                      x.extract('ROW/RowNumb/text()').getNumberVal()
                     ,x.extract('ROW/IdPos/text()').getNumberVal()
                         ,x.extract('ROW/NumPos/text()').getStringVal()
                         ,x.extract('ROW/AccReserv/text()').getStringVal()
                         ,x.extract('ROW/AccReservDebt/text()').getStringVal()
               from
                  table(xmlsequence(xmltype(V_XML).extract('/ROOT/ROW'))) x;
            -- end pl/sql
            
            cur.fetch(recs);
            
            for i in 1..recs.count loop
               ...
            end loop;
         end;
         
         --
         V_XML := null;
      end if;
   end if;
end;

vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВс Мар 11, 2012 14:33    Ответить с цитатой
Полезность: Нет оценки
Сергей, мне кажется, что на БОЛЬШОМ ( что озвучил ТС) объеме данных твой метод ( пинать записи через : клиент скрипт живет на клиенте, валидатор - на сервере) будет ТОРМОЗИТЬ, в отличие от ( csv зальется на сервер и там же скушается в TABLE).
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВс Мар 11, 2012 14:51    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
пинать записи через : клиент скрипт живет на клиенте, валидатор - на сервере) будет ТОРМОЗИТЬ, в отличие от ( csv зальется на сервер и там же скушается в TABLE).


Не торопись, а то я что-то смысл твоих слов не улавливаю...

Что значит "скушается"? Не в оракле функции "скушать в TABLE", будешь также читать файл построчно, и делать insert'ы в таблицу..

Файл же на сервер передавать будешь точно также средствами Oracle, через компоненту "Экспорт-импорт файлов".

В каком месте будет ТОРМОЗИТЬ?
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВс Мар 11, 2012 15:18    Ответить с цитатой
Полезность: Нет оценки
Файл я передам с клиента на сервер "за один раз". Далее он построчно будет читаться на сервере.

В твоем методе будут периодическое переключение клиент (клиент скрипт считал данные ) - сервер ( в валидаторе обработка данных).
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВс Мар 11, 2012 15:42    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
Файл я передам с клиента на сервер "за один раз". Далее он построчно будет читаться на сервере.

В твоем методе будут периодическое переключение клиент (клиент скрипт считал данные ) - сервер ( в валидаторе обработка данных).


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

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