Имя: Пароль:
1C
 
V8: Запрос ВЫБРАТЬ ПЕРВЫЕ 1
Ø
0 ValeriTim
 
16.11.05
16:10
Мне нужно выбрать _последнюю_ запись в регистре накопления Взаиморасчеты с клиентами, но как это сделать непойму. ВЫБРАТЬ ПЕРВЫЕ 1 с обратной сортировкой по регистратору не получается. Подскажите.
1 mikecool
 
16.11.05
16:11
Используй вложенный подзапрос, сортируй в нем, а во внешнем запросе выбирай ПЕРВЫЕ 1
2 Att8
 
16.11.05
16:13
срез последних?
3 ValeriTim
 
16.11.05
16:15
(2) это регистр накопления
(1) т.е. он выбирает первые до сортировки ? получается так ?
4 mikecool
 
16.11.05
16:16
(3) именно, сначала отбор записей, а затем их упорядочивание
5 Гений самоучка
 
16.11.05
16:19
2(4) Допустимо сортировать в подзапросе?
Я вроде пытался - не получилось, но может в другом проблема была.
Про oracle знаю, что такая возможность появилась только в 8-ке. А майкрософтовский sql позволяет?
6 mikecool
 
16.11.05
16:26
(5) В подзапросе нельзя применять УПОРЯДОЧИТЬ ПО без применения ПЕРВЫЕ - так что мешает в подзапросе выбрать ПЕРВЫЕ 1000000000 записей(или сколько нужно нулей)?
7 ValeriTim
 
16.11.05
16:33
(6) Опа ! Мне нужно получить именно _последнюю_ запись на определенную дату, чтобы узнать дату этой записи. А если я в подзапросе немогу упорядочить, то как я могу получить именно последнюю ?
8 mikecool
 
16.11.05
16:39
ВЫБРАТЬ <....>
ИЗ (ВЫБРАТЬ ПЕРВЫЕ 1000000000 <....>
    ИЗ <....>(если таблица виртуальная - передаешь "определенную дату" как параметр, иначе добавляешь условие ГДЕ Дата <= "определенная дата"))
   УПОРЯДОЧИТЬ ПО <....>
   )
вместо <....> подставляешь нужные поля/таблицы
9 Гений самоучка
 
16.11.05
16:42
2(6) понятно. :)
10 cathode
 
16.11.05
16:45
(0) Может быть, я неправильно понял вопрос, но, по-моему здесь подзапрос не нужен.
ВЫБРАТЬ ПЕРВЫЕ 1 *
ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хоз
ГДЕ НАЧАЛОПЕРИОДА(Хоз.Период, ДЕНЬ) = &ДатаПериода
УПОРЯДОЧИТЬ ПО Хоз.Период УБЫВ
Показывает последнюю произведенную запись регистра на указанную дату.
Тут одна загвоздка по поводу упорядочения по регистратору: непосредственное упорядочение по регистратору ничего не даст, так как будут сравниваться GUID'ы документов, использование же конструкции УПОРЯДОЧИТЬ ПО Регистратор.Дата будет порождать дикое количество связываний с таблицами документов.
11 ValeriTim
 
16.11.05
16:45
А если у меня этот регистр имеет хрен знает сколько записей ... это же сколько запрос то потянет ...
А это не аналог ?
ВЫБРАТЬ ПЕРВЫЕ 1 <....>
ИЗ (ВЫБРАТЬ <....>
    ИЗ <....>(если таблица виртуальная - передаешь "определенную дату" как параметр, иначе добавляешь условие ГДЕ Дата <= "определенная дата"))
   УПОРЯДОЧИТЬ ПО <....>
   )
12 ValeriTim
 
16.11.05
16:47
(10) Вот я так и делал (за исключением упорядочивания). Упорядочивал по регистратору - видимо в этом и была моя ошибка. Попробую по периоду...
13 A
 
16.11.05
16:56
(0) Наверное так попроще будет
Выб = РегистрыНакопления.Регистр.Выбрать(,,,"Убыв");
Если Выб.Следующий() Тогда
ПоследняяДатаВРегистре = Выб.Период
КонецЕсли;
14 mikecool
 
16.11.05
16:58
(13) - только не делай так на сертификации - автоматом два :)
а насчет своего варианта в (8) уверен, работает
15 Гений самоучка
 
16.11.05
16:59
2(11) а как бы ты ни делал - все равно потянет - нужно же сортировать ВСЕ.
Можно еще например так - в одном запросе находить нужное максимальное(минимальное) значение, потом результат связывать с исходными данными.
Вообще задача известая (иногда используется при тестированиеи на знание основ SQL) и разработано много запросов без использования упорядочивания в подзапросе, можно попробовать найти ответ/задать вопрос на SQL.ru.
Но если (6) работает - то проще наверно не придумаешь, оптимальней наверно можно
16 A
 
16.11.05
17:08
+13 или так
ВЫБРАТЬ ПЕРВЫЕ 1
Регистр.Период КАК Период
Регистр. ...
...
ИЗ
РегистрНакопления.Регистр.Обороты[ОстаткиИОбороты](, , Запись, ) КАК Регистр
УПОРЯДОЧИТЬ ПО
Период УБЫВ
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.