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

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.

```csharp
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.
            

---

```csharp
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.
