Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) аналог слова "Все" или "Вошедшие в запрос" (число прочтений - 22429 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #30 - 22. Октября 2012 :: 08:52
Печать  
т.е для примера из поста 5
имеем
товар колонка 1
склад1 колонка 2
склад2 колонка 3
склад3 колонка 4

Выводим шапку таблицы
колонки
1 товар
колонка 2 склад1
колонка 3 склад2
колонка 4 склад3

Цикл по строкам
Мороженное это новый товар
выводим строку в таблицу
где заполнена колонка 1 - мороженное
колонки с 2 по 4 колво пробел
Видим склад 1 выводим 5 шт в колонку 2

строка 2
Видим склад 2 выводим 7 шт в колонку 3

строка 3
Видим склад 3 выводим 3 шт в колонку 4

строка 4
яблоки это новый товар
выводим строку  в таблицу
где заполнена колонка 1 - яблоки
колонки с 2 по 4 колво пробел
Видим склад 1 выводим 8 шт в колонку 2

строка 5
Видим склад 3 выводим 1 шт в колонку 4
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #31 - 22. Октября 2012 :: 09:16
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:52:
Дело в том, что ТЗ имеет 3 колонки: товар, склад и остаток.
И для каждого товара - разное количество и состав складов.
Поэтому при выводе "всех" складов для каждого товара получится чехарда. Например : товар1, склад3, склад6, а под этой строкой: Товар2, склад1, склад4, склад8. И т.д. С помощью ТЗ у меня очтет давно написан и работает, но получилось не совсем просто, мягко говоря. А цель работы - скорость.

А в чем проблема то?
Код
Выбрать все
//ТЗ - ИндексированнаяТаблица с колонками "Товар, Склад, Остаток"
ТЗ.ДобавитьИндекс("_инд","*Товар, *Склад");
вТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(вТЗ);
вТЗ.Свернуть("Склад","");
вТЗ.Сортировать("Склад");
тТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(тТЗ);
тТЗ.Свернуть("Товар","");
тТЗ.Сортировать("Товар");
Таб.ВывестиСекцию("Шапка|Товар");
Для Сч=1 по вТЗ.КоличествоСтрок() Цикл
     //Выводим шапку складов
     Таб.ВывестиСекцию("Шапка|Склад");
КонецЦикла
_сз=СоздатьОбъект("СписокЗначений");
тТЗ.ВыбратьСтроки();
Пока тТЗ.ПолучитьСтроку()=1 Цикл
     Таб.ВывестиСекцию("Строка|Товар");
     Для Сч=1 по вТЗ.КоличествоСтрок() Цикл
	    //Выводим строчку складов
	    _сз.УдалитьВсе();
	    _сз.ДобавитьЗначение(тТЗ.Товар);
	    _сз.ДобавитьЗначение(вТЗ.ПолучитьЗначение(Сч,"Склад"));
	    НайденнаяСтрока=ТЗ.НайтиСтроку("_инд",_сз);
	    Если НайденнаяСтрока=0 Тогда
		   выхОстаток=0;
	    Иначе
		   выхОстаток=ТЗ.ПолучитьЗначение(НайденнаяСтрока,"Остаток");
	    КонецЕсли
	    Таб.ВывестиСекцию("Строка|Склад");
     КонецЦикла
КонецЦикла 

  
Наверх
ICQ  
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #32 - 22. Октября 2012 :: 10:03
Печать  
Спасибо!
Еще не понял до конца, как , но уже проверил, работает!!!
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #33 - 22. Октября 2012 :: 10:05
Печать  
Vlad7131 писал(а) 17. Октября 2012 :: 10:24:
     В конкретном случае выходят остатки по двум товарам, первый товар есть на двух складах, а другой на трех.
     (Всего в таблицу попадает 5 строк)
     Нужно чтобы первый товар был показан с нулевым остатком и на третьем складе, т.е. как при "ВСЕ Вошедшие в запрос".
     (В таблице тогда будет 6 строк, 3 строки по каждому товару)


Вот такой код:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
	|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
	|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
	|FROM $РегистрОстатки.ОстаткиТоваров(,,
	|		(Фирма = :ВыбФирма),
	|		(Товар, Склад),) AS ОстаткиТоваровОстатки
	|TOTALS Sum(ОстатокТовараОстаток)
	|BY ALL
	|	, [Товар $Справочник.Номенклатура]
	|	, [Склад $Справочник.МестаХранения]
	|";
ПостроительЗапроса = СоздатьОбъект("ПостроительЗапроса");
ПостроительЗапроса.Текст = ТекстЗапроса;
ПостроительЗапроса.Параметры.Установить("ВыбФирма", ВыбФирма);
ПостроительЗапроса.Группировки.Добавить("[Товар]");
ПостроительЗапроса.Группировки.Добавить("[Склад]");
ПостроительЗапроса.Выполнить();
Выборка = ПостроительЗапроса.Результат();
Пока Выборка.Группировка("Товар") = 1 Цикл
	Пока Выборка.Группировка("Склад") = 1 Цикл
		Сообщить("Товар: " + Выборка.Товар + ", склад: " + Выборка.Склад + ", остаток: " + Выборка.СуммаОстатокТовараОстаток);
	КонецЦикла;
КонецЦикла;
 



выводит в окне сообщений Цитата:
Товар: товар 1, склад: Склад 1, остаток: 10
Товар: товар 1, склад: Склад 2, остаток: 10
Товар: товар 2, склад: Склад 1, остаток: 10
Товар: товар 2, склад: Склад 2, остаток: 10
Товар: товар 3, склад: Склад 1, остаток: 10
Товар: товар 3, склад: Склад 2, остаток:


Класс

Если чё, используются разработки 1 и 2.



Или вот так, если нужна таблица значений:
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
		|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
		|FROM $РегистрОстатки.ОстаткиТоваров(,,
		|		(Фирма = :ВыбФирма),
		|		(Товар, Склад),) AS ОстаткиТоваровОстатки
		|TOTALS Sum(ОстатокТовараОстаток)
		|BY [Товар $Справочник.Номенклатура]
		|	, [Склад $Справочник.МестаХранения]
		|";
	Консоль = СоздатьОбъект("AddIn.qryConsole");
	Консоль.УстановитьТекстовыйПараметр("ВыбФирма", ВыбФирма);
	ФайлКуба = Консоль.СоздатьКуб(ТекстЗапроса);
	СводныйЗапрос = СоздатьОбъект("СводныйЗапрос");
	СводныйЗапрос.Открыть(ФайлКуба);
	тз = СводныйЗапрос.Выгрузить(, "[Товар], [Склад]");
 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #34 - 22. Октября 2012 :: 10:22
Печать  
ПостроительЗапроса это не в 1с++, отдельная компонента?
Что есть разработки 1 и 2 ?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #35 - 22. Октября 2012 :: 10:28
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:15:
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.



Курить в сторону класса ИтогиПоГруппировкам.
Там есть метода разворота по горизонтали - там это все реализовано.

Если в примитиве на пальцах, то делается очень просто: из выборки выгружается колонка с нужными данными и сворачивается.
Этот Свернутый список показателей - и есть "все вошедшие в запрос".
Если отсортируешь этот список + правильно отсортируешь таблицу данных - то легко сможешь шагая по данным определять, сколько пустых ячеек тебе нужно вывести до следующего значащего значения (или действовать даже более правильно - ячейки выводить всегда пустыми, а значения уже писать вычисляя адрес нужной ячейки).


не помню, есть ли он здесь в репозитории (скорее всего есть в сводной конфе с классами)
Потому линк на "создателя" - http://rikcenter.ru/download/RiK_Sums.rar
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #36 - 22. Октября 2012 :: 10:31
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 10:22:
Что есть разработки 1 и 2 ?

Это ссылки. http://www.1cpp.ru/forum/YaBB.pl?num=1193394153 и http://www.1cpp.ru/forum/YaBB.pl?num=1268237529



А если добавить к этому Yoksel, можно написать
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
		|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
		|FROM $РегистрОстатки.ОстаткиТоваров(,,
		|		(Фирма = :ВыбФирма),
		|		(Товар, Склад),) AS ОстаткиТоваровОстатки
		|TOTALS Sum(ОстатокТовараОстаток)
		|BY ALL
		|	, [Товар $Справочник.Номенклатура]
		|	, [Склад $Справочник.МестаХранения]
		|";
	Консоль = СоздатьОбъект("AddIn.qryConsole");
	Консоль.УстановитьТекстовыйПараметр("ВыбФирма", ВыбФирма);
	ФайлКуба = Консоль.СоздатьКуб(ТекстЗапроса);
	СводныйЗапрос = СоздатьОбъект("СводныйЗапрос");
	СводныйЗапрос.Открыть(ФайлКуба);
	ПостроительОтчета = СоздатьОбъект("ПостроительОтчета");
	ПостроительОтчета.ИсточникДанных = СводныйЗапрос;
	ПостроительОтчета.ГруппировкиСтрок.ДобавитьЗначение("[Товар]");
	ПостроительОтчета.ГруппировкиКолонок.ДобавитьЗначение("[Склад]");
	ПостроительОтчета.Поля.ДобавитьЗначение("Сумма ОстатокТовараОстаток");
	Документ = ПостроительОтчета.Показать().ПолучитьЭлементУправления(1).Документ;
	Документ.ПоказатьУровеньГруппировокСтрок(2);
	Документ.ПоказатьУровеньГруппировокКолонок(2); 


Улыбка
  

_______002.PNG ( 4 KB | Загрузки )
_______002.PNG

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #37 - 23. Октября 2012 :: 12:02
Печать  
Всем привет!
Решил пойти по пути подсказанном Salimbek-ом и Satans Claws:

Отчет работает, решил усложнить, дабавить разворот по группам справочника Номенклатура.
Для этого вместо таблицы значений с товаром (у него тТЗ) использовал индексированную таблицу, сгруппировав ее:
ИТ.Группировать("Товар:&Тов", "Остаток",0);                        //????
а эта строка была выше, до группировать:
ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");                        //????

и выводя в рекурсивной процедуре:

Процедура ВывестиГруппировку(ИТ,Таб)
     ...................................
     ИТ.ВыбратьСтроки();
     Пока ИТ.ПолучитьСтроку()=1 цикл  
           Таб.ВывестиСекцию("Строка|Товар");
           Для Сч=1 по СклТЗ.КоличествоСтрок() Цикл
                   //Выводим строчку складов
                     _сз.УдалитьВсе();
                     _сз.ДобавитьЗначение(ТовТЗ.Тов);
                     _сз.ДобавитьЗначение(СклТЗ.ПолучитьЗначение(Сч,"Склад"));
                 НайденнаяСтрока=ИТ.НайтиСтроку("_инд",_сз);            //????
                     Если НайденнаяСтрока=0 Тогда
                         выхОстаток=0;
                     Иначе
                         выхОстаток=ИТ.ПолучитьЗначение(НайденнаяСтрока,"Остаток");
                     КонецЕсли;
                 Таб.ПрисоединитьСекцию("Строка|Склад");
     ...................................
Ошибка:      Индекс с именем _инд не найден ! Что не так? Куда делся индекс.
Может надо было как то по другому группировать?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #38 - 23. Октября 2012 :: 12:22
Печать  
Другими словами:
Можно ли группировать ИТ по одному индексу (с одной колонкой &товар), а потом искать в этой же таблице но по другому индексу
(с двумя колонками: товар, склад)???
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #39 - 24. Октября 2012 :: 03:59
Печать  
ИТ.НайтиСтроку(_сз, "_инд");
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #40 - 24. Октября 2012 :: 05:03
Печать  
Теперь другая ошибка,
НайденнаяСтрока=ИТ.НайтиСтроку(_сз,"_инд");
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Номер индекса может быть либо числом либо строкой!  (100)
В учебнике стоит сначала индекс, потом ключ - список значений.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #41 - 24. Октября 2012 :: 05:12
Печать  
Синтаксис: НайтиСтроку(Индекс, Ключ, [чНайтиПоследнюю = 0], [чСпозиционироваться = 0])
Параметры:
Индекс - тип: Строка, Число. Идентификатор или номер индекса.

Хорошо, не ищет по этому индексу:
ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");
А какой идентификатор или номер индекса здесь:
ИТ.Группировать("Товар:&Тов;Склад:Склад", "Остаток",0);
В списке значений _сз товар и склад.
Что подставить в ИТ.НайтиСтроку("_инд",_сз) вместо "_инд"?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #42 - 24. Октября 2012 :: 05:25
Печать  
Товар и Склад вестимо, 2 индекса в сгруппированной ИТЗ
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #43 - 24. Октября 2012 :: 05:30
Печать  
Каким образом?
НайденнаяСтрока=ИТ.НайтиСтроку("Товар,Склад",_сз);
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Индекс с именем Товар,Склад не найден !
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #44 - 24. Октября 2012 :: 05:35
Печать  
[quote author=Vlad7131 link=1348826949/30#40 date=1351055029]Теперь другая ошибка,
НайденнаяСтрока=ИТ.НайтиСтроку(_сз,"_инд");
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Номер индекса может быть либо числом либо строкой!  (100)
В учебнике стоит сначала индекс, потом ключ - список значений.[/quote]

Сплю с утра :)
Переставь ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");  после ИТ.Группировать();  Видимо все ненужные индексы прибиваются при группировке. Честно говоря, не помню уже чё там как.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 6
ОтправитьПечать