03.03.2008, 14:29 | #1 |
Участник
|
Работа с бинарными объектами
Доброго времени суток!
Снова я с, возможно дурацким, вопросом ответ на который не нашел, и даже не знаю где искать. Нет ли у кого-нибудь примера работы с большими бинарными файлами в БД аксапты. Есть табличка, у которой есть поле, типа контейнер. Заполнить это поле получается, сохранить данные на жесткий диск, "кривовато", но получается. А вот как открыть приложение, связанное с данными в этом поле? неужели нужно сохранять данные на диск, и затем открывать файл? вот код для записи (сохранения) поля типа контейнер (не обращайте внимания на логику, здесь я тестирую). X++: str filename; FileNameFilter filter = ['All files','*.*']; Bindata binData = new BinData(); super(); filename = Winapi::getOpenFileName(100,filter,'', "Открыть файл", '',''); if (filename) { if (binData.loadFile(filename)) { //запись файла в поле типа контейнер VendContractFile.FileContract = binData.getData(); //чтение из поля типа контейнер binData.setData(VendContractFile.FileContract); //сохранение на диск под именем "123" binData.saveFile("h:\\123"); } } |
|
03.03.2008, 14:33 | #2 |
Участник
|
WinApi::shellExecute(<путь к файлу>)
|
|
03.03.2008, 15:39 | #3 |
Участник
|
Значит только сохраняя на диск можно просмотреть файл?
|
|
03.03.2008, 15:41 | #4 |
Участник
|
я думаю, это зависит от приложения.
|
|
03.03.2008, 16:12 | #5 |
Участник
|
вроде нет.
посмотрите как выполняется работа с логотипом компании Основное \ Данные о компании \ Лого или как показываются фотографии сотрудников в российском модуле Расчеты с персоналом |
|
03.03.2008, 16:32 | #6 |
Участник
|
А это картинки - про картинки аксапта знает как из показывать. А вот какой-нибудь файл doc...
|
|
03.03.2008, 16:38 | #7 |
Участник
|
Вот что значит предыдущая фраза. Все зависит от приложения с которым проассоциирован файл. Согласен.
Может быть не в тему, но разве обязательно записывать файл на диск? Как открывается вставленная внутрь вордового документа экселевская таблица (embeded document)? неужели пишет файл во временный каталог? |
|
03.03.2008, 16:41 | #8 |
Участник
|
Ну, думаю, на примере оффиса лучше вообще не рассуждать.
Он кучу временных файлов создает, когда надо и когда не надо. К автору: А что такого страшного в сохранении файла на диск перед использованием? К mazzy: Попробуй, интересно. Включи FileMon, и открой. |
|
03.03.2008, 16:46 | #9 |
Участник
|
Цитата:
Кстати, дельфи, например может показывать такие документы из блоба, а вот аксапта, нет. Но это надо чтобы приложение поддерживало OLE |
|
04.03.2008, 10:15 | #10 |
Участник
|
Вобщем-то и ничего страшного. Вот только возникает вопрос.
Пусть пользователь открывает файл из БД. Аксапта делает запись в временный каталог, и открывает файл. Временный каталог находится в папке пользователья (терминальный клиент). А как же удалять эти файлы, ведь их может накопиться много. Или эта папка очищается, при каждом входе на удаленный рабочий стол? |
|
04.03.2008, 10:23 | #11 |
Участник
|
Ничего не очищается. Можно версти некий реестр файлов и запущенных процессов и чистить, когда процессы закрываются.
Можно просто условиться, что есть некая папка во временной, которую чистить периодически |
|
04.03.2008, 10:25 | #12 |
Участник
|
Вот код рабочего проекта
X++: str filename; Bindata binData = new BinData(); str TempfileParth; super(); if (VendContractFile.Description == "") { Error("Нет файла для открытия"); return; } TempfileParth = Winapi::getTempPath(); binData.setData(VendContractFile.FileContract); filename = TempfileParth + VendContractFile.Description; binData.saveFile(Filename); if (! Winapi::shellExecute(filename) ) Error("С данным типом файла не связана ни одна программа"); |
|
04.03.2008, 10:29 | #13 |
MCTS
|
Можно файл создавать как временный с атрибутом FILE_ATTRIBUTE_TEMPORARY
Цитата:
The file is being used for temporary storage. File systems attempt to keep all of the data in memory for quicker access rather than flushing the data back to mass storage. A temporary file should be deleted by the application as soon as it is no longer needed.
Естественно, при этом необходимо не забыть прибить их. Весь смак в том, что данном в случае не требуется указывать путь к конкретной папке.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
04.03.2008, 11:47 | #14 |
Участник
|
В свое время предлагал такой вариант для похожей ситуации:
Помогите с удалением файла! Для вас это будет выглядеть примерно так X++: #WinAPI TextBuffer textBuffer = new TextBuffer(); FileName cmdName; ; ... binData.saveFile(Filename); cmdName = WinAPI::getTempPath() + "show.cmd"; textBuffer.appendText(strfmt("call \"%1\"\n", winapi::charToOEM(VendContractFile.Description))); textBuffer.appendText(strfmt("del \"%1\"\n", winapi::charToOEM(VendContractFile.Description))); textBuffer.appendText("del " + cmdName); textBuffer.toFile(cmdName); winapi::shellExecute(cmdName, "", WinAPI::getTempPath(), #ShellExeOpen, #SW_HIDE);
__________________
Axapta v.3.0 sp5 kr2 |
|
04.03.2008, 12:34 | #15 |
Участник
|
А не будет ли в этом случае висеть терминальное окно?
|
|
04.03.2008, 12:37 | #16 |
Участник
|
что ты подразумеваешь под терминальным окном?
Command Line? Вроде не должно - там же SW_HIDE передается Или именно окно теминального клиента (mstsc)? |
|
06.03.2008, 11:55 | #17 |
Участник
|
Парни! я проверил. Каталог Temp чистится самой виндой, то ли перед входом на терминальный рабочий стол, толи прере выходом. Но точно заморачиваться не стоит. А если и придется, по советы конечно Весомые. Огромное всем спасибо.
|
|
Теги |
ax3.0 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|