12.02.2020, 16:09 | #1 |
Участник
|
DAX2009: как получить Bitmap
Есть такой стандартный метод:
X++: client server static Bitmap companyLogo() { CompanyInfo companyInfo = CompanyInfo::find(); ; return CompanyImage::find(companyInfo.DataAreaId, companyInfo.TableId, companyInfo.RecId).Image; } Вопрос, подскажите метод которым возвращает Bitmap из картинки с сервера по заданному пути. |
|
12.02.2020, 16:36 | #2 |
Участник
|
Используйте объект Image
X++: Image image;
;
image.loadFile(...);
return image.getData();
__________________
// no comments |
|
12.02.2020, 17:15 | #3 |
Участник
|
Спасибо.
Подскажите еще а какая логика работы этого метода FormLetter::companyLogo() в моем первом посте ? Правильно ли я понял что в аксапте есть форма CompanyImage в которую загружаются файлы а потом извлекаются? Может можно как-то загрузить нужный файл? X++: CompanyImage::find(companyInfo.DataAreaId, companyInfo.TableId, companyInfo.RecId).Image Последний раз редактировалось oleggy; 15.02.2020 в 09:15. |
|
13.02.2020, 05:06 | #4 |
Участник
|
Судя по названию - это просто хранение логотипа компании. Использовать как хранилище левых изображений - смысла нет.
|
|
13.02.2020, 06:47 | #5 |
Участник
|
В таблице CompanyImage обычно хранятся логотипы компании. Форма CompanyImage позволяет загрузить и отобразить соответствующую картинку.
При желании можно использовать эту таблицу для хранения любого количества изображений, причем каждая запись из этой таблицы привязывается к любой записи любой таблицы (через RefTableId, RefRecId). Однако на практике редко так делают. Собственно логика метода companyLogo() заключается в том, что вы подсовываете запись текущей компании (здесь проще было бы использовать метод findByRecord) и возвращаете значение поля Image. Еще для справки, поля, хранящие Bitmap, имеют тип контейнера, но обычными средствами вы не извлечете из него ни байта. Для работы с изображениями предназначен класс Image, работающий с Bitmap на низком уровне.
__________________
// no comments |
|
13.02.2020, 08:55 | #6 |
Участник
|
Я правильно понял что мне лучше реализовать свой метод. И где нужно использовать его в отчетах?
X++: client server static Bitmap companyLogoCustom(str path) { Image image = new Image(); ; image.loadImage(path); return image.getData(); } Просто я так и не понял мне выходит нужно единоразово загрузить свой файл в таблицу CompanyImage с помощью Job. А потом просто извлекать его? Но по каким параметрам? Просто есть логотип компании но другой и его по хорошему тоже надо хранить и отображать в отчетах в определенных случаях. Последний раз редактировалось oleggy; 13.02.2020 в 09:09. |
|
|
За это сообщение автора поблагодарили: dech (2). |
13.02.2020, 09:58 | #7 |
Участник
|
Существует множество решений.
Могу предложить самый простой способ в CompanyInfo добавить новое поле для вашего логотипа. И да, достаточно единоразово добавить файл в базу данных.
__________________
// no comments |
|
13.02.2020, 11:59 | #8 |
Участник
|
Я правильно понял мне нужно добавить в таблицу СompanyInfo еще одну запись?
Открыв таблицу я вижу как раз только одну запись в этой таблице. Но судя по методу существует еще таблица CompanyImage. Открыв ее вижу несколько записей. И вот как раз у этой записи есть поле Image. Или добавить на форму СompanyInfo ? Какие дальнейшие шаги? Можете расписать поподробнее? Последний раз редактировалось oleggy; 13.02.2020 в 12:04. |
|
13.02.2020, 12:09 | #9 |
Участник
|
Цитата:
Изначально сделано что у компании может быть только один логотип. В вашем случае как я понял Один логотип для одних документов, Другой логотип для других документов. Так? |
|
13.02.2020, 13:07 | #10 |
Участник
|
Совершенно верно.
Хотелось бы этот логотип загрузить в БД аксапты а потом его извлекать. Вариант брать логотип из файла мне кажется не оптимальным вариантом, хотя я такой способ уже реализовал. Просто хотелось бы решение такое же универсальное как по умолчанию: X++: CompanyImage::find(companyInfo.DataAreaId, companyInfo.TableId, companyInfo.RecId).Image |
|
13.02.2020, 13:39 | #11 |
Участник
|
Поместите ваши лого в ресурсы. Вынимать из ресурсов картинки можно так.
X++: display Bitmap ImageBitmapTest() { ; return SysResource::getResourceNodeData(SysResource : : getResourceNode('ImageName')); } |
|
13.02.2020, 14:00 | #12 |
Участник
|
Либо создайте в CompanyImage еще одно поле с картинкой. В нем у вас будет ваше новое изображение. Либо создать в CompanyImage поле с типом. Добавить это поле необязательным параметром в find. И для вашего варианта будет
X++: CompanyImage::find(companyInfo.DataAreaId, companyInfo.TableId, companyInfo.RecId, MyImageType::AddImage).Image |
|
13.02.2020, 15:08 | #13 |
Участник
|
Цитата:
В чем трудность, чтобы добавить новое поле в таблицу? Что у вас не получается?
__________________
// no comments |
|
15.02.2020, 09:04 | #14 |
Участник
|
Создал поле MyLogo в таблице СompanyInfo, его свойства:
Написал Job: X++: static void importCompanyLogo(Args _args) { CompanyInfo companyInfo = CompanyInfo::find(); Bitmap logo; CompanyInfo tmp_companyInfo; str path; ; path = 'c\\tmp\\logo.png'; if (_fileExists(path)) { ttsbegin; companyInfo.selectForUpdate(true); companyInfo.MyLogo = _getBitmap(path); companyInfo.update(); ttscommit; } logo = companyInfo.MyLogo; // данные сохраняются tmp_companyInfo = CompanyInfo::find(); logo = tmp_companyInfo.MyLogo; // пустое поле if (!logo) { info("поле пустое"); } } public server static Bitmap _getBitmap(str path) { Image image = new Image(); ; image.loadImage(path); return image.getData(); } Но при повторном выполнении в этой таблице это поле уже пустое. В другой таб.переменной так же пустое. Последний раз редактировалось oleggy; 15.02.2020 в 10:30. |
|
15.02.2020, 12:53 | #15 |
Участник
|
а CompanyInfo у вас одна и та же, в которую записали картинку и в которой проверяете?
|
|
15.02.2020, 16:46 | #16 |
Участник
|
в Job видно что я использую одну и ту же компанию.
P.S. к тому же в таблице CompanyInfo только одна запись. Последний раз редактировалось oleggy; 15.02.2020 в 17:55. |
|
17.02.2020, 13:47 | #17 |
Участник
|
Вы неверно сравниваете.
Все у вас нормально сохраняется. Нельзя вот так просто взять и привести контейнер к булевому типу. Всегда сравнивайте контейнеры с функцией connull(). X++: if (logo != connull()) ...
__________________
// no comments |
|
|
|