Импорт из 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 пишет: | Файл я передам с клиента на сервер "за один раз". Далее он построчно будет читаться на сервере.
В твоем методе будут периодическое переключение клиент (клиент скрипт считал данные ) - сервер ( в валидаторе обработка данных). |
Все правильно
Если хочешь продолжить флудильню, напиши где тормоза... Но, мне кажется, читатели не оценят.. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|