避免添加重复记录



我正试图写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.

相关内容

  • 没有找到相关文章

最新更新