|
16.12.2008, 14:50 | #1 |
Участник
|
Коллеги, возник интересный вопрос: может кто знает, как через FieldRef добраться до _значения_ blob поля (т.е. выгрузить его, либо загрузить). Чет мне кажется, что напрямую никак .
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
16.12.2008, 15:41 | #2 |
Участник
|
|
|
16.12.2008, 16:14 | #3 |
Участник
|
Да, конечно. А каким образом это поможет при выгрузке, например? Да, CALCFIELD успешно выполняется и, вероятно, даже значение появляется, но это конец пути.
Давайте я поясню задачу. Может придет обходное решение. Есть текстовик, который содержит в себе параметры, через которые мона изменить значение полей в любой таблице текущей Фирмы. Формат текстовика следующий: <Номер таблицы>,<Ключ для поиска>,<Номер изменяемого поля>,<Новое Значение поля>. Реализован код (в рамках системы обновления), который все это успешно глотает и обрабатывает. Но этот код не поддерживает передачу сложных типов данных (типа BLOB), чего до сегодняшнего дня и не требовалось. Для того, чтобы не плодить однотипный функционал в случае передачи BLOB было решено передавать в качестве <Новое Значение поля> имя файла, который надо загрузить. Итого, формат получается такой: Таблица,Ключ,Поле_куда_грузить,Файл_который_грузить. Засунуть в FieldRef напрямую BLOB я не нашел, так как у FieldRef нет "методов" работы с блобами и я пошел в обход - создал буфферное блоб-поле в спец. таблице. Заточил функционал на то, чтобы файлик грузился в это буферное поле. Дальше предполагалось получить значение этого буферного поля через некий CacheFieldRef и провернуть что-то типа Код: 1.FieldRef.VALUE := CacheFieldRef.VALUE 2. FieldRev := CacheFieldRef
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|
17.12.2008, 00:27 | #4 |
Участник
|
Да.. интересная задачка. Не плохо пришлось повозиться.
Код: //Создаем поток связанный с загружаемым файлом 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 |
Участник
|
Идея хорошая . Не знаю, как в пятерке, но в NAV3.70B не работает. Инструкция
Код: FieldRef1.VALUE:=ObjectForBLOB."BLOB Reference"; Надо ли понимать это как платформенную недостаточность 3.70B? P.S. Буду рыть дальше, ибо есть ощущение, что можно это провернуть.
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский |
|