Текущее время: Вс, июл 20 2025, 22:28

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 12:37 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
Всем привет!! =)

Люди, обращаюсь к вам с целью узнать кто, что использует. Не поленитесь ответить))


В общем нужен интрумент какой нибудь универсальный, который бы мог делать примерно следующее:

1) передаем на вход переменную со значением

2) динамически определяем ее домен

3) определяем проверочную таблицы либо набор фиксированных значений если есть

4) Читаем табличку по ключу из нашей переменной (пусть и неполному - главное чтобы запись сама по себе была с таким занчением)

5) если нет - возвращаем ошибку что мол для поля в проверочной таблице (среди фиксированных значений) такого значения нет

Желательно конечно чтобы это все было завернуто в какой нибудь класс! Очень жду ответов =) Я пока не нашел - есть отдельные куосчки в разных ФМах и классах.. вот пока не решился написать свое, решил провести небольшой опрос))


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 12:58 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
А зачем Вы хотите это делать? Просто во многих случаях, если все правильно оформить, то система сама будет все это проверять.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 13:26 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
Так в том и дело, что не во всех!

Если мы говорим о стандартных диалоговых тарнзакциях - да, так и есть!

А теперь представим собственный функционал. Есть программа загрузки данных из Excel скажем. При этом грузится куча полей, большая часть из которых находится во всемозможных Z-справочниках. По определенным правилам и описанному в файле меппингу полей - она как то его считывает и раскалдывает по полям в структуру - на этом этапе никакой проверки не отработает, если мы в переменную передаем значения, не занесенные в эти справочники. Далее мы эти значения грузим в талбличку БД, где казалось бы тоже содержатся поля, ссылки на проверочные таблицы и т.д. но - нет - апдейт идет нормально - и записи спокойно ложатся со значениями, не содержащимися в значениях- справочниках.

Если знаете способ решить такую проблему средствами словаря - буду рад знать!


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 13:51 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Сделайте пакетный ввод на нужные транзакции.
Все проверки будут сделаны ;)

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 14:25 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
Пакетный ввод?? Зачем?? зашиваться на дизайн экранов и вешать на это логику.. Потом любое переименование экрана, пермещение с закладки на закладку поля и т.д. будет приводить к большим проблемам! не говоря уже о том, что если какие то функции реализованы контролами такими как АЛВ грид - его использование становится просто невозможным.

А если я хочу пробежаться по всей структуре и выявить все неверные значения разом, чтобы вывести пользователю все ошибки на экран, а не заставлять его по одному полю в шаблоне исправлять?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 14:56 
Специалист
Специалист

Зарегистрирован:
Вт, июл 07 2009, 13:24
Сообщения: 235
а средства RTTS, вам не подойдут?
http://wiki.sdn.sap.com/wiki/display/ABAP/Runtime+Type+Services+(RTTS)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 15:10 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
ppeter написал:
Пакетный ввод?? Зачем?? зашиваться на дизайн экранов и вешать на это логику.. Потом любое переименование экрана, пермещение с закладки на закладку поля и т.д. будет приводить к большим проблемам!

Если речь идет о своих транзакциях, то сделайте к ним ФМ для ввода данных, в котором будут делаться проверки.
Кроме проверок соответствия значений полей есть еще логические проверки, индивидуальные для каждой транзакции.
ppeter написал:
не говоря уже о том, что если какие то функции реализованы контролами такими как АЛВ грид - его использование становится просто невозможным.

Интересно, зачем в транзакциях ввода данных использовать ALV? :?

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 15:33 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
DaV написал(а):
а средства RTTS, вам не подойдут?
http://wiki.sdn.sap.com/wiki/display/ABAP/Runtime+Type+Services+(RTTS)


Да, речь именно о них в приницпе - но я искал готовый класс какой нибудь, потроенный на RTTS.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 15:43 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
Удав написал(а):
Если речь идет о своих транзакциях, то сделайте к ним ФМ для ввода данных, в котором будут делаться проверки.
Кроме проверок соответствия значений полей есть еще логические проверки, индивидуальные для каждой транзакции.

Вот! речь то как раз об этом! Чтобы до этапа специфических проверок, котрые безусловно нужны - отсечь часть полей, проверив их одним махом))

Удав написал(а):
Интересно, зачем в транзакциях ввода данных использовать ALV? :?
Ну так уж вышло, стал заниматься АВАРом, сразу начав использовать грид, как табличное средство для ввода. Я считаю, я не одинок в своих взгядах - транзакция ME51N - отличный тому пример.

Все что удалось найти - это вот этот ФМничек: DDUT_INPUT_CHECK.

а как оболочку к нему - очень мне нравится класс: CL_RECA_CUST_CHECK_SERVICES и его методы CHECK_STRUCT_DATA, CHECK_TABLE_DATA, CHECK_TABLE_TEXT_DATA. Вот щас занимаюсь тем, что пытаюсь выяснить, что он умеет делать, а что все таки нет..


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 15:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Постоянные значения домена можно проверить в ФМ CHECK_DOMAIN_VALUES.
По поводу проверок по словарю - ФМ DD_TABL_GET

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 16:05 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Вот такое чудо накопал
Code:
*"  IMPORTING
*"     VALUE(I_STRUCT_NAME) TYPE  CHAR30
*"     VALUE(I_DATA_FOR_CHECK)
*"     VALUE(I_CONSTANTS) OPTIONAL
*"  EXCEPTIONS
*"      NO_STRUCT_NAME
*"      NO_STRUCT
*"      NO_STRUCT_INFO_F
*"      NO_STRUCT_INFO_K
*"      INTERNAL_ERR
*"      NO_KEY
*"      NOT_EXISTS
*"      ERR_IN_LOG
*"----------------------------------------------------------------------

  IF i_struct_name IS INITIAL.
    RAISE  no_struct_name.
  ENDIF.

  IF struct_name1 NE i_struct_name.
    struct_name1 = i_struct_name.

* Заполняем таблицу с технич. информацией о полях струк-ры i_struct_name
    CLEAR t_fields[].
    CALL FUNCTION 'DD_TABL_GET'
     " читаем поля структуры в таблицу
      EXPORTING
        tabl_name      = i_struct_name
        withtext       = 'X'
      TABLES
        dd03p_tab_a    = t_fields
      EXCEPTIONS
        access_failure = 1
        OTHERS         = 2.

    IF sy-subrc = 0. " информ. по полям прочитана в таблицу
      IF t_fields[] IS INITIAL. " нет записей в таблице
        CLEAR struct_name1.
        RAISE  no_struct.
      ELSE.
        " заполняем кратк.информ.о полях структуры i_struct_name
        CLEAR t_fields1[].
        LOOP AT t_fields
        WHERE checktable NE space AND fieldname NE 'MANDT'.
          MOVE-CORRESPONDING t_fields TO wa_field1.
          APPEND wa_field1 TO t_fields1.
        ENDLOOP.
        CLEAR t_fields[].
      ENDIF.

    ELSE. " тех.инф. о полях структуры i_struct_name не прочитана
      CLEAR struct_name1.
      RAISE  no_struct_info_f.
    ENDIF.
  ENDIF. " табл.с информ.о полях структуры i_struct_name заполнена

  IF t_fields1[] IS NOT INITIAL. " в струк-ре есть поля с провероч.табл.

* Цикл по полям структуры i_struct_name
    CLEAR fl_err.
    ASSIGN i_data_for_check TO <struct_data>.
    ASSIGN i_constants      TO <struct_const>.

    LOOP AT t_fields1 INTO wa_field1.
      ASSIGN COMPONENT wa_field1-fieldname OF STRUCTURE <struct_data>
        TO <field0>.

      IF sy-subrc = 0 AND     " в i_data_for_check есть такое поле
      <field0> IS NOT INITIAL. " поле заполнено

          CLEAR t_keys_check[].
          CALL FUNCTION 'DD_TBFK_GET'
            " читаем ключи для обр-я в проверочн.табл. в таблицу
            EXPORTING
              fieldname     = wa_field1-fieldname
              tabl_name     = i_struct_name
            TABLES
              dd05m_tab_a   = t_keys_check
            EXCEPTIONS
              illegal_value = 1
              OTHERS        = 2.

        IF sy-subrc = 0. " ключи для обр-я в провероч.табл.прочитаны

          READ TABLE t_keys_check INTO wa_key
            WITH KEY forkey = wa_field1-fieldname.

          IF sy-subrc = 0. " поле, к-е надо читать из провер.табл.найд.
            s_field      = wa_key-checkfield.

            CLEAR s_conditions[].
            LOOP AT t_keys_check INTO wa_key.

              IF wa_key-forkey NE 'MANDT'.
                " формирование условия для динамического select
                s_table = wa_key-checktable.
                s_cond  = wa_key-checkfield.

                IF wa_key-datatype = 'DATS'.
                 CONCATENATE s_cond '>=' INTO s_cond SEPARATED BY space.
                ELSE.
                 CONCATENATE s_cond '='  INTO s_cond SEPARATED BY space.
                ENDIF.

                CASE wa_key-fortable.

                  WHEN i_struct_name.
                    IF wa_key-forkey NE wa_field1-fieldname.
                      CLEAR fl_comp.
                      ASSIGN COMPONENT wa_key-forkey
                        OF STRUCTURE <struct_data> TO <field1>.
                      IF sy-subrc = 0. " в i_data_for_check есть поле
                        fl_comp = 'X'.
                      ELSE.
                        ASSIGN COMPONENT  wa_key-forkey OF STRUCTURE
                          <struct_const> TO <field1>.
                        IF sy-subrc = 0. " в i_constants есть такое поле
                          fl_comp = 'X'.
                        ENDIF.
                      ENDIF.
                      IF fl_comp = 'X'. " есть такое поле во вход.дан.
                        CONCATENATE s_cond '''' <field1> ''''
                          INTO s_cond.
                        APPEND s_cond TO s_conditions.
                      ELSE.
                        RAISE  no_key.
                      ENDIF.
                    ELSE.
                      CONCATENATE s_cond '''' <field0> '''' INTO s_cond.
                      APPEND s_cond TO s_conditions.
                    ENDIF.

                  WHEN 'SY' OR 'SYST'. " данные берутся из струк-ры SYST
                    ASSIGN COMPONENT wa_key-forkey OF STRUCTURE syst
                      TO <field1>.
                    IF sy-subrc = 0. " в SYST есть поле wa_key-forkey
                      CONCATENATE s_cond '''' <field1> '''' INTO s_cond.
                      APPEND s_cond TO s_conditions.
                    ELSE.
                      RAISE  internal_err.
                    ENDIF.

                  WHEN '*'. " поле - родовой ключ

                  WHEN OTHERS.
                    IF wa_key-fortable+0(1) NE ''''.
                      " полю wa_field1-fieldname не присв. постоян. зн-е
                      CLEAR fl_comp.
                      ASSIGN COMPONENT wa_key-forkey OF STRUCTURE
                        <struct_const> TO <field1>.
                      IF sy-subrc = 0. " в i_constants есть такое поле
                        fl_comp = 'X'.
                      ELSE.
                        ASSIGN COMPONENT wa_key-forkey OF STRUCTURE
                          <struct_data> TO <field1>.
                        IF sy-subrc = 0. " в i_data_for_check есть поле
                          fl_comp = 'X'.
                        ENDIF.
                      ENDIF.
                      IF fl_comp = 'X'. " есть такое поле во вход.дан.
                        CONCATENATE s_cond '''' <field1> ''''
                          INTO s_cond.
                        APPEND s_cond TO s_conditions.
                      ELSE.
                        RAISE no_key.
                      ENDIF.
                    ELSE.
                      " полю wa_field1-fieldname присв-ся постоян. зн-е
                      CONCATENATE s_cond wa_key-fortable INTO s_cond.
                      APPEND s_cond TO s_conditions.
                    ENDIF.
                ENDCASE.
              ENDIF.
            ENDLOOP.

            IF s_conditions[] IS NOT INITIAL. " логич-е усл-я сформир-ны
              LOOP AT s_conditions INTO s_cond FROM 2.
                CONCATENATE 'AND' s_cond INTO s_cond SEPARATED BY space.
                MODIFY s_conditions FROM s_cond.
              ENDLOOP.

              CREATE DATA wa_field TYPE (wa_field1-rollname).
              ASSIGN wa_field->* TO <field1>.

              SELECT SINGLE (s_field)
              INTO <field1>
              FROM (s_table)
              WHERE (s_conditions).

              IF sy-subrc NE 0. " зн-е не найдено в провероч.таблице
                MESSAGE e001 WITH wa_field1-scrtext_l <field0>
                  INTO dummy_msg.
                  fl_err = 'X'.
                  "Заполнение протокола
              ENDIF.
            ENDIF.
          ELSE. " поле, к-е надо читать из провероч.табл. не найдено
            RAISE no_key.
          ENDIF.
        ELSE. " тех.инф. о ключах провероч.табл.не прочитана
          RAISE  no_struct_info_k.
        ENDIF.
      ENDIF.
    ENDLOOP.
    IF fl_err = 'X'. " зн-я некот.полей не найдены,
      RAISE err_in_log.
    ENDIF.
  ENDIF.

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 16:21 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 133
Откуда: Набережные Челны
Пол: Мужской
Code:
DATA: l_eleminfo  TYPE REF TO cl_abap_elemdescr,
      l_domain    TYPE abap_helpid,
      it_values   TYPE ddfixvalues.

l_eleminfo ?= cl_abap_elemdescr=>describe_by_data( field ).
l_domain  = l_eleminfo->help_id.
it_values = l_eleminfo->get_ddic_fixed_values( ).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Пт, мар 25 2011, 16:51 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 21 2008, 08:02
Сообщения: 71
Откуда: Moscow
Пол: Мужской
вот что получилось у меня:

Code:
 
data: lt_return type bapiret2_t,
        lo_msg_list type ref to IF_RECA_MESSAGE_LIST.

  lo_msg_list = CF_RECA_MESSAGE_LIST=>CREATE( ).

  CL_RECA_CUST_CHECK_SERVICES=>CHECK_STRUCT_DATA( IS_STRUCT  = cs_data_card
                                                  IO_MSGLIST = lo_msg_list ).

  if lo_msg_list->HAS_MESSAGES_OF_MSGTY( 'E' ) eq abap_true.
    lo_msg_list->GET_LIST_AS_BAPIRET( IMPORTING ET_LIST = lt_return ).
  endif.


Только вот не работает со структурами объявленными через локальные типы. Пока как то так. И насчет фиксированных значений не уверен.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)
СообщениеДобавлено: Вт, мар 29 2011, 06:58 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 02 2006, 18:56
Сообщения: 78
как вариант можно подсмотреть метод SPLIT_GOOD_AND_BAD класса cl_gui_alv_grid :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка значения поля по проверочной таблице / фиксированным значениям (универсальный метод)  Тема решена
СообщениеДобавлено: Пн, апр 04 2011, 11:11 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Посмотрите ФМ DDUT_INPUT_CHECK, RSISW_DTEL_INPUT_CHECKb


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

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


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

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


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

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