Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Индексированные Таблицы (число прочтений - 3185 )
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Индексированные Таблицы
04. Июля 2008 :: 04:09
Печать  
Всем привет и заранее извиняюсь, если плохо искал ветку где это можно обсудить Подмигивание

Вопрос вот в чем:
Я сделал запрос и выгрузил в субж.
потом сделал группировку типа:
);
пробежал по всем группировкам и сделал все что мне нужно, добавил колонки расчитал и вставил значения.
теперь чтобы не бегать по группировкам, мне нужно назад ее развернуть, тоесть в первоначальное состояние без группировок - это реально?
УдалитьИндекс якобы удаляет только все больше 1, а вот про 1 говорит иди нафиг основной индекс, никто не знает как решить данную задачу?
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #1 - 04. Июля 2008 :: 04:24
Печать  
нет, не реально, тем более что при твое варианте группировки от исходной тз остаются только итоги по указанным строкам, у тебя чРасшифровкаПоследнегоУровня = 0, а зачем тебе назад всё ?
Что то мне подсказывает что вариант  
Код
Выбрать все
,1); 

тебе подойдёт
Группировать(стрГруппировки, стрКолонкиСумм, [чРасшифровкаПоследнегоУровня = 0])
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #2 - 04. Июля 2008 :: 04:41
Печать  
там следующее, нужна группировка товара по 0Группа (так как ABC анализ относительно конкретной группы 1 уровня делается), потом группируем так сказать по свойствам товара, чтобы высчитать к какой категории свойство относится A, B или C  в итоге все делает и вставляет колонку в тзПотомки по 2 группировке.
НО группировок 1  не одна штука и отсюда в каждой будет тзПотомки у которой проводится расчет и это все правильно.
но потом при выводе товара из справочника проверяется принадлежит какому свойству этот товар и это свойство смотрится в этой Индтаблице, однако становится затруднительно снова бегать по группировкам 1 и искать это свойство и какая там буква ему принадлежит Печаль
просто думал как то проще можно назад разворачивать Печаль
Можно конечно еще одну ТЗ делать и туда после каждой 1 группировки сливать туда сформированные группировки 2, но это гемор да и скорость страдает Печаль
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #3 - 04. Июля 2008 :: 06:41
Печать  
pavlo писал(а) 04. Июля 2008 :: 04:09:
пробежал по всем группировкам и сделал все что мне нужно, добавил колонки расчитал и вставил значения.

Делай то-же самое с копией ИТЗ, сделанной до вызова Группировать.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #4 - 04. Июля 2008 :: 07:42
Печать  
ну тоесть просто плодить ТЗ Печаль
ведь их и так там 2 = количество группировок
хотелось в одной все решить Печаль

Нерешительный
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Индексированные Таблицы
Ответ #5 - 04. Июля 2008 :: 08:13
Печать  
Выложи ert.
Помогу  Улыбка
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #6 - 07. Июля 2008 :: 03:11
Печать  
[code]
Процедура Сформировать()
     Перем РПоз,ФирмаЗ,РКолПред,РКолСлед;
     глЛогПоОтчетам();

//*******************************************************************
     // формируем текст запроса
     ТекстЗапроса = СоздатьТекстЗапросаПоТМЦ();

     // Поищем в подразделениях нужный нам склад
     спр = СоздатьОбъект("Справочник.Подразделения");
     спр.ВыбратьЭлементы();
     ABCнет=0;
     Пока спр.ПолучитьЭлемент()=1 Цикл
           Если фСклад.ВидСклада = Перечисление.ВидыСкладов.Розничный Тогда
                 склад = спр.ОсновнойСклад;
           Иначе
                 склад = спр.СкладУслуг;
           КонецЕсли;
           Если склад = фСклад Тогда
                 Подразделение = спр.ТекущийЭлемент();
                 Прервать;
           КонецЕсли;
     КонецЦикла;
     Если ПустоеЗначение(Подразделение)=1 Тогда
           //Сообщить("Странный склад!!!");
           ABCнет = 1;
     КонецЕсли;
     // Если ошибка в запросе, то выход из процедуры
     Если ABCнет = 1 Тогда
           рс = СоздатьОбъект("ODBCRecordset");
           ти = СоздатьОбъект("ИндексированнаяТаблица");
           ти2 = СоздатьОбъект("ИндексированнаяТаблица");
           рс.УстановитьТекстовыйПараметр("ДатаНачала", ДатаНачала);
           рс.УстановитьТекстовыйПараметр("ДатаКонца", ДатаКонца);
           рс.УстановитьТекстовыйПараметр("Подразделение", Подразделение);
           //рс.Отладка(1);
           рс.ВыполнитьИнструкцию(ТекстЗапроса,ти);
           Состояние("Делаем ABC Анализ по товару...");
           );
           //ти.выбратьстроку();
     
           ти.выбратьстроки();
           Пока ти.ПолучитьСтроку() =1 Цикл
                 сум=0;
                 ПрибыльИТОГ = ти.СуммаСумма-ти.СуммаСебестВнеш;
                 ти2=ти.тзПотомки;
                 ти2.выбратьстроки();
                 ти2.НоваяКолонка("Прибыль");
                 ти2.НоваяКолонка(   "Доля");
                 ти2.НоваяКолонка(   "Буква");
                 Пока ти2.ПолучитьСтроку()=1 Цикл
                       ти2.Прибыль = ти2.СуммаСумма-ти2.СуммаСебестВнеш;
                       ти2.Доля      = Окр(ти2.Прибыль/ПрибыльИТОГ*100,2);
                 КонецЦикла;
                 ти2.Сортировать("-Доля");
                 ти2.ВыбратьСтроки();
                 Пока ти2.ПолучитьСтроку() = 1 Цикл
                       сум = сум+ти2.Доля;
                       Если сум <= 80 Тогда
                             ти2.Буква = "A";
                       ИначеЕсли сум <= 90 Тогда
                             ти2.Буква = "B";
                       Иначе
                             ти2.Буква = "C";
                       КонецЕсли;
                 КонецЦикла;
                 //ти2.выбратьстроку();
           КонецЦикла;
     КонецЕсли;
//*******************************************************************

[/code]
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #7 - 07. Июля 2008 :: 03:12
Печать  
[code]
Функция СоздатьТекстЗапросаПоТМЦ()
     
     ДатаНачала      = ДобавитьМесяц(НачМесяца(ТекущаяДата()),-3);
     ДатаКонца      = ПолучитьДатуТА();

     ТекстЗапроса = "-- qryMaker:Отчет1.2008.07.02.15.40.06
           |SELECT $Продажи.ТМЦ [ТМЦ $Справочник.ТМЦ]
           |      , dbo.Parentidnew($Продажи.ТМЦ,1) as [0Группа $Справочник.ТМЦ]
           |      , $ТМЦ.Группа [Группа $Справочник.ОбъединенныеГруппы]
           |      , Sum($Продажи.СебестВнеш) СуммаСебестВнеш
           |      , Sum($Продажи.Сумма) СуммаСумма
           |FROM $Регистр.Продажи AS Продажи With (NOLOCK)
           |      INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Продажи.IDDOC = Журнал.IDDOC
           |      INNER JOIN $Справочник.ТМЦ AS ТМЦ With (NOLOCK) ON $Продажи.ТМЦ = ТМЦ.ID
           |WHERE ($ТМЦ.Группа <> $ПустойИд)
           |      AND ($Продажи.Подразделение = :Подразделение)
           |      AND (Журнал.DATE_TIME_IDDOC Between :ДатаНачала and :ДатаКонца)
           |      AND ($Продажи.Сумма>0)
           |GROUP BY $Продажи.ТМЦ
           |      , $ТМЦ.Группа
           |";
     Возврат ТекстЗапроса;
     
КонецФункции // СоздатьТекстЗапросаПоТМЦ()

[/code]
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Индексированные Таблицы
Ответ #8 - 07. Июля 2008 :: 10:26
Печать  
Еще вопросы:
1) Зачем опять, в развернутом.
2) В каком виде хочешь выводить на экран.
Улыбка
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #9 - 08. Июля 2008 :: 02:20
Печать  
Я же выше объяснял зачем Улыбка
как сделать с помощью еще таблиц я знаю, но мне нужно было узнать реально ли реализовать в одной Улыбка

Дело не в выведении, а в вытаскивании, тоесть потом будет идти запрос по остаткам товара и уже чтобы не бегать по группировкам в одной бы развернутой назад таблице искать этот товар и ту самую колонку в которую я добавлял некие буквы по группировкам.
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Индексированные Таблицы
Ответ #10 - 08. Июля 2008 :: 06:41
Печать  
[quote]Делай то-же самое с копией ИТЗ, сделанной до вызова Группировать.[/quote]

Примерно так:
[code]
Процедура Сформировать()
     Перем РПоз,ФирмаЗ,РКолПред,РКолСлед;
     глЛогПоОтчетам();

//*******************************************************************
     // формируем текст запроса
     ТекстЗапроса = СоздатьТекстЗапросаПоТМЦ();

     // Поищем в подразделениях нужный нам склад
     спр = СоздатьОбъект("Справочник.Подразделения");
     спр.ВыбратьЭлементы();
     ABCнет=0;
     Пока спр.ПолучитьЭлемент()=1 Цикл
           Если фСклад.ВидСклада = Перечисление.ВидыСкладов.Розничный Тогда
                 склад = спр.ОсновнойСклад;
           Иначе
                 склад = спр.СкладУслуг;
           КонецЕсли;
           Если склад = фСклад Тогда
                 Подразделение = спр.ТекущийЭлемент();
                 Прервать;
           КонецЕсли;
     КонецЦикла;
     Если ПустоеЗначение(Подразделение)=1 Тогда
           //Сообщить("Странный склад!!!");
           ABCнет = 1;
     КонецЕсли;
     // Если ошибка в запросе, то выход из процедуры
     Если ABCнет = 1 Тогда
           рс = СоздатьОбъект("ODBCRecordset");
           ти = СоздатьОбъект("ИндексированнаяТаблица");
           рс.УстановитьТекстовыйПараметр("ДатаНачала", ДатаНачала);
           рс.УстановитьТекстовыйПараметр("ДатаКонца", ДатаКонца);
           рс.УстановитьТекстовыйПараметр("Подразделение", Подразделение);
           //рс.Отладка(1);
           рс.ВыполнитьИнструкцию(ТекстЗапроса,ти);
           Состояние("Делаем ABC Анализ по товару...");
           
           //ти2 = СоздатьОбъект("ИндексированнаяТаблица");
           ти2=ти.Копия(0,0);
                 ти2.НоваяКолонка("Прибыль");
           ти2.НоваяКолонка("Доля");
           ти2.НоваяКолонка("Буква");
           
           );
           //ти.выбратьстроку();
     
           ти.выбратьстроки();
           Пока ти.ПолучитьСтроку() =1 Цикл
                 ти2.НоваяСтрока();
                 ти2.ЗаполнитьСтроку(,ти,,1);
                 
                 сум=0;
                 ПрибыльИТОГ = ти.СуммаСумма-ти.СуммаСебестВнеш;
                 ти3=ти.тзПотомки;
                 ти3.выбратьстроки();
                 
                 Пока ти3.ПолучитьСтроку()=1 Цикл
                       ти2.НоваяСтрока();
                       ти2.ЗаполнитьСтроку(,ти3,,1);
                       ти2.Прибыль = ти3.СуммаСумма-ти3.СуммаСебестВнеш;
                       ти2.Доля      = Окр(ти2.Прибыль/ПрибыльИТОГ*100,2);
                 КонецЦикла;
           КонецЦикла;

           ти2.Сортировать("-Доля");
           ти2.ВыбратьСтроки();
           Пока ти2.ПолучитьСтроку() = 1 Цикл
                 сум = сум+ти2.Доля;
                 Если сум <= 80 Тогда
                       ти2.Буква = "A";
                 ИначеЕсли сум <= 90 Тогда
                       ти2.Буква = "B";
                 Иначе
                       ти2.Буква = "C";
                 КонецЕсли;
           КонецЦикла;
           //ти2.выбратьстроку();

     КонецЕсли;
//*******************************************************************
[/code]

ну далее, тебе и так все понятно :)
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #11 - 08. Июля 2008 :: 07:54
Печать  
вот именно что в итоге еще одна таблица, еще съеденное количество памяти, еще чуть больше кода Печаль
а хотелось красивее, думал ИндексныеТаблицы спасут, оказалось только на половину Улыбка

и почему ти2=ти.Копия(0,0);
разве не ти2=ти.Копия(0,1); нужно?
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Индексированные Таблицы
Ответ #12 - 08. Июля 2008 :: 09:15
Печать  
pavlo писал(а) 08. Июля 2008 :: 07:54:
вот именно что в итоге еще одна таблица, еще съеденное количество памяти, еще чуть больше кода Печаль
а хотелось красивее, думал ИндексныеТаблицы спасут, оказалось только на половину Улыбка

и почему ти2=ти.Копия(0,0);
разве не ти2=ти.Копия(0,1); нужно?

Смотря какие данные нужны до группировки или после.
Без полного алгоритма выборки и вывода, набросал примерно Улыбка

Без доп. таблицы результатов никак Подмигивание
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Индексированные Таблицы
Ответ #13 - 09. Июля 2008 :: 03:06
Печать  
ааа ну ясно, сенкс.
я правда немного по другому решил, пришлось также создать еще одну таблицу и туда по группировкам делать Объединить(), вообщем так оказалось более лучше.
теперь вроде работает все.
жаль только что в одной всего этого сделать нельзя Улыбка

всем СПАСИБО! Подмигивание
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать