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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.09.2008, 17:28   #1  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Импорт бинарных данных
Приветствую!

Занимался тем, что делал механизм импорта из 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
                //иначе женщина
}
}
на сравнении есстно вылетает ошибка. Как же все-таки сравнить бинарные данные из 1С?
Старый 23.09.2008, 17:53   #2  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
а зачем вам их целиком сравнивать? сравнивайте тока тот байт который отличается
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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Для чего сравнить? Нужно разобраться с форматом этих binary. В DAX бинарные данные хранятся как контэйнер. Если уж сравнивать, то можно использовать класс BinData и его метод getStrData(), после чего просто сравнить строки. См. форму CompanyImage(смена логотипа компании), которая вызывается из формы ComanyInfo. Там, на примере картинки, которая предсавляет собой BinaryDatа можно посмотреть, как работать с этим классом.
Старый 23.09.2008, 18:13   #4  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
если делать
X++:
Bindata binData = new BinData();
binData = Choose.();
info(binData.getStrData()); //- здесь вылетает ошибка, что COM-объект не имеет метода getStrData
Т.е. я не могу достать данные из Choose.Пол(), не могу их никому присвоить нормально, чтобы уже дальше что-то делать.

Цитата:
а зачем вам их целиком сравнивать? сравнивайте тока тот байт который отличается
можно и часть сравнивать, только для этого нужно опять же из Choose.Пол() достать то, что сравнивать
Старый 23.09.2008, 18:30   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Попробуйте так,

X++:
container con = Choose.();
PS: Вообще, как вы получили эту строку "0x863A7C890BC7DB6849BB5C5D636552AA" ?
Старый 23.09.2008, 18:54   #6  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Пол в 1С это перечисление. Перечисления в 1С действительно представлены бинарным типом. Чтобы получить результат в виде как Вы хотите (0 - М, 1 - Ж) используйте приперно следующий запрос
X++:
Text = @' ВЫБРАТЬ Код               как Код,
                      Фамилия           как Фамилия,
                      Имя               как Имя,
                      ДатаРождения      как ДатаРождения,
                      ИНН               как ИНН,
                      СтраховойНомерПФР как СтраховойНомерПФР,
                      Пол.Порядок       как Пол
              ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица
              ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц КАК ФИОФизЛиц"
                ПО ФизическиеЛица.Ссылка = ФИОФизЛиц.ФизЛицо"
                ГДЕ ФизическиеЛица.Код <> "000000001" ';
За это сообщение автора поблагодарили: niktata (1).
Старый 24.09.2008, 12:48   #7  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Цитата:
PS: Вообще, как вы получили эту строку "0x863A7C890BC7DB6849BB5C5D636552AA" ?
- посмотрел в таблицу 1C через query Analyzer

2 _scorp_: Спасибо! Вашим способом все получилось. А как быть с другими данными, представленными в бинарном виде? Например в этой же таблице есть поле ГруппаФизическихЛиц.

И еще вопрос. Нет вариантов, как вытащить фотографию из 1С в Аксапту?
Старый 24.09.2008, 16:06   #8  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Например в этой же таблице есть поле ГруппаФизическихЛиц
У меня в таблице "ФизическиеЛица" нет поля "ГруппаФизическихЛиц". Откройте у себя конфигуратор 1С, откройте метаданные, найдите этот справочник, найдите поле "ГруппаФизическихЛиц", посмотрите его тип. Если у этого поля тип "Перечисление.НазваниеПеречисления", то в ищите его в разделе "Перечисления" метаданных. Там откроете его и увидите порядок перечисления. Порядок перечислений в 1С начинается с 0. Содайте в Аксапте подобный BaseEnum для удобства и все.
А фотографии 1С хранит в sql так же как и аксапта. Так что ищите на форуме как работать с изображениями в аксапте.
Старый 24.09.2008, 16:23   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
А фотографии 1С хранит в sql так же как и аксапта. Так что ищите на форуме как работать с изображениями в аксапте.
Что, прямо так же в контейнер запаковывает?
__________________
Axapta v.3.0 sp5 kr2
Старый 24.09.2008, 16:47   #10  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Что, прямо так же в контейнер запаковывает?
Сорри, погорячился, конечно не запаковывает.

2 niktata Где 1С у Вас хранит изображения? Непосредственно в базе или в файловой системе?
Старый 25.09.2008, 10:15   #11  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
2 niktata Где 1С у Вас хранит изображения? Непосредственно в базе или в файловой системе?
У нас все изображения лежат непосредственно в базе, но прочитать аксаптой мне их все еще не удалось. Там также binary формат, который мне никак не обработать.
Старый 25.09.2008, 13:30   #12  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
В 1С для файлов используется тип данных "ХранилищеЗначения", точно так же как в аксапте container. Но в 1С конкретно для изображений есть еще отдельный тип данных "Картинка". Вам нужно:

1. Вытащить из 1С поле в котором хранится файл в переменную типа COM в аксапте.
X++:
Com pic;
;
pic = Choose.();
2. Создать элемент типа Картинка.
X++:
COM kart;
;
kart = comConnection.NewObject("Картинка");
kart = pic.Get();
где comConnection - Ваше подключение к 1С.

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  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Пришлось сделать немного по-другому:
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();
Но теперь вылетает на kart = pic.Получить(); - говорит, что COM объект не имеет метода Получить().
Старый 25.09.2008, 15:48   #14  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
pic = pic.Хранилище(); // Пришлось добавить эту строчку, иначе вылетало на Получить()
Сразу в запросе добирайтесь до "Хранилище" тогда эта строка будет ненужна.
Цитата:
Но теперь вылетает на kart = pic.Получить(); - говорит, что COM объект не имеет метода Получить().
1С какая? 8.0? 8.1? 8.2?
Старый 25.09.2008, 16:01   #15  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Сразу в запросе добирайтесь до "Хранилище" тогда эта строка будет ненужна.
странно, но если сразу в запросе так пишу (ФизическиеЛица.ОсновноеИзображение.Хранилище как ОсновноеИзображение), то при pic = Choose.ОсновноеИзображение(); вываливается на "Вариантный тип, возвращенный методом COM-объекта, не поддерживается".

Цитата:
1С какая? 8.0? 8.1? 8.2?
8.1 смотрю в 1С - там такие методы есть, но из-под аксапты они никак не видятся! коннект через Com cc = new Com("v81.COMConnector");
Старый 25.09.2008, 16:15   #16  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от niktata Посмотреть сообщение
странно, но если сразу в запросе так пишу (ФизическиеЛица.ОсновноеИзображение.Хранилище как ОсновноеИзображение), то при pic = Choose.ОсновноеИзображение(); вываливается на "Вариантный тип, возвращенный методом COM-объекта, не поддерживается".
Нужно джойнить таблицу "ХранилищеДополнительнойИнформации" (ну или как она у Вас назвается) к физическим лицам, хотя это не обязательно, должно работать и так как Вы написали. У меня работает, только что проверил.
Старый 25.09.2008, 16:31   #17  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Вот мой запрос
X++:
 .  
	 .  
	  .  
	 . = .
	 . = \"00012\"
В фл.код я указал код физ лица у которго есть привязанная картинка. Все работает. Скорее всего вы как-то не так написали запрос.

p.s. Небольшой совет, не используйте в коде русские буквы. Например pic.Хранилище() Добирайтесь до русскоязычных полей или методов через COMDispFunction, иначе при переходе на Ax 4 придется все переписывать.

Последний раз редактировалось _scorp_; 25.09.2008 в 16:41.
Старый 25.09.2008, 17:41   #18  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Получилось!!!
Пока не понял в чем разница между Вашим запросом и моим, но главное, что он работает! СпасибоСпасибо! с меня пиво)
Старый 25.09.2008, 17:48   #19  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Разобрался. Дело в том, что ошибка вылетает, когда у физлица отсутствует фотография. Каким-то образом перед вызовом pic = Choose.Хранилище(); в аксапте нужно проверять, есть ли что-нибудь в этом хранилище или отлавливать ошибку.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Стандартный импорт данных. Обновление sparur DAX: Функционал 0 24.03.2008 19:07
Тормозит Экспорт/Импорт данных st_msav DAX: Администрирование 28 01.08.2006 15:52
Импорт данных из ODBC источника JohNick DAX: Программирование 4 09.04.2004 10:17
Импорт на данных из 2.5 в 3.0 ddadream DAX: Прочие вопросы 14 10.06.2003 20:28
Импорт данных Swetik DAX: Функционал 2 30.01.2003 01:52

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

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

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