Tracking and Logging Dynamic Field Changes in Dynamics 365 F&O
Dynamics 365'te Dinamik Alan Değişikliklerini İzleme ve Kayıt Altına Alma
Dynamics 365 Finance and Operations (D365FO), kullanıcıların iş süreçlerini dijitalleştirirken verilerin güvenliği ve doğruluğunu sağlamak adına önemli bir rol oynar. Ancak, veritabanındaki alanlarda yapılan değişikliklerin izlenmesi, özellikle finansal ve bütçe verileri gibi kritik bilgiler için hayati öneme sahiptir. Bu yazıda, D365'te alan bazında yapılan değişikliklerin nasıl dinamik bir şekilde tespit edileceğini ve kaydedileceğini göstereceğiz.
Değişikliklerin izlenmesi için geliştirilen yöntem, iki kaydın karşılaştırılması ve her alanın değerinin kontrol edilmesi üzerine kuruludur. Bu sayede, eski ve yeni veri arasındaki farklar dinamik bir şekilde belirlenir ve her değişiklik, sistemde loglanarak izlenebilir hale gelir. Özellikle logField
ve createLog
metotları ile bu sürecin nasıl işlediğini ve değişikliklerin nasıl kaydedildiğini inceleyeceğiz.
public static void logField(ETGBudgetEntryLine _lineOrig, ETGBudgetEntryLine _lineThis)
{
DictTable dictTable = new DictTable(_lineOrig.TableId);
FieldId fieldId = dictTable.fieldNext(0);
//FieldName fieldName = dictTable.fieldName(fieldId);
DictField dictField;
while (fieldId && ! isSysId(fieldId))
{
dictField = dictTable.fieldObject(fieldId);
if(_lineOrig.(fieldId) != _lineThis.(fieldId))
{
ETGBudgetEntryLineHistory::createLog(_lineOrig, _lineThis, fieldId);
}
fieldId = dictTable.fieldNext(fieldId);
//fieldName = dictTable.fieldName(fieldId);
}
}
logField
Metodu
Bu metodun görevi, iki kayıt arasındaki farkları tespit etmektir.
Parametreler:
_lineOrig
: Orijinal kayıt (eski veri)._lineThis
: Yeni kayıt (güncel veri).
Metodun işleyişi:
Tablo ve Alanları Listeleme:
_lineOrig.TableId
kullanılarakDictTable
nesnesi oluşturuluyor. Bu, tablo yapısını dinamik olarak incelemek için kullanılır.fieldNext(0)
ile ilk alan ID'si alınıyor, ardından tüm alanlar sırayla döngü ile kontrol ediliyor.
Sistem Alanlarını Hariç Tutma:
isSysId(fieldId)
kontrolü ile sistem alanları (örneğinRecId
,DataAreaId
gibi) hariç tutuluyor.
Alanların Değerlerini Karşılaştırma:
_lineOrig.(fieldId)
ve_lineThis.(fieldId)
ifadeleri, her alanın değerini dinamik olarak alır. Eğer iki kayıt arasında bu alanın değeri farklıysa:createLog
metodu çağrılarak değişim kaydedilir.
public static void createLog(ETGBudgetEntryLine _budgetEntryLineOld, ETGBudgetEntryLine _budgetEntryLineNew, FieldId _fieldId)
{
ETGBudgetEntryLineHistory history;
ttsBegin;
history.clear();
history.BudgetEntryId = _budgetEntryLineNew.BudgetEntryId;
history.LineNumber = _budgetEntryLineNew.LineNumber;
history.ChangeField = fieldId2pname(_budgetEntryLineNew.TableId, _fieldId);
history.OldFieldValue = _budgetEntryLineOld.(_fieldId);
history.NewFieldValue = _budgetEntryLineNew.(_fieldId);
history.ChangeUser = curUserId();
history.ChangeDateTime = DateTimeUtil::getSystemDateTime();
history.insert();
ttsCommit;
}
createLog
Metodu
Bu metodun görevi, değişikliklerin kaydedilmesi için bir log (kayıt) oluşturmak.
Parametreler:
_budgetEntryLineOld
: Eski kayıt._budgetEntryLineNew
: Yeni kayıt._fieldId
: Değişen alanın ID'si.
Metodun işleyişi:
Log Kaydı Hazırlama:
ETGBudgetEntryLineHistory
Bu tablo, değişiklik geçmişini tutuyor.Yeni bir
log
kaydı oluşturuluyor ve aşağıdaki değerler atanıyor:BudgetEntryId
veLineNumber
: Değişiklik yapılan kaydın kimlik bilgileri.ChangeField
: Değişen alanın etiket bilgisi(Label)OldFieldValue
veNewFieldValue
: Eski ve yeni değerler atanıyor.ChangeUser
veChangeDateTime
: Değişiklik yapan kullanıcı ve değişiklik yaptığı zaman bilgileri tutuluyor.
Özetle: Bu kod, iki tablo kaydını karşılaştırarak değişen alanları tespit eder ve bu değişiklikleri bir log tablosuna yazar. Değişiklik takibi veya hata analizi gibi senaryolarda oldukça faydalı olabilir. Kritik verilerin, özellikle finansal ve bütçe verilerinin izlenmesi gereken durumlarda bu yöntem etkin bir şekilde kullanılabilir.