Текущее время: Сб, авг 02 2025, 05:58

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пт, мар 27 2009, 17:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, июн 01 2005, 09:40
Сообщения: 536
Откуда: Belgorod
Пол: Мужской
Вот не пойму, зачем городить рабор выражения. RA предложил красивое решение.

_________________
Новый этап на проекте - устранение доработок :).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пт, мар 27 2009, 17:24 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Брат Мигель написал:
Вот не пойму, зачем городить рабор выражения. RA предложил красивое решение.


это не решение, макросы не понимают динамических выражений.

т.е. вызов my_macros <строковая переменная со строкой условий> не прокатит.

в макрос это фактически тот же кусок кода который вы бы написали руками, но просто поленились это сделать дважды :))

поддерживаю мнение Lars, как-то сомнительная логика , сначала вызывать свой же FM для формирования строки а потом самому же разбирать эту строку.
я бы попробовал изменить логику этой схемы ;)
ну если уж очень хочеться то без рег. выражений ни куда.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пт, мар 27 2009, 17:49 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
А мне кажется GENERATE SUBROUTINE-POOL - самое простое решение, преобразование строки минимальное, убрать название таблицы. Но тут вопрос в том, насколько сложная может быть строка. могут ли в ней быть несколько таблиц указано.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пт, мар 27 2009, 17:58 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Lars написал:
А мне кажется GENERATE SUBROUTINE-POOL - самое простое решение, преобразование строки минимальное, убрать название таблицы. Но тут вопрос в том, насколько сложная может быть строка. могут ли в ней быть несколько таблиц указано.
Всё зависит от того сколько раз в пределах сессии прийдтся выполнять подобную операцию - если не больше 36 раз, то подойдёт.
Опять таки - безопасность и пр. Условие возвращается неким вненим ФМ - вдруг они в строку засунут код. дропающий базу?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пт, мар 27 2009, 18:25 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
sy-uname написал(а):
Lars написал:
А мне кажется GENERATE SUBROUTINE-POOL - самое простое решение, преобразование строки минимальное, убрать название таблицы. Но тут вопрос в том, насколько сложная может быть строка. могут ли в ней быть несколько таблиц указано.
Всё зависит от того сколько раз в пределах сессии прийдтся выполнять подобную операцию - если не больше 36 раз, то подойдёт.
Опять таки - безопасность и пр. Условие возвращается неким вненим ФМ - вдруг они в строку засунут код. дропающий базу?


Про 36 раз согласен. Но, 36 раз делать loop...
Про остальное - как-то притянуто :)

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пн, мар 30 2009, 10:36 
Начинающий
Начинающий

Зарегистрирован:
Пт, мар 27 2009, 11:15
Сообщения: 5
Lars написал:
Мне кажется несколько нелогичным распарсивать строку, которая и так была создана динамически неким ФМ, который знает и поля и значения.
...


Некий ФМ узнает поля и значения из таблицы в которой есть следующие поля:
Some_id, ИмяПоля, Значение.
Задача ФМ по some_id выбрать все записи и если имя поля одинаковое сгруппировать их через ИЛИ, остальные разделить И.
То есть из таблицы
1| FiscYear | 2005
1| FiscYear | 2006
1| Month | 01
1| Month | 04
1| Month | 07
1| Month | 10
1| Prod | 15

выбирая по some_id = 1 делает строку
( FiscYear = 2005 or FiscYear = 2006 ) AND ( Month = 01 or Month = 04 or Month = 07 or Month = 10 ) AND Prod = 15
Готов принять предложения по оптимизации.

P.S. Подробности с указанием имени таблицы опущены специально.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пн, мар 30 2009, 10:52 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Я бы предложил, как простое решение, на вход ФМ передавать вашу внутренню табличку (или же ссылку на нее).
далее в ФМ е уже фильтровать эту табличку и возвращать ее уже отфильтрованную по вашим условиям.

ну а фильтровать внутри думаю достаточно легким будет.
что-нибудь вроде:
Code:

  ASSIGN COMPONENT <field_name> OF  STRUCTURE <table> TO <field_value>.
  IF sy-subrc EQ 0.
    IF <field_value>  EQ <sel_value>.
    ELSE.
      удаляем запись из внутренней таблицы.
    ENDIF.

  ENDIf.


ну и с производительностью проблем не будет. а то все эти динамические штучки весьма сомнительные + отладка и прочий геморой.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пн, мар 30 2009, 11:15 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
ну или из ФМ возвращать табличку с вашими полями

FiscYear | 2005
FiscYear | 2006
Month | 01
Month | 04
Month | 07
Month | 10
Prod | 15

отсортированную по имени поля.

далее цикл по вашей табличке.

CLEAR lf_and_true.
вложенный цикл по таб. условий.

ASSIGN COMPONENT <field_name> OF STRUCTURE <value_tab> to <tab_value>.
CHECK sy-subrc EQ 0.

AT NEW fieldname.
CLEAR lf_or_true.
ENDAT.

If field_value = table_value.
lf_or_true = 'X'.
ENDIF.

AT END OF fieldname.
lf_and_true = lf_or_true .
ENDAT.

If lf_and_true EQ false.
EXIT,
ENDIF.

конец цикла по таб. условий.

If lf_and_true EQ false.
удаляем строку вашей таблицы.
ENDIF.

конец цикла по вашей таблице.


правда это все будет работать, если вы собирались генерировать WHERE c AND и OR по вышеуказанному алгоритму (группировка полей и проч.), если условие WHERE формируется более сложным способом.,
то тогда лучше фильтровтаь табличку в том же ФМ.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Пн, мар 30 2009, 16:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
lomancool написал(а):
Некий ФМ узнает поля и значения из таблицы в которой есть следующие поля:
Some_id, ИмяПоля, Значение.
Задача ФМ по some_id выбрать все записи и если имя поля одинаковое сгруппировать их через ИЛИ, остальные разделить И.
То есть из таблицы
1| FiscYear | 2005
1| Month | 01
...
выбирая по some_id = 1 делает строку
( FiscYear = 2005 or FiscYear = 2006 ) AND ( Month = 01 or Month = 04 or Month = 07 or Month = 10 ) AND Prod = 15
Готов принять предложения по оптимизации.
P.S. Подробности с указанием имени таблицы опущены специально.

Pokusannoe_Zubilo правильно написал, но можно реализовать это через RANGES.
Это не самое быстрое решение, зато более универсальное ;)
Code:
TYPES: BEGIN OF t_selopt,
         sign TYPE sign,
         option TYPE option,
         low(30) TYPE c,
         high(30) TYPE c,
       END OF t_selopt,
       tt_selopt TYPE STANDARD TABLE OF t_selopt,
       BEGIN OF t_restrict,
         fldname TYPE fieldname,
         selopt TYPE tt_selopt,
       END OF t_restrict,
       tt_restrict TYPE STANDARD TABLE OF t_selopt.

DATA: gs_selopt TYPE t_selopt,
      gt_selopt TYPE tt_selopt,
      gs_restrict TYPE t_restrict,
      gt_restrict TYPE tt_restrict.
"...
*{ Начало ФМ
SORT gt_cond BY id fldname.
LOOP AT gt_cond INTO gs_cond where id = some_id.
  AT NEW fldname.
    REFRESH gt_selopt.
    CLEAR: gs_selopt, gs_restrict.
    gs_selopt-sign = 'I'.
    gs_selopt-option = 'EQ'.
    gs_restrict-fldname = gs_cond-fldname.
  ENDAT.
  gs_selopt-low = gs_cond-low.
  APPEND gs_selopt TO gt_selopt.
  AT END OF fldname.
    gs_restrict-selopt = gt_selopt.
    APPEND gs_restrict TO gt_restrict.
  ENDAT.
ENDLOOP.
*} Конец ФМ
LOOP AT gt_data ASSIGNING <fs_data>.
  CLEAR gs_fail.
  LOOP AT gt_restrict INTO gs_restrict.
    ASSIGN COMPONENT gs_restrict-fldname OF STRUCTURE <fs_data> TO <fs>.
    CHECK sy-subrc = 0.
    CHECK <fs> NOT IN gs_restrict-selopt.
    gs_fail = 'X'.
    EXIT.
  ENDLOOP.
  CHECK gs_fail IS INITIAL.
  ...
ENDLOOP.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Вт, мар 31 2009, 10:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, июн 01 2005, 09:40
Сообщения: 536
Откуда: Belgorod
Пол: Мужской
тогда посмотрите структуру RSSELECT.
и не придется придумывать велосипеды заного. все уже давно придумано до нас с вами. :)

_________________
Новый этап на проекте - устранение доработок :).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Вт, мар 31 2009, 12:25 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Брат Мигель написал:
тогда посмотрите структуру RSSELECT.

Это немного не то, см.код :)

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое условие в if
СообщениеДобавлено: Вт, мар 31 2009, 12:31 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Почти по теме: Разворот столбцов в строки в ALV


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

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


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

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


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

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