Dialog Field Lookups with Multi-Select Capability in Dynamics 365

Bayram ÇETİNBayram ÇETİN
3 min read

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:

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:

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:

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ç

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

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();
    }

}
0
Subscribe to my newsletter

Read articles from Bayram ÇETİN directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Bayram ÇETİN
Bayram ÇETİN

Senior Dynamics 365 Developer