Working With RecordRef Variables In Microsoft Dynamics NAV
技術標籤:微軟ERP-Nav&BC
當您不必知道要處理的記錄或欄位時,Microsoft Dynamics導航中使用RecordRef和FieldRef變數型別來處理記錄中的記錄和欄位。
在此部落格文章中,我將介紹如何與他們合作。注意:這些說明應適用於從3.7版到Dynamics NAV 2013和Dynamics NAV 2013 R2的所有版本的Dynamics NAV。
您可能已經看到了RecordRef,FieldRef和KeyRef變數型別。如果您從未使用過它們,那麼您可能不太瞭解它們是什麼或它們如何工作。
當您知道需要使用一條記錄或一組記錄,但又不知道需要訪問哪個表時,將使用這三種變數型別。 通常,我在兩種不同情況下使用了RecordRef變數。
我要麼需要對幾個非常相似的表執行相同的操作,例如“銷售標題”,“銷售發票標題”和“銷售發貨標題”,要麼需要對一大堆沒有共同點的表進行相同的操作。
在這兩種情況下,促使我進入RecordRef變數的原因是直到執行時我才知道要處理哪個表。 (我使用RecordRef要做的最大的專案涉及通過Web服務呼叫實時在NAV和外部資料庫之間同步記錄;我在ApplicationManagement程式碼單元中使用OnGlobalInsert,OnGlobalModify,OnGlobalDelete和OnGlobalRename觸發器來呼叫一些Web服務,與RecordRef變數一起傳送資料。)
RecordRef本質上是一個普通的Record變數,只需要您向它提供表號即可,以便NAV知道您要使用哪個表。您可以通過RecordRef.OPEN函式執行此操作,
該函式具有三個引數: 編號(必填):這是您要使用的表號。您可以使用DATABASE :: [表名]選項變數來查詢要使用的表的編號(如果您不提前知道的話)。
Temp(可選):這是一個布林值,告訴系統是要開啟臨時表(TRUE)還是開啟實表(FALSE)。如果您省略此選項,則系統會假設您需要一個真實的表。
CompanyName(可選):這是您正在使用的NAV公司名稱。如果您省略此選項,則系統會假設您正在與當前公司合作。
關於RecordRef變數,還有一些其他重要功能需要了解。 RecordRef.GETTABLE用於將RecordRef指向與Record變數相同的表例項,
而RecordRef.SETTABLE用於將Record變數指向與RecordRef變數相同的表例項。您可以使用GETTABLE和SETTABLE在RecordRef和常規Record變數之間傳輸資料。
您可以使用RecordRef變數的FINDFIRST,FINDLAST,FINDSET和NEXT函式遍歷記錄集,就像使用Record變數一樣。您可以使用FieldRef變數在RecordRef上設定過濾器;
我將在下面介紹。您還可以使用INSERT,MODIFY,DELETE和RENAME函式通過RecordRef修改記錄。請注意,可以使用TRUE或FALSE引數執行它們,
以在適當的表中觸發OnInsert / OnModify / OnDelete / OnRename觸發器。 若要訪問RecordRef變數中記錄的欄位,您必須使用FieldRef。
FieldRef基本上類似於Record變數中的欄位,但是進行了一些特殊的更改以處理可能隨時存在的事實。 有兩種使用FieldRef訪問記錄欄位的方法。
您可以使用RecordRef.FIELDINDEX函式將欄位載入到FieldRef中,也可以使用RecordRef.FIELD函式。
FIELDINDEX要求您按照欄位在表中的顯示順序進行輸入-第一個欄位為1,第二個欄位為2,依此類推,無論基礎表中的欄位號屬性如何。
FIELD要求您從基礎表中輸入Field No.屬性。您可以通過訪問任何記錄變數的FIELDNO屬性併為其輸入欄位名稱來找到欄位的欄位編號。
如果要檢視記錄變數中的所有欄位,則可以使用整數計數器和RecordRef.FIELDCOUNT屬性將它們與RecordRef.FIELDINDEX一起載入。
如果要檢視特定欄位,請使用RecordRef.FIELD。 可以使用FieldRef.VALUE屬性讀取或寫入FieldRef變數。 FieldRef.VALUE的資料型別是一個變體
,因此您可以向其寫入任何有效的NAV資料型別。 您可以使用FieldRef.SETRANGE和FieldRef.SETFILTER在RecordRef上設定過濾器。
您也可以使用RecordRef.RESET清除RecordRef變數上的所有過濾器。 對於NAV中的常規Record變數,可以將GET函式與主鍵值一起使用以從資料庫中獲取特定記錄。
但是,您必須使用一種稱為RecordID的特殊型別的變數,才能從資料庫中獲取RecordRef的特定記錄。
RecordID是經過特殊編碼的值,其中包含RecordRef變數的主鍵。 您可以使用RecordRef.RECORDID函式為RecordRef變數找到它。
如果要從Record變數中獲取RecordID以便與RecordRef一起使用,則需要首先通過使用RecordRef.GETTABLE並將該Record變數輸入,將Record變數轉換為RecordRef。
這是我用RecordRef和FieldRef編寫的一個示例程式碼單元,該程式碼單元將比較兩個不同的記錄,並在有任何差異時向您傳送訊息。 如果要檢查記錄是否已更改並相應地更新某些內容,則可能需要使用類似的內容。
OnRun()
Cust.GET('10000');
Cust2.GET('10000');
Cust2.Name := 'Changed';
CLEAR(RecRefCust1);
RecRefCust1.GETTABLE(Cust);
CLEAR(RecRefCust2);
RecRefCust2.GETTABLE(Cust2);
RecordCompare(RecRefCust1,RecRefCust2);
RecordCompare(RecRef1 : RecordRef;RecRef2 : RecordRef)
ChangesMade := FALSE;
lCounter := 1;
REPEAT
CLEAR(FldRef1);
FldRef1 := RecRef1.FIELDINDEX(lCounter);
CLEAR(FldRef2);
FldRef2 := RecRef2.FIELDINDEX(lCounter);
ChangesMade := (FldRef1.VALUE <> FldRef2.VALUE);
lCounter += 1;
UNTIL ChangesMade OR (lCounter > RecRef1.FIELDCOUNT);
IF ChangesMade THEN BEGIN
MESSAGE('The records do not match.');
END ELSE BEGIN
MESSAGE('The records are the same.');
END;