|
v7: Тип Неопределенный и прямой запрос | ☑ | ||
---|---|---|---|---|
0
vinogradъ
31.08.13
✎
12:56
|
Помогите с решением проблемы.
Есть справочник,в котором хранятся некие значения на документ. Основные реквизиты: Товар, Склад, ТипЗначения, Документ, Значение и др. Значение имеет тип Неопределенный. Может хранить в себе число или ссылку. В скуле имеет тип char(23). Как получаю значения: Функция ПолучитьПериодическоеЗначениеНаДокумент(Товар, Склад, Тип, Документ) Экспорт Если ТипЗначенияСтр(Документ) = "Документ" Тогда скл = " |select dbo.GetValueByDoc(:Товар, :Склад, :Тип, :Документ) [Значение $Неопределенный] |"; глрс.УстановитьТекстовыйПараметр("Документ", Документ); ИначеЕсли ТипЗначенияСтр(Документ) = "Дата" Тогда скл = " |select dbo.GetValueByDate(:Товар, :Склад, :Тип, '" + Формат(Документ,"ДГГГГММДД") + "ZZZZZZZZZZZZZZZ') [Значение $Неопределенный] |"; ИначеЕсли Документ = "" Тогда скл = " |select dbo.GetValueByDate(:Товар, :Склад, :Тип, '') [Значение $Неопределенный] |"; КонецЕсли; глрс.УстановитьТекстовыйПараметр("Товар",Товар); глрс.УстановитьТекстовыйПараметр("Склад",Склад); глрс.УстановитьТекстовыйПараметр("Тип",Тип); Значение = глрс.ВыполнитьСкалярный(скл); Возврат Значение; КонецФункции Тут все гуд: если получаю число, то возвращается число, если ссылку на элемент справочника - тоже что надо, благодаря типизации. Но если использую функцию GetValueByDoc в запросе (прямом), то тут беда: при получении числа возвращает 'N 29640', ссылки - 'B1 DK F '. Как тут получить нужное значение? Если надо, сама функция: CREATE function GetValueByDoc(@tov char(9), @skl char(9), @type char(9), @doc char(9)) returns char(23) begin declare val char(23) set val = 0 select top 1 val = p.sp9214 from sc9210 as p (nolock) where p.sp9212 = @tov and p.sp9213 = @skl and p.sp9222 = @type and right(p.sp9216, 9) = @doc and p.sp9226 = 0 order by p.sp9265 desc return val end Чую, что может как-то подвязать поле TSP9214, где как я понимаю хранится тип значения SP9214? Помогите кто чем может. |
|||
1
Rie
31.08.13
✎
13:03
|
(0) А если просто первую букву глянуть? N - число, S - строка, B - справочник, O - документ (если мне память не изменяет). И в зависимости от этого - интерпретировать "хвост".
|
|||
2
vinogradъ
31.08.13
✎
13:09
|
делать еще одну функцию по разбору строки, которую вернула функция из (0) и вызывать функции, которые буду возвращать в зависимоcти от результата разбора либо строку с ID справочника, либо число?
|
|||
3
Rie
31.08.13
✎
13:13
|
(2) Не совсем понятно, как эта функция используется в запросе. Может, проще не значение извлекать, а то значение, что из запроса, к 23-символьному преобразовывать.
|
|||
4
vinogradъ
31.08.13
✎
13:22
|
(3) например,
тут должно быть как число: select ... $ds.Количество * dbo.GetValueByDoc(Ост.Субконто1, Ост.Субконто2, $Перечисление.ТипыЗначений.Цена, Ост.Субконто3) as Сумма Здесь как ИД select ... dbo.GetValueByDoc(Ост.Субконто1, Ост.Субконто2, $Перечисление.ТипыЗначений.Поставщик, Ост.Субконто3) as [Поставщик $Справочник.Контрагенты] Просто раньше тип реквизита Значение был Число, но понадобилось, чтобы хранились и ссылки. Поэтому и сделал тип Неопределенный. В разовом получении значения помогает типизация, а как получить значение нужного типа в запросе - не знаю. |
|||
5
Rie
31.08.13
✎
13:30
|
(4) Тогда остаётся только анализировать первый символ 23-значного значения, IMHO. Из TSP-полей тип не извлечь.
Пару слов на эту тему есть здесь: http://www.script-coding.com/v77tables.html#1.1.1. |
|||
6
vinogradъ
31.08.13
✎
13:30
|
Мысли вслух:
Может, как вариант, завести новый реквизит ЗначениеСсылка с типом Справочник, а текущий переименовать в ЗначениеЧисло и вернуть тип Число? Тогда сделать функцию с возвращаемым значением numeric() и еще одну с char(13)? |
|||
7
vinogradъ
31.08.13
✎
13:35
|
Блин, еще и дату надо хранить в Значение... Но дату можно писать в char(13) и, получая, делать cast as datetime
|
|||
8
Rie
31.08.13
✎
13:41
|
(7) Так а что мешает первый символ проанализировать?
|
|||
9
vinogradъ
31.08.13
✎
13:46
|
(8) потом делать, к примеру,
cast(ltrim(<значение>) as numeric(14,2)) для числа? для остальных типов как? |
|||
10
Rie
31.08.13
✎
13:49
|
(9) Для ссылок - просто вырезать 13 символов, начиная с 3-го (или 9 - пропустив вид). Для строк - взять хвост.
|
|||
11
vinogradъ
31.08.13
✎
13:50
|
(10) да, туплю. спасибо, попробую
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |