Как выполнить SELECT DISTINCT с помощью запроса SAP Infoset?

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

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

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

ИЛИ

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


person Esti    schedule 22.09.2010    source источник
comment
Также: ирония того, что программист тратит время на создание инструмента, который, как предполагается, НЕ требует работы программиста, в то время как упомянутый программист может решить ту же проблему с помощью ABAP за все 5 минут, не теряется для меня.   -  person Esti    schedule 22.09.2010


Ответы (1)


Какие переменные мне доступны в разделе «КОД» и «Дополнительно»?

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

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

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

В блоке кода ИНИЦИАЛИЗАЦИЯ добавьте следующий оператор:

* 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 - это имя переменной набора результатов в сгенерированной программе (используйте [] для доступа к таблице, а не только к строке заголовка). Поскольку сгенерированные программные переменные недоступны в информационном наборе, вы должны использовать символы полей для доступа к любым переменным. Если переменная не существует, проверка присвоения позволит избежать ошибок времени выполнения.

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

Чем я закончил:

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

person Esti    schedule 23.09.2010