Импорт из Excel в IBSO 
	  На страницу 1, 2  След. 
	     | 
   
 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		belyansky Участник со стажем
 
  Вступление в Клуб: 22.10.2007
  | 
		
			
				 Вт Окт 23, 2007 01:24   Импорт из Excel в IBSO | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Добрый день, коллеги. Если кто сталкивался с вопросом загрузки данных из MS Excel в IBSO, прошу откликнитесь! Я пытаюсь наладить загрузку стоп-листа из формата xls. Выгрузка в Excel в принципе настраивается, хотелось бы знать, возможно ли загружать из Excel'я???
 
   
 
Буду весьма признателен любым комментариям... | 
			 
		  | 
	 
	
		  | 
	 
	
		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    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Спасибо большое, Олег!
 
но всё же я специалист начинающий... 
 
сделал всё как указано в вашем сообщении, за исключением пути к файлу - я его строго задал как файл с локального диска - '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    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Большое спасибо, коллеги!  
 
Разобрался с кодом Олега, начало работам положено.
 
Файл открывается, и формат 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 пишет: | 	 		  Файл я передам с клиента на сервер "за один раз". Далее он построчно будет читаться на сервере.
 
 
В твоем методе будут периодическое переключение клиент (клиент скрипт считал данные ) - сервер ( в валидаторе обработка данных). | 	  
 
 
Все правильно  
 
Если хочешь продолжить флудильню, напиши где тормоза... Но, мне кажется, читатели не оценят.. | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |