Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Прямой запрос-отбор по пустому значению перечислен (число прочтений - 4384 )
agdam
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 4
Зарегистрирован: 19. Сентября 2007
Прямой запрос-отбор по пустому значению перечислен
19. Сентября 2007 :: 07:24
Печать  
Прямой запрос к справочнику Сотрудники:

RS = CreateObject("ODBCRecordSet");
RS.SetDatabase1C();
MW = CreateObject("MetaDataWork");

SELECT
Rtt.ID as [Элемент $Справочник.Сотрудники],
Rtt.Descr as Наименование,
$Rtt.ОсновнойЭлемент as [ОсновнойЭлемент $Справочник.Сотрудники],
$ПоследнееЗначение.Сотрудники.ИмеетАкции(Rtt.ID, :ВыбДата) as Акции,
$ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) as [СостояниеФизлица $Перечисление.СостояниеФизлица]

FROM
$Справочник.Сотрудники as Rtt
WHERE
Rtt.IsFolder = 2 AND
Rtt.IsMark = 0 AND
$Rtt.ОсновнойЭлемент = Rtt.ID
AND $ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) = :ПустоеСостояниеФизлица
ORDER BY
Rtt.Descr


Пытаюсь отобрать сотрудников с пустым значением реквизита СостояниеФизлица (Перечисление.СостояниеФизлица). Параметр "ПустоеСостояниеФизлица" делал и так:

ПустоеП = ПолучитьПустоеЗначение("Перечисление.СостояниеФизлица");
ПустоеП_=MW.ЗначениеВСтрокуБД(ПустоеП);
RS.SetTextParam("ПустоеСостояниеФизлица", ПустоеП_);
и так
стояниеФизлица"));

В итоге получаю пустую выборку - никого не находит Печаль
Пробовал через $ПустойИД - тоже ничего, в смысле запрос чего-то лопатит до бесконечности. В таблице справочника пустое значение этого реквизита соответствует '     0   ', но как это прописать в запросе?
Пробовал так: $ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) = '     0   ' . не пролезло Печаль Результат такой же как и с $ПустойИД - сервер что-то усиленно лопатит (загрузка процессора 65-70%) и так до бесконечности. Даже с учётом большого объёма справочника (более 2,5 тыс. сотров) так не может быть.
Значений таких в справочнике море - это и все уволенные, и акционеры, не работающие в фирме, около половины объёма справочника. Тем более, что с другими условиями (когда состояние не пустое) - всё летает. напр., со штатными:

RS.SetTextParam("Штатные",Перечисление.СостояниеФизлица.СотрудникОсновной"));
И условием
AND $ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) = :Штатные

То же с декретниками и внешними совместителями.
Конечно можно идти от обратного, т.е.в условии прописать "не равно" - штатные и т.п., но так некрасиво и длинно. К тому же хочется узнать, где здесь косяк.
На форуме http://www.forum.mista.ru подкинули идею с 'is NULL'? т.е. $ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) = is NULL.
Работает, даёт выборку. Но это лишь частично решает проблему - выбираются те люди, у которых состояние физлица "идеально чистое" (NULL одним словом) - в истории реквизита нет ни одной записи. Это не работающие держатели акций. А уволенных запрос при этом условии не попадают, хотя у них тоже "пусто". Значит есть какая-то разница между NULL и "пусто".
Подскажите, где сидит ошибка, плиз!
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос-отбор по пустому значению перечи
Ответ #1 - 19. Сентября 2007 :: 09:39
Печать  
вариант 1
Код
Выбрать все
AND nullif($ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата), $ПустойИД) is null 



вариант 2
Код
Выбрать все
AND isnull($ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата), $ПустойИД) = $ПустойИД 

  

1&&2&&3
Наверх
 
IP записан
 
agdam
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 4
Зарегистрирован: 19. Сентября 2007
Re: Прямой запрос-отбор по пустому значению перечи
Ответ #2 - 20. Сентября 2007 :: 04:22
Печать  
Пробовал оба варианта - итог один - процессор сервера нагружается в среднем на 60%, в обоих случаях ждал 10 минут, потом давал отбой обработке.  По идее прямой запрос должен работать быстрее, а получается наоборот  Печаль C $ПустойИД вообще не хочет работать...
  
Наверх
 
IP записан
 
agdam
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 4
Зарегистрирован: 19. Сентября 2007
Re: Прямой запрос-отбор по пустому значению перечи
Ответ #3 - 20. Сентября 2007 :: 04:36
Печать  
Дождался всё же конца работы обработки - "молотила" почти 20 минут. Итог тот же, как в условии:
$ПоследнееЗначение.Сотрудники.СостояниеФизлица(Rtt.ID, :ВыбДата) = is NULL,
т.е. выбираются только те, у кого этот реквизит справочника вообще чистый.
Только намного медленнее Ужас
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос-отбор по пустому значению перечи
Ответ #4 - 20. Сентября 2007 :: 07:31
Печать  
Подобные задачи лучше решать таким способом:
Код
Выбрать все
select
  Сотрудники.ID as [Элемент $Справочник.Сотрудники],
  Сотрудники.Descr as Наименование,
  $ПоследнееЗначение.Сотрудники.ИмеетАкции(Сотрудники.ID, :ВыбДата) as Акции,
  isnull(left(ЗначенияИстории.value, 9), $ПустойИД) as [СостояниеФизлица $Перечисление.СостояниеФизлица]
from $Справочник.Сотрудники as Сотрудники (nolock)
left join (
  select
    История.objid as Сотрудник,
    max(История.date) as АктуальнаяДата
  from _1sconst as История (nolock)
  where История.id = $ИсторияРеквизита.Сотрудники.СостояниеФизлица and История.date <= :ВыбДата
  group by История.objid
) as АктуальныеДаты on АктуальныеДаты.Сотрудник = Сотрудники.id
left join _1sconst as ЗначенияИстории (nolock) on ЗначенияИстории.id = $ИсторияРеквизита.Сотрудники.СостояниеФизлица and ЗначенияИстории.objid = Сотрудники.id and ЗначенияИстории.date = АктуальныеДаты.АктуальнаяДата
where Сотрудники.IsFolder = 2 and Сотрудники.IsMark = 0 and $Сотрудники.ОсновнойЭлемент = Сотрудники.id
  and (ЗначенияИстории.value = $ПустойИД or ЗначенияИстории.value is null)
order by Сотрудники.descr
 

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать