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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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