Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Спрошу элементарное по теме Запросов  (Прочитано 3299 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Jane-K
Гость
« : 25-08-2010 14:28 » 

День добрый!

Начала изучать Запросы, кое-что получается, кое-что нет и не могу понять, где допущена ошибка.

(без запросов, просто с условиями - все работает отлично)

Задача.

Получить данные вида:

Касса № 1
= Чек № 0001 = проведен = сумма: 100 руб
= Чек № 0002 = проведен = сумма: 110 руб
= Чек № 0003 = не проведен = сумма: 200 руб

№ кассы выбирается в диалоговом окне, дата - тоже.

Полученные данные пока вывожу просто с помощью "Сообщить".


Вот код запроса:

Код:
Запрос = СоздатьОбъект("Запрос");

ТекстЗапроса=
" //{{ ЗАПРОС (ВыборЧеков)
|Период с кн_дата по кн_дата;
|ОбрабатыватьДокументы Все;
|Обрабатывать Все;

|ЧЕК = Документ.ЧекККМ.ТекущийДокумент;
|КАССА = Справочник.Кассы.Наименование;
|НомерЧека =  Документ.ЧекККМ.НомерДок;
|СТАТУСЧека = Документ.ЧекККМ.ЧекПробитККМ;
|ВИДЧека = Документ.ЧекККМ.ВидОперации;
|СуммаПоЧеку = Документ.ЧекККМ.Сумма;

|Группировка Касса Без Групп;

              |Функция Сум = Сумма(СуммаПоЧеку);

|Условие (Касса=Кассы);

|"//}}ЗАПРОС
;

По самому запросу не понятно пока только одно: а именно то, что связано с оператором "Группировка" и далее - методом "Группировка".
Вопрос далее, исходя из кода ниже:

Код:
Если Запрос.Выполнить(ТекстЗапроса) =0 Тогда 

Сообщить ("Ошибка выполнения запроса отбора чеков"); 
Возврат;

Иначе
       
Пока Запрос.Группировка() = 1 Цикл
              Сообщить ("Касса в запросе: " + запрос.касса );
Сообщить ("Номер чека: " + запрос.НомерЧека);   
Сообщить ("Статус чека: " + запрос.статусЧека ); 
    Сообщить ("Вид чека: " + запрос.видЧека );
Сообщить ("Сумма чека: " + запрос.СуммаПоЧеку ); 


КонецЦикла;

Сообщить ("Общая сумма: " + запрос.Сум + " руб.");

КонецЕсли;

Вот  вопросы:

0) возвращаясь к Запросу: если не указывать "Без групп" - на экран не выводятся ни номера чеков, ни статус, ни вид, ни сумма (где-то стоят нули, где-то - пустые строки). В чем так принципиально указывать именно "без групп"?

1) если в качестве параметра метода указать "Касса" или "1", то внутренности цикла вообще невыполняются. С чем это связано?

и еще один вопросик: в каком виде представлена информация, после выполнения запроса?
Правильно я понимаю, что так:

| касса | номер чека | вид чека | статус чека | сумма по чеку |

спасибо за внимание  Краснею
Вторые сутки мучаюсь.
Записан
AndyG
Постоялец

by
Offline Offline

« Ответ #1 : 27-08-2010 07:43 » 

Начал я писать ответ и.... ну не знаю даже что написать......
Напишу таки запрос....
ну вот что у мне получилось:
Код:

       Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса=
" //{{ ЗАПРОС (ВыборЧеков)
|Период с кн_дата по кн_дата;
        |Обрабатывать НеПомеченныеНаУлаление;
|ЧЕК = Документ.ЧекККМ.ТекущийДокумент;
|КАССА = Документ.ЧекККМ.КАССА; //а не ссылка на справочник, вернее даже на наименование
|НомерЧека =  Документ.ЧекККМ.НомерДок;
|СТАТУСЧека = Документ.ЧекККМ.ЧекПробитККМ;
|ВИДЧека = Документ.ЧекККМ.ВидОперации;
|СуммаПоЧеку = Документ.ЧекККМ.Сумма;
        |Функция Сум = Сумма(СуммаПоЧеку);
|Группировка Касса Без Групп; //в справочнике могут быть и группы:)))
        //эта  команда отсекает группировки по ним
        |Группировка ЧЕК;
|"//}}ЗАПРОС
;

        Если выбКасса.Выбран() Тогда //выбКасса  - реквизит диалога Справочник кассы
               Касса=ВыбКасса;
        КонецЕсли;

        Если Запрос.Выполнить(ТекстЗапроса) =0 Тогда  
      Сообщить ("Ошибка выполнения запроса отбора чеков");  
      Возврат;
         КонецЕсли;

         // код для понятия структуры запроса
         ТЗ=СоздатьОбъект("ТаблицаЗначений");
          Запрос.Выгрузить(ТЗ);
          ТЗ.ВыбратьСтроку();
          // даст некоторое представление о группировках и переменных запроса..

        Пока Запрос.Группивовка(1) Цикл // ну типа Фильтр:) по кассе
                // можно Запрос.Группивовка("КАССА") но с цифирьками быстрее работает :)
                //тут вывод строки Касса № ....
                //Сумма=Запрос.Сум; - выведет сумму всех чеков по кассе;
               Сообщить ("Общая сумма по кассе "+Запрос.Касса+": "+запрос.Сум + " руб.");
                Пока Запрос.Группивовка(2) Цикл //группировка чеков по кассе отгруппированной выше
                        //тут вывод строки типа "= Чек № 0001 = проведен = сумма: 100 руб"
                        Док=Запрос.ЧЕК;           //такой вариант имеет право на жизнь
                        Номер=Док.НомерДок;  // в запросе тогда меньше переменных
                        СтатусДока=?(Док.Проведен()=1,"Проведен","Не проведен");
                        Сумма = Запрос.Сум; //или Док.Сумма ; сумма по чеку
                        Сообщить ("Касса в запросе: " + запрос.касса );
       Сообщить ("Номер чека: " + запрос.НомерЧека);    //или Номер
       Сообщить ("Статус чека: " + запрос.статусЧека );  
           
                        Сообщить ("Статус проведения: " + СтатусДока );                        

                        Сообщить ("Вид чека: " + запрос.видЧека );
       Сообщить ("Сумма чека: " + запрос.СуммаПоЧеку );  

                КонецЦикла;
        КонецЦикла;

Автору: не поленитесь, почитайте хелп по запросам, посмотрите как реализованы запросы у других
« Последнее редактирование: 27-08-2010 08:12 от AndyG » Записан
Kivals
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 28-08-2010 07:54 » 

Цитата
и еще один вопросик: в каком виде представлена информация, после выполнения запроса?
Правильно я понимаю, что так:

| касса | номер чека | вид чека | статус чека | сумма по чеку |
Для простого случая более правильно считать что данные представены в виде:
|Группировка 1 (Касса)|Группировка 2|...|Функция 1 (Сум = Сумма(СуммаПоЧеку))|Функция 2|...|
Хотя если какое-то поле запросов доступно для этого уровня группировки - то к нему тоже можно доступиться. В твоем случае: если ты делаешь группировку по кассе - то к реквизитам документа ты уже не доступишься. Как написал AndyG - у тебя еще должна быть группировка по ЧЕК.

Причем если ты вставишь в запрос Без итогов; - то тогда получишь табличную структуру результатов и обход нужно делать Запрос.Группировка() - без параметров.
Если Без итогов не будет - то результат запроса будет иерархический, и обходить нужно в виде:
Код:
Пока Запрос.Группировка(1)=1 Цикл
    Пока Запрос.Группировка(2)=1 Цикл
        ...
    КонецЦикла;
КонецЦикла;
В этом случае в каждом цикле будут итоги по всем функциям, а доступность к значениям всех группировок будет только в самом внутреннем цикле
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines