Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) $РегистрОстатки.ОстаткиТМЦ и родители справочника (число прочтений - 6602 )
zyris
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 05. Сентября 2006
$РегистрОстатки.ОстаткиТМЦ и родители справочника
20. Сентября 2006 :: 01:53
Печать  
RS = СоздатьОбъект("ODBCRecordset");

ТекстЗапроса = "
|SELECT
|      Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|      Рег.КоличествоОстаток as Количество
|FROM
|      $РегистрОстатки.ОстаткиТМЦ(:ВыбДата,
|                                                ,
|                               ,
|                               (Номенклатура), (Количество)) as Рег";

//RS.Отладка(1);
RS.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата);

ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);   

ТЗ.ВыбратьСТроку();

Запрос выводит остатки по товарам в ввиде

Элемент1  5
Элемент2  7
Элемент3  10
Элемент4  1
Элемент5  2

Как сделать, чтобы было так:

Группа0        25
  Группа1      22
    Элемент1  5
    Элемент2  7
    Элемент3  10
  Группа2       3
    Элемент4  1
    Элемент5  2

т.е. мне нужно на результат запроса "накрутить" всех родителей с подсчетом итогов по ним.
  
Наверх
 
IP записан
 
pyramid
YaBB Newbies
*
Отсутствует



Сообщений: 7
Зарегистрирован: 09. Июня 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #1 - 20. Сентября 2006 :: 05:00
Печать  
Например, использовать КОП "ТаблицаГруппировок".
  
Наверх
 
IP записан
 
zyris
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 05. Сентября 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #2 - 20. Сентября 2006 :: 05:12
Печать  
Я про такой класс знаю, работает слишком медленно. Хотелось средствами sql это сделать
  
Наверх
 
IP записан
 
pyramid
YaBB Newbies
*
Отсутствует



Сообщений: 7
Зарегистрирован: 09. Июня 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #3 - 20. Сентября 2006 :: 05:55
Печать  
средствами sql было не быстрее, только лишь запутаннее.

строим дерево справочника товаров:
Код
Выбрать все
create table #Tree
(
  id	  char(9) not null,
  parentid  char(9) null,
  descr     varchar(100) null,
  isfolder  numeric(1, 0) not null,
  lvl	 int not null,
  sort	varbinary(200) null,
  ident     int identity
)

declare @lvl   int,
	  @void  char(9)

set @void = '     0   '
set @lvl = 1

-- создать корень
insert into #Tree (id, parentid, descr, isfolder, lvl, sort)
  select @void, @void, NULL, 0 , 0, NULL

-- заполнить элементами первого уровня
insert into #Tree (id, parentid, descr, isfolder, lvl, sort)
  select id, parentid, descr, isfolder, @lvl, cast(0 as binary(4))
    from sc62 (nolock)
    where (parentid = @void)
    order by isfolder, cast(descr as varbinary(100))

while (@@rowcount > 0) begin
  set @lvl = @lvl + 1
  insert into #Tree (id, parentid, descr, isfolder, lvl, sort)
    select t.id, t.parentid, t.descr, t.isfolder, @lvl, tt.sort + cast(tt.ident as binary(4))
	from sc62 t (nolock)
	join #Tree tt
	  on (tt.id = t.parentid) and (tt.lvl = @lvl - 1)
	order by t.isfolder, cast(t.descr as varbinary(100))
end

update #Tree set sort = sort + cast(ident as binary(4)) 



связываем его с таблицей остатков
Код
Выбрать все
select
    t.id id, o.qty as qty,
    t.isfolder, t.lvl, t.parentid, t.sort
  into #Main
  from #Tree t
  left join #Remains o
    on (o.id = t.id) 



считаем итоги
Код
Выбрать все
declare @maxlevel int
select @maxlevel = max(lvl) from #Main
while (@maxlevel >= 0) begin
  set @maxlevel = @maxlevel - 1
  update #Main
    set
    qty = (
	   select isnull(sum(mm.qty),0)
	     from #Main mm
	  where (mm.parentid = #Main.id)
    )
  where (#Main.lvl = @maxlevel) and (#Main.isfolder < 2)
end 



добавить детализацию по складу сюда - уже кучу кода лопатить.
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #4 - 20. Сентября 2006 :: 05:57
Печать  
а например rollup уже отменили или то я просто туплю?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pyramid
YaBB Newbies
*
Отсутствует



Сообщений: 7
Зарегистрирован: 09. Июня 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #5 - 20. Сентября 2006 :: 06:02
Печать  
Цитата:
а например rollup уже отменили или то я просто туплю?

не поможет. групп справочника, к примеру, две на одном уровне, rollup сразу по обеим итог даст.
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #6 - 20. Сентября 2006 :: 06:04
Печать  
pyramid писал(а) 20. Сентября 2006 :: 06:02:
не поможет. групп справочника, к примеру, две на одном уровне, rollup сразу по обеим итог даст.

а это как? приведи пример...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pyramid
YaBB Newbies
*
Отсутствует



Сообщений: 7
Зарегистрирован: 09. Июня 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #7 - 20. Сентября 2006 :: 07:04
Печать  
Цитата:
а это как? приведи пример...

Вот тестовые данные:
Код
Выбрать все
if not (select OBJECT_ID('products')) is NULL
	drop table products

create table products (
  id int,
  parentid int,
  descr char(30),
  isfolder int
)

insert products (id, parentid, descr, isfolder)
	select 1, NULL, 'Вода', 1
	union all
	select 2, NULL, 'Земля', 1
	union all
	select 3, NULL, 'Прочее', 1
	union all
	select 4, 3, 'Огонь', 1
	union all
	select 101, 1, 'Вода лёгкая', 2
	union all
	select 102, 1, 'Вода тяжёлая', 2
	union all
	select 103, 2, 'Земля лёгкая', 2
	union all
	select 104, 2, 'Земля тяжёлая', 2
	union all
	select 105, 4, 'Огонь прочий', 2


if not (select OBJECT_ID('remains')) is NULL
	drop table remains

create table remains (
  id int,
  qty int
)

insert remains (id, qty)
	select 101, 10
	union all
	select 102, 5
	union all
	select 104, 100
	union all
	select 105, -2 



Обращаю внимание на то, что элемент с id=105 лежит уровнем ниже, чем остальные элементы.
Как должен выглядеть запрос с rollup, чтобы получить итоги по группам?
Решения этой задачи без update я не знаю.

Код
Выбрать все
select
  id, sum(qty) qty
from remains
group by id
	with rollup 


Простейший запрос, получаем полный итог.

  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #8 - 20. Сентября 2006 :: 07:26
Печать  
вобщето када я пробовал ролапить у меня было именно так:
Группа0        25
 Группа1      22
   Элемент1  5
   Элемент2  7
   Элемент3  10
 Группа2       3
   Элемент4  1
   Элемент5  2

в хитромудрости твоих предположений и тестовых заданий вникать не собираюсь, Вы наверно с 1cvirus в одной "консерватории" обучались по тому как задавть понятные только Вам вопросы и как запутывать людей...
кроме того если почитать описание и тестовые примеры ролапа, то там будет видно что именно так итоги по группировкам и выводятся...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #9 - 20. Сентября 2006 :: 07:33
Печать  
Цитата:
в хитромудрости твоих предположений и тестовых заданий вникать не собираюсь, Вы наверно с 1cvirus в одной "консерватории" обучались по тому как задавть понятные только Вам вопросы и как запутывать людей...
кроме того если почитать описание и тестовые примеры ролапа, то там будет видно что именно так итоги по группировкам и выводятся...

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

ps
прошу прощения за офф, но наболело
  

1&&2&&3
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #10 - 20. Сентября 2006 :: 07:44
Печать  
тогда объясни почему у меня ролап выдает так как он в (0) рассказывает?
может я не такой ролап юзаю?
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
zyris
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 12
Зарегистрирован: 05. Сентября 2006
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #11 - 21. Сентября 2006 :: 00:59
Печать  
Вчера смотрел как 1с накручивает группы с итогами.
Создается dbf файл к нему прикручивается cdx файл с двумя идексами.
Описание индексов следущие:

индекс   1
Назв  RG_ADD
Выр   S(F0,1)+P0+I0+U(O4)+V0
Уник  0
Убыв  0
Филт  .NOT.DELETED()


индекс   2
Назв  RG_MAIN
Выр   S(F0,1)+I0+V0
Уник  0
Убыв  0
Филт  .NOT.DELETED()
RG_ADD

Как расшифровать выражения S(F0,1)+P0+I0+U(O4)+V0 и S(F0,1)+I0+V0
Особенно интересует функция S(F0,1), где F0 - это число

Может кто что знает?
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: $РегистрОстатки.ОстаткиТМЦ и родители справочн
Ответ #12 - 21. Сентября 2006 :: 06:15
Печать  
по поводу того, как юзал ROLLUP, простой и понятный пример в: http://www.1cpp.ru/forum/YaBB.pl?num=1157436447
только я не делал темповых таблиз а сразу строил выобрку по такому принцыпу...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать