Tracking and Logging Dynamic Field Changes in Dynamics 365 F&O

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:

  1. Tablo ve Alanları Listeleme:

    • _lineOrig.TableId kullanılarak DictTable 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.

  2. Sistem Alanlarını Hariç Tutma:

    • isSysId(fieldId) kontrolü ile sistem alanları (örneğin RecId, DataAreaId gibi) hariç tutuluyor.
  3. 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:

  1. 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 ve LineNumber: Değişiklik yapılan kaydın kimlik bilgileri.

      • ChangeField: Değişen alanın etiket bilgisi(Label)

      • OldFieldValue ve NewFieldValue: Eski ve yeni değerler atanıyor.

      • ChangeUser ve ChangeDateTime: 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.