Выбрать для всех записей - PullRequest
       31

Выбрать для всех записей

0 голосов
/ 26 февраля 2012

Я пытался сделать выбор для всех записей в операторе выбора - abap.Я не понимаю, что делает выбор для записей.Кто-нибудь знает ?

Пожалуйста, взгляните на следующие утверждения:

1.

select bukrs belnr xblnr budat 
    from bkpf 
    into table it_bkpf 
    where belnr in s_belnr

2.

 select bukrs belnr buzei gsber zuonr wrbtr kunnr 
    from bseg 
    into table it_bseg  
    for all entries in it_bkpf 
    where belnr = it_bkpf-belnr.

Пожалуйста, дайте мне знать разницудва высказывания.

Шива

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012

Некоторые очевидные различия:

  1. Разные таблицы
  2. Разные целевые поля
  3. Во втором выборе была синтаксическая проблема: вы использовали form вместо from(Я исправил это с моим редактированием)

Другие различия:

Выбор 1.) использует in в предложении where.Так что он использует select-options (или range -объект).

for all entries in it_bkpf означает, что внутренняя таблица it_bkpf содержит список элементов, которые вы хотите выбрать.Или другими словами: выберите все записи в bseg, где поданное belnr является элементом внутренней таблицы bseg.

3 голосов
/ 27 февраля 2012

Вы получите четкий ответ через ST05 транзакцию.

  • Вы можете выполнить транзакцию st05, выбрать трассировку SQL и активировать трассировку.
  • После этого запуститеcode.
  • Введите st05 еще раз, выберите деактивировать трассировку, затем просмотрите результат трассировки.

Там вы можете увидеть точный код SQL, который пересылается на сервер базы данных.Поскольку BSEG является кластеризованной таблицей, вы не можете использовать интуитивное объединение заголовков и элементов для получения необходимой информации о финансовых движениях.Это просто потому, что есть несколько таблиц, включая BSEG, которые хранятся в одной таблице базы данных, поэтому сервер баз данных технически не может разделить строки BSEG и найти специфичные для BSEG поля для правильного соединения.

Таким образом, вы можете создать конструкцию, подобную соединениюна сервере приложений.Сначала вы извлекаете все связанные с заголовком столбцы из таблицы заголовков (BKPF).Затем, когда SELECT ... FOR ALL ENTRIES IN ... будет выполнено, сервер приложений возьмет небольшие порции строк заголовка (обычно 5) и создаст SQL-запросы для получения пакетов элементов, соответствующих этим частям.Далее все эти части будут объединены в единую внутреннюю таблицу.Таким образом, будут только элементы желаемого документа, как если бы вы могли выполнить обычное объединение.

2 голосов
/ 07 марта 2012

Вот что происходит так, как я понимаю.Два оператора, вероятно, выполняются один за другим:

  1. Первый оператор выбирает несколько записей из таблицы bkpf.Эти записи хранятся во внутренней таблице it_bkpf (скажем, belnr 1, 2, 3).

  2. Каждая из этих записей затем используется как часть выбора # 2.«Для всех записей» соответствует belnr в таблице bseg и во внутренней таблице it_bkpf из первого оператора.Затем соответствующие записи помещаются во внутреннюю таблицу it_bseg.

В приведенном вами примере это почти то же самое, если предложение where в SQL # 2 было where belnr in s_belnr (вместо целого для всех записей).Это имеет смысл, только если вам нужно содержимое it_bkpf для каких-то других целей.Другая типичная ситуация - если вы определяете содержимое внутренней таблицы, используемой в предложении для всех записей, с некоторой программной логикой вместо чтения ее непосредственно из базы данных.

Один улов с «для всех записей»:внутренняя таблица в for all entries не пуста - тогда будет выбрана вся таблица в предложении from.

...