Код людей Record.Insert() не создает исключение при уникальной ошибке ограничения

Код людей прост: создайте экземпляр объекта записи, прочитайте из XML-файла, присвойте значения полям rec.field, а затем выполните вставку, за которой следует commitwork().

Единственное, что я вижу, что может быть причиной того, что данные из XML не будут вставлены, это то, что это второе использование одного и того же SSN в файле. Таблица, в которую он вставляется, имеет BRANCH_ID, CREATION_DT и SSN в качестве ключевой структуры. BRANCH_ID и CREATION_DT являются статическими для всего файла.

Вот код....

Ниже вы увидите, что я пытался использовать 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;

person Flynn    schedule 20.06.2018    source источник


Ответы (1)


Читая PeopleBooks, он говорит, что метод вставки вернет значение false, если эти ключи уже существуют. Любая другая причина приведет к завершению программы.

поэтому вы можете написать что-то вроде:

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