|
Access подключенный к 1С базе | ☑ | ||
---|---|---|---|---|
0
sda553
19.03.12
✎
17:15
|
Началась разработка с безумной идеей, связать ms access с базой 1С по таким то и таким то данным. Вначале мне показалось все просто. Подумаешь, делаешь несколько query в access которые прилинкованы к sql базе 1С и наслаждешься. Однако трудности возникли почти сразу:
Допустим, хочу я в комбобоксе на форме аксеса выбрать номенклатуру какую то. Делаю в аксесе query вида типа: select _IDRRef, _Code, _Descr from _Reference1234 --там типа справочник номенклатуры where true....--тут какие то условия отбирающие 10 номенклатур. Естественно я в комбобоксе настраиваю свойства, чтобы он показывал колонки _Code и _Descr (код и наименование) но при выборе, в качестве value был бы _IDRRef (логично, не по наименованию же их в памяти хранить и использовать). Началось с того что combobox отлично дает выбрать номенклатуру, но в качестве value (_IDRRef) аксес показывает строку "binary" и все тут, хоть ты тресни. До байтов этого binary я добраться не могу, или как то предобразовать их в массив байтов. Пока кривое решение, типа из комбобокса беру номер строки которую выбрали, потом беру рекордсет который в этом комбобоксе и отсчитываю этот номер строки и оттуда получаю поле _IDRRef как массив байтов. Пробовал заменить на select cast(_IDRRef as varchar(16)), _Code, _Descr вообще какую то "погоду" возвращает Я конечно понимаю, что я почти везде первопроходец, но может кто нибудь уже "вязал" аксес с 1С-ной базой? Как выкрутились с этими varbinary которые в 1с-ной базе в качестве ссылок везде? |
|||
1
774816
19.03.12
✎
17:42
|
конвертируй в INT
CAST(_IDRRef AS INT) AS ID |
|||
2
МихаилМ
19.03.12
✎
17:46
|
select 0+ _IDRRef
|
|||
3
sda553
19.03.12
✎
17:53
|
(1) Сча попробуем
|
|||
4
sda553
19.03.12
✎
17:55
|
(1) Какое то подозрительно маленькое число возвращает, должно ведь быть байтов 16 в таком целом, видимо INT такого не тянет
|
|||
5
sda553
19.03.12
✎
17:56
|
(2) То же самое, слишком маленькое целое
|
|||
6
МихаилМ
19.03.12
✎
17:57
|
есть вероятность , что без nolock
курсор заблокирует всю таблицу |
|||
7
sda553
19.03.12
✎
17:57
|
Скажите а можно в sql как то это поле в BASE64 строку преобразовать в запросе?
|
|||
8
sda553
19.03.12
✎
17:58
|
(6) Нет, это выставляется в свойствах query
|
|||
9
sda553
19.03.12
✎
17:59
|
Вернее в свойствах комбобокса в которам в качестве data source задан этот query
|
|||
10
МихаилМ
19.03.12
✎
18:03
|
(9)
лучше не нарываться |
|||
11
sda553
20.03.12
✎
07:51
|
ап, нет тут аксес спецов?
|
|||
12
КМ155
20.03.12
✎
07:55
|
(11) Adp - зло
|
|||
13
Мимохожий Однако
20.03.12
✎
07:59
|
Из 1С в Акцесс попробуй.
|
|||
14
fantomask
20.03.12
✎
08:43
|
ТОже в свое время мучался с такой проблемой, но в конце концов, сконвертировал все Таблицы access в XLS и загрузил в 1С. Так как это нужно было делать единожды.
|
|||
15
sda553
20.03.12
✎
11:16
|
(14) У меня в обратную сторону подключение
|
|||
16
sda553
20.03.12
✎
11:45
|
Ну вообщем кому интересно, я сделал stored function для преобразования 1С-ных UID в строку вида '0x97CAC8DDA6AFB42A45BB01C70B7648B3' и соответственно заменил запрос на
select sp_hexadec_to_string(_IDRRef), _Code, _Descr from _Reference1234 |
|||
17
МихаилМ
20.03.12
✎
11:51
|
(16)
С одной стороны - молодец с другой - скоро Вас выселят в копию базы. Ну зачем Вам видеть представления гуидов. надеюсь, Вы их отображаете по правилам 1с. иначе могут вазникнеть неувязочки. |
|||
18
sda553
20.03.12
✎
12:02
|
(17) Представления Гуидов никто не видит.
Комбобокс аксесса ссылается на query список вида ТоварКод/ТоварНаименование/УИД '001'/'Зеленая коробка'/'0x97CAC8DDA6AFB42A45BB01C70B7648B3' '001'/'Красная коробка'/'0xb86ab59487144b69484ce36c3adaad92' В комбобоксе показываются только первые две колонки, третья имеет нулевую ширину (так обычно в аксесе делают), а значение комбобокса привязано к третьей. Т.е. пользователь раскрывает комбобокс, выбирает зеленую коробку, видит эту зеленую коробку, а программа видит, что combobox1.value = '0x97CAC8DDA6AFB42A45BB01C70B7648B3' Далее эта строчка легко подставляется используя VBA в дальнейшие sql запросы вида where _IDRref = " & combobox1.value и можно делать в аксесе что надо по этим товарам. Пользователи не видят ИДшников, как в 1С так и в аксесе, они только для внутреннего использования |
|||
19
sda553
20.03.12
✎
12:04
|
Ну и в довесок функция преобразования binary в varchar
ALTER FUNCTION [dbo].[sp_hexadecimal] ( -- Add the parameters for the function here @binvalue varbinary(16) ) RETURNS varchar(34) AS BEGIN -- Declare the return variable here DECLARE @charvalue varchar(34) declare i int declare @length int declare @hexstring char(16) select @charvalue = '0x' select i = 1 select @length = 16 select @hexstring = '0123456789abcdef' while (i <= @length) begin declare @tempint int declare @firstint int declare @secondint int select @tempint = convert(int, substring(@binvalue,i,1)) select @firstint = floor(@tempint/16) select @secondint = @tempint - (@firstint*16) select @charvalue = @charvalue + substring(@hexstring, @firstint+1, 1) + substring(@hexstring, @secondint+1, 1) select i = i + 1 end -- Return the result of the function RETURN @charvalue END |
|||
20
МихаилМ
20.03.12
✎
12:19
|
(19)
спасибо за код. подскажу алтернативу встроенную в мс скл master.dbo.fn_varbintohexstr |
|||
21
sda553
20.03.12
✎
12:21
|
(20) ух ты, и правда
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |