+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средстваТема:
|- Выбор данных в SELECT (операция BETWEEN)




Автор Тема: Выбор данных в SELECT (операция BETWEEN)  (Прочитано 8325 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 635
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Выбор данных в SELECT (операция BETWEEN)
« : Июнь 11, 2014, 01:30:04 pm »
В общем есть табличка, в ней есть поле LGART = CHAR(4), делам запрос, идея получить все значения только цифрами. Вроде как можно ограничить между "0000" до "9999", буквы явно должны не входить в данный диапазон. Однако выбираются так же и значения содержащие буквы. Чего-то я завтыкал с этим запросом. У кого есть какие версии?
Код: You are not allowed to view links. Register or Login
REPORT  zi_test_pay.
DATA: lt_payment TYPE TABLE OF v_bw_t512t,
      ls_payment TYPE v_bw_t512t.

SELECT *  INTO TABLE lt_payment
  FROM v_bw_t512t
  WHERE langu = sy-langu AND
        molga = '36' AND
        ( lgart BETWEEN '0000' AND '9999' ).

LOOP AT lt_payment INTO ls_payment.
  WRITE: / ls_payment-langu,
           ls_payment-molga,
           ls_payment-lgart,
           ls_payment-txtsh,
           ls_payment-txtmd.
ENDLOOP.

Оффлайн Victor Ghost

  • Newbie
  • *
  • Сообщений: 20
  • Reputation Power: 0
  • Victor Ghost has no influence.
  • Пол: Мужской
  • YearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #1 : Июнь 20, 2014, 08:41:28 am »
Код: You are not allowed to view links. Register or Login
REPORT ZRU_FOR_TESTING.

DATA: lt_payment TYPE TABLE OF v_bw_t512t,
      ls_payment TYPE v_bw_t512t.

  DATA: lv_chr(4) type c,
        lv_num    type p.

SELECT *  INTO TABLE lt_payment
  FROM v_bw_t512t
  WHERE langu = sy-langu AND
        molga = '36' AND
        ( lgart BETWEEN '0000' AND '9999' ).




LOOP AT lt_payment INTO ls_payment.

  lv_chr = ls_payment-lgart.

  CALL FUNCTION 'MOVE_CHAR_TO_NUM'
    EXPORTING
      CHR             = lv_chr
    IMPORTING
      NUM             = lv_num
    EXCEPTIONS
      CONVT_NO_NUMBER = 1
      CONVT_OVERFLOW  = 2
      OTHERS          = 3.
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    CONTINUE.
  ENDIF.

  WRITE: / ls_payment-langu,
           ls_payment-molga,
           ls_payment-lgart,
           ls_payment-txtsh,
           ls_payment-txtmd.
ENDLOOP.

вроде ок =)

Оффлайн Victor Ghost

  • Newbie
  • *
  • Сообщений: 20
  • Reputation Power: 0
  • Victor Ghost has no influence.
  • Пол: Мужской
  • YearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #2 : Июнь 20, 2014, 08:44:24 am »
вообще это от того, что там тип данных char4 - цифры, буквы и т.д.
/вроде очевидно о_О

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 635
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #3 : Июнь 20, 2014, 11:15:46 am »
You are not allowed to view links. Register or Login
вообще это от того, что там тип данных char4 - цифры, буквы и т.д.
/вроде очевидно о_О
Да понятно что CHAR, но код символа цифра, меньше чем буква, поэтому я чего-то считал что при выборке с "0000" до "9999" значения с буквами никак не должно было попасть в выборку. Оказалось что попадает.

Оффлайн Victor Ghost

  • Newbie
  • *
  • Сообщений: 20
  • Reputation Power: 0
  • Victor Ghost has no influence.
  • Пол: Мужской
  • YearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #4 : Июнь 20, 2014, 12:06:05 pm »
ага. только прикол в том, что после 9399 идет не 9400, как хотелось бы, а 939A
/почему-то вспоминается 16-ричная система исчисления

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 635
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #5 : Июнь 20, 2014, 01:28:53 pm »
You are not allowed to view links. Register or Login
/почему-то вспоминается 16-ричная система исчисления
Да вот я тоже про это подумал.

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 632
  • Reputation Power: 1
  • №1 has no influence.
  • Пол: Мужской
  • Судьбы я вызов принимаю прямым пожатием руки
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #6 : Июнь 21, 2014, 11:14:47 am »
You are not allowed to view links. Register or Login
16-ричная система исчисления
Есть такая фенька у САП - нумерация от 0...9 до A...Z. Встретилось такое на номерах запросов
Мой You are not allowed to view links. Register or Login

Оффлайн sergiucz

  • Newbie
  • *
  • Сообщений: 69
  • Reputation Power: 0
  • sergiucz has no influence.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #7 : Июль 02, 2014, 11:28:39 pm »
Можно вот так сделать, вместо вывода занести в внутр. таблицу и отсортировать если есть по надобность и потом вывести .
При таком запросе есть один минус:
   он пробежит по всей таблице где langu = sy-langu
                                                    AND molga = '36'
   если данные под такими критериями не большие то в принципе можно использовать :)
Код: You are not allowed to view links. Register or Login
DATA: lt_payment TYPE TABLE OF v_bw_t512t,
      ls_payment TYPE v_bw_t512t.

DATA: result_tab TYPE match_result_tab.


select * into ls_payment
  FROM v_bw_t512t
  WHERE langu = sy-langu
    AND molga = '36'.

  CLEAR: result_tab[].
  FIND ALL OCCURRENCES OF REGEX '([0-9][0-9][0-9][0-9])'
    IN ls_payment-lgart
    RESULTS result_tab .

  IF result_tab[] is not INITIAL.
      WRITE: / ls_payment-langu,
           ls_payment-molga,
           ls_payment-lgart,
           ls_payment-txtsh,
           ls_payment-txtmd.
  ENDIF.

  ENDSELECT.
« Последнее редактирование: Июль 02, 2014, 11:37:34 pm от sergiucz »
Жизнь - это программа , найти бы debugger к ней :)

Оффлайн sergiucz

  • Newbie
  • *
  • Сообщений: 69
  • Reputation Power: 0
  • sergiucz has no influence.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #8 : Июль 02, 2014, 11:55:35 pm »
можно попробовать вместо  ( lgart BETWEEN '0000' AND '9999' ).
поставить в переменные типа numc или i.Жаль что у меня в этой таблицы нету позиций с 0000  >:(  я бы по тестил :)))

Думаю что ты передаешь в скобках значение и он понимает как чаровское :)) и по этому выплевывает там и те что с буквами :)) а мои пример наверху где я использовал REGEX ищет только цифровое значение .
« Последнее редактирование: Июль 02, 2014, 11:59:30 pm от sergiucz »
Жизнь - это программа , найти бы debugger к ней :)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 635
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #9 : Июль 03, 2014, 12:04:43 am »
You are not allowed to view links. Register or Login
можно попробовать вместо  ( lgart BETWEEN '0000' AND '9999' ).
поставить в переменные типа numc или i.Жаль что у меня в этой таблицы нету позиций с 0000  >:(  я бы по тестил :)))
Проверил, один фиг, вот такая же программка возвращает тот же результат, с буквами, кстати тип I, еще хуже получается там вообще лезет все со спецсимволами типа / и т.д. Так что не работает. Кстати, по поводу 16-ричных цифр, тоже фигня, так как там лезут буквы типа в коде 019N, что никак не тянет на 16-ричную систему.
Код: You are not allowed to view links. Register or Login

REPORT  zi_test_pay.
DATA: lt_payment TYPE TABLE OF v_bw_t512t,
      ls_payment TYPE v_bw_t512t.
DATA: l_start(4) TYPE n,
      l_end(4) TYPE n.

l_start = '0000'.
l_end = '9999'.

SELECT *  INTO TABLE lt_payment
  FROM v_bw_t512t
  WHERE langu = '8' AND
        molga = '36' AND
        ( lgart BETWEEN l_start AND l_end ).

LOOP AT lt_payment INTO ls_payment.
  WRITE: / ls_payment-langu,
           ls_payment-molga,
           ls_payment-lgart,
           ls_payment-txtsh,
           ls_payment-txtmd.
ENDLOOP.
Регулярные выражения, можно, но это уже пост-обработка, и там вариантов вагон и тележка если честно начиная с операции CS (ContainString) в условиях.

Оффлайн sergiucz

  • Newbie
  • *
  • Сообщений: 69
  • Reputation Power: 0
  • sergiucz has no influence.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #10 : Июль 03, 2014, 11:46:59 am »
а в RANGES с типом n или i поставить не пробовал ? и вместо BETWEEN использовать in
Жизнь - это программа , найти бы debugger к ней :)

Оффлайн nick_mi

  • Newbie
  • *
  • Сообщений: 6
  • Reputation Power: 0
  • nick_mi has no influence.
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #11 : Июль 03, 2014, 01:36:56 pm »
1 Создать внутреннюю таблицу с ключами от 0000 до 9999 и потом выполнить поиск
   по for all entries
2. Создать прозрачную таблицу с ключами  от 0000 до 9999 и выполнить поиск с JOIN
  Скорости правда, по всей видимости будут не очень и проще, наверное, потом отсеять все не цифровые ключи.
« Последнее редактирование: Июль 03, 2014, 01:51:57 pm от nick_mi »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 635
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Выбор данных в SELECT (операция BETWEEN)
« Ответ #12 : Июль 05, 2014, 12:18:17 am »
You are not allowed to view links. Register or Login
1 Создать внутреннюю таблицу с ключами от 0000 до 9999 и потом выполнить поиск
   по for all entries
2. Создать прозрачную таблицу с ключами  от 0000 до 9999 и выполнить поиск с JOIN
Ну это все уже обход...  решений много может быть, что быстрее можно наверное потом будет отдельно померить :-)