Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Получение ID36 и стр. представления вида документа (число прочтений - 1829 )
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Получение ID36 и стр. представления вида документа
23. Июня 2007 :: 09:32
Печать  
Проблема заключается в следующем:  
У нас в базе регистре ОстатковТМЦ  тип реквизита «ПартияВнешняя» - документ неопределенного вида. Чтобы приджойнить партию к запросу нужно из десятичного IDDocDef  получить строковое 36-ричное значение , например функцией   sp_tohex, как описано ранее на форуме. К сожалению, временные затраты такого решения таковы, что использование его не представляется возможным.

Попробовал сделать на том же SQL-сервере, где лежит база табличку с полями Vid (nchar 36), ID36 (nchar 4), ID10 (decimal, 9). Таблица лежит в базе Adm и называется VidDoc.

Заполняется табличка процедурой:

[code]Процедура ЗаполнитьТабВидДок()
     Перем Вид,ИД10,ИД36;
     Запрос=СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "Delete From [Adm]..[VidDoc] ";
     Если Запрос.Выполнить(ТекстЗапроса)=0 тогда
           Сообщить(Запрос.получитьОписаниеОшибки());
     КонецЕсли;      
     мд= СоздатьОбъект("MetaDataWork");      
     Для сч = 1 По Метаданные.Документ() Цикл
           Док = Метаданные.Документ(сч);
           Вид = Док.Идентификатор;
           ИД10=мд.ИДДокумента(Вид);
           ИД36=мд.ЧислоВСтроку(мд.ИДДокумента(Вид),36);
           Пока СтрДлина(ИД36)<4 Цикл ИД36=" "+ИД36; КонецЦикла;
           ТекстЗапроса = "insert into Adm..VidDoc (Vid,ID36,ID10) values ('"+Вид+"','"+ИД36+"','"+ИД10+"')";
           Если Запрос.Выполнить(ТекстЗапроса)=0 тогда
                 Сообщить(Запрос.получитьОписаниеОшибки());
           КонецЕсли;      
     КонецЦикла;
КонецПроцедуры [/code]

Чтобы не забывать перезаполнять табличку при добавлении документов, можно вставить в ПриНачалеРаботыСистемы  код:

[code]Запрос=СоздатьОбъект("ODBCRecordset");
КолвоВидов=Запрос.ВыполнитьСкалярный("Select Count(*) from Adm..VidDoc");
Если КолвоВидов <> Метаданные.Документ() Тогда
     ЗаполнитьТабВидДок();
КонецЕсли;[/code]

Теперь чтобы приджойнить партию, пишем такой код:

[code] INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON $ОстаткиТМЦ.ПартияВнешняя = (select id36 from Adm..VidDoc With (NoLock) where id10 = Журнал.IDDOCDef) + Журнал.IDDOC[/code]

По сравнению с использованием sp_tohex выигрыш по быстродействию в 7 раз.

Тот же самый принцип можно использовать для получения строкового представления вида документа из IDDocDef.
« Последняя редакция: 05. Июля 2007 :: 03:48 - vivm »  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать