2014-10-29 2 views
0

Я работаю над программой ABAP. У меня есть таблица фильтров с парами ZFIELD и ZVALUE (например, «страна» + «DE», «дата» + «Q1.2014»). Мне нужно запросить эту таблицу и найти CID пар, соответствующих моим критериям фильтра. Чтобы проиллюстрировать это на примере:SQL-заявление в таблице фильтров/ABAP

Таблица ZFILTER (ИДС, FID, Zfield, Zvalue):

1, 1, "country", "DE" 
1, 2, "country", "SE" 
1, 3, "date", "Q1.2014" 

Мои критерии фильтрации от переднего конца:

country=DE, date=Q1.2014 

теперь я хочу найти все CID, где критерии фильтра совпадают, поэтому в этом случае страна соответствует в DE, а дата соответствует Q1.2014, а ожидаемое возвращаемое значение - CID = 1.

Я пробовал следующий запрос:

SELECT DISTINCT CID 
FROM ZFILTER INTO TABLE LT_COMFILT 
WHERE (ZFIELD = 'country' AND ZVALUE = 'DE' ) 
       AND 
     (ZFIELD = 'date' AND ZVALUE = 'Q1.2014') 

однако, очевидно, что это не дает мне никакого результата из-за и между операторами. Я предполагаю, что мне придется создать какой-то подзапрос, но я борюсь с этим в ABAP, поскольку он превосходит мой опыт Open SQL.

Есть ли лучший способ решить эту задачу или кто-нибудь может внести свой вклад в ее выполнение (возможно, с синтаксическим правильным примером подзапроса в Open SQL)? Надеюсь, это ясно, чего я хочу достичь.

Заранее благодарен!

ответ

1

Если я правильно понимаю вашу проблему должным образом, именно мотивация для существования for all entries идиомы в ABAP Open SQL:

data: ls_filter type zfilter, 
     lt_filter type table of zfilter, 
     lt_result type table of zfilter. 

* Fill filter table 
ls_filter-zfield = `country`. 
ls_filter-zvalue = `DE`. 
append ls_filter to lt_filter. 
ls_filter-zfield = `date`. 
ls_filter-zvalue = `Q1.2014`. 
append ls_filter to lt_filter. 

* Get result: Important: Don't execute if lt_filter is initial! 
if lt_filter is not initial. 
    select * from zfilter into table lt_result 
      for all entries in lt_filter 
      where zfield = lt_filter-zfield 
      and zvalue = lt_filter-zvalue. 
endif. 
+0

Когда-то у меня был опыт, когда я использовал« для всех записей »с двумя полями, такими как вы, и я не получал все записи, все, что я получил из этого утверждения было только 1 запись за совпадение. –

+1

nmiranda Итак, вы думаете, что «для всех записей» нарушено? Это было бы очень серьезным обвинением. Докажите это! Единственное серьезное предупреждение с 'для всех записей' заключается в том, что вы должны убедиться, что внутренняя таблица не является исходной. Вышеуказанное предложение должно работать. – rplantiko

+0

В итоге я использовал комбинацию FOR ALL ENTRIES IN и цикл по парам ключ/значение фильтра. FOR ALL ENTRIES IN гарантирует, что я рассматриваю только те записи (CID), которые были найдены в предыдущих итерациях. –

0

Почему вы не можете справиться с этим в слое ABAP, а не в слое DB? Сколько записей ожидается в таблице ZFILTER? Если это не слишком усердно, проще обрабатывать в abap через циклы, сначала получая все данные в таблице и записывая вашу логику.

+0

Это фактически устраняет мой вопрос в том смысле, что «__Is там лучший способ обойти эту задачу__ или кто-нибудь может понять, как ее выполнить » –

0

Я думаю, что это даст вам то, что вам нужно.

SELECT DISTINCT CID 
FROM ZFILTER INTO TABLE LT_COMFILT 
WHERE CID IN (SELECT CID FROM ZFILTER WHERE ZFIELD = 'country' AND ZVALUE = 'DE') 
    AND CID IN (SELECT CID FROM ZFILTER WHERE ZFIELD = 'date' AND ZVALUE = 'Q1.2014') 

 Смежные вопросы

  • Нет связанных вопросов^_^