Как сделать SELECT DISTINCT с помощью SAP Infoset Query? - PullRequest
1 голос
/ 22 сентября 2010

Например: использование таблицы ITOB;если я выбираю EQUNR и ANLNR, я получаю несколько записей (в основном из-за неуникальных записей ILOAN, TPLNR и DATBI).Как я могу сделать эквивалент:

select distinct equnr anlnr from itob into (itob-equnr, itob-anlnr)
  where (some_wherclause).

Есть ли где-нибудь пропущенный флажок или радио-кнопка, которая переключает только отдельные записи?

ИЛИ

В области CODE, какие дополнительные переменные мне доступны?Если бы я мог получить доступ к набору результатов, я мог бы удалить дубликаты там.Я попытался получить доступ к% dtab, который используется в сгенерированной программе, но безуспешно.

1 Ответ

2 голосов
/ 23 сентября 2010

В области CODE unter extra, какие переменные мне доступны?

Из чего я вижу только строки заголовка таблиц выбора, которые вы определяете в условии соединениядоступно в блоках кодирования.То есть, если вы выбираете из ITOB присоединиться к ANLA, доступны как строки заголовка ITOB, так и ANLA.(Это относится только к блоку ОБРАБОТКА ЗАПИСИ).Однако вы можете определить свои собственные переменные в блоке DATA.

Как получить доступ к набору данных и ограничить записи после выбора:

Отказ от ответственности: Это очень похоже на хак, оно не работает для всех типов вывода, но показывает, как вы можете получить доступ к набору данных.

В блоке кода INITIALIZATION добавьте следующую инструкцию:

* Dummy comment to force generation 
* of END-OF-SELECTION Block

Любой комментарий подойдет - все, что нужно, это заставить генератор программы сгенерировать блок END-OF-SELECTION, который нам необходим для доступа к набору данных.

В блоке кода END-OF-SELECTION добавьте следующее:

data: lv_table type char100 value '%G00[]'.
field-symbols: <table> type any table.
assign (lv_table) to <table>.
if <table> is assigned.
  sort <table>.
  delete adjacent duplicates from <table>.
endif.

% G00 - имя переменной набора результатов в сгенерированной программе (используйте [] для доступа к таблице, а не только к строке заголовка).Поскольку сгенерированные программные переменные недоступны в Infoset, вы должны использовать символы поля для доступа к любым переменным.Если переменная не существует, проверка присвоения позволит избежать ошибок во время выполнения.

Ограничение: При выполнении запроса в «Режим списка ABAP» этот код не действует, этотЭто потому, что в этом случае список записывается как данные, которые выбираются, поэтому любые манипуляции после того, как факт слишком поздно.

То, что я в итоге сделал:

Я выполнил ручное объединение соответствующих отдельных таблиц в ITOB (EQUI-> EQUZ-> ILOA) и исключил IFLOT и IFLOTX из смеси, для этого потребовалось только установить дополнительное ограничение на дату окончания.Я предполагаю, что в большинстве случаев возможно деконструировать данные до уровня, на котором вы можете избежать дубликатов, используя правильное предложение WHERE.Вопрос о том, как сделать SELECT DISTINCT, когда вам действительно нужно, остается открытым ...

...