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

Как в одной операции прочитать TXT файл и сохранить в XLS

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Ivanvas
Участник


Вступление в Клуб: 16.04.2008
СообщениеПт Ноя 25, 2011 15:02   Как в одной операции прочитать TXT файл и сохранить в XLS Ответить с цитатой
Полезность: Нет оценки
Доброго дня всем.
Есть проблемка открыть txt-файл хранящийся в локальной директории, взять из него данные и сохрнить их в excel.
Проблема в том что stdio для работы с текстовым файлом отрабатывает только в разделе операции "Тело" в части копирования файла с локального диска на сервер и открытиея его на чтение (stdio.open(path,file,'r'); где path - это путь на сервере), если в разделе "Проверка", то говорит "File not found", а работа с excel шаблоном работает только в "Проверка" в валидации. Как это победить, мне же надо первично открыть текстовый файл, чтобы вытянуть из него информацию, а потом только заполнить шаблон excel, а тут обратная схема только работает.
Если пробую сразу открыть файл на чтение с локального диска т.е. path = путь на локальном диске то ошибка "Операция не может быть выполнена для этого файла".
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеПт Ноя 25, 2011 17:04    Ответить с цитатой
Полезность: Нет оценки
Попробуйте сначала принудительно закачать файл на сервер, вызвав операцию копирования через PLPCALL.
Например так:
Код:
stdio.put_line_buf('<% PLPCALL [FILE_SALARY].[COPY_FILE](%PARAM%.P_LOCAL_PATH=>'''||::[SYSTEM_PARAMS].[GET]('PATH',null)||''',
                                                 %PARAM%.P_FILENAME=>'''||P_FILES_REE(i).[LOCAL_PATH]||''',
                                                 %PARAM%.P_SERVER_PATH=>'''||V_FILE.[DST_PATH]||''',
                                                 %PARAM%.P_SERVER_FILENAME=>'''||P_FILES_REE(i).[LOCAL_PATH]||''',
                                                 %PARAM%.P_DIRECTION=> ''true''
                                                 )%>');


ну а далее дело техники
_________________
всегда есть как минимум 2 выхода
Ivanvas
Участник


Вступление в Клуб: 16.04.2008
СообщениеПн Ноя 28, 2011 11:37    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
Попробуйте сначала принудительно закачать файл на сервер, вызвав операцию копирования через PLPCALL.
Например так:
Код:
stdio.put_line_buf('<% PLPCALL [FILE_SALARY].[COPY_FILE](%PARAM%.P_LOCAL_PATH=>'''||::[SYSTEM_PARAMS].[GET]('PATH',null)||''',
                                                 %PARAM%.P_FILENAME=>'''||P_FILES_REE(i).[LOCAL_PATH]||''',
                                                 %PARAM%.P_SERVER_PATH=>'''||V_FILE.[DST_PATH]||''',
                                                 %PARAM%.P_SERVER_FILENAME=>'''||P_FILES_REE(i).[LOCAL_PATH]||''',
                                                 %PARAM%.P_DIRECTION=> ''true''
                                                 )%>');


ну а далее дело техники


Попробовал так, все равно не находит файл. Решил проблему по другому, отказался от txt, взял xls с данными. Тем не менее спасибо.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Ноя 29, 2011 06:05    Ответить с цитатой
Полезность: 1
Ivanvas пишет:
Alexsey пишет:
Попробуйте сначала принудительно закачать файл на сервер, вызвав операцию копирования через PLPCALL.
Например так:
Код:
stdio.put_line_buf('<% PLPCALL [FILE_SALARY].[COPY_FILE](%PARAM%.P_LO...                                  )%>');


ну а далее дело техники


Попробовал так, все равно не находит файл. Решил проблему по другому, отказался от txt, взял xls с данными. Тем не менее спасибо.


Вероятно, ты вывел в буфер команду, а потом сразу начал искать файл. Это ошибка. Надо дать Навигатору прочитать данные из буфера, распознать команду и выполнить ее.

Тут следует действовать из следующих предпосылок:
1. Файл, к которому ты пытаешься получить доступ, находится на клиенте.
2. А программа выполняется на сервере.
3. Обмен информацией клиента с сервером происходит через АРМ Навигатор, то есть, после того как ты выполнил stdio.put_line_buf, необходимо дождаться отработки этой операции, то есть дождаться, когда выполнятся валидатор и VB-скрипт.
4. На локальной станции отрабатывает ТОЛЬКО vb-скрипт
5. Все, написанное на PL/+, отрабатывает ТОЛЬКО на сервере.

Вывод? Либо файл перетащить на сервер, либо работать сразу на клиенте, не используя PL/+ и stdio вообще.

Я бы сделал вообще по-другому:
1. запустил операцию.
2. Дождался нажатия на кнопку.
3. выполнил бы из клиент-скрипта result = Form1.ScriptPlayEx("<%PLPCALL [ТИП].[ОПЕРАЦИЯ](ПАРАМЕТРЫ)%>") копирование файла с локальной станции на сервер - ну тут можно посмотреть примеры уже реализованных операций
4. клиент-скрипт будет дожидаться, пока отработает предыдущая команда, так что считаем, что файл уже на сервере. поэтому выполняем Form1.ScriptServerValidate OK, "FILE_SENDED", таким образом, ты командуешь скрипту выполнить секцию валидации операции на сервере с p_info = FILE_SENDED
5. В секции валидации операции нужно добавить обработку if p_info = 'FILE_SENDED' then <чтение и обработка txt-файла>
6. Обрати внимание на закладку операции "дополнительные свойства", группа "Проверки" - должна быть включена обработка действий на клиенте; контрол (в данном случае кнопка) должен быть отмечен как валидируемый (свойство CheckValidate из РЭФ); ну и в клиент-скрипте должна присутствовать функция Main.

Ну и напоследок, чтобы посмотреть, какие файлы находятся на сервере, используй stdio.file_list

Ну или вообще использовал в клиент-скрипте что-нибудь типа
Код:
Function ReadLineTextFile
  Const ForReading = 1, ForWriting = 2
  Dim fso, f
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("c:\testfile.txt", ForReading)

Set xls = CreateObject("Excel.Application")
Set book = xls.Workbooks.Add
Set sheet = book.Worksheets(1)
Sheet.Activate
xls.Visible=True
Sheet.Cells(1,1) = "Hello, world!"
Sheet.Cells(2,2) = f.ReadLine
'Ну и дальше перекинул бы данные из текстового файла в эксель, используя f.ReadLine
End Function
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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