Текущее время: Вс, ноя 19 2017, 23:28

Часовой пояс: UTC + 4 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 77 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 12:50 
Специалист
Специалист

Зарегистрирован:
Чт, май 12 2011, 17:06
Сообщения: 238
nicky555 писал(а):
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
А в чем прикол? Просто в использовании одной и той же таблицы или в каких-то спецэффектах?
UPDATE. Сразу дополню. Имхо, опасный подход. Например, выполним:
Код:
DATA: t_usr02 TYPE TABLE OF usr02.

SELECT bname FROM usr01 INTO CORRESPONDING FIELDS OF TABLE t_usr02.
BREAK-POINT.
SELECT * FROM usr02 INTO TABLE t_usr02
FOR ALL ENTRIES IN t_usr02
WHERE bname = t_usr02-bname AND aname = 'SAP*'.
BREAK-POINT.
На первом брейк-поинте во внутренней таблице все bname, после второго их становится [в системе, где запускаю] значительно меньше. Этот пример просто для иллюстрации: одно неверное движение в where второго селекта - и в "универсальной" таблице потеряются записи.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 14:20 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 08:32
Сообщения: 776
Откуда: Москва
Пол: Мужской
LAT писал(а):
nicky555 писал(а):
Интересный прикол для использования одной внутренней таблицы как входных параметров, так и контейнера результата выборки.
А в чем прикол? Просто в использовании одной и той же таблицы или в каких-то спецэффектах?
UPDATE. Сразу дополню. Имхо, опасный подход. Например, выполним:
Код:
DATA: t_usr02 TYPE TABLE OF usr02.

SELECT bname FROM usr01 INTO CORRESPONDING FIELDS OF TABLE t_usr02.
BREAK-POINT.
SELECT * FROM usr02 INTO TABLE t_usr02
FOR ALL ENTRIES IN t_usr02
WHERE bname = t_usr02-bname AND aname = 'SAP*'.
BREAK-POINT.
На первом брейк-поинте во внутренней таблице все bname, после второго их становится [в системе, где запускаю] значительно меньше. Этот пример просто для иллюстрации: одно неверное движение в where второго селекта - и в "универсальной" таблице потеряются записи.

Ну, коллега, зачем же сразу так уничижительно? :lol:
Мы же все-таки на форуме, подразумевающем профессионально-уважительное отношение друг к другу.
Из описаний модераторов я понял, что в этой ветке публикуются вещи, показавшиеся авторам-разработчикам на АВАР необычными и забавными. Если вас не вдохновил мой пост, зачем же сразу высказывать свое "фи"? Как говорит мой хороший знакомый, "на вкус и цвет все фломастеры разные". :lol:
И, кстати, было бы удивительно, при наложении дополнительных ограничений на выборку, получить в результате то же количество записей. :roll: Хотя, "неверным движением" это назвать сложно. Скорее, "осознанное ограничение".

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 15:07 
Специалист
Специалист

Зарегистрирован:
Чт, май 12 2011, 17:06
Сообщения: 238
:shock: Это ни в коем случае не "фи". Просто посчитал своим долгом :) указать на особенность приема: он подходит, если нужно сузить (заиннерджойнить) выборку; а вот если нужно сделать довыборку в ту же таблицу (залефтджойнить) - тут могут появиться сюрпризы. Особенно, если внезапно потеряется парочка из нескольких тысяч записей :D.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 18 2014, 20:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, апр 24 2007, 16:56
Сообщения: 1389
nicky555 писал(а):
было бы удивительно, при наложении дополнительных ограничений на выборку, получить в результате то же количество записей

+1.
Это не "потенциально опасный" пример использования (с доп.ограничениями), а наоборот, очень даже удобный.
Сам часто так делаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 25 2014, 04:08 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 137
CASE можно использовать так:
Код:
CASE 'X'.
  WHEN rb1.
     " IF rb1 = 'X'.
  WHEN rb2.
     " IF rb2 = 'X'.
ENDCASE.

Особенно удобно, когда rb1 и rb2 - это RADIOBUTTON.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пт, июл 25 2014, 06:49 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 03 2012, 12:12
Сообщения: 21
Пол: Мужской
UKY писал(а):
CASE можно использовать так:
Код:
CASE 'X'.
  WHEN rb1.
     " IF rb1 = 'X'.
  WHEN rb2.
     " IF rb2 = 'X'.
ENDCASE.

Особенно удобно, когда rb1 и rb2 - это RADIOBUTTON.

Прямо так скажем, RADIOBUTTON - единственный случай, когда такая конструкция будет работать 100% правильно


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пн, авг 04 2014, 10:27 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 19 2012, 09:33
Сообщения: 171
Пол: Мужской
e.savitskij писал(а):
UKY писал(а):
CASE можно использовать так:
Код:
CASE 'X'.
  WHEN rb1.
     " IF rb1 = 'X'.
  WHEN rb2.
     " IF rb2 = 'X'.
ENDCASE.

Особенно удобно, когда rb1 и rb2 - это RADIOBUTTON.

Прямо так скажем, RADIOBUTTON - единственный случай, когда такая конструкция будет работать 100% правильно

Ну почему единственный.
Вдруг есть какой нибудь набор флагов и нужно выяснить, какой именно установлен. Если их больше 2, определенно
Код:
case 'X'
удобная вещь

_________________
crusty писал(а):
Логистика - понятие растяжимое


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, авг 07 2014, 05:54 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 137
Оказывается, в SELECT можно фильтровать по полям таблицы БД той же строки БД:
Код:
SELECT carrid connid fldate
       FROM sflight
       INTO CORRESPONDING FIELDS OF TABLE sflight_tab
       WHERE seatsocc > sflight~seatsmax.


При выборке SELECT *, если в условиях выборки есть EXISTS, то выбираются все поля из таблицы, а не только нужные…

Чтобы удалить строку табицы в LOOP’е по вторичному ключу, нужно писать ключевое слово LOOP_KEY:
Код:
  LOOP AT mct_where_buf ASSIGNING <ls_where_buf>
                        USING KEY key_ref
                        WHERE key_ref = ir_buf.
    DELETE mct_where_buf USING KEY LOOP_KEY.
  ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, авг 14 2014, 06:47 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 10:41
Сообщения: 137
Кто-нибудь знает, зачем может пригодится написать такой код?
Код:
  TRY.
    sy-tabix = 1 / 0.
  ENDTRY.

Почему можно писать TRY без CATCH или CLEANUP?
EXIT, CHECK выходят не из TRY, а из всего блока.

Или это просто баг и не нужно об этом думать? :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Чт, авг 14 2014, 16:00 
Старший специалист
Старший специалист

Зарегистрирован:
Ср, июн 01 2005, 20:32
Сообщения: 253
Откуда: Москва
UKY писал(а):
Кто-нибудь знает, зачем может пригодится написать такой код?
Код:
  TRY.
    sy-tabix = 1 / 0.
  ENDTRY.

Почему можно писать TRY без CATCH или CLEANUP?
EXIT, CHECK выходят не из TRY, а из всего блока.

Или это просто баг и не нужно об этом думать? :)

http://help.sap.com/abapdocu_740/en/abaptry.htm
Цитата:
If a class-based exception is raised in the TRY block, the system searches for an exception handler in the same TRY control structure or in an external structure (see System Behavior).

Так что это "не баг, а фича". :-)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вс, окт 05 2014, 22:23 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 404
Заметил следующее

Код:
" отрабатывает неправильно - записи не удаляются
"delete ltf_table1 WHERE BUKRS ne wa1-bukrs and VBRK_KUNRG ne wa1-kunrg.


Код:
" правильное удаление записей
delete ltf_table1 WHERE BUKRS ne wa1-bukrs .
IF sy-subrc = 0.        ENDIF.
delete ltf_table1 WHERE VBRK_KUNRG ne wa1-kunrg.
IF sy-subrc = 0.        ENDIF.


Буду очень признателен, если поясните, почему 1ый способ записи не удаляет (то, что он не удаляет - убедился сам :D ).
Возможно, его как-то нужно преобразовать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вс, окт 05 2014, 22:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 16:38
Сообщения: 1092
olegbash
1) покажите структуру внутр. таблы
2) покажите исход. набор данных
3) укажите что из п2 не удалялось и при каких условиях удаления

Потому что эти два варианта делают совершенно разные вещи
вариант 1) убирает те строки, в которых И БЕ И KUNRG не совпадают с значением фильтра
вариант 2) убирает сперва строки с несовпадающей БЕ, а затем - строки с несовпадающей KUNRG
Удаляемые данные в вариантах 1 и 2 - разные. В варианте 1 набор данных, который может быть удален, меньше чем в варианте 2

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Вс, окт 05 2014, 23:51 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 404
Спасибо большое за пояснение.
Возможно, я действительно, из виду упустил and <> or. Хотя коллегам показывал, мол покажите, в чем я не прав.
в тот период в системе было обновление ядра; дружно списали на это :-)
пример я себе оставил для прояснения на будущее.

по ответам на вопросы
types: begin of t_table
....
BUKRS type BUKRS
...
VBRK_KUNRG type KUNRG
....
end of t_table.

data: ltf_table1 TYPE STANDARD TABLE OF t_table.

с данными сложнее :-) - по памяти.
стр1 BUKRS=[4000] VBRK_KUNRG=[200101]
стр2 BUKRS=[4000] VBRK_KUNRG=[200102]
стр3 BUKRS=[4000] VBRK_KUNRG=[200103]
стр4 BUKRS=[4000] VBRK_KUNRG=[200104]
стр5 BUKRS=[4000] VBRK_KUNRG=[200105]
стр5 BUKRS=[5000] VBRK_KUNRG=[200105]

Цель: оставить запись только с одной какой-то комбинацией, например 4000/200101.

1ый вариант вообще никак несреагировал - ничего не удалил. Хотя данные на основе, которых идет удаление (wa1) содержат
2ой вариант после 2го шага оставил запись
стр1 BUKRS=[4000] VBRK_KUNRG=[200101]


Последний раз редактировалось olegbash Пн, окт 06 2014, 00:06, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пн, окт 06 2014, 00:01 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 404
так как тема про трюки; вот, что я полезным нашел
1 - в ABAP-отладчике появилась возможность просматривать данные внутренней таблице в ALV-отчете. Для этого перейти на вкладку "Таблицы", правой кнопкой мыши по данным -> Стандарт -> Просмотр данных в ALV

2- в LOOP можно сразу определять и использовать field-symbol.
Код:
LOOP AT <itab> ASSIGNING FIELD-SYMBOL(<line>).
  ...
ENDLOOP.


3 - в отладчике можно сохранять точки останова через сеанс в локальный файл; выйти из системы и загрузить их снова. не надо тыкаться по каждой строке.

4 - две функции в отладчике "Перейти к оператору" (shift+F12) переходит к нужной строке кода (как наверх, так и вниз) без выполнения; и "выполнить до курсора" - переходит до указанного места в коде с выполнением кода.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Полезные трюки ABAP
СообщениеДобавлено: Пн, окт 06 2014, 08:46 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 16:38
Сообщения: 1092
olegbash: вы не указали значение фильтра. Какие значения были у wa1-bukrs и wa1-kunrg?

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 77 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB