|
23.07.2007, 13:26 | #1 |
Участник
|
Подскажите с Binary
Доброго понедельничка всем обитателям сия ресурса.
Уважаемы неожиданно возникла задача след. содержания: Необходима из Аксапты формировать некий отчет в Excel по заданному шаблону. Затем этот файлик юзер куда-то сохраняет, после чего он должен его импортировать в Аксапту (сам файл Excel'я), в которой этот самый файлик и должен храниться в каком то виде до определенного момента. Пока его не захотят снова открыть (экспорт). То есть необходимо потом обратная процедура: из этого некоего хранилища надо вывести "как есть" хранящийся файлик в Excel. Как это красивше и правильнее реализовать средствами Аксапты (Ax 3.0) Думается создать простенькую табличку вида: - Код файла - структура , где "структура" - некое хранилище где и будет хранится в чистом виде Excel-файл. Предположительно это тип container (но если я не прав поправьте) Так вот если следовать этому направлению. то необходимы какие то механизмы реализующие возможность импорта/экспорта файлов в аксаптовкий тип container. Подскажите что можно попользовать, классец какой или еще что имеется ? Слышал есть классы Binary и BinData по названию вроде должны подходить, но хотелось бы увидеть наглядный примерчик как передать файл в Аксапту с их помощью, как вытянуть файл из аксаптовкой структуры(container) обратно в Excel. Или же в моем случае лучше использовать какие то другие классы? Вообщем направьте на путь истиный... Заранее респект всем откликнувшимся и сочуствующим... |
|
23.07.2007, 13:40 | #2 |
Участник
|
Делайте шаблон exel. Файл xlt. В нем скрытый лист Data. Первая строчка русские имена. Под ними вторая строчка значения. Дальше строку для наглядности пропустили. Четвёртая имена строк. Пятая и далее таблица.Смысл: обычно нужна одна строчка из шапки и таблица приджойненая к ней (строки). А аналитики и юзары пусть уж как хотят возятся с этим шаблоном с помощью ссылок. Куда какие поля раставить, добавить формулы и т.д. Вам лишь прейдётся работать с жёстко структурированным листом Data. Для вас Data будет протокол общения.
Последний раз редактировалось miklenew; 23.07.2007 в 13:43. |
|
|
За это сообщение автора поблагодарили: Ed1k (1). |
23.07.2007, 13:50 | #3 |
Участник
|
Цитата:
Сообщение от miklenew
Делайте шаблон exel. Файл xlt. В нем скрытый лист Data. Первая строчка русские имена. Под ними вторая строчка значения. Дальше строку для наглядности пропустили. Четвёртая имена строк. Пятая и далее таблица.Смысл: обычно нужна одна строчка из шапки и таблица приджойненая к ней (строки). А аналитики и юзары пусть уж как хотят возятся с этим шаблоном с помощью ссылок. Куда какие поля раставить, добавить формулы и т.д. Вам лишь прейдётся работать с жёстко структурированным листом Data. Для вас Data будет протокол общения.
дело в том, что само формирование отчета мне не сильно важно... Как вывести отчет в Excel на основании шаблона - это не проблема реализовать... Необходимо именно реализовать импорт/экспорт самого файла в каком-либо виде(бинарном) в/из Аксапты. Просто нужно этот весь геморрой для того чтобы хранить разные версии этого самого отчета. Допустим сформировали 1ый раз отчет сохранили на диск, сделали импорт. А потом решили кое-чего подправить в нем(без изменения данных, на основании которых формируется отчет, в Аксапте) цифирки, делаем экспорт 1ой версии, подправили, сохранили, импорт (предыдущая версия не затирается, а создается новая запись в таблице - новая версия) и т.д. вот для чего весь карнавал... |
|
23.07.2007, 14:06 | #4 |
Участник
|
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.
Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать. |
|
23.07.2007, 14:13 | #5 |
Участник
|
Цитата:
Сообщение от miklenew
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.
Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать. То, что Вы предлагаете возможно тоже является решением задачи, однако не в моем представлении... возможно я просто смотрю слишком узко на поставленную задачу... но все равно спасибо за проявлнный интерес... |
|
23.07.2007, 14:13 | #6 |
Участник
|
Цитата:
Сообщение от miklenew
А чё не понятно. Появился диалог с параметрами запроса. Выстовили что нужно ок. Хотите выводите это на экран (чтоб юзары сохранили куда-то или сами или в настройках путь экспорта вам виднее), хотите не выводите. Просто выдали экспорт окончен. Далее юзары поюзали. Только надо сделать чтоб эти данные обновлялись и на Date. Делаем импорт. С настройками или явно тоже ваше дело. В аксапте что-то меняем снова экспорт.
Можно обновление сделать, а можно добавление (хотя не уверен что это правильно). Надо версию сохранить сохраняйте в чём проблемы. Сделайте какие- нибудь утверждения при формирование имяни их и реализуйте. Цифирки, буковки. А лучше галочки на диалоге создать новый исходя из того который последний+сдвиг(исходя из утверждение) или затереть. Вам решать. Но подумать прийдётся до того как код писать. То, что Вы предлагаете возможно тоже является решением задачи, однако не в моем представлении... возможно я просто смотрю слишком узко на поставленную задачу... но все равно спасибо за проявлнный интерес... |
|
23.07.2007, 13:45 | #7 |
Участник
|
посмотрите как работает документооборот.
|
|
23.07.2007, 13:46 | #8 |
Участник
|
X++: // AOSRunMode::client - this method is always called on the client, which eliminates the need for a CAS assert. public static client DocuValue writeDocuValue(DocuRef docuRef, Filename filename = '', BinData binData = null) { DocuValue docuValue; DocuType docuType; ; ttsbegin; docuType = docuRef.docuType(); docuValue = docuRef.docuValue(true); [docuValue.FileName, docuValue.FileType, docuValue.Path] = Docu::splitFilename(filename); if (docuType.FilePlace != DocuFilePlace::NoCopy) docuValue.Path = ''; //path is already stored in ArchivePath in docuType or docuParameters if (docuType.FilePlace == DocuFilePlace::Database) { // Insert to database if (WinAPI::fileLocked(filename)) { info("@SYS72783",'',SysInfoAction_Formrun::newFormnameControlnameDesc(formstr(DocuOpenFile), identifierstr(Grid), "@SYS4167")); } else { if (! binData) { binData = new BinData(); if (binData.loadFile(filename)) //only works if file not locked { docuValue.File = binData.getData(); } else throw error(strfmt("@SYS54217",filename)); } else docuValue.File = binData.getData(); } } docuValue.update(); ttscommit; return docuValue; } Последний раз редактировалось petr; 23.07.2007 в 13:58. Причина: Более полный ответ |
|
23.07.2007, 13:48 | #9 |
Участник
|
Это было сохранение в таблицу, теперь восстановление
X++: static public Filename saveTempFile(DocuRef docuRef, boolean internetCache = true) { BinData binData; Filename filename; FilePath filePath; str endSlash(str _str) { return (strscan(_str, '\\',strlen(_str),-1)) ? _str : _str + '\\'; } ; binData = new BinData(); binData.setData(docuRef.docuValue().file); filePath = endSlash(internetCache ? WinAPI::getFolderPath(#CSIDL_INTERNET_CACHE) : xInfo::directory(DirectoryType::Temp)); filename = docuRef.completeFilename(filePath); binData.saveFile(filename); return filename; } |
|
|
За это сообщение автора поблагодарили: Player1 (2). |
23.07.2007, 13:56 | #10 |
Участник
|
2petr:
а вот это уже похоже на что-то интересное... я так понимаю код откуда то из стандарта выдернут ? если так подскажите откуда... в посте про импорт: filename - это полный путь к файлу на диске? |
|
23.07.2007, 14:01 | #11 |
Участник
|
filename - путь в файлу,
сохраниние в БД \Data Dictionary\Tables\DocuValue\Methods\writeDocuValue извлечение из БД \Classes\DocuActionFile\saveTempFile поле docuRef.docuValue().file тоже самое поле типа container в которое и сохраняли. |
|
|
За это сообщение автора поблагодарили: sparur (1). |
23.07.2007, 14:07 | #12 |
Участник
|
Цитата:
Кстати а как со скоростью исполнения данного метода? отчего будет зависить время импорта/экспорта файла? |
|
23.07.2007, 15:07 | #13 |
Moderator
|
Имейте в виду, что в BinaryData есть ограничение на размер сохраняемого файла. Что-то близкое в 64Мб. При попытке затягивания excel-документа в базу данных большего размера Аксапта просто висла. Похоже, что это ограничение нигде не описано.
Как выход, я использовал архивирование больших файлов, перед затягиванием их в БД. Но это пораждает две проблемы. Первое - дождаться окончания архивации, перед загрузкой файла в бд, вторая - деплоинг архиватора и получение прав на запуск архиватора (к сожалению, не у всех это есть). Первая проблема решается путем импортирования api-функции createProcess. Вторая - групповыми политиками. |
|
23.07.2007, 15:13 | #14 |
Участник
|
Цитата:
Сообщение от Андре
Имейте в виду, что в BinaryData есть ограничение на размер сохраняемого файла. Что-то близкое в 64Мб. При попытке затягивания excel-документа в базу данных большего размера Аксапта просто висла. Похоже, что это ограничение нигде не описано.
Как выход, я использовал архивирование больших файлов, перед затягиванием их в БД. Но это пораждает две проблемы. Первое - дождаться окончания архивации, перед загрузкой файла в бд, вторая - деплоинг архиватора и получение прав на запуск архиватора (к сожалению, не у всех это есть). Первая проблема решается путем импортирования api-функции createProcess. Вторая - групповыми политиками. спасибо за предупреждение, но я думаю размер в 64 МБ в данном случае недостижим В предполагаемом отчете ограниченный набор строк(при чем его существенное изменение в сторону увеличения не предвидется) и он на сегодня никак не дотягивает до такого размера(слава богу ), соответственно вопрос можно снять с повестки обсуждения. |
|