Record.Insert() 人员代码未在唯一约束错误上创建异常



人员代码很简单,实例化记录对象,从XML文件中读取,为rec.fields赋值,然后执行插入,然后执行commitwork((。

我唯一能看到的是 XML 中的数据未入的原因,它是文件中同一 SSN 的第二次使用。 它入的表具有 BRANCH_ID、CREATION_DT 和 SSN 作为键结构。 对于整个文件,BRANCH_ID和CREATION_DT是静态的。

这是代码...

您将在下面看到我尝试使用 TRY/CATCH(它无法正常工作,因为它从未找到要捕获的异常(,以及简单地测试插入和提交工作的布尔返回。 如您所见,布尔方法会引发异常,但它没有正当理由作为插入失败的解释。

由于代码现在在下面,您将看到我只是循环访问,而不是使用插入/提交工作的布尔值或 try/catch 来确定错误。 程序不会因为这个唯一的约束错误而停止,这很奇怪。 它只是继续前进到下一行。

当然,我需要能够登录到由于唯一约束而未插入该行的错误表。 有什么建议吗?

&REC1 = CreateRecord(Record.D2_PLFS_TBL);
&REC1.SetDefault();
&Node1 = &rootNode.GetElementsByTagName("LocatorData");
&Mega1File.WriteLine("THERE ARE >" | &Node1.Len | " rows in this file."); 
&cDate = Substring(&cDate, 8, 2) | Substring(&cDate, 3, 5) | Substring(&cDate, 1, 2); 
For &Cnt1 = 1 To &Node1.Len
rem try;
&xmlDoc1 = CreateXmlDoc(&Node1 [&Cnt1].GenXmlString()); 
&Mega1File.WriteLine(%This.GetElementData(&xmlDoc1, "SocialSecurityAccountNumber"));
&REC1.GetField(Field.IBTRANSACTIONID).Value = &IBTransactionId;
&REC1.GetField(Field.TRANSACTION_NBR).Value = &Cnt1;
&REC1.GetField(Field.BRANCH_ID).Value = &Branch_CD1;
&REC1.GetField(Field.CREATION_DT).Value = &cDate; 
&REC1.GetField(Field.SSN).Value = %This.GetElementData(&xmlDoc1, "SocialSecurityAccountNumber");
&REC1.GetField(Field.SSN1).Value = %This.GetElementData(&xmlDoc1, "XRefSocialSecurityAccountNumber");
&REC1.GetField(Field.D2_ACCT_STATUS).Value = %This.GetElementData(&xmlDoc1, "AccountStatus");
&REC1.GetField(Field.NAME).Value = %This.GetElementData(&xmlDoc1, "MemberName");
&REC1.GetField(Field.NAME1).Value = %This.GetElementData(&xmlDoc1, "OwnerName");
&REC1.GetField(Field.D2_MBR_TYPE).Value = %This.GetElementData(&xmlDoc1, "MemberType");
&REC1.GetField(Field.D2_SPCL_HNDLNG).Value = %This.GetElementData(&xmlDoc1, "SpecialHandling");
&REC1.GetField(Field.D2_DOMFOR_CD).Value = %This.GetElementData(&xmlDoc1, "DomForeignCode");
&REC1.GetField(Field.ADDRESS1).Value = %This.GetElementData(&xmlDoc1, "Address");
&REC1.GetField(Field.COUNTRY_2CHAR).Value = %This.GetElementData(&xmlDoc1, "CountryCode");
&REC1.GetField(Field.CITY).Value = %This.GetElementData(&xmlDoc1, "CityName");
&REC1.GetField(Field.STATE).Value = %This.GetElementData(&xmlDoc1, "StateName");
&REC1.GetField(Field.POSTAL).Value = %This.GetElementData(&xmlDoc1, "ZipSuffix");
&REC1.GetField(Field.POSTAL2).Value = %This.GetElementData(&xmlDoc1, "ZipName");
&REC1.GetField(Field.BRANCH_FLAG).Value = %This.GetElementData(&xmlDoc1, "BranchOfService");
&REC1.GetField(Field.D2_RANK_RATE).Value = %This.GetElementData(&xmlDoc1, "RankRate");
&REC1.GetField(Field.UNIT_CD).Value = %This.GetElementData(&xmlDoc1, "UIC");
&REC1.GetField(Field.RETIREMENT_DT).Value = %This.GetElementData(&xmlDoc1, "RetirementTransferDate");
&REC1.Insert();
CommitWork();
/*        If &REC1.Insert() Then
&Mega1File.WriteLine("INSERTED");
CommitWork();
Else
&Mega1File.WriteLine("NOT !!!!!!    INSERTED");
throw CreateException(0, 0, "exception here");
End-If; 
catch Exception &ex
Local Record &recError = CreateRecord(Record.D2_DRAS2_ERROR);
&Mega1File.WriteLine("Caught the ERROR >" | &ex.ToString() | "<");
&recError.IBTRANSACTIONID.Value = &IBTransactionId;
&recError.TRANSACTION_NBR.Value = &Cnt1;
&recError.SSN.Value = %This.GetElementData(&xmlDoc1, "SocialSecurityAccountNumber");
&recError.MESSAGE_NBR.Value = 0;
&recError.MESSAGE_TEXT_254.Value = "IGS-PLFS - " | &ex.ToString();
&recError.FIELDNAME.Value = "SSN";
&recError.VALUE_TEXT.Value = "Duplicate Row, Unique Constraint on SSN";
&recError.Insert();
CommitWork();
end-try;*/
End-For;

阅读 PeopleBooks,它说如果这些键已经存在,则 insert 方法将返回值 false。 任何其他原因都将导致程序终止。

所以你可以写这样的东西:

if not &REC1.insert() then
throw CreateException(0, 0, "Duplicate Insert");
End-If;

最新更新