避免添加重复记录(SAP ABAP)

时间:2014-06-12 22:51:21

标签: sap abap duplicates

如果用户尝试添加现有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.

4 个答案:

答案 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不仅是不必要的,而且也是不好的。