23.09.2008, 17:28 | #1 |
Участник
|
Импорт бинарных данных
Приветствую!
Занимался тем, что делал механизм импорта из 1С'a в аксапту , и наткнулся на то, что многие поля в 1С'e имеют тип binary , даже поле Пол (не понимаю, почему не могли 0/1 использовать). X++: static void Ic8_testTradeQueryCom(Args _args) { str text; com query,md; com Result; com Choose; EmplTable emplTable; Com cc = new Com("v81.COMConnector"); // Подключение к БД com con = cc.Connect("srvr=\"cs005\";ref=\"db_1c_hrm_test\";Usr=\"Администратор\";pwd=\"\";"); // Вывод сообщения о названии конфигурации md = con.Metadata(); print md.name(); Text = " ВЫБРАТЬ * ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица" + " ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц КАК ФИОФизЛиц" + " ПО ФизическиеЛица.Ссылка = ФИОФизЛиц.ФизЛицо" + " ГДЕ ФизическиеЛица.Код <> \"000000001\""; // Создаем объект Запрос Query = con.NewObject("Запрос"); Query.Text(Text); // Выполнение запроса Result = Query.Execute(); Choose = Result.Choose(); // Выборка результата выполнения запроса While (Choose.Next()) { select forupdate firstonly firstfast emplTable where emplTable.EmplId == strLTrim(strRTrim(Choose.())); emplTable.EmplId = strLTrim(strRTrim(Choose.())); emplTable.lastName = Choose.(); emplTable.firstName = Choose.(); emplTable.middleName = Choose.(); emplTable.BirthDate = Choose.(); EmplTable.PayInn_RU = Choose.(); EmplTable.PayInnPf_RU = Choose.(); if (Choose.() == "0x863A7C890BC7DB6849BB5C5D636552AA ") // в БД пол лежит в формате binary(16). мужчина выглядит, как 0x863A7C890BC7DB6849BB5C5D636552AA //то мужчина else //иначе женщина } } |
|
23.09.2008, 17:53 | #2 |
Участник
|
а зачем вам их целиком сравнивать? сравнивайте тока тот байт который отличается
X++: binary b = new binary(16); ; if (b.byte(15) == 170) ....
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
23.09.2008, 17:57 | #3 |
Боец
|
Для чего сравнить? Нужно разобраться с форматом этих binary. В DAX бинарные данные хранятся как контэйнер. Если уж сравнивать, то можно использовать класс BinData и его метод getStrData(), после чего просто сравнить строки. См. форму CompanyImage(смена логотипа компании), которая вызывается из формы ComanyInfo. Там, на примере картинки, которая предсавляет собой BinaryDatа можно посмотреть, как работать с этим классом.
|
|
23.09.2008, 18:13 | #4 |
Участник
|
если делать
X++: Bindata binData = new BinData(); binData = Choose.(); info(binData.getStrData()); //- здесь вылетает ошибка, что COM-объект не имеет метода getStrData Цитата:
а зачем вам их целиком сравнивать? сравнивайте тока тот байт который отличается
|
|
23.09.2008, 18:30 | #5 |
Боец
|
Попробуйте так,
X++: container con = Choose.(); |
|
23.09.2008, 18:54 | #6 |
Участник
|
Пол в 1С это перечисление. Перечисления в 1С действительно представлены бинарным типом. Чтобы получить результат в виде как Вы хотите (0 - М, 1 - Ж) используйте приперно следующий запрос
X++: Text = @' ВЫБРАТЬ Код как Код,
Фамилия как Фамилия,
Имя как Имя,
ДатаРождения как ДатаРождения,
ИНН как ИНН,
СтраховойНомерПФР как СтраховойНомерПФР,
Пол.Порядок как Пол
ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц КАК ФИОФизЛиц"
ПО ФизическиеЛица.Ссылка = ФИОФизЛиц.ФизЛицо"
ГДЕ ФизическиеЛица.Код <> "000000001" '; |
|
|
За это сообщение автора поблагодарили: niktata (1). |
24.09.2008, 12:48 | #7 |
Участник
|
Цитата:
PS: Вообще, как вы получили эту строку "0x863A7C890BC7DB6849BB5C5D636552AA" ?
2 _scorp_: Спасибо! Вашим способом все получилось. А как быть с другими данными, представленными в бинарном виде? Например в этой же таблице есть поле ГруппаФизическихЛиц. И еще вопрос. Нет вариантов, как вытащить фотографию из 1С в Аксапту? |
|
24.09.2008, 16:06 | #8 |
Участник
|
Цитата:
Например в этой же таблице есть поле ГруппаФизическихЛиц
А фотографии 1С хранит в sql так же как и аксапта. Так что ищите на форуме как работать с изображениями в аксапте. |
|
24.09.2008, 16:23 | #9 |
Участник
|
Что, прямо так же в контейнер запаковывает?
__________________
Axapta v.3.0 sp5 kr2 |
|
24.09.2008, 16:47 | #10 |
Участник
|
|
|
25.09.2008, 10:15 | #11 |
Участник
|
|
|
25.09.2008, 13:30 | #12 |
Участник
|
В 1С для файлов используется тип данных "ХранилищеЗначения", точно так же как в аксапте container. Но в 1С конкретно для изображений есть еще отдельный тип данных "Картинка". Вам нужно:
1. Вытащить из 1С поле в котором хранится файл в переменную типа COM в аксапте. X++: Com pic; ; pic = Choose.(); X++: COM kart;
;
kart = comConnection.NewObject("Картинка");
kart = pic.Get(); 3. А вот тут самое интересное. Вроде бы у типа "Картинка" в 1C есть метод "ПолучитьДвоичныеДанные" или англ. аналог "GetBinaryData", но метод все равно возвращает COM объект. Поэтому я нашел только один выход. Сохранять картинку на диск, а потом забирать её аксаптой. То есть: X++: BinData binData; container con; ; kart.write("d:\\tmp.jpg"); binData = new BinData(); binData.loadFile("d:\\tmp.jpg"); con = bind.getData(); Последний раз редактировалось _scorp_; 25.09.2008 в 13:41. |
|
25.09.2008, 15:34 | #13 |
Участник
|
Пришлось сделать немного по-другому:
X++: pic = Choose.(); pic = pic.(); // Пришлось добавить эту строчку, иначе вылетало на Получить() kart = con.NewObject("Картинка"); kart = pic.Get(); kart.Write("C:\tmp.jpg"); binData = new BinData(); binData.loadFile("C:\\tmp.jpg"); cont = binData.getData(); |
|
25.09.2008, 15:48 | #14 |
Участник
|
Цитата:
pic = pic.Хранилище(); // Пришлось добавить эту строчку, иначе вылетало на Получить()
Цитата:
Но теперь вылетает на kart = pic.Получить(); - говорит, что COM объект не имеет метода Получить().
|
|
25.09.2008, 16:01 | #15 |
Участник
|
Цитата:
Цитата:
1С какая? 8.0? 8.1? 8.2?
|
|
25.09.2008, 16:15 | #16 |
Участник
|
Нужно джойнить таблицу "ХранилищеДополнительнойИнформации" (ну или как она у Вас назвается) к физическим лицам, хотя это не обязательно, должно работать и так как Вы написали. У меня работает, только что проверил.
|
|
25.09.2008, 16:31 | #17 |
Участник
|
Вот мой запрос
X++: . . . . = . . = \"00012\" p.s. Небольшой совет, не используйте в коде русские буквы. Например pic.Хранилище() Добирайтесь до русскоязычных полей или методов через COMDispFunction, иначе при переходе на Ax 4 придется все переписывать. Последний раз редактировалось _scorp_; 25.09.2008 в 16:41. |
|
25.09.2008, 17:41 | #18 |
Участник
|
Получилось!!!
Пока не понял в чем разница между Вашим запросом и моим, но главное, что он работает! СпасибоСпасибо! с меня пиво) |
|
25.09.2008, 17:48 | #19 |
Участник
|
Разобрался. Дело в том, что ошибка вылетает, когда у физлица отсутствует фотография. Каким-то образом перед вызовом pic = Choose.Хранилище(); в аксапте нужно проверять, есть ли что-нибудь в этом хранилище или отлавливать ошибку.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Стандартный импорт данных. Обновление | 0 | |||
Тормозит Экспорт/Импорт данных | 28 | |||
Импорт данных из ODBC источника | 4 | |||
Импорт на данных из 2.5 в 3.0 | 14 | |||
Импорт данных | 2 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|