如果用户尝试添加现有ID号,我试图写if语句给出错误消息。当我尝试输入现有ID时我得到错误。直到这里它没关系但是当我输入另一个id没有并填写字段(姓名,地址等)它不会去数据库。
METHOD add_employee.
DATA: IT_EMP TYPE TABLE OF ZEMPLOYEE_20.
DATA:WA_EMP TYPE ZEMPLOYEE_20.
Data: l_count type i value '2'.
SELECT * FROM ZEMPLOYEE_20 INTO TABLE IT_EMP.
LOOP AT IT_EMP INTO WA_EMP.
IF wa_emp-EMPLOYEE_ID eq pa_id.
l_count = l_count * '0'.
else.
l_count = l_count * '1'.
endif.
endloop.
If l_count eq '2'.
WA_EMP-EMPLOYEE_ID = C_ID.
WA_EMP-EMPLOYEE_NAME = C_NAME.
WA_EMP-EMPLOYEE_ADDRESS = C_ADD.
WA_EMP-EMPLOYEE_SALARY = C_SAL.
WA_EMP-EMPLOYEE_TYPE = C_TYPE.
APPEND wa_emp TO it_emp.
INSERT ZEMPLOYEE_20 FROM TABLE it_emp.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
TITEL = 'INFO'
TEXTLINE1 = 'Record Added Successfully.'.
elseif l_count eq '0'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
TITEL = 'INFO'
TEXTLINE1 = 'Selected ID already in database.Please type another ID no.'.
ENDIF.
ENDMETHOD.
答案 0 :(得分:2)
我不确定我是否得到你的解释。为什么要尝试将所有现有条目重新插入表中?如果它还不存在,您只是试图插入C_ID
等?为什么你需要所有现有的条目?
如果是这样,完全抛弃选择和循环,你不需要它。你有几个选择...
只需使用您的单一条目阅读表格
SELECT SINGLE * FROM ztable INTO wa WITH KEY ID = C_ID etc.
IF SY-SUBRC = 0.
"this entry exists. popup!
ENDIF.
使用修改声明
这会用新数据覆盖重复的条目(因此非关键字段可能会改变这种方式),它不会失败。不需要弹出窗口。
MODIFY ztable FROM wa.
抓住SQL异常而不是转储
如果更新因异常而失败,您可以随时捕获并处理异常情况。
TRY .
INSERT ztable FROM wa.
CATCH sapsql_array_insert_duprec.
"do your popup, the update failed because of duplicate records
ENDTRY.
答案 1 :(得分:1)
我认为在内部表格中添加IT&EMP'时会出现错误。并插入' ZEMPLOYEE_20'表。
假设您第一次追加,然后插入。但是当你第二次追加时,你会在IT_EMP'中找到2条记录。这将被插入' ZEMPLOYEE_20'。那是因为你没有刷新或清除内部表,那里就会出现运行时错误。
根据SAP documentation on 'Inserting Lines into Tables ':
插入多行
要在数据库表中插入多行,请使用以下命令: 从表中插入[接受重复键]。这个 将内部表的所有行写入数据库表中 一个单一的操作。相同的规则适用于线型 至于上述工作区域。如果系统能够 插入内部表中的所有行,SY-SUBRC设置为0。 如果因为数据库已经无法插入一行或多行 包含具有相同主键的行,发生运行时错误。
这里可能正确的方向是尝试直接插入工作区,但在使用主键检查记录是否已存在之前。
单击此处的链接,查看有关此问题的SAP文档。
另一方面,由于l_count
l_count = l_count * '0'.
为零,该值永远不会更改为任何其他数字,因此您无法追加或重新插入。
答案 2 :(得分:0)
您可以直接使用insert查询,如果sy-subrc不成功则引发错误消息。
WA_EMP-EMPLOYEE_ID = C_ID.
WA_EMP-EMPLOYEE_NAME = C_NAME.
WA_EMP-EMPLOYEE_ADDRESS = C_ADD.
WA_EMP-EMPLOYEE_SALARY = C_SAL.
WA_EMP-EMPLOYEE_TYPE = C_TYPE.
INSERT ZEMPLOYEE_20 FROM WA_EMP.
If sy-subrc <> 0.
Raise the Exception.
Endif.
答案 3 :(得分:0)
为什么要从zemployee_20中检索所有条目?
您可以直接查看“身份证”。通过使用选择单一来存在或不存在。如果存在,则显示消息,如果不存在,则添加。 建议在需要时仅检索一个字段,而不是使用asterisc *
检索整个表SELECT single employee_id FROM ZEMPLOYEE_20 where employee_id = p_id INTO v_id. ( or field in structure )
if sy-subrc = 0. "exists
"show message
else. "not existing id
"populate structure and then add record to Z table
endif.
此外,l_count不仅是不必要的,而且也是不好的。