问题描述
在开发实施中,当我们通过BAPI_EQUI_CREATE创建设备后,我们希望创建“附件数据 1”页签中的长文本;
其中,创建设备使用:BAPI_EQUI_CREATE,实现代码后面给出简单示例;
另外,创建长文本我们使用SAVE_TEXT,针对设备中我们创建长文本需要的参数如下:OBJECT:EQUI,ID:LTXT,NAME:设备号(长文本对象的名称就是设备号,注意需要添加前导零)。
按以上步骤完成设备的创建和对应的长文本创建后,使用IE03查看设备,发现对应的长文本没有值,但是使用READ_TEXT输入对应参数后是可以查看到长文本中有值的,如果点击设备名称后的“显示文本”,也可以看到长文本,且退出后长文本出现,保存后则可以正常显示长文本;
以上原因对比可以展示长文本和不可以展示长文本的设备发现:不能展示长文本的设备对应的文本表(EQKT)中长文本标识字段KZLTX和TXASP没有打上“X”标记。
解决方法参考
FORM frm_call_bapi .
""创建主设备 BAPI参数
DATA: ext_number TYPE bapi_itob_parms-equipment.
DATA: data_general TYPE bapi_itob.
DATA: data_general_exp TYPE bapi_itob.
DATA: data_specific TYPE bapi_itob_eq_only.
DATA: data_install TYPE bapi_itob_eq_install.
DATA: return TYPE bapiret2.
DATA: t_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
""创建主设备 长文本参数
DATA: ls_thead TYPE thead,
lt_ltxts TYPE STANDARD TABLE OF tline,
ls_ltxts TYPE tline.
DATA ls_eqkt TYPE eqkt.
DATA: lt_eqkt_upt TYPE TABLE OF eqkt,
lt_eqkt_del TYPE TABLE OF eqkt,
lt_eqkt_ins TYPE TABLE OF eqkt.
DATA: objectkey TYPE bapi1003_key-object.
DATA: classnum TYPE bapi1003_key-classnum.
DATA: valueschar TYPE TABLE OF bapi1003_alloc_values_char WITH HEADER LINE.
FIELD-SYMBOLS: TYPE ty_data.
READ TABLE it_data TRANSPORTING NO FIELDS WITH KEY flag_ch = 'X'.
IF sy-subrc = 0.
RETURN.
ENDIF.
LOOP AT it_data ASSIGNING .
****数据准备
* ext_number = -equnr. "设备编码
CLEAR data_general.
data_general-descript = -eqktx. " 设备描述
data_general-read_crdat = -erdat. "有效起始日期
data_general-objecttype = -eqart. " 技术对象类型
* DATA_GENERAL-AUTHGRP = -BEGRU. "授权组
* data_general-obj_weight = -brgew. " 重量
* data_general-unit_of_wt = -gewei. "重量单位
data_general-obj_size = -groes. " 大小、尺寸
data_general-inventory = -invnr. "库存号
data_general-start_from = -inbdt. " 开始日期
data_general-acquisval = -answt. "购置价值
data_general-currency = -waers. " 货币码
data_general-acqdate = -ansdt. "购置日期
data_general-manfacture = -herst. " 制造商
data_general-mancountry = -herld. "制造商国家
data_general-manmodel = -typbz. " 型号
data_general-manparno = -mapar. "零件号
* data_general-manserno = -serge. " 系列号
data_general-constyear = -baujj. "制造年份
data_general-constmonth = -baumm. " 月份
data_general-maintplant = -swerk. "维护工厂
* DATA_GENERAL-PP_WKCTR = -OBJID. " 工作中心
data_general-abcindic = -abckz. "ABC标识
data_general-comp_code = -swerk. " 公司代码
data_general-asset_no = -anlnr. "主资产号
data_general-costcenter = -kostl. " 成本中心
data_general-planplant = -swerk. "计划工厂
data_general-plangroup = -ingrp. " 计划员组
* data_general-plsectn = -beber. "工厂区域
* data_general-maintroom = -msgrp. " 房间
data_general-work_ctr = -objid1. "主工作中心
* DATA_GENERAL-CATPROFILE = -RBNR. " 类别参数文件
CLEAR data_specific.
data_specific-equicatgry = -eqtyp. "设备类型
data_specific-techid = -tidnr. " 设备位号
* data_specific-read_valid_from = -ansdt. "开始生效日期
* "判断上级设备
* IF -hequi IS NOT INITIAL.
* data_specific-read_supeq = -hequi. "上级设备
* ELSE.
* data_specific-read_floc = -tplnr. " 功能位置标签
* ENDIF.
"设备位置信息
CLEAR data_install.
"判断上级设备
IF -hequi IS NOT INITIAL.
data_install-supequi = -hequi. "上级设备
ELSE.
data_install-funcloc = -tplnr. " 功能位置标签
ENDIF.
****调用BAPI创建设备主数据
CALL FUNCTION 'BAPI_EQUI_CREATE'
EXPORTING
external_number = ext_number
data_general = data_general
data_specific = data_specific
data_install = data_install
IMPORTING
equipment = ext_number
data_general_exp = data_general_exp
* DATA_SPECIFIC_EXP =
* DATA_FLEET_EXP =
return = return.
IF return-type = 'E' OR return-type = 'A'.
"创建设备失败
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
-icon = 1." ICON_LED_RED.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = return-id
msgnr = return-number
msgv1 = return-message_v1
msgv2 = return-message_v2
msgv3 = return-message_v3
msgv4 = return-message_v4
IMPORTING
message_text_output = -msg_ch.
ELSE.
"创建设备成功
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ext_number = |{ ext_number ALPHA = OUT }|.
-icon = 3." ICON_LED_GREEN.
IF data_general-objecttype = '1111' AND
data_general-asset_no IS INITIAL.
-msg_ch = '设备' && ext_number
&& '和资产' && data_general_exp-asset_no &&'创建成功'.
* ELSEIF data_general-objecttype = '2222'
* OR ( data_general-objecttype = '1111' AND
* data_general-asset_no IS NOT INITIAL ).
ELSE.
-msg_ch = '设备' && ext_number && '创建成功'. .
ENDIF.
-equnr = ext_number.
ext_number = |{ ext_number ALPHA = IN }|.
DO 50 TIMES.
SELECT SINGLE equnr
INTO @DATA(lv_equnr)
FROM equi
WHERE equnr = @ext_number.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO '0.1' SECONDS.
ENDIF.
ENDDO.
"设备号已更新至数据库
IF lv_equnr IS NOT INITIAL.
CLEAR ls_eqkt.
ls_eqkt-mandt = sy-mandt.
ls_eqkt-equnr = lv_equnr.
ls_eqkt-spras = sy-langu.
ls_eqkt-eqktx = data_general_exp-descript.
ls_eqkt-kzltx = 'X'.
* ls_eqkt-txasp = 'X'.
ls_eqkt-eqktu = data_general_exp-descript.
APPEND ls_eqkt TO lt_eqkt_upt.
ENDIF.
IF -long_text IS ASSIGNED.
DATA(lv_string) = -long_text.
" 设备主数据长文本
CLEAR ls_thead.
ls_thead-tdobject ='EQUI' .
ls_thead-tdname = lv_equnr.
ls_thead-tdid = 'LTXT'.
ls_thead-tdspras = '1'.
DATA(lv_len) = strlen( lv_string ).
DATA(lv_div) = lv_len DIV 130. "整除
DATA(lv_mod) = lv_len MOD 130.
IF lv_div > 0.
"如果整除大于0 直接做循环将前130个字符赋值给长文本内表
DO lv_div TIMES.
CLEAR ls_ltxts.
ls_ltxts-tdformat = '*'.
ls_ltxts-tdline = lv_string(130).
APPEND ls_ltxts TO lt_ltxts.
SHIFT lv_string BY 130 PLACES LEFT.
ENDDO.
"如果余数不为0 则将剩余的字符再赋值给长文本内表
IF lv_mod <> 0.
CLEAR ls_ltxts.
ls_ltxts-tdformat = '*'.
ls_ltxts-tdline = lv_string.
APPEND ls_ltxts TO lt_ltxts.
ENDIF.
ELSEIF lv_div = 0.
CLEAR ls_ltxts.
ls_ltxts-tdformat = '*'.
ls_ltxts-tdline = lv_string.
APPEND ls_ltxts TO lt_ltxts.
ENDIF.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
client = sy-mandt
header = ls_thead
insert = ''
savemode_direct = 'X'
TABLES
lines = lt_ltxts
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
IF sy-subrc = 0.
CALL FUNCTION 'COMMIT_TEXT'
EXPORTING
object = ls_thead-tdobject
name = ls_thead-tdname
savemode_direct = 'X'.
ENDIF.
ENDIF.
ENDIF.
CLEAR return.
CLEAR ext_number.
ENDLOOP.
**"更新长文本标识
IF lt_eqkt_upt IS NOT INITIAL.
CALL FUNCTION 'EQKT_SAVE_UPD_TASK'
TABLES
it_eqkt_upd = lt_eqkt_upt
it_eqkt_del = lt_eqkt_del
it_eqkt_ins = lt_eqkt_ins
EXCEPTIONS
error_eqkt_upd = 1
error_eqkt_ins = 2
error_eqkt_del = 3
OTHERS = 4.
ENDIF.**
ENDFORM. " FRM_CALL_BAPI