Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 调用BAPI\U USER\U CHANGE后,如何从返回表中获取所有消息?_Function_Loops_Abap_Bapi - Fatal编程技术网

Function 调用BAPI\U USER\U CHANGE后,如何从返回表中获取所有消息?

Function 调用BAPI\U USER\U CHANGE后,如何从返回表中获取所有消息?,function,loops,abap,bapi,Function,Loops,Abap,Bapi,我在ABAP任务中遇到问题,需要我执行以下操作: 从系统中选择所有活动用户 使用bapi_user_get_detail获取有关这些用户的一些个人信息(例如:名字、姓氏、上次登录日期) 然后我必须检查用户的电子邮件是否得到维护;如果他们的电子邮件没有维护(不存在),那么我需要使用BAPI_USER_CHANGE为这些用户提供电子邮件 毕竟,列表应该是这样显示的:第一列是用户名,第二列是姓氏,第三列是上次登录日期,第四列是电子邮件,第五列是消息(消息是返回表中的一个组件,来自Bapi) 我尝试使用

我在ABAP任务中遇到问题,需要我执行以下操作:

  • 从系统中选择所有活动用户
  • 使用bapi_user_get_detail获取有关这些用户的一些个人信息(例如:名字、姓氏、上次登录日期)
  • 然后我必须检查用户的电子邮件是否得到维护;如果他们的电子邮件没有维护(不存在),那么我需要使用BAPI_USER_CHANGE为这些用户提供电子邮件
  • 毕竟,列表应该是这样显示的:第一列是用户名,第二列是姓氏,第三列是上次登录日期,第四列是电子邮件,第五列是消息(消息是返回表中的一个组件,来自Bapi)
  • 我尝试使用功能模块“Format_message”从返回表中获取消息,但它不起作用。我真的不知道怎么做。如果可以的话,请帮助我。 另外,如果你仔细阅读,我有一个循环中的循环结构,我的经理不想要它。我怎样才能改变这一点,从而优化我的程序

    以下是我的源代码:

    *&---------------------------------------------------------------------*
    *& TABLES
    *&---------------------------------------------------------------------*
    TABLES: syst.
    
    *&---------------------------------------------------------------------*
    *& TYPES
    *&---------------------------------------------------------------------*
    TYPES: BEGIN OF ty_users,
            bname TYPE usr01-bname,
           END OF ty_users.
    
    *&---------------------------------------------------------------------*
    *& GLOBAL VARIABLES
    *&---------------------------------------------------------------------*
    DATA: gt_userdetail TYPE TABLE OF ty_users,
          gs_userdetail TYPE ty_users,
          gt_userstochange TYPE TABLE OF ty_users,
          gs_userstochange TYPE ty_users,
          gt_email TYPE TABLE OF bapiadsmtp,
          gs_address TYPE bapiaddr3.
    
    
    *&---------------------------------------------------------------------*
    *& SELECTION SCREEN
    *&---------------------------------------------------------------------*
    SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-t01.
    SELECT-OPTIONS: s_user FOR syst-uname.
    SELECTION-SCREEN END OF BLOCK bl1.
    
    
    *&---------------------------------------------------------------------*
    *& START OF SELECTION
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.
      PERFORM select_active_users.
    
    
    *&---------------------------------------------------------------------*
    *&      Form  select_active_users
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM select_active_users.
      CLEAR gt_userdetail.
    
      SELECT usr01~bname
        INTO CORRESPONDING FIELDS OF TABLE gt_userdetail
        FROM usr01
        WHERE usr01~bname IN s_user.
    
      IF sy-subrc = 0.
        PERFORM bapi_user_details.
      ELSE.
        MESSAGE i208(00) WITH 'No active users detected'.
      ENDIF.
    
    
    ENDFORM.                    "select_active_users
    
    
    *&---------------------------------------------------------------------*
    *&      Form  bapi_user_details
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM bapi_user_details.
    
      DATA: ls_logon TYPE bapilogond,
            ls_address TYPE bapiaddr3,
            lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
            ls_return TYPE bapiret2.
    
      WRITE: / 'FIRST NAME' COLOR COL_NEGATIVE INVERSE, 20 'LAST NAME' COLOR COL_NEGATIVE INVERSE, 55 'LAST LOGON DATE' COLOR COL_NEGATIVE INVERSE.
      SKIP 1.
    
    
      LOOP AT gt_userdetail INTO gs_userdetail.
    
        CLEAR: ls_logon, ls_address, lt_return[].
    
        CALL FUNCTION 'BAPI_USER_GET_DETAIL'
          EXPORTING
            username  = gs_userdetail-bname
          IMPORTING
            logondata = ls_logon
            address   = ls_address
          TABLES
            return    = lt_return
            addsmtp   = gt_email.
    
        IF lt_return IS INITIAL.
          PERFORM display_details USING ls_address ls_logon.
        ELSE.
          READ TABLE lt_return INTO ls_return WITH KEY type = 'AE'.
          IF sy-subrc = 0.
            MESSAGE e208(00) WITH 'An error has occurred'.
            EXIT.
          ENDIF.
        ENDIF.
    
        IF gt_email IS INITIAL.
          CONCATENATE ls_address-firstname ls_address-lastname '@example.com' INTO gs_address-e_mail.
          TRANSLATE gs_address-e_mail TO LOWER CASE.
          PERFORM append USING gs_userdetail.
          PERFORM user_change.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
          CLEAR gt_email[].
        ENDIF.
    
      ENDLOOP.
    
    ENDFORM.                    "bapi_user_details
    
    
    *&---------------------------------------------------------------------*
    *&      Form  display_details
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM display_details USING ps_address TYPE bapiaddr3
                               ps_logon TYPE bapilogond.
    
      WRITE: / ps_address-firstname UNDER 'FIRST NAME'(t05) COLOR COL_HEADING,
             ps_address-lastname UNDER 'LAST NAME' COLOR COL_HEADING,
             ps_logon-ltime UNDER 'LAST LOGON DATE' COLOR COL_HEADING.
    
    ENDFORM.                    "display_details
    
    
    *&---------------------------------------------------------------------*
    *&      Form  append
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_TEXT     text
    *----------------------------------------------------------------------*
    FORM append USING p_user TYPE ty_users.
      gs_userdetail = p_user.
      APPEND gs_userdetail TO gt_userstochange.
      CLEAR gs_userdetail.
    ENDFORM.                    "append
    
    
    *&---------------------------------------------------------------------*
    *&      Form  user_change
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM user_change.
    
      DATA: lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
            ls_return TYPE bapiret2,
            ls_addressx TYPE bapiaddr3x,
            lv_msg_str(100).
    
      IF gt_userstochange IS NOT INITIAL.
        LOOP AT gt_userstochange INTO gs_userstochange.
    
          CLEAR: lt_return[].
    
          ls_addressx-e_mail = 'X'.
    
          CALL FUNCTION 'BAPI_USER_CHANGE'
            EXPORTING
              username = gs_userstochange-bname
              address  = gs_address
              addressx = ls_addressx
            TABLES
              return   = lt_return
              addsmtp  = gt_email.
    
          IF lt_return IS NOT INITIAL.
            LOOP AT lt_return INTO ls_return.
              CALL FUNCTION 'FORMAT_MESSAGE'
                EXPORTING
                  id        = ls_return-id
                  lang      = sy-langu
                  no        = ls_return-number
                  v1        = ls_return-message_v1
                  v2        = ls_return-message_v2
                  v3        = ls_return-message_v3
                  v4        = ls_return-message_v4
                IMPORTING
                  msg       = lv_msg_str "Message text
                EXCEPTIONS
                  not_found = 1
                  OTHERS    = 2.
            ENDLOOP.
          ENDIF.
        ENDLOOP.
    
      ENDIF.
    
    ENDFORM.                    "user_change
    

    使用带有标题行的表(实际上不应该这样做,编译器只允许您这样做,因为您不在OO上下文中)

    所以这段代码

    IF lt_return IS NOT INITIAL.
    
    检查表的标题是否为初始值,而不是表本身

    不要使用带有标题行的表格(首选)

    或将代码更改为(不鼓励)


    这并不是说
    格式化\u消息
    不起作用。由于条件不正确,它甚至没有被调用的机会。

    您使用带有标题行的表(实际上您不应该这样做,编译器只允许您这样做,因为您不在OO上下文中)

    所以这段代码

    IF lt_return IS NOT INITIAL.
    
    检查表的标题是否为初始值,而不是表本身

    不要使用带有标题行的表格(首选)

    或将代码更改为(不鼓励)


    这并不是说
    格式化\u消息
    不起作用。由于条件不正确,它甚至没有被调用的机会。

    如果要避免嵌套循环,在这种情况下非常简单。 在主循环的每次迭代中:

    LOOP AT gt_userdetail INTO gs_userdetail.
    
    您可以使用BAPI BAPI用户更改进行更改。代码中的错误是,您正在缓冲此例程中用户的详细信息:

     FORM append USING p_user TYPE ty_users.
      gs_userdetail = p_user.
      APPEND gs_userdetail TO gt_userstochange.
      CLEAR gs_userdetail.
    ENDFORM.                    "append
    
    而且表格GT_USERSTOCHANGE没有刷新

    我建议如下:

    • 使用数据选择迭代表(GT_USERDETAIL)
    • 使用BAPI BAPI\u用户获取详细信息
    • 检查结果,如果没有错误,请使用BAPI BAPI\U USER\U CHANGE处理更改
    在每次迭代中,您应该始终执行正确的异常处理,这意味着您应该检查SY-SUBRC或BAPIRET2表,考虑到这一点,处理结果可以是缓冲区,并显示在ALV列表中或使用WRITE语句

    此外,如果要将BAPIRET2消息结构格式化为消息,只需简单地使用语句:

    MESSAGE TNNN(ID) WITH v1 v2 v3 v4 INTO lv_message.
    

    作为T消息类型,NNN数字,IDID和V1。。。消息的参数。

    如果要避免嵌套循环,在本例中非常简单。 在主循环的每次迭代中:

    LOOP AT gt_userdetail INTO gs_userdetail.
    
    您可以使用BAPI BAPI用户更改进行更改。代码中的错误是,您正在缓冲此例程中用户的详细信息:

     FORM append USING p_user TYPE ty_users.
      gs_userdetail = p_user.
      APPEND gs_userdetail TO gt_userstochange.
      CLEAR gs_userdetail.
    ENDFORM.                    "append
    
    而且表格GT_USERSTOCHANGE没有刷新

    我建议如下:

    • 使用数据选择迭代表(GT_USERDETAIL)
    • 使用BAPI BAPI\u用户获取详细信息
    • 检查结果,如果没有错误,请使用BAPI BAPI\U USER\U CHANGE处理更改
    在每次迭代中,您应该始终执行正确的异常处理,这意味着您应该检查SY-SUBRC或BAPIRET2表,考虑到这一点,处理结果可以是缓冲区,并显示在ALV列表中或使用WRITE语句

    此外,如果要将BAPIRET2消息结构格式化为消息,只需简单地使用语句:

    MESSAGE TNNN(ID) WITH v1 v2 v3 v4 INTO lv_message.
    

    作为T消息类型,NNN数字,IDID和V1。。。消息的参数。

    什么意思
    另外,如果您仔细阅读,我有一个循环中的循环结构,我的经理不想要它
    ?您的管理器不需要嵌套循环?有些任务别无选择,这是其中之一。给出实现的所有限制条件,并给出您想要构建的列表的预期输出。如果您仔细阅读,我有一个循环中的循环结构,我的经理不想要它。?您的管理器不需要嵌套循环?有些任务别无选择,这是其中之一。给出实现的所有限制条件,并给出想要构建的列表的预期输出。您可能需要更正的问题中还有另一个错误:
    将表lt\u return读入ls\u return,键类型为'AE'
    。类型可能是
    A
    E
    ,但不会是
    AE
    ,因为
    BAPIRET2-type
    仅为一个字符。你完全正确,错过了那个字符。在此上下文中,如果可能,可能应该是
    CA
    。您可能要更正的问题中还有另一个错误:
    将表lt\u return读入ls\u return,键类型为'AE'
    。类型可能是
    A
    E
    ,但不会是
    AE
    ,因为
    BAPIRET2-type
    仅为一个字符。你完全正确,错过了那个字符。在这种情况下,如果可能,可能应该是
    CA