2013-04-01 90 views

回答

1

在相同類型的第二緩衝器使用setTmpData方法

實施例:

SomeTable someTable; 
TmpTable tmpTable; 
TmpTable tmpTableCheck; 

// Use tmpTable as primary data set, and tmpTableCheck to check for duplicates 
while select someTable 
{ 
    tmpTable.initFromSomeTable(someTable); 

    // Check if key is already used. 
    tmpTableCheck.setTmpData(tmpTable); 
    select firstOnly tmpTableCheck 
     where tmpTableCheck.Key == tmpTable.Key; 

    // Only insert record in tmpTable if the key has not been used before. 
    if (! tmpTableCheck) 
    { 
      tmpTable.insert(); 
    } 
} 
+0

//檢查密鑰是否已被使用。 tmpTableCheck.setTmpData(tmpTable);非常感謝我的幫助。 – Berkay

1

只需在調用插入過程之前檢查記錄。

//Build query above 
while (qr.next()) 
{ 
    SourceTable = qr.get(tablenum(SourceTable)); 

    select DestTable 
     where DestTable.Field1 == SourceTable.Field1; //Replace with criteria that determines if records are the same 

    if (!DestTable) 
    { 
     DestTable.Field1 = SourceTable.Field1; 
     DestTable.Field2 = SourceTable.Field2; 
     DestTable.Field3 = SourceTable.Field3; 
     DestTable.Insert(); 
    } 

} 

//Once processing is finished 
if (element.prompt()) 
{ 
    while select DestTable    
    { 
     element.send(DestTable); 
    } 
} 
else 
{ 
    return false; 
} 

基本上,嘗試選擇將匹配將插入的記錄。如果沒有記錄被返回,則插入它。否則,它會轉到下一個記錄。

+0

的問題是;該查詢可以沒有記錄。選擇DestTable 其中DestTable.Field1 == SourceTable.Field1; //替換爲確定記錄是否相同的標準 } – Berkay

+0

對於使用臨時數據源的報表,我使用類似的方法,其中數據是從一個或多個源編譯的。就我而言,我將它用作開關來確定是否需要插入(新記錄)或更新(現有記錄)。在我的應用程序中,這確實起作用。你有循環的代碼片段,所以我們可以看看實際的應用程序? – kingofzeal

2

只要你具有唯一的索引,you can catch the problem

SysInfoLogLevel prevLevel = infolog.infologLevel() 
try 
{ 
    infolog.setInfoLogLevel(SysInfoLogLevel::None); 
    whatever.insert(); 
    infolog.setInfoLogLevel(prevLevel); 
} 
catch (Exception::DuplicateKeyException) 
{ 
    infolog.setInfoLogLevel(prevLevel); 
}