Имя: Пароль:
1C
1C 7.7
v7: 1С77 прямой запрос через SQLite - сортировка по наименованию
0 Looking
 
30.05.16
22:35
Доброго времени суток! Вопрос в продолжение темы
ТиС 77 Прямой запрос к справочнику Номенклатура

Очень прошу подсказать - как отсортировать результат запроса по Наименованию номенклатуры?

Сортировка по ID дает совсем не ту сортировку.

    ТекстЗапроса="
    |WITH RECURSIVE
    |Goods(ID,PARENTID,ISFOLDER) AS ( -- вся номенклатура в группе
    |SELECT t0.ID,t0.PARENTID,t0.ISFOLDER
    |FROM Справочник_Номенклатура AS t0
    |WHERE t0.PARENTID=@Группа
    |UNION SELECT t1.ID,t1.PARENTID,t1.ISFOLDER
    |FROM Справочник_Номенклатура AS t1
    |),
    |NoGoods(ID,PARENTID,ISFOLDER) AS ( -- вся запрещенная  номенклатура
    |SELECT t1.ID,t1.PARENTID,t1.ISFOLDER
    |FROM Справочник_СоставФильтраСправочникаНоменклатура AS t0
    |LEFT JOIN Справочник_Номенклатура AS t1
    |    ON t0.Номенклатура=t1.ID
    |WHERE t0.PARENTEXT=@ФильтрПользователя
    |UNION SELECT t3.ID,t3.PARENTID,t3.ISFOLDER
    |FROM Справочник_Номенклатура AS t3
    |INNER JOIN NoGoods ON t3.PARENTID=NoGoods.ID
    |)
    |SELECT
    |Goods.ID     [NoGoods $Справочник.Номенклатура]
    |FROM Goods
    |LEFT JOIN NoGoods ON NoGoods.ID=Goods.ID
    |WHERE NoGoods.ID IS NULL
    |ORDER BY Goods.ID DESC
    |";

    База=СоздатьОбъект("SQLiteBase");
    База.Открыть(":memory:");
    Запрос=База.НовыйЗапрос();
    Запрос.Подготовить(ТекстЗапроса);
    Запрос.УстановитьПараметр("@ФильтрПользователя",глПользователь.ФильтрСправочникаНоменклатура);
    
СЗОтображаемойНоменклатуры=СоздатьОбъект("СписокЗначений");
    СЗОтображаемойНоменклатуры=Запрос.Выполнить(СЗОтображаемойНоменклатуры);    
    
ИспользоватьСписокЭлементов(СЗОтображаемойНоменклатуры);
1 Djelf
 
30.05.16
23:37
Ну так ID идентификатор, Наименование это DESCR
2 Looking
 
31.05.16
07:42
(1)если я вместо
ORDER BY Goods.ID DESC

пишу в запросе

ORDER BY Goods.DESCR DESC

то получаю ошибку

Запрос.Подготовить(ТекстЗапроса);
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(1109)}: no such column: Goods.DESCR

Это из-за того, что я выше не объявил в запросе переменную, или из-за того что в DBF-таблице нет такой колонки - Наименование?
3 spock
 
31.05.16
07:51
В твоих CTE Goods и NoGoods определены такие поля ID,PARENTID,ISFOLDER.
Либо добавляй доп.поле для сортировки, либо заджойни в запросе таблицу с товарами.
4 Looking
 
31.05.16
07:56
(3)вот так сортировка вроде-бы получилась. но я совсем-совсем начинающий, просто добавил по аналогии DESCR. очень прошу проверить, верно-ли получилось, или этот вариант не корректен.

ТекстЗапроса="
    |WITH RECURSIVE
    |Goods(ID,PARENTID,ISFOLDER,DESCR) AS ( -- вся номенклатура в группе
    |SELECT t0.ID,t0.PARENTID,t0.ISFOLDER, t0.DESCR
    |FROM Справочник_Номенклатура AS t0
    |WHERE t0.PARENTID=@Группа
    |UNION SELECT t1.ID,t1.PARENTID,t1.ISFOLDER, t1.DESCR
    |FROM Справочник_Номенклатура AS t1
    //|INNER JOIN Goods ON Goods.ID = t1.PARENTID  
    |),
    |NoGoods(ID,PARENTID,ISFOLDER, DESCR) AS ( -- вся запрещенная  номенклатура
    |SELECT t1.ID,t1.PARENTID,t1.ISFOLDER, t1.DESCR
    |FROM Справочник_СоставФильтраСправочникаНоменклатура AS t0
    |LEFT JOIN Справочник_Номенклатура AS t1
    |    ON t0.Номенклатура=t1.ID
    |WHERE t0.PARENTEXT=@ФильтрПользователя
    |UNION SELECT t3.ID,t3.PARENTID,t3.ISFOLDER, t3.DESCR
    |FROM Справочник_Номенклатура AS t3
    |INNER JOIN NoGoods ON t3.PARENTID=NoGoods.ID
    |)
    |SELECT
    |Goods.ID     [NoGoods $Справочник.Номенклатура]
    |FROM Goods
    |LEFT JOIN NoGoods ON NoGoods.ID=Goods.ID
    |WHERE NoGoods.ID IS NULL
    |ORDER BY Goods.DESCR
    |";
5 Djelf
 
31.05.16
21:52
(4) Не так чтоб не корректен раз работает, но не оптимален.

- вот ты зачем засунул DESCR в NoGoods? Это же получение списка номенклатуры которую мы не будем показывать! Следовательно DESCR там вообще не нужен.
- в Goods DESCR еще куда шло, но если ты через NoGoods отчильтровываешь 30% товаров, то их Наименования тоже не нужны. Следовательно - лишние действия.

Достаточно еще раз приджойнить номенклатуру, и отсортировать уже по ней.


SELECT
Goods.ID     [NoGoods $Справочник.Номенклатура]
FROM Goods
LEFT JOIN NoGoods ON NoGoods.ID=Goods.ID
LEFT JOIN Справочник_Номенклатура AS Goods2 ON Goods2.ID=Goods.ID
WHERE NoGoods.ID IS NULL
ORDER BY Goods2.DESCR


Не факт, что это работать будет быстрее (все зависит от планировщика sqlite) так что сравни, но DESCR из NoGoods убирай 100%