我正试图写if语句,如果用户试图添加现有的ID号,则给出错误消息。当我尝试输入现有的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.
我不太明白你的解释。为什么要尝试将所有现有的条目重新插入到表中?你只是试图插入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.
我认为在内部表'IT_EMP'中添加并插入'ZEMPLOYEE_20'表时存在错误。
假设第一次追加,然后插入。但是当你第二次追加时,你将在'IT_EMP'中有2条记录,它们将被插入'ZEMPLOYEE_20'中。这是因为你没有刷新或清除内部表,这样你就会有一个运行时错误。
根据SAP文档"插入行到表中":
插入几行
要在数据库表中插入几行,请使用以下命令:插入表[接受重复键]。这将内部表的所有行写入中的数据库表一次操作。的行类型也适用同样的规则关于上述工作区域。如果系统能够插入内部表中的所有行,SY-SUBRC设置为0。如果一个或多个行无法插入,因为数据库已经包含具有相同主键的行,则发生运行时错误。
也许正确的方向是尝试直接插入工作区域,但在此之前必须使用主键检查记录是否已经存在。
点击前面的链接查看SAP文档。
另一方面,一旦l_count
因为l_count = l_count * '0'.
而为零,该值将永远不会改变为任何其他数字,使您无法再次追加或插入
为什么要从zemployee_20中检索所有条目?
可以使用select single直接检查'id'是否已经存在。如果存在,则显示消息,如果不存在,则添加。建议在需要时只检索一个字段,而不是用星号*
检索整个表。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不仅没有必要,而且实现得很差。
您可以直接使用插入查询,如果sy- subc不成功则引发错误消息。
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.