SAP PS BAPI篇
从项目定义,到WBS,到网络,到活动,到物料组件
1项目定义
序号 | 业务分类 | 作用类别 | 名 | 主要作用 |
---|---|---|---|---|
1 | 项目定义 | 查询类 | BAPI_PROJECTDEF_GETLIST | 生成选择标准的项目定义的清单 |
2 | 项目定义 | 查询类 | BAPI_PROJECTDEF_GETDETAIL | 读取项目定义的细节 |
3 | 项目定义 | 查询类 | BAPI_BUS2001_GETDATA | 项目定义的详细数据 |
4 | 项目定义 | 查询类 | BAPI_PROJECTDEF_EXISTENCECHECK | 检查对象是否存在 |
5 | 项目定义 | 查询类 | BAPI_BUS2001_GET_GUID_FROM_KEY | 从键值获取GUID |
6 | 项目定义 | 查询类 | BAPI_BUS2001_GET_KEY_FROM_GUID | 从 GUID 获取键值 |
7 | 项目定义 | 查询类 | BAPI_BUS2001_GET_STATUS | 读取BUS2001状态 (项目定义) |
8 | 项目定义 | 新建类 | BAPI_PROJECTDEF_CREATE | BAPI: 创建项目定义 |
9 | 项目定义 | 新建类 | BAPI_BUS2001_CREATE | 使用 BAPI来创建项目定义,得增强字段了 |
10 | 项目定义 | 修改类 | BAPI_PROJECTDEF_UPDATE | 使用 BAPI来修改项目定义信息 |
11 | 项目定义 | 修改类 | BAPI_BUS2001_CHANGE | 使用 BAPI来修改项目定义信息,可使用增强字段 |
12 | 项目定义 | 修改类 | BAPI_BUS2001_SET_STATUS | 设置项目状态 |
13 | 项目定义 | 修改类 | BAPI_BUS2001_DELETE | 删除项目 |
1.1 查询
1.1.1 BAPI_PROJECTDEF_GETLIST生成选择标准的项目定义的清单
*&---------------------------------------------------------------------*
*& Report ZLGZBAPI_PROJECTDEF_GETLIST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLGZBAPI_PROJECTDEF_GETLIST.
TABLEs:vbak,proj.
"第一步,定义变量
data: iv_max_rows type BAPIF4A-MAX_ROWS.
data: lt_PROJECT_DEFINITION_LIST TYPE TABLE of BAPIPREXP."定义的对外显示的信息
"第二步,定义range
"二种定义函数中range方法
*选项介绍:
*1.SIGN 值为I和E I包含 E是排除 一般使用I
*2.OPTION 如果HIGH 为空 为单值选择 有 EQ、NE、GT、LE、LT等逻辑操作 对于*的 CP包含 NP是排除
* 如果HIGH 不为空 为区间选择 有BT,NB可选
*3.LOW 低值
*4.HIGH 高值
"方法一,查找函数range的LOW和HIGH的类型,采用type RANGE OF 不过这种方式,已经跳到函数内部了,失去了函数封装的意义了,下面就是例如针对结构BAPI_2002_PD_RANGE的示例
*DATA lt_pspid TYPE RANGE OF PS_PSPID."项目定义ID
*DATA wa_pspid LIKE LINE OF lt_pspid.
" wa_pspid-sign = 'I'.
" wa_pspid-option = 'BT'.
" wa_pspid-low = 'PSCN02_2020001'.
" wa_pspid-high = 'PSCN02_2020003'.
" APPEND wa_pspid TO lt_pspid.
"方法二,直接用data引用封装好的range
data lt_pd_range type table of BAPI_2002_PD_RANGE."这个是封装的项目编号range
data wa_pd_range type BAPI_2002_PD_RANGE.
data lt_descr_range type table of BAPI_2002_DESCR_RANGE."这个是封装的项目描述range
data wa_descr_range type BAPI_2002_DESCR_RANGE.
"第三步,定义选择条件
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS p_p1 TYPE BAPIF4A-MAX_ROWS .
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-001.
SELECT-OPTIONS: range0 for proj-PSPID DEFAULT '0' TO 'PSCN02_2020003' OPTION BT.
SELECT-OPTIONS: range1 FOR proj-POST1 DEFAULT 'ZCN02基建项目' TO 'ZCN02基建项目' OPTION BT.
"也可以根据定义的range结构定义选择条件
* SELECT-OPTIONS: range0 for wa_pd_range DEFAULT '0' TO 'PSCN02_2020003' OPTION BT.
* SELECT-OPTIONS: range1 FOR wa_descr_range DEFAULT 'ZCN02基建项目' TO 'ZCN02基建项目' OPTION BT.
SELECTION-SCREEN END OF BLOCK b2.
"第四步,将选择条件的值赋值给range
"屏幕选择的操作
iv_max_rows = p_p1."将输入显示行数赋值给参数1iv_max_rows
*wa_descr_range = range0. "直接将range0复制到wa_pd_range貌似把高的值无法复制过来,那就强行赋值了,给第一个range赋值
clear wa_pd_range.
wa_pd_range-sign = range0-sign.
wa_pd_range-option = range0-option.
wa_pd_range-low = range0-low.
wa_pd_range-high = range0-high.
APPEND wa_pd_range to lt_pd_range.
*wa_pd_range = range1. "直接将range0复制到wa_pd_range貌似把高的值无法复制过来,那就强行赋值了
clear wa_descr_range.
wa_descr_range-sign = range1-sign.
wa_descr_range-option = range1-option.
wa_descr_range-low = range1-low.
wa_descr_range-high = range1-high.
APPEND wa_descr_range to lt_descr_range.
"未赋值判断
IF p_p1 is INITIAL.
MESSAGE '最好选择行数,不然撑爆' type 'I'.
ENDIF.
"第五步,调用BAPI
"调用函数
CALL FUNCTION 'BAPI_PROJECTDEF_GETLIST'
EXPORTING
MAX_ROWS = iv_max_rows
* IMPORTING
* RETURN =
TABLES
project_definition_list = lt_PROJECT_DEFINITION_LIST
PROJECT_DEFINITION_RANGE = lt_pd_range
"DESCRIPTION_RANGE = lt_descr_range
.
"第六步,显示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
I_STRUCTURE_NAME = 'BAPIPREXP'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT_LVC =
* IT_FIELDCAT_LVC =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = lt_PROJECT_DEFINITION_LIST
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
调用示例:
1.1.2 BAPI_PROJECTDEF_GETDETAIL读取项目定义的细节
*&---------------------------------------------------------------------*
*& Report ZLGZBAPI_PROJECTDEF_GETDETAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLGZBAPI_PROJECTDEF_GETDETAIL.
"第一步,定义变量
data: WA_PROJECT_DEFI type BAPI_PROJ_KEY-PROJECT_DEFI."项目定义编号
data: WA_PROJ_KEY_INT TYPE BAPI_PROJ_KEY-PROJ_KEY_INT."项目内部编号
data: LT_PROJECT_DEFINITION_EX type TABLE of BAPI_PROJECT_DEFINITION_EX."定义输出变量
data: WA_PROJECT_DEFINITION_EX type BAPI_PROJECT_DEFINITION_EX."定义输出变量
"第二步,定义屏幕参数
PARAMETERS p_p1 TYPE PROJ-PSPID.
PARAMETERS p_p2 TYPE PROJ-PSPNR.
"第三步,赋值
WA_PROJECT_DEFI = p_p1.
WA_PROJ_KEY_INT = p_p2.
"第四步,调用函数
CALL FUNCTION 'BAPI_PROJECTDEF_GETDETAIL'
EXPORTING
currentexternalproje = WA_PROJECT_DEFI
currentinternalproje = WA_PROJ_KEY_INT
IMPORTING
PROJECT_DEFINITION_STRU = WA_PROJECT_DEFINITION_EX
* RETURN =
.
APPEND WA_PROJECT_DEFINITION_EX TO LT_PROJECT_DEFINITION_EX.
"第五步,ALV输出
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
I_STRUCTURE_NAME = 'BAPI_PROJECT_DEFINITION_EX'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT_LVC =
* IT_FIELDCAT_LVC =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = LT_PROJECT_DEFINITION_EX
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
1.1.3 BAPI_BUS2001_GETDATA 项目定义的详细数据
再看看新版的项目定义,有哪些区别,可增强,自定义字段按需获取。至于扩展字段的查询稍后再演示。
*&---------------------------------------------------------------------*
*& Report ZLGZBAPI_BUS2001_GETDATA
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLGZBAPI_BUS2001_GETDATA.
"第一步,定义变量
"输出和输入
DATA:
ld_e_project_definition TYPE BAPI_BUS2001_DETAIL ,
lt_e_project_definition TYPE STANDARD TABLE OF BAPI_BUS2001_DETAIL ,
ld_i_project_definition TYPE BAPI_BUS2001_DETAIL-PROJECT_DEFINITION ,
"返回变量
it_et_return TYPE STANDARD TABLE OF BAPIRET2 ,
wa_et_return LIKE LINE OF it_et_return,
"语言
ld_i_language TYPE BAPI_BUS2001_DETAIL-LANGU_ISO ,
"扩展的输入变量,扩展字段使用
it_extensionin TYPE STANDARD TABLE OF BAPIPAREX ,
wa_extensionin LIKE LINE OF it_extensionin,
"扩展的输出变量,扩展字段使用
it_extensionout TYPE STANDARD TABLE OF BAPIPAREX ,
wa_extensionout LIKE LINE OF it_extensionout.
"第二步,赋值
ld_i_project_definition = 'LGZXS002'.
"populate fields of struture and append to itab
append wa_et_return to it_et_return.
ld_i_language = 'ZH'.
"populate fields of struture and append to itab
append wa_extensionin to it_extensionin.
"populate fields of struture and append to itab
append wa_extensionout to it_extensionout.
.
"第三步,调用函数及lvc展示
CALL FUNCTION 'BAPI_BUS2001_GETDATA'
EXPORTING
i_project_definition = ld_i_project_definition
* i_language = ld_i_language
IMPORTING
e_project_definition = ld_e_project_definition
* TABLES
* et_return = it_et_return
* extensionin = it_extensionin
* extensionout = it_extensionout
. " BAPI_BUS2001_GETDATA
IF SY-SUBRC EQ 0.
APPEND ld_e_project_definition to lt_e_project_definition.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
I_STRUCTURE_NAME = 'BAPI_BUS2001_DETAIL'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT_LVC =
* IT_FIELDCAT_LVC =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = lt_e_project_definition
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
1.1.4 其他类查询
序号 | 业务分类 | 作用类别 | 名 | 主要作用 |
---|---|---|---|---|
4 | 项目定义 | 查询类 | BAPI_PROJECTDEF_EXISTENCECHECK | 检查对象是否存在 |
5 | 项目定义 | 查询类 | BAPI_BUS2001_GET_GUID_FROM_KEY | 从键值获取GUID |
6 | 项目定义 | 查询类 | BAPI_BUS2001_GET_KEY_FROM_GUID | 从 GUID 获取键值 |
7 | 项目定义 | 查询类 | BAPI_BUS2001_GET_STATUS | 读取BUS2001状态 (项目定义) |
*&---------------------------------------------------------------------*
*& Report ZLGZBAPI_BUS2001_GET_STATUS
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLGZBAPI_BUS2001_GET_STATUS.
DATA:
ld_return TYPE BAPIRETURN1 ,
ld_internalitemnumber TYPE BAPI_PRPS_KEY-INTERNALITEMNUMBER ,
ld_externalitemnumber TYPE BAPI_PRPS_KEY-EXTERNALITEMNUMBER .
ld_externalitemnumber = 'LGZXS00212'.
ld_internalitemnumber = ''.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_PROJECT_EXISTENCECHECK'
EXPORTING
internalitemnumber = ld_internalitemnumber
externalitemnumber = ld_externalitemnumber
IMPORTING
return = ld_return
. " BAPI_PROJECT_EXISTENCECHECK
IF SY-SUBRC EQ 0.
IF ld_return is INITIAL.
WRITE:/ '存在该WBS,可以获取该WBS的状态了:'.
ENDIF.
ENDIF.
"第一步:定义变量
DATA:
ld_project_definition TYPE BAPIPR-PROJECT_DEFINITION ,"项目定义输入条件
it_e_system_status TYPE STANDARD TABLE OF BAPI_SYSTEM_STATUS ,"系统状态定义
wa_e_system_status LIKE LINE OF it_e_system_status,
it_e_user_status TYPE STANDARD TABLE OF BAPI_USER_STATUS ,"用户状态定义
wa_e_user_status LIKE LINE OF it_e_user_status.
"第二步:初始化变量
ld_project_definition = 'LGZXS002'.
clear ld_return.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_BUS2001_GET_STATUS'
EXPORTING
project_definition = ld_project_definition
IMPORTING
return = ld_return
TABLES
e_system_status = it_e_system_status
e_user_status = it_e_user_status
. " BAPI_BUS2001_GET_STATUS
IF SY-SUBRC EQ 0.
LOOP AT it_e_system_status into wa_e_system_status.
IF wa_e_system_status is not INITIAL.
WRITE:/ '输出系统状态:',wa_e_system_status-SYSTEM_STATUS.
ENDIF.
ENDLOOP.
LOOP AT it_e_user_status into wa_e_user_status.
IF wa_e_user_status is not INITIAL.
WRITE:/ '输出用户状态:',wa_e_user_status-USER_STATUS.
ENDIF.
ENDLOOP.
ENDIF.
1.2 新增
1.2.1 BAPI_PROJECTDEF_CREATE旧的不可以增强的新增
*根据给出的流水号创建项目
DATA:ls_stru TYPE bapi_project_definition,
lt_return TYPE TABLE OF bapi_meth_message WITH HEADER LINE,
p_message type char1.
*FS上只标注了项目定义、描述、业务范围、成本控制范围、公司代码、工厂、负责人编号
PARAMETERS p_char1 TYPE char40."项目定义
PARAMETERS p_char2 TYPE char40."项目描述
PARAMETERS p_char3 TYPE PROJ-VBUKR."公司代码
PARAMETERS p_char4 TYPE PROJ-VKOKR."成本控制范围
PARAMETERS p_char5 TYPE PROJ-PROFL."项目参数文件
PARAMETERS p_char6 TYPE PROJ-WERKS."工厂
PARAMETERS p_char7 TYPE PROJ-PRCTR."利润中心
ls_stru-project_definition = p_char1.
ls_stru-description = p_char2.
ls_stru-comp_code = p_char3.
ls_stru-controlling_area = p_char4.
ls_stru-project_profile = p_char5.
ls_stru-plant = p_char6.
ls_stru-PROFIT_CTR = p_char7 .
CALL FUNCTION 'BAPI_PROJECTDEF_CREATE'
EXPORTING
project_definition_stru = ls_stru
* IMPORTING
* RETURN =
TABLES
e_message_table = lt_return.
READ TABLE lt_return WITH KEY message_type = 'E'.
IF sy-subrc EQ 0.
p_message = 'E'.
MESSAGE '创建失败' TYPE 'S'.
ELSE.
p_message = 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
MESSAGE '创建成功' TYPE 'S'.
ENDIF.
1.2.2 BAPI_BUS2001_CREATE项目定义新增,可扩展字段
*&---------------------------------------------------------------------*
*& Report ZLGZBAPI_BUS2001_CREATE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zlgzbapi_bus2001_create.
DATA :is_proj TYPE proj.
"第一步,创建变量
DATA:ls_return TYPE bapi_meth_message,
lt_stru_proj_define TYPE TABLE OF bapi_bus2001_new,
wa_stru_proj_define TYPE bapi_bus2001_new,
lt_message TYPE TABLE OF bapiret2,
wa_message TYPE bapiret2.
*FS上只标注了项目定义、描述、业务范围、成本控制范围、公司代码、工厂、负责人编号
"第二步,画参数
"MOVE-CORRESPONDING ld_e_project_definition TO wa_stru_proj_define.
PARAMETERS p_char1 TYPE char40 ."项目定义
PARAMETERS p_char2 TYPE char40."项目描述
PARAMETERS p_char3 TYPE proj-vbukr DEFAULT '6888'."公司代码
PARAMETERS p_char4 TYPE proj-vkokr DEFAULT '6888'."成本控制范围
PARAMETERS p_char5 TYPE proj-profl DEFAULT 'ZPS8802'."项目参数文件
PARAMETERS p_char6 TYPE bapi_bus2001_new-plant DEFAULT '8810'."工厂
PARAMETERS p_char7 TYPE bapi_bus2001_new-profit_ctr DEFAULT 'P6888001'."利润中心
PARAMETERS p_char8 TYPE bapi_bus2001_new-start DEFAULT '20210208'."开始日期
PARAMETERS p_char9 TYPE bapi_bus2001_new-finish DEFAULT