# Dialog Field Lookups with Multi-Select Capability in Dynamics 365

Dynamics 365 Finance and Operations uygulamalarında, kullanıcıların veri girişi sırasında seçim yapmalarını kolaylaştırmak için dialog alanları sıkça kullanılır. Ancak, standart dialog alanlarındaki lookup'lar genellikle tek seçimle sınırlıdır. Bu yazıda, bir dialog alanına çoklu seçim özelliği eklemek için nasıl bir yöntem kullanabileceğinizi adım adım açıklayacağız.

#### Kullanılacak Yöntem: `SysLookupMultiSelectGrid`

`SysLookupMultiSelectGrid` sınıfı, Dynamics 365'te çoklu seçim yapılabilir bir grid oluşturmak için kullanılır. Bu sınıfı, dialog'un bir alanında çoklu seçim sağlayan bir lookup ile entegre edeceğiz.

---

### Adım 1: Dialog Alanını Tanımlama

Dialog alanını oluşturmak için bir `Dialog` nesnesi kullanılır. Aşağıda, bir dialog'un nasıl oluşturulacağı ve bir alanın lookup özelliğinin nasıl geçersiz kılınacağı gösterilmiştir:

```csharp
private boolean dialog()
{
    Dialog dialog = new Dialog("Personelleri ekle");
    DialogField field  = dialog.addField(extendedTypeStr(String500), "Personel");

    field.registerOverrideMethod(methodStr(FormStringControl, lookup),
        methodStr(BCResponsibleAddMultiLine, lookupPerson), this);
    
    if(dialog.run())
    {
        if (!field.value())
            throw warning("Personelleri seçiniz.");
    
        dialogValue = field.value();

        return true;
    }

    return false;
}
```

Yukarıdaki kodda:

* `Dialog` nesnesi ile bir dialog penceresi oluşturuluyor.
    
* `registerOverrideMethod` kullanılarak, ilgili alanın `lookup` metodu geçersiz kılınıyor ve kendi `lookupPerson` metodumuz ile değiştiriliyor.
    

---

### Adım 2: Çoklu Seçim Lookup'ını Oluşturma

Dialog alanına çoklu seçim özelliği eklemek için `SysLookupMultiSelectGrid` sınıfını kullanacağız. İşte örnek kod:

```csharp
public void lookupPerson(FormStringControl _formControl)
{
    Query query = new Query();
    QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(HcmWorker));

    queryBuildDataSource.addSelectionField(fieldNum(HcmWorker, Person));

    container Person;

    SysLookupMultiSelectGrid::lookup(query,_formControl,_formControl,_formControl, Person);
}
```

Bu metotta:

* `Query` nesnesi ile HcmWorker tablosundan veriler alınıyor.
    
* `SysLookupMultiSelectGrid::lookup` metodu, verilen sorgu ile çoklu seçim yapılabilir bir grid oluşturuyor.
    

---

### Adım 3: Seçimlerin İşlenmesi

Kullanıcının yaptığı seçimler, dialog kapandıktan sonra işlenmelidir. Aşağıdaki kodda, seçilen değerlerin nasıl işleneceği gösterilmiştir:

```csharp
private void run()
{
   if(this.validate() && this.dialog())
   {
      BCResponsible bcResponsibleNew;
      RecId person;
      List strlist = new List(Types::Int64);
    
      strlist = strSplit(dialogValue, ";");
    
      ListIterator it = new ListIterator(strlist);
    
      ttsbegin;
      while (it.more())
      {
         person = it.value();
      
         bcResponsibleNew.clear();
         bcResponsibleNew.Number = record.Number;
         bcResponsibleNew.PersonnelHcm = HcmWorker::findByPerson(person).RecId;
         bcResponsibleNew.insert();
      
         it.next();
      }
    
      ttscommit;
      info(strFmt("Personeller oluşturuldu."));
   }
}
```

Bu kodda:

* `strSplit` ile dialog alanından alınan değerler ayrıştırılıyor.
    
* Her bir seçim işlenerek, ilgili tabloya kayıt ekleniyor.
    

---

### Sonuç

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1736073968521/c29511b3-32e1-446c-b917-87992c7215e4.png align="center")

Bu yöntem ile Dynamics 365 uygulamalarında dialog alanlarında çoklu seçim yapabilen bir lookup oluşturabilirsiniz. `SysLookupMultiSelectGrid` sınıfı, kullanıcılara esnek ve kullanıcı dostu bir deneyim sunarak, iş süreçlerinizi hızlandırabilir.

Umarım bu yazı, Dynamics 365 projelerinizde çoklu seçim özellikleri eklemek için size ilham verir! 😊

---

### Tam Kod

```csharp
class BCResponsibleAddMultiLine
{
    BCTable record;

    str dialogValue;

    public void lookupPerson(FormStringControl _formControl)
    {
        Query query = new Query();
        QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(HcmWorker));

        queryBuildDataSource.addSelectionField(fieldNum(HcmWorker, Person));

        container Person;

        SysLookupMultiSelectGrid::lookup(query,_formControl,_formControl,_formControl, Person);
    }

    private boolean dialog()
    {
        Dialog dialog = new Dialog("Personelleri ekle");
        DialogField field  = dialog.addField(extendedTypeStr(String500), "Personel");

        field.registerOverrideMethod(methodStr(FormStringControl, lookup),
            methodStr(BCResponsibleAddMultiLine, lookupPerson), this);
        
        if(dialog.run())
        {
            if (!field.value())
                throw warning("Personelleri seçiniz.");
        
            dialogValue = field.value();

            return true;
        }
    
        return false;
    }

    private void run()
    {
        if(this.validate() && this.dialog())
        {
            BCResponsible bcResponsibleNew;
            RecId person;
            List strlist = new List(Types::Int64);

            strlist = strSplit(dialogValue, ";");

            ListIterator it = new ListIterator(strlist);

            ttsbegin;
            while (it.more())
            {
                person = it.value();

                bcResponsibleNew.clear();
                bcResponsibleNew.Number = record.Number;
                bcResponsibleNew.PersonnelHcm = HcmWorker::findByPerson(person).RecId;
                bcResponsibleNew.insert();

                it.next();
            }

            ttscommit;
            info(strFmt("Personeller oluşturuldu."));
        }
    }

    private boolean validate()
    {
        boolean isValid = true;

        return isValid;
    }

    public BCTable parmRecord(BCTable _record = record)
    {
        record = _record;
        return record;
    }

    public void new()
    {
        
    }

    public static BCResponsibleAddMultiLine construct()
    {
        return new BCResponsibleAddMultiLine();
    }

    public static void main(Args _args)
    {
        if (! _args || ! _args.dataset() || ! _args.record() ||
            _args.record().TableId != tablenum(BCTable))
        {
            throw error(Error::missingRecord(funcname()));
        }
        
        BCResponsibleAddMultiLine process = BCResponsibleAddMultiLine::construct();
        process.parmRecord(_args.record());
        process.run();
    }

}
```
