Как создать запрос с кодом основного / дополнительного языка

Подскажите пожалуйста, как это сделать: есть таблица МАКТ. У меня есть MAKTX на французском языке (SPRAS = 'FR'), но если французского языка здесь нет, тогда необходимо отображать MAKTX на английском языке. Как это сделать правильно?

 IF MAKT-SPRAS='FR'.
    SELECT SINGLE MAKT-MAKTX FROM MAKT WHERE SPRAS='FR'.
 ELSE.
    SELECT SINGLE MAKT-MAKTX FROM MAKT WHERE SPRAS='EN'.
 ENDIF.

person Callisto    schedule 04.12.2016    source источник
comment
В этой ситуации вы ищете одно описание, а не получаете описания для таблицы материалов, верно?   -  person Brian    schedule 05.12.2016


Ответы (3)


Вы можете получить с заказом по.

select * from MAKT where SPRAS = 'FR' or SPRAS = 'EN' order by SPRAS descending.
  exit.
endselect.
person mkysoft    schedule 04.12.2016
comment
Спасибо, Mkysoft! В этом случае информация отображается все подряд. И нужен только FR. Если «FR» нет, то только «EN». Как это сделать? - person Callisto; 04.12.2016
comment
@Callisto выше запрос получает весь порядок перевода по языкам. Так что FR всегда на высоте, если есть. Команда выхода остановить цикл в таблице (мы не можем использовать select single с order by). Вы можете удалить * и добавить то, что хотите. Думаю, вам также понадобится фильтр MATNR. - person mkysoft; 04.12.2016
comment
Зачем здесь SELECT...ENDSELECT? Это прекрасно можно написать с SELECT SINGLE - person Suncatcher; 05.12.2016
comment
Я почти уверен, что SELECT .. ENDSELECT важен - реальной проблемы с производительностью нет, потому что плакат просил выбрать сингл. Когда вы выполняете заказ, он вернет «FR», затем «EN», если оба существуют, или просто «EN» - «EXIT» выскакивает из цикла после одной записи - так что вы получите «FR», если он существует, или «EN». ' если не. - person clumb; 05.12.2016
comment
@Suncatcher Очевидно, вы не можете ORDER BY ... в SELECT SINGLE. - person ; 06.12.2016
comment
@LPK, да, правильно. Кроме того, составное условие OR должно быть заключено в круглые скобки, иначе оно будет извлекать кучу нерелевантных строк. Здесь это не важно из-за EXIT, но на всякий случай ... - person Suncatcher; 07.12.2016

Я лично не рекомендую использовать SELECT...EXIT ENDSELECT. с ORDER BY в этом случае!

Вот способ, который более краток и дает полный контроль над тем, что вы хотите делать с базой данных:

DATA: ls_makt TYPE makt.

SELECT SINGLE * FROM makt
  INTO ls_makt
  WHERE matnr EQ <your-matnr>
    AND ( spras EQ 'FR' 
          OR ( spras EQ 'EN'
               AND NOT EXISTS ( SELECT * FROM makt
                                WHERE matnr EQ <your-matnr>
                                AND   spras EQ 'FR' ) ) ).

Это выберет ваш материальный текст на французском или английском языках, но только в том случае, если французского текста не существует.

ИЗМЕНИТЬ согласно первому комментарию. Вы были правы, ... SINGLE ... отсутствовал в операторе SELECT.

person Max O    schedule 14.12.2016
comment
Я считаю, что это лучший подход, чем приведенный выше, но я также считаю, что его можно улучшить, выполнив SELECT SINGLE * FROM makt INTO ls_makt, где ls_makt определяется как строка таблицы MAKT. Я не уверен, что это активируется так, как есть. - person gkubed; 15.12.2016

Вы можете создать динамическое предложение where в ABAP следующим образом.

 DATA wherecond TYPE String.

 IF MAKT-SPRAS='FR'.
    CONCATENATE 'SPRAS = ''' FR '''' INTO wherecond.
 ELSE.
     CONCATENATE 'SPRAS = ''' EN '''' INTO wherecond.
 ENDIF.

 SELECT SINGLE MAKT-MAKTX FROM MAKT WHERE (wherecond).
person Reginaldo Costa    schedule 16.12.2016