AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.12.2008, 14:50   #1  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Thumbs up
Коллеги, возник интересный вопрос: может кто знает, как через FieldRef добраться до _значения_ blob поля (т.е. выгрузить его, либо загрузить). Чет мне кажется, что напрямую никак .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 16.12.2008, 15:41   #2  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от FoxSoft2005 Посмотреть сообщение
Коллеги, возник интересный вопрос: может кто знает, как через FieldRef добраться до _значения_ blob поля (т.е. выгрузить его, либо загрузить). Чет мне кажется, что напрямую никак .
Fildref.CALCFIELD пробовали?
Старый 16.12.2008, 16:14   #3  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Да, конечно. А каким образом это поможет при выгрузке, например? Да, CALCFIELD успешно выполняется и, вероятно, даже значение появляется, но это конец пути.

Давайте я поясню задачу. Может придет обходное решение.

Есть текстовик, который содержит в себе параметры, через которые мона изменить значение полей в любой таблице текущей Фирмы. Формат текстовика следующий: <Номер таблицы>,<Ключ для поиска>,<Номер изменяемого поля>,<Новое Значение поля>. Реализован код (в рамках системы обновления), который все это успешно глотает и обрабатывает. Но этот код не поддерживает передачу сложных типов данных (типа BLOB), чего до сегодняшнего дня и не требовалось. Для того, чтобы не плодить однотипный функционал в случае передачи BLOB было решено передавать в качестве <Новое Значение поля> имя файла, который надо загрузить. Итого, формат получается такой: Таблица,Ключ,Поле_куда_грузить,Файл_который_грузить.

Засунуть в FieldRef напрямую BLOB я не нашел, так как у FieldRef нет "методов" работы с блобами и я пошел в обход - создал буфферное блоб-поле в спец. таблице. Заточил функционал на то, чтобы файлик грузился в это буферное поле. Дальше предполагалось получить значение этого буферного поля через некий CacheFieldRef и провернуть что-то типа
Код:
1.FieldRef.VALUE := CacheFieldRef.VALUE
2. FieldRev := CacheFieldRef
Инструкция из 2 успешно выполняется, но, к сожалению, значение в блоб не пишется, а инструкция 1 рождает ошибку "Выражение типа BLOB не может быть преобразовано в значение типа BLOB". Вот такая штука...
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
Старый 17.12.2008, 00:27   #4  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Да.. интересная задачка. Не плохо пришлось повозиться.
Код:
//Создаем поток связанный с загружаемым файлом
FileToLoad.OPEN('C:\2.txt');
FileToLoad.CREATEINSTREAM(Instream1);
//Будем грузить в 50000 таблицу.
CLEAR(RecordRef1);
RecordRef1.OPEN(50000);
//в моем случае в данной таблице две записи, они уже существуют, и я хочу загружать файл в последнюю запись.
IF RecordRef1.FINDLAST THEN;
//В моем случае BLOB поле имеет ID = 2;
FieldRef1:=RecordRef1.FIELD(2);
//В данный момент У меня английская версия 5.0 SP1, поэтому ObjectForBLOB - это переменная типа record - Object (Объект);
//Нам важно лишь то, чтобы была объявлена переменная типа BLOB, а явно этого сделать нельзя, 
//можно только используя уже существующую таблицу, например Object и её поле "BLOB Reference" ("BLOB Ссылка")
//Обманываем Navision:
ObjectForBLOB."BLOB Reference":=FieldRef1.VALUE;
//Создаем поток, куда будем грузить
ObjectForBLOB."BLOB Reference".CREATEOUTSTREAM(OutStream1);
//Копируем содержимое файла в блоб поле
COPYSTREAM(OutStream1, Instream1);
//Переобманываемся обратно
FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference";
//Сохраняемся
RecordRef1.MODIFY;
FileToLoad.CLOSE;
//Все - файл загружен в запись 50000, в поле с ID = 2, в последнюю запись.
Старый 17.12.2008, 10:41   #5  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Идея хорошая . Не знаю, как в пятерке, но в NAV3.70B не работает. Инструкция
Код:
FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference";
дает ошибку "Выражение типа BLOB не может быть преобразовано в значение типа BLOB".

Надо ли понимать это как платформенную недостаточность 3.70B?

P.S. Буду рыть дальше, ибо есть ощущение, что можно это провернуть.
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:19.