Текущее время: Чт, май 15 2025, 20:06

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Пн, сен 05 2005, 14:44 
Гость
подскажите, как построить запрос:
нужно заполнить внутреннюю таблицу данными из 2-х внутренних таблиц, допустим, ZBKPF (на основе BKPF) и ZBSEG (на основе BSEG). но! в одной строке итоговой таблицы, допустим, ZITOG, должны комбинироваться данные из 2-х строк ZBSEG. то есть мне нужно взять 2 строчки из ZBSEG с одинаковым значением, скажем, в поле ANLN1 (их ровно две, не больше). В результате чего в строчку таблицы ZITOG должны попасть: номер документа и номер позиции из первой строчки ZBSEG, соответствующая документу дата документа из ZBKPF, номер документа и номер позиции из 2-ой строчки ZBSEG, соответствующая 2-ому документу дата документа из ZBKPF.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Пн, сен 05 2005, 15:43 
Менеджер
Менеджер

Зарегистрирован:
Вт, дек 07 2004, 10:39
Сообщения: 610
Alraun написал(а):
подскажите, как построить запрос:
нужно заполнить внутреннюю таблицу данными из 2-х внутренних таблиц, допустим, ZBKPF (на основе BKPF) и ZBSEG (на основе BSEG). но! в одной строке итоговой таблицы, допустим, ZITOG, должны комбинироваться данные из 2-х строк ZBSEG. то есть мне нужно взять 2 строчки из ZBSEG с одинаковым значением, скажем, в поле ANLN1 (их ровно две, не больше). В результате чего в строчку таблицы ZITOG должны попасть: номер документа и номер позиции из первой строчки ZBSEG, соответствующая документу дата документа из ZBKPF, номер документа и номер позиции из 2-ой строчки ZBSEG, соответствующ
ая 2-ому документу дата документа из ZBKPF.

LOOP AT zbkpf
LOOP AT zbseg WHERe ..
APPEND ...
ENDLOOP.
ENDLOOP.

_________________
полный SAPец


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 05 2005, 16:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Иногда в таких случаях можно использовать join таблицы к самой себе
Code:
select t1~f1 t1~f2
       t2~f1 t2~f2
  into ...
  from some_table as t1
  join some_table as t2
    on t1~f3 = t2~f3
where ...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Пн, сен 05 2005, 16:22 
Гость
slash написал(а):
LOOP AT zbkpf
LOOP AT zbseg WHERe ..
APPEND ...
ENDLOOP.
ENDLOOP.


Мнэээ. учитывая соотношение BSEG:BKPF как много:1, не проще ли будет сперва сделать

Code:
SORT zbseg BY belnr.
SORT zbkpf BY belnr.

LOOP AT zbseg.
  AT NEW belnr.
    READ TABLE zbkpf WITH KEY belnr = zbseg-belnr BINARY SEARCH.
  ENDAT.
  MOVE-CORRESPONDING zbseg TO zitog.
  MOVE-CORRESPONDING zbkpf TO zitog.
ENDLOOP.


PS не люблю nested loops ;)[/code]


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 05 2005, 16:35 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
T написал:
Иногда в таких случаях можно использовать join таблицы к самой себе
Code:
select t1~f1 t1~f2
       t2~f1 t2~f2
  into ...
  from some_table as t1
  join some_table as t2
    on t1~f3 = t2~f3
where ...

Это, конечно, хорошо, но bseg - кластерная таблица. JOIN по ней не пройдет.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 05 2005, 16:36 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Дмитрий написал:
Это, конечно, хорошо, но bseg - кластерная таблица. JOIN по ней не пройдет.


Речь шла о некой ZBSEG



ЗЫ блин, ZBSEG же внутренняя..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Пн, сен 05 2005, 16:58 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
Max Popenker написал(а):
Мнэээ. учитывая соотношение BSEG:BKPF как много:1, не проще ли будет сперва сделать

Code:
SORT zbseg BY belnr.
SORT zbkpf BY belnr.

LOOP AT zbseg.
  AT NEW belnr.
    READ TABLE zbkpf WITH KEY belnr = zbseg-belnr BINARY SEARCH.
  ENDAT.
  MOVE-CORRESPONDING zbseg TO zitog.
  MOVE-CORRESPONDING zbkpf TO zitog.
ENDLOOP.


PS не люблю nested loops ;)[/code]

Во-первых, задача стояла в заполнении каждой строчки zitog данными из заголовка - zbkpf и 2-х позиций - zbseg, поэтому просто циклом по zbseg'у без изменения заполненной строки итогов при проходе по второй позиции для приведенного здесь алгоритма не обойтись. А это дурная практика. :(
Во-вторых, у таблиц bkpf, bseg составной первичный ключ. Поэтому поиск заголовка документа только по его номеру может привести к неприятным коллизиям - для разных БЕ, года номер док-та может быть одним и тем же.
Ну и соответственно at new belnr тоже маловато, если, конечно, в определении внутренней таблицы zbkpf поля bukrs и gjahr не объявлены ранее belnr.
Вот, в общем-то, и все. :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 05 2005, 17:02 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
T написал:
Дмитрий написал:
Это, конечно, хорошо, но bseg - кластерная таблица. JOIN по ней не пройдет.


Речь шла о некой ZBSEG



ЗЫ блин, ZBSEG же внутренняя..

ты предлагал сделать join для внутренних таблиц? :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, сен 05 2005, 17:22 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Дмитрий написал:
T написал:
Дмитрий написал:
Это, конечно, хорошо, но bseg - кластерная таблица. JOIN по ней не пройдет.


Речь шла о некой ZBSEG

ЗЫ блин, ZBSEG же внутренняя..

ты предлагал сделать join для внутренних таблиц? :D


Щаз..
я считал, что речь идет о прозрачной таблице ZBSEG, об этом я и написал, а потом допёр, что речь о внутренней, о чём дописал позже в виде PS. Прояснилось? :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Вт, сен 06 2005, 09:37 
Гость
Дмитрий написал:
Во-первых, задача стояла в заполнении каждой строчки zitog данными из заголовка - zbkpf и 2-х позиций - zbseg, поэтому просто циклом по zbseg'у без изменения заполненной строки итогов при проходе по второй позиции для приведенного здесь алгоритма не обойтись. А это дурная практика. :(

мне тоже так показалось. а как же быть? :roll:


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения: Re: заполнение внутренней таблицы из 2-х других таблиц
СообщениеДобавлено: Вт, сен 06 2005, 14:06 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
В твоем случае надо отсортировать zbseg по полю anln1,
а zbkpf по bukrs, belnr, gjahr. А лучше их объявить как сортированные таблицы.
Потом делаешь цикл по zbseg. Для "первой" строчки zbseg читаешь
заголовок
read table zbukrs with key bukrs = zbseg-buks belnr = zbseg-belnr gjahr = zbseg-gjahr binary search
и заполняешь свои поля в zitog для 1-строчки.
Для "второй" строчки также читаешь заголовок и заполняешь поля zitog для 2-й строчки и не забываешь append zitog сделать.
В двух словах вот так. Можно написать более прозрачный алгоритм, но это надо zbseg и zbkpf специальным образом определять.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 06 2005, 15:01 
Гость
спасибо.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 06 2005, 17:33 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
В SE38 есть хорошая вещь - примеры производительности. Не помню, кто это мне подсказал, но там есть алгоритмы оптимизации поиска в двух связанных таблицах. Лучше будет сделать примерно так:
Code:
data: begin of zbkpf occurs 0,
        [ключ. поля],
        ...,
      end of zbkpf,

      begin of zbseg occurs 0,
        [ключ. поля],
        [доп. ключ. поле для zbseg - позиция],
       ....,
      end of zbseg.
data: ind type i.
......................
  SORT: zbkpf BY [ключ zbkpf'a],
        zbseg BY [ключ zbseg'a].
  ind = 0.
  CLEAR: zbkpf, zbseg.
  LOOP AT zbseg.
    IF zbseg-[ключ] NE zbkpf-[ключ].
      ind = ind + 1.
      READ TABLE zbkpf INDEX ind.
      ....
      MODIFY zbkpf INDEX ind.
    ELSE.
      ....
      MODIFY zbkpf INDEX ind.
    EDNIF.
  ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 06 2005, 17:49 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, авг 18 2004, 09:17
Сообщения: 477
Откуда: Москва
Пол: Мужской
RoadRunner написал:
В SE38 есть хорошая вещь - примеры производительности. Не помню, кто это мне подсказал, но там есть алгоритмы оптимизации поиска в двух связанных таблицах. Лучше будет сделать примерно так:

У нас zbseg отсортирован по полю anln1, а zbkpf по первичному ключу таблицы bseg, но только без манданта. Так что метод параллельных курсоров никак не прокатит. Тут, в принципе, оптимизировать особо нечего - нет вложенных циклов.
Ну, от сортировки zbkpf можно избавиться, если в селект дописать order by primary key. А так - быстродействие по максимуму.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, сен 06 2005, 18:02 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 08:55
Сообщения: 331
Откуда: Украина, г.Мариуполь
Пол: Мужской
Дмитрий написал:
У нас zbseg отсортирован по полю anln1, а zbkpf по первичному ключу таблицы bseg, но только без манданта. Так что метод параллельных курсоров никак не прокатит.

Что мешает отсортировать по первичному ключу? Кроме БОЛЬШОГО размера внутренней таблицы, по-моему, нет причин не делать доп. сортировку...
Кроме того, я не знаю вашей специфики - "в твоем случае лучше..." (с) Дмитрий :)

З.Ы. Про параллельный курсор я сказал потому, что некто предлагал делать вложенный цикл с WHERE-условием. ИМХО, безобразие :) Да и в цикле делать READ TABLE ... BINARY SEARCH не лучший вариант. Если есть возможность, лучше сразу отсортировать ZBSEG по ключу, сделать необх. махинации с ZBKPF и затем отсортировать так, как вам надо.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB