Имя: Пароль:
1C
1C 7.7
v7: 1SQLite: Подскажите, как организовать счетчик в запросе?
,
0 Zhuravlik
 
18.06.13
14:38
Здравствуйте. Есть например запрос на выборку элементов справочника:

       ТекстЗапроса = "
       |SELECT
       |    спр_Галерея.ID as [Название :Справочник._ГалереяИзображений]
       |FROM
       |    [Справочник._ГалереяИзображений] as спр_Галерея
       |
       |WHERE
       |    substr(спр_Галерея.Объект, 5) = :Объект
       |";

тз = Запрос.Выполнить(ТекстЗапроса);

На выходе переменная "тз" содержит в себе одну колонку, с ид. "Название". А как сделать так, чтобы именно в запросе у нее была еще колонка с ид. например "Счетчик", которая будет повторять ее номер строки?
1 ЧеловекДуши
 
18.06.13
14:44
(0) Дарю:

ТЗ.НомерСтроки :)
2 ЧеловекДуши
 
18.06.13
14:46
+(0) спр_Галерея.ID - это ссылка на элемент справочника, он всегда один, или их несколько.
Зачем тебе счетчик, когда ты все делаешь через ТЗ, что за номер ты хочешь увидеть по справочнику?
Откуда вообще такие бредовые идеи :)
3 Zhuravlik
 
18.06.13
14:49
(1) Спасибо)
Но мне нужно именно в запросе эту колонку.
(2) Я часто использую ПоставщикSQLITE, там единственный для меня минус который малину портит - это то, что для табличного поля надо устанавливать связь с одним из полей запроса, и значение этого поля становится значением для свойства ТП.ТекущаяСтрока(), а мне для консолей которые я на ее основе написал было бы удобнее видеть именно счетчик (а не например код справочника). И не только видеть (т.е. в ПриВыводеСтроки устанавливать его значение - это не решение проблемы), но и получать из свойства.
4 ЧеловекДуши
 
18.06.13
14:51
(3) Зачем? Еще раз, ты получаешь именно Таблицу значений.
Так же, если тебе надо какой либо уникальный идентификатор, так и выводи ИД справочника, или код или что там еще :)
5 ЧеловекДуши
 
18.06.13
14:52
+(3) Вы сударь явно извращенец :)
Мне бы ваши проблемы не желания писать запросы руками :)
6 Mikeware
 
18.06.13
14:54
(5) и явно, и тайно, и во веки веков...
(0) зачем тебе колонка, никак не связанная с данными, возвращаемыми запросом?
7 Zhuravlik
 
18.06.13
14:55
(4) Таблицу значений я получаю в примере в (0). Этот пример я привел, чтобы вопрос задать.
А с для ТП, если я использую поставщик SQLite, там промежуточной тз нет.
(5) Почему? Желание есть как-раз, просто не пойму как сделать. Помучал case немножко, потом понял что видимо какие-то системные таблички самого скульлайта надо задействовать, и сюда пошел...
8 ЧеловекДуши
 
18.06.13
14:59
(7) Зачем таблички ску-лайта? У тебя есть ID от справочника, это уникальное значение в пределе всего справочника, используй его для связи :)
9 Zhuravlik
 
18.06.13
15:03
(6) Чтобы организовать удобный интерфейс на ТП, и удобный алгоритм управления редактированием.
Вот у меня есть коноль на ТП, где пользователь редактирует элементы справочника. Там я использую SQliteDataProvider. В качестве ИД - код элемента справочника. При удалении элемента из консоли, чтобы спозиционироваться на предидущую строку я пишу приблиз. вот такой код:

   //======================================================================
   Процедура УдалениеСтроки()
       нСтрТП = ТП.ТекущаяСтрока;
       Если Число(нСтрТП) > 0 Тогда    
           спр_Маршруты.НайтиЭлемент(ТП.ТекущиеДанные.Ссылка);
           
           гл_ТТН_УдалитьМаршрут(спр_Маршруты.ТекущийЭлемент());
           
           ТП.ОбновитьСтроки();
   
           НовСтрока = Строка(Число(нСтрТП) - 1);
           Пока спр_Маршруты.НайтиПоКоду(НовСтрока, 0) = 0 Цикл
               НовСтрока = Строка(Число(НовСтрока) - 1);
               Если НовСтрока = "0" Тогда
                   Возврат;
               КонецЕсли;            
           КонецЦикла;
           ТП.ТекущаяСтрока = НовСтрока;
       КонецЕсли;
   КонецПроцедуры // УдалениеСтроки

И вот этот кусок - неправильный, хоть и рабочий, но не нравится он мне. Не нравится идея такого перебора. А он нужен, потому что строк в тп много, и очень неудобно позиционироваться в начало списка, если строку удалили где-то в середине.
           Пока спр_Маршруты.НайтиПоКоду(НовСтрока, 0) = 0 Цикл
               НовСтрока = Строка(Число(НовСтрока) - 1);
               Если НовСтрока = "0" Тогда
                   Возврат;
               КонецЕсли;            
           КонецЦикла;

А если бы у меня свойство ТП.ТекущаяСтрока заполнялось по счетчику из запроса, то никаких проблем с этим не было...
10 Mikeware
 
18.06.13
15:11
(9) идиотизм полный.
для того, чтобы утверждать, что "строка предыдущая" или "последующая" - нужно знать из порядок. если ты знаешь порядок - ты запросом всегда получишь первое меньше или первое больше
11 viktor_vv
 
18.06.13
15:20
Таки там сортировка нужна, причем задаваться должна в запросе.

   ТекстЗапроса = "
   |Select
   |    ВидыЗатрат.ID as [ВидЗатрат $Справочник.ВидыЗатрат],
   |    ВидыЗатрат.Descr as Наименование,
   |    Count(ВидыЗатрат2.ID) as НомерСтр
   |From
   |    $Справочник.ВидыЗатрат as ВидыЗатрат
   |    inner join $Справочник.ВидыЗатрат as ВидыЗатрат2
   |        on ВидыЗатрат.Descr >= ВидыЗатрат2.Descr
   |Group by ВидыЗатрат.Descr,ВидыЗатрат.ID
   |Order by ВидыЗатрат.Descr
   |";
   
   ТЗ = глЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   
   ТЗ.ВыбратьСтроку();

по мотивам

Книга знаний: v8: Нумерация строк в запросе

но опять же, если это запрос для поставщика данных ТП, то он по частям получает данные, как при этом отработает нумерация ХЗ.
12 Zhuravlik
 
18.06.13
15:24
(11) В SQliteDataProvider нельзя использовать Order by. Он сортирует сам по указанному ID (полю запроса). Я недопонял, где вы говорите нужна сортировка?
13 Zhuravlik
 
18.06.13
15:25
(10) Их порядок известен. Потому и ищу по коду "Вниз". А был бы у меня в запросе счетчик, я бы просто еденичку отминусовал, и все.
14 mikecool
 
18.06.13
15:25
читать как в скуле нумеруются строки результата - способы отличаются в зависимости от версий скуля
15 viktor_vv
 
18.06.13
15:48
(12) Можешь так попробовать

   ТекстЗапроса = "
   |Select
   |    ВидыЗатрат.ID as [ВидЗатрат $Справочник.ВидыЗатрат],
   |    ВидыЗатрат.Descr as Наименование,
   |    Count(ВидыЗатрат2.ID) as НомерСтр
   |From
   |    $Справочник.ВидыЗатрат as ВидыЗатрат
   |    inner join $Справочник.ВидыЗатрат as ВидыЗатрат2
   |        on ВидыЗатрат.Descr >= ВидыЗатрат2.Descr
   |Group by ВидыЗатрат.Descr,ВидыЗатрат.ID
   |";

Только вот здесь тебе придется каждый раз менять текст запроса

   |        on ВидыЗатрат.Descr >= ВидыЗатрат2.Descr

если будет меняться поле сортировки ТП.
16 Zhuravlik
 
18.06.13
16:11
(15) Group by - в поставщике нельзя использовать.
Уже вчитываюсь сижу, как в (14) советовали. Нашел вот пару статей http://www.sql.ru/faq/faq_topic.aspx?fid=126, но разбираться позже буду, как найду - отпишусь...
17 КонецЦикла
 
18.06.13
18:11
Может такое сработает?
Выгрузить во временную таблицу и пронумеровать апдейтом

http://1c911.by/stati_1s/statya-primery-resheniya-nestandartnyh-zadach-na-t-sql-v-1s.htm
18 Dolly_EV
 
20.06.13
07:07
(0) а если просто попробовать класс "ПоставщикДанных"?
19 Zhuravlik
 
20.06.13
22:45
(17) Долго будет, к тому же как в одном запросе это реализовать?
(18) Не хотелось бы...
Я в принципе уже решил эту задачку (в см. задачку с позиционированием), с помощью тз.
Просто думал, что есть какая-то функция в скульлайте, о которой я не знаю. Читал что что-то такое есть, только это недокументированная возможность, которую надо как-то там "разрешить", в дебри не лазил.
В общем-то тему можно считать закрытой, спасибо всем за беспокойство и советы)
20 КонецЦикла
 
23.06.13
17:02
(19) В смысле долго? Попробуй, уж всяко быстрее пететрахивания ТЗ:)
Если строки немного - разница минимальна, а если тысячи или сотни тысяч?  
Иногда быстрее выгрузить, например, движения регистра за период в свою таблицу с нужными индексами для последующего соединения, чем соединяться с таблицей регистра.
AdBlock убивает бесплатный контент. 1Сергей