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