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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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