<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Bayram ÇETİN on Medium]]></title>
        <description><![CDATA[Stories by Bayram ÇETİN on Medium]]></description>
        <link>https://medium.com/@bayramcetin?source=rss-c2a0d53dd981------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*B6EHYkfpz1dfzQ_aPEHL0A.jpeg</url>
            <title>Stories by Bayram ÇETİN on Medium</title>
            <link>https://medium.com/@bayramcetin?source=rss-c2a0d53dd981------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 10:46:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@bayramcetin/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[How to Handle Unit Conversion for Variant Products in Dynamics 365 F&O]]></title>
            <link>https://bayramcetin.medium.com/how-to-handle-unit-conversion-for-variant-products-in-dynamics-365-f-o-7e8a649f408f?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/7e8a649f408f</guid>
            <category><![CDATA[product-variant]]></category>
            <category><![CDATA[d365]]></category>
            <category><![CDATA[dynamics-365]]></category>
            <category><![CDATA[dynamics-365-for-finance]]></category>
            <category><![CDATA[unit-conversion]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Wed, 12 Nov 2025 17:37:21 GMT</pubDate>
            <atom:updated>2025-11-12T17:45:59.514Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365 F&amp;O — Varyantlı Ürünlerde Birim Dönüşümü</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LpykQ2D_0NytBNHO" /></figure><p>Dynamics 365 Finance and Operations’ta varyantlı ürünlerde doğru birim dönüşümünü sağlamak için EcoResProductUnitConverter::convertGivenUnitSymbolsForReleasedProduct() metodunu kullanmak gerekir. Bu metod, ürün varyantına özel tanımlı dönüşüm faktörlerini dikkate alır ve standart UnitOfMeasureConverter::convert() metoduna göre daha doğru sonuçlar üretir.</p><h3>📘 Temel Kullanım</h3><pre>SalesQty documentSalesQty = EcoResProductUnitConverter::convertGivenUnitSymbolsForReleasedProduct(<br>    salesLine.ItemId,<br>    salesLine.InventDimId,<br>    salesLine.SalesQty,<br>    salesLine.SalesUnit,<br>    salesLine.ABCDocumentUnitId,<br>    NoYes::Yes<br>);<br><br>SalesPrice documentSalesPrice = decRound(salesLine.LineAmount / documentOtherSalesQty, 4);</pre><p><strong>Parametreler:</strong></p><ul><li>ItemId: Released product kodu</li><li>InventDimId: Stok boyut bilgisi (depo, site vb.)</li><li>SalesQty: Dönüştürülecek miktar</li><li>SalesUnit: Kaynak birim sembolü (ör. &quot;ADET&quot;)</li><li>ABCDocumentUnitId: Hedef birim sembolü (ör. &quot;KG&quot;)</li><li>NoYes::Yes: Mutlak değeri yuvarlama (opsiyonel)</li></ul><h3>⚙️ Avantajlar</h3><ul><li>Variant (ürün varyantı) bazlı doğru dönüşüm</li><li>Item-level UoM kurallarını destekler</li><li>Depo/site bazlı farklılıkları dikkate alabilir</li></ul><h3>💡 Özet</h3><p>Varyantlı ürünlerde EcoResProductUnitConverter::convertGivenUnitSymbolsForReleasedProduct() kullanmak, stok, sipariş ve maliyet hesaplarında birim farklılıklarından doğan hataları önler.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/how-to-handle-unit-conversion-for-variant-products-in-dynamics-365-fando"><em>https://bayramcetin.com</em></a><em> on November 12, 2025.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7e8a649f408f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Generate a CAR Report in Dynamics 365 F&O]]></title>
            <link>https://bayramcetin.medium.com/how-to-generate-a-car-report-in-dynamics-365-f-o-35504dee6f78?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/35504dee6f78</guid>
            <category><![CDATA[car-report]]></category>
            <category><![CDATA[dynamics-365]]></category>
            <category><![CDATA[customization-analysis]]></category>
            <category><![CDATA[dynamics-365-for-finance]]></category>
            <category><![CDATA[d365-fo]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Fri, 07 Nov 2025 12:19:01 GMT</pubDate>
            <atom:updated>2025-11-07T16:03:00.885Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365 F&amp;O’da CAR Raporu Nasıl Oluşturulur?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*gP0b5ydMF614pWlx" /><figcaption>Photo by <a href="https://unsplash.com/@jontyson?utm_source=medium&amp;utm_medium=referral">Jon Tyson</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Dynamics 365 projelerinde geliştirme yaparken <strong>best practice (BP)</strong> ihlallerini ve olası uyumsuzlukları tespit etmek için <strong>CAR (Customization Analysis Report)</strong> oldukça faydalı bir araçtır. Bu rapor sayesinde geliştirdiğiniz modeldeki hataları erken fark edip, kod kalitesini artırabilirsiniz.</p><h3>🧩 CAR Raporu Nasıl Oluşturulur?</h3><ol><li><strong>CMD’yi yönetici (Run as Administrator)</strong> olarak açın.</li><li>Aşağıdaki komutu kendi model adınıza göre düzenleyip çalıştırın:</li></ol><pre>K:\AosService\PackagesLocalDirectory\bin\xppbp.exe -metadata=&quot;K:\AosService\PackagesLocalDirectory&quot; -all -model=&quot;ABCModel&quot; -xmlLog=C:\temp\BPCheckLogcd.xml -module=&quot;ABCModel&quot; -car=c:\temp\ABCModel_CAReport.xlsx</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/977/0*X6FSgw4IyS-mQ04C" /></figure><p>3. Komut tamamlandığında belirttiğiniz dizinde bir <strong>.xlsx</strong> dosyası (CAR raporu) oluşacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/976/0*DfJ_Wsmw9Z9WU7_2" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/903/0*zHBJ3d8H5FIAn_G3" /></figure><p>Raporu inceledikten sonra listelenen <strong>BP (Best Practice)</strong> ve <strong>Issue</strong> maddelerini düzenleyebilirsiniz.</p><blockquote>💡Tüm bu adımlar, projenizin <strong>kod kalitesi</strong>, <strong>sürdürülebilirliği</strong> ve <strong>upgrade uyumluluğu</strong> için kritik öneme sahiptir.</blockquote><p>👉 <a href="https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/customization-analysis-report">Microsoft dokümantasyonunu da inceleyebilirsiniz</a></p><p><em>Originally published at </em><a href="https://bayramcetin.com/how-to-generate-a-car-report-in-dynamics-365-fando"><em>https://bayramcetin.com</em></a><em> on November 7, 2025.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=35504dee6f78" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Common String Functions in Dynamics 365 X++ with Examples]]></title>
            <link>https://bayramcetin.medium.com/common-string-functions-in-dynamics-365-x-with-examples-6580ade91f0c?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/6580ade91f0c</guid>
            <category><![CDATA[d365]]></category>
            <category><![CDATA[strlen-strfind-substr]]></category>
            <category><![CDATA[string]]></category>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[string-manipulation]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Fri, 20 Jun 2025 13:16:14 GMT</pubDate>
            <atom:updated>2025-06-20T16:20:02.579Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365 X++’de Metin İşlevlerini ve Örnek Kullanımlarını Keşfedin</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_1_j3GHnt6iYQ9gA" /></figure><p>Dynamics 365 Finance and Operations (D365 FO) geliştiricileri için metin (string) işlemleri, günlük geliştirme süreçlerinin vazgeçilmez parçalarındandır. Kullanıcı girdilerini kontrol etmek, verileri parçalara ayırmak veya formatlamak gibi birçok senaryoda bu işlemler karşımıza çıkar.</p><p>Bu yazıda, X++ dilinde sıkça kullanılan bazı temel metin komutlarını ve bunların pratik örneklerini inceleyeceğiz:</p><h3>strfmt</h3><p>Belirli bir format içerisinde birden fazla değeri birleştirmek için kullanılır.</p><pre>str name = &quot;Ahmet&quot;;<br>int age = 30;<br>str result = strFmt(&quot;Ad: %1 - Yaş: %2&quot;, name, age);<br>// Sonuç: &quot;Ad: Ahmet - Yaş: 30&quot;</pre><blockquote>Özellikle bilgi mesajları, log kayıtları ya da çıktılar oluştururken hayat kurtarır.</blockquote><h3>strlen</h3><p>Bir metnin uzunluğunu döner.</p><pre>str text = &quot;Dynamics365&quot;;<br>int length = strlen(text);<br>// Sonuç: 11</pre><blockquote>Boş mu değil mi kontrolü yaparken veya maksimum karakter sınırlamalarını aşmamak için kullanılır.</blockquote><h3>strFind</h3><p>Bir metin içinde, başka bir metnin yerini (başlangıç indeksini) bulur.</p><pre>str fullText = &quot;Dynamics365&quot;;<br>int index = strFind(fullText, &quot;365&quot;, 1, strlen(fullText));<br>// Sonuç: 9</pre><blockquote>Bulunamazsa 0 döner. Özellikle doğrulama veya ayrıştırma işlemlerinde faydalıdır.</blockquote><h3>subStr</h3><p>Bir metnin belirli bir bölümünü almak için kullanılır.</p><pre>str text = &quot;Dynamics365&quot;;<br>str part = subStr(text, 1, 8);<br>// Sonuç: &quot;Dynamics&quot;</pre><blockquote>Genellikle sabit formatlı metinleri ayrıştırmak için kullanılır (örneğin fatura numaralarından tarih çekmek).</blockquote><h3>strDel</h3><p>Bir metinden, belirli bir aralıktaki karakterleri siler.</p><pre>str text = &quot;Dynamics365&quot;;<br>str result = strDel(text, 9, 3);<br>// Sonuç: &quot;Dynamics&quot;</pre><blockquote>Bu örnekte 9. karakterden başlayarak 3 karakter silindi. Genellikle istenmeyen karakterleri temizlemek için idealdir.</blockquote><h3>strSplit</h3><p>Bir metni, belirli bir ayırıcıya göre parçalara ayırır. X++ içinde strSplit metodu Global sınıfında yer alır.</p><pre>List parts = strSplit(&quot;Ahmet,Mehmet,Ayşe&quot;, &quot;,&quot;);<br>ListEnumerator enumerator = parts.getEnumerator();<br>while (enumerator.moveNext())<br>{<br>    info(strFmt(&quot;İsim: %1&quot;, enumerator.current()));<br>}</pre><p>Sonuç:</p><pre>İsim: Ahmet  <br>İsim: Mehmet  <br>İsim: Ayşe</pre><blockquote>CSV ayrıştırma, isim-soyisim ayırma gibi işlemlerde oldukça kullanışlıdır.</blockquote><h3>🎯 Gerçek Hayattan Senaryo Örneği</h3><pre>str fullName = &quot;Çetin, Bayram&quot;;<br>List nameParts = strSplit(fullName, &quot;,&quot;);<br>str surname = strLTrim(nameParts.get(1));<br>str name = strLTrim(nameParts.get(2));<br><br>info(strFmt(&quot;Ad: %1 - Soyad: %2&quot;, name, surname));</pre><blockquote>Bu örnekte kullanıcıdan gelen “Soyad, Ad” formatındaki veri doğru şekilde parçalanıyor ve ekrana düzgün bir şekilde yazdırılıyor.</blockquote><h3>📝 Sonuç</h3><p>Metin işlemleri Dynamics 365 projelerinde küçük ama kritik roller üstlenir. strFmt, strFind, strDel, strSplit gibi komutlar sayesinde karmaşık veri işleme ihtiyaçları bile basit çözümlerle karşılanabilir. Bu fonksiyonları iyi bilmek, hem kod kalitesini artırır hem de daha okunabilir ve yönetilebilir çözümler üretmemizi sağlar.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/common-string-functions-in-dynamics-365-x-with-examples"><em>https://bayramcetin.com</em></a><em> on June 20, 2025.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6580ade91f0c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tracking Workflow Users in Dynamics 365]]></title>
            <link>https://bayramcetin.medium.com/tracking-workflow-users-in-dynamics-365-4e6a16c9f7f6?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/4e6a16c9f7f6</guid>
            <category><![CDATA[development-workflow]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[user-workflow]]></category>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[d365]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Tue, 04 Feb 2025 16:12:55 GMT</pubDate>
            <atom:updated>2025-02-04T16:29:51.369Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365&#39;te İş Akışı Kullanıcı Takibi</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*uevrQPwmMtGXHHpK" /></figure><p>Dynamics 365 Finance and Operations’ta iş akışları, kurumsal süreçlerin düzenli ve kontrol edilebilir bir şekilde ilerlemesini sağlayan kritik bileşenlerden biridir. İş akışı içinde kullanıcı hareketlerini takip etmek, bu hareketlere bağlı kurallar tanımlamak ve bu sayede süreci otomatikleştirmek mümkün olur.</p><p>Bu yazıda, iş akışına gönderen, onaylayan ve yeniden atanan kullanıcıların nasıl takip edileceğini gösteren <strong>display metotlar</strong> üreteceğiz. Bu metotları ilgili tabloya ekleyerek, kullanıcı hareketlerini anlık olarak görüntüleyebilir ve iş akışı kurallarına entegre edebilirsiniz.</p><h3>1. İş Akışı Kullanıcı Hareketlerini Takip Etmek</h3><p>Dynamics 365&#39;te iş akışı hareketlerini kaydeden iki temel tablo vardır:</p><ul><li><strong>WorkflowTrackingTable:</strong> İş akışı hareketlerini saklayan tablo.</li><li><strong>WorkflowTrackingStatusTable:</strong> İş akışının mevcut durumunu takip eden tablo.</li></ul><p>Bu tabloları kullanarak iş akışına gönderen, onaylayan ve atanan kullanıcıyı bulabiliriz.</p><h3>1.1 İş Akışını Onaylayan Kullanıcı</h3><p>Bu metot, ilgili kayıt üzerinde iş akışını en son onaylayan kullanıcıyı getirir.</p><pre>/// &lt;summary&gt;<br>/// İş akışını onaylayan kullanıcı<br>/// &lt;/summary&gt;<br>display UserId workflowApprovalUser()<br>{<br>    WorkflowTrackingStatusTable workflowTrackingStatusTable;<br>    WorkflowTrackingTable       workflowTrackingTable;<br><br>    select firstOnly workflowTrackingTable order by CreatedDateTime desc<br>    exists join workflowTrackingStatusTable<br>     where workflowTrackingStatusTable.RecId == workflowTrackingTable.WorkflowTrackingStatusTable<br>        &amp;&amp; workflowTrackingStatusTable.ContextTableId == this.TableId<br>        &amp;&amp; workflowTrackingStatusTable.ContextRecId == this.RecId<br>        &amp;&amp; workflowTrackingTable.TrackingType == WorkflowTrackingType::Approval;<br><br>    return workflowTrackingTable.User;<br>}</pre><h3>1.2 İş Akışına Gönderen Kullanıcı</h3><p>Bir iş akışının kim tarafından başlatıldığını anlamak için aşağıdaki metodu kullanabiliriz:</p><pre>/// &lt;summary&gt;<br>/// İş akışına gönderen kullanıcı<br>/// &lt;/summary&gt;<br>display UserId workflowSubmittedUser()<br>{<br>    WorkflowTrackingStatusTable workflowTrackingStatusTable;<br>    WorkflowTrackingTable       workflowTrackingTable;<br><br>    select firstOnly workflowTrackingTable order by CreatedDateTime desc<br>    exists join workflowTrackingStatusTable<br>     where workflowTrackingStatusTable.RecId == workflowTrackingTable.WorkflowTrackingStatusTable<br>        &amp;&amp; workflowTrackingStatusTable.ContextTableId == this.TableId<br>        &amp;&amp; workflowTrackingStatusTable.ContextRecId == this.RecId<br>        &amp;&amp; workflowTrackingTable.TrackingType == WorkflowTrackingType::Submission;<br><br>    return workflowTrackingTable.User;<br>}</pre><p>Bu metot, iş akışını başlatan (ilk gönderen) kullanıcıyı getirir.</p><h3>1.3 İş Akışına Son Atanan Kullanıcı</h3><p>Bazen iş akışı bir başka kullanıcıya atanabilir. Bu durumda, son atanan kullanıcıyı bulmak için şu metodu kullanabiliriz:</p><pre>/// &lt;summary&gt;<br>/// İş akışına son atanan kullanıcı<br>/// &lt;/summary&gt;<br>display UserId workflowReassignedUser()<br>{<br>    WorkflowTrackingStatusTable workflowTrackingStatusTable;<br>    WorkflowTrackingTable       workflowTrackingTable;<br><br>    select firstOnly workflowTrackingTable order by CreatedDateTime desc<br>    exists join workflowTrackingStatusTable<br>     where workflowTrackingStatusTable.RecId == workflowTrackingTable.WorkflowTrackingStatusTable<br>        &amp;&amp; workflowTrackingStatusTable.ContextTableId == this.TableId<br>        &amp;&amp; workflowTrackingStatusTable.ContextRecId == this.RecId<br>        &amp;&amp; workflowTrackingTable.TrackingType == WorkflowTrackingType::Creation;<br><br>    return workflowTrackingTable.User;<br>}</pre><p>Bu metot, iş akışının son olarak hangi kullanıcıya atandığını getirir.</p><h3>Sonuç</h3><p>Bu display metotlarını kullanarak iş akışı hareketlerini kolayca takip edebilir ve bunlara dayalı çeşitli iş kuralları tanımlayabilirsiniz. Bu sayede iş akışınızı daha dinamik ve kural bazlı hale getirebilirsiniz.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/tracking-workflow-users-in-dynamics-365"><em>https://bayramcetin.com</em></a><em> on February 4, 2025.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4e6a16c9f7f6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Use the LIKE Operator in Dynamics 365 Queries?]]></title>
            <link>https://bayramcetin.medium.com/how-to-use-the-like-operator-in-dynamics-365-queries-95092aab6ec3?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/95092aab6ec3</guid>
            <category><![CDATA[sysquery-valuelike]]></category>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[d365-query]]></category>
            <category><![CDATA[value-like]]></category>
            <category><![CDATA[query-like]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Wed, 18 Dec 2024 15:36:31 GMT</pubDate>
            <atom:updated>2024-12-30T11:52:58.767Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365 Sorgularında LIKE Operatörü Nasıl Kullanılır?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*D3WdDvhiBsHXRhni" /></figure><p>Dynamics 365 Finance and Operations’da arama işlemlerini özelleştirmek ve esnek hale getirmek için SysQuery::valueLike() metodu oldukça kullanışlıdır. Bu blog yazısında, LIKE operatörünü kullanarak bir veritabanı sorgusunu nasıl oluşturabileceğinizi ve sonuçları nasıl filtreleyebileceğinizi göstereceğim.</p><h4>Kod Örneği</h4><p>Aşağıdaki örnekte, bir LineOfBusiness tablosundaki açıklama (Description) alanında bir kelime ya da karakter dizisi geçen kayıtları sorgulamak için SysQuery::valueLike() metodunu kullanıyoruz:</p><pre>public static LineOfBusiness runQueryLike(Description _description)<br>{<br>    LineOfBusiness lineOfBusiness;<br><br>    Query query = new Query();<br>    QueryBuildDataSource qbds = query.addDataSource(tableNum(LineOfBusiness));<br><br>    QueryBuildRange qbr = qbds.addRange(fieldNum(LineOfBusiness, Description));<br>    qbr.value(SysQuery::valueLike(_description));<br><br>    QueryRun qr = new QueryRun(query);<br><br>    while(qr.next())<br>    {<br>        lineOfBusiness = qr.get(tableNum(LineOfBusiness));<br><br>        return lineOfBusiness;<br>    }<br><br>    return lineOfBusiness;<br>}</pre><h4>Bu Kod Ne Yapar?</h4><ul><li>SysQuery::valueLike(_description): Gelen _description parametresine göre, SQL LIKE operatörünü kullanarak bir filtre uygular.</li><li>QueryBuildDataSource ve QueryBuildRange: Sorgunun temel yapı taşlarını oluşturur. QueryBuildRange, belirli bir alan üzerinde filtre uygulamak için kullanılır.</li><li>Dönen Değer: Sorguya uyan ilk kayıt döndürülür.</li></ul><h4>Önemli Notlar</h4><ul><li>LIKE operatörü, büyük/küçük harf duyarlılığına dikkat eder. Bu nedenle, ihtiyaca göre büyük/küçük harf duyarlılığını kaldırmak için ek kontroller yapılabilir.</li><li>Performans açısından dikkatli olunmalıdır. Çok geniş kapsamlı bir LIKE araması, büyük tablolar üzerinde yavaş çalışabilir.</li></ul><p><em>Originally published at </em><a href="https://bayramcetin.com/how-to-use-the-like-operator-in-dynamics-365-queries"><em>https://bayramcetin.com</em></a><em> on December 18, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=95092aab6ec3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Creating a Custom Workflow Participant Provider in Dynamics 365 F&O]]></title>
            <link>https://bayramcetin.medium.com/creating-a-custom-workflow-participant-provider-in-dynamics-365-f-o-db58152e9a44?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/db58152e9a44</guid>
            <category><![CDATA[participant-provider]]></category>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[d365]]></category>
            <category><![CDATA[workflowparticipantprovid]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Thu, 05 Dec 2024 16:42:32 GMT</pubDate>
            <atom:updated>2024-12-30T11:56:30.083Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zEcTrbbciKriXDKuUqSqcQ.png" /><figcaption>Workflow Participant Provider in Dynamics 365 F&amp;O</figcaption></figure><h4>Dynamics 365 Finance and Operations’ta Özel Workflow Katılımcı Sağlayıcı Nasıl Oluşturulur?</h4><p>Dynamics 365 Finance and Operations’ta <strong>Workflow Participant Provider</strong>, iş akışlarında belirli bir adım için uygun kullanıcıları veya grupları tanımlamak için kullanılır. Bu yazıda, satınalma taleplerini yöneticilere atayan bir sınıfın nasıl oluşturulup iş akışına bağlanacağını adım adım ele alacağız.</p><h4>1. Sınıfın Tanımı</h4><p>Aşağıdaki sınıf, satınalma talep biriminin yöneticisini belirler ve iş akışı katılımcısı olarak atar:</p><pre>class ETGPurchTableTemplateRequesterParticipantProvider implements WorkflowParticipantProvider<br>{<br>    public WorkflowParticipantTokenList getParticipantTokens()<br>    {<br>        WorkflowParticipantTokenList        tokenList = WorkflowParticipantTokenList::construct();<br><br>        tokenList.add(&quot;ETGPurchRequesterWorkflowUser&quot;, &quot;Satınalma Talep Birimi&quot;);<br><br>        return tokenList;<br>    }<br><br>    public WorkflowUserList resolve(WorkflowContext _context, WorkflowParticipantToken _participantTokenName)<br>    {<br>        WorkflowUserList userList = WorkflowUserList::construct();<br><br>        if  (!_participantTokenName)<br>        {<br>            throw error(&quot;Participant token bulunamadı!&quot;);<br>        }<br><br>        if  (_participantTokenName == &quot;ETGPurchRequesterWorkflowUser&quot;)<br>        {<br>            PurchTable purchTable = PurchTable::findRecId(_context.parmRecId());<br><br>            HcmPositionRecId positionRecId = HcmWorkerHelper::getWorkerPrimaryPositionAssignment(purchTable.Requester).Position;<br>            HcmPositionRecId parentPositionRecId = HcmPositionHierarchy::findByPosition(positionRecId).ParentPosition;<br>            HcmWorkerRecId parentWorkerRecId = HcmPositionWorkerAssignment::findByPosition(parentPositionRecId).Worker;<br><br>            UserId userId = HcmWorker::findPersonUser(parentWorkerRecId).User;<br><br>            if (userId)<br>            {<br>                userList.add(userId);<br>            }<br>            else<br>            {<br>                throw error(strFmt(&quot;%1 Satınalma Talep Birimi üst yöneticisi bulunamadı.&quot;, purchTable.PurchId));<br>            }<br>        }<br><br>        return userList;<br>    }<br><br>}</pre><h4>2. Workflow Participant Assignment Provider Tanımlama</h4><p>Sınıfı iş akışına bağlamak için bir <strong>Workflow Participant Assignment Provider</strong> oluşturun:</p><ol><li>Yeni Provider Ekleyin:</li></ol><ul><li>Name: ETGPurchTableTemplateRequesterParticipantProvider</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/946/0*n1sA5naNxoMj1a8N" /><figcaption>ETGPurchTableTemplateRequesterParticipantProvider</figcaption></figure><p>2. Özellikleri Ayarlayın:</p><ul><li>Label: Satınalma Talep Birimi</li><li>Provider Class: ETGPurchTableTemplateRequesterParticipantProvider</li><li>Workflow Types: PurchTableTemplate</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/0*UtPjlNl-8CukCDFT" /></figure><p>3. Kaydedin ve Derleyin.</p><h4>3. İş Akışına Bağlama</h4><ol><li>Dynamics 365&#39;te <strong>PurchTableTemplate</strong> iş akışını açın.</li><li>Bir “Approval” adımı ekleyin veya düzenleyin.</li><li><strong>Assignment Type</strong> olarak “Participant” seçin.</li><li><strong>Provider</strong> alanında yeni tanımladığınız sağlayıcıyı seçin.</li><li>İş akışını kaydedin ve doğrulayın.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cqsJn_JdEtxjdr7a" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7SSMhMxEAx6Eo_e5" /></figure><h4>Sonuç</h4><p>Bu işlemle, iş akışınız satınalma taleplerini otomatik olarak doğru yöneticilere atayacak şekilde özelleştirilmiştir.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/creating-a-custom-workflow-participant-provider-in-dynamics-365-fo"><em>https://bayramcetin.com</em></a><em> on December 5, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=db58152e9a44" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Check for DocuRef Records in Dynamics 365 Finance and Operation]]></title>
            <link>https://bayramcetin.medium.com/how-to-check-for-docuref-records-in-dynamics-365-finance-and-operation-869b28c604a0?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/869b28c604a0</guid>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[docuref]]></category>
            <category><![CDATA[d365]]></category>
            <category><![CDATA[docuref-record]]></category>
            <category><![CDATA[dynamics-365-finance]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Wed, 04 Dec 2024 14:58:26 GMT</pubDate>
            <atom:updated>2024-12-30T12:08:47.360Z</atom:updated>
            <content:encoded><![CDATA[<h4>Belirli Bir Kayıt İçin DocuRef Kontrolü</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zk7rqhpftaHTjXXg" /></figure><p><strong>DocuRef</strong>, Dynamics 365 Finance and Operations’da, belirli bir kayıtla ilişkilendirilmiş belgeleri veya notları saklamak için kullanılan bir tablodur. Geliştirme sırasında, bir kaydın belirli bir türde bir <strong>DocuRef</strong> kaydına sahip olup olmadığını kontrol etmek gerekebilir. Bunun için aşağıdaki gibi bir metod kullanabilirsiniz:</p><pre>public static boolean isDocuRefRecord(Common _common, DocuTypeId _typeId)<br>{<br>    boolean ret = false;<br>    DocuRef docuRef;<br><br>    select firstonly docuRef<br>     where docuRef.RefCompanyId == _common.DataAreaId<br>        &amp;&amp; docuRef.RefTableId == _common.TableId<br>        &amp;&amp; docuRef.RefRecId == _common.RecId<br>        &amp;&amp; docuRef.TypeId == _typeId;<br><br>    if(docuRef)<br>        ret = true;<br><br>    return ret;<br>}</pre><h3>Metodun İşlevi</h3><p>Bu metod, _common parametresiyle verilen tablo kaydının, _typeId ile belirtilen türde bir <strong>DocuRef</strong> kaydına sahip olup olmadığını kontrol eder. Eğer ilgili kayıt varsa, true döner; aksi takdirde false.</p><h3>Kullanım Alanları</h3><ul><li>Kayıtların ilişkilendirilmiş belgelerini kontrol etmek.</li><li>Kullanıcıya, bir işlem yapılmadan önce belirli bir doküman ilişkisinin varlığı hakkında bilgi vermek.</li><li>Doküman yönetim süreçlerinde doğrulama yapmak.</li></ul><p>Dynamics 365 geliştirmelerinde bu gibi yardımcı metodlar, iş süreçlerinizi daha verimli ve yönetilebilir hale getirebilir.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/docuref-records-in-dynamics-365-finance-and-operations"><em>https://bayramcetin.com</em></a><em> on December 4, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=869b28c604a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tracking and Logging Dynamic Field Changes in Dynamics 365 F&O]]></title>
            <link>https://bayramcetin.medium.com/tracking-and-logging-dynamic-field-changes-in-dynamics-365-f-o-839c8420cb0f?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/839c8420cb0f</guid>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[dynamics-365]]></category>
            <category><![CDATA[logging-and-monitoring]]></category>
            <category><![CDATA[d365-log]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Tue, 26 Nov 2024 15:11:24 GMT</pubDate>
            <atom:updated>2024-12-30T12:09:43.227Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ERK6hHII3NoSExMP" /><figcaption>Dynamics 365&#39;te Dinamik Alan Değişikliklerini İzleme ve Kayıt Altına Alma</figcaption></figure><h4>Dynamics 365&#39;te Dinamik Alan Değişikliklerini İzleme ve Kayıt Altına Alma</h4><p>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&#39;te alan bazında yapılan değişikliklerin nasıl dinamik bir şekilde tespit edileceğini ve kaydedileceğini göstereceğiz.</p><p>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.</p><pre>public static void logField(ETGBudgetEntryLine _lineOrig, ETGBudgetEntryLine _lineThis)<br>{<br>    DictTable   dictTable = new DictTable(_lineOrig.TableId);<br>    FieldId     fieldId   = dictTable.fieldNext(0);<br>    //FieldName   fieldName = dictTable.fieldName(fieldId);<br>    DictField   dictField;<br><br>    while (fieldId &amp;&amp; ! isSysId(fieldId))<br>    {<br>        dictField = dictTable.fieldObject(fieldId);<br><br>        if(_lineOrig.(fieldId) != _lineThis.(fieldId))<br>        {<br>            ETGBudgetEntryLineHistory::createLog(_lineOrig, _lineThis, fieldId);<br>        }<br><br>        fieldId = dictTable.fieldNext(fieldId);<br>        //fieldName = dictTable.fieldName(fieldId);<br>    }<br>}</pre><h3>logField Metodu</h3><p>Bu metodun görevi, iki kayıt arasındaki farkları tespit etmektir.</p><p><strong>Metodun işleyişi:</strong></p><ol><li><strong>Tablo ve Alanları Listeleme</strong>:</li></ol><ul><li>_lineOrig.TableId kullanılarak DictTable nesnesi oluşturuluyor. Bu, tablo yapısını dinamik olarak incelemek için kullanılır.</li><li>fieldNext(0) ile ilk alan ID&#39;si alınıyor, ardından tüm alanlar sırayla döngü ile kontrol ediliyor.</li></ul><p><strong>2. Sistem Alanlarını Hariç Tutma</strong>:</p><ul><li>isSysId(fieldId) kontrolü ile sistem alanları (örneğin RecId, DataAreaId gibi) hariç tutuluyor.</li></ul><p><strong>3. Alanların Değerlerini Karşılaştırma</strong>:</p><ul><li>_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:</li><li>createLog metodu çağrılarak değişim kaydedilir.</li></ul><pre>public static void createLog(ETGBudgetEntryLine _budgetEntryLineOld, ETGBudgetEntryLine _budgetEntryLineNew, FieldId _fieldId)<br>{<br>    ETGBudgetEntryLineHistory history;<br><br>    ttsBegin;<br>    history.clear();<br>    history.BudgetEntryId = _budgetEntryLineNew.BudgetEntryId;<br>    history.LineNumber = _budgetEntryLineNew.LineNumber;<br>    history.ChangeField = fieldId2pname(_budgetEntryLineNew.TableId, _fieldId);<br>    history.OldFieldValue = _budgetEntryLineOld.(_fieldId);<br>    history.NewFieldValue = _budgetEntryLineNew.(_fieldId);<br>    history.ChangeUser = curUserId();<br>    history.ChangeDateTime = DateTimeUtil::getSystemDateTime();<br>    history.insert();<br>    ttsCommit;<br>}</pre><h3>createLog Metodu</h3><p>Bu metodun görevi, değişikliklerin kaydedilmesi için bir log (kayıt) oluşturmak.</p><p><strong>Metodun işleyişi:</strong></p><p>Log Kaydı Hazırlama:</p><ol><li>ETGBudgetEntryLineHistory Bu tablo, değişiklik geçmişini tutuyor.</li><li>Yeni bir log kaydı oluşturuluyor ve aşağıdaki değerler atanıyor:</li></ol><ul><li>BudgetEntryId ve LineNumber: Değişiklik yapılan kaydın kimlik bilgileri.</li><li>ChangeField: Değişen alanın etiket bilgisi(Label)</li><li>OldFieldValue ve NewFieldValue: Eski ve yeni değerler atanıyor.</li><li>ChangeUser ve ChangeDateTime: Değişiklik yapan kullanıcı ve değişiklik yaptığı zaman bilgileri tutuluyor.</li></ul><p><strong>Özetle:</strong> 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.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/tracking-and-logging-dynamic-field-changes-in-dynamics-365-fo"><em>https://bayramcetin.com</em></a><em> on November 26, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=839c8420cb0f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Retrieve TableId and FieldId Information in Dynamics 365 Using]]></title>
            <link>https://bayramcetin.medium.com/how-to-retrieve-tableid-and-fieldid-information-in-dynamics-365-using-733f7af1d4dc?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/733f7af1d4dc</guid>
            <category><![CDATA[tableid]]></category>
            <category><![CDATA[dynamics-365]]></category>
            <category><![CDATA[d365]]></category>
            <category><![CDATA[fieldid]]></category>
            <category><![CDATA[d365-fo]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Tue, 26 Nov 2024 11:40:53 GMT</pubDate>
            <atom:updated>2024-12-30T11:40:59.069Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nhBGAX1VHLzCEJ-k" /><figcaption>Dynamics 365&#39;te SQL Sorguları ile TableId ve FieldId bilgilerini Nasıl Elde Edersiniz?</figcaption></figure><h4>Dynamics 365&#39;te SQL Sorguları ile TableId ve FieldId bilgilerini Nasıl Elde Edersiniz?</h4><p>Dynamics 365 Finance and Operations’ta tablolara ve alanlarına dair meta verilere erişmek, özel geliştirmeler ve analizler için kritik önem taşır. Aşağıdaki sorgular, tablo ve alan bilgilerini SQL üzerinden nasıl alabileceğinizi gösterir:</p><ol><li><strong>Bir Tablo Bilgisini Almak</strong></li></ol><pre> SELECT Id, Name, SqlName <br> FROM SYSTABLEIDVIEW <br> WHERE Name = &#39;DirPartyTable&#39;;</pre><blockquote>Bu sorgu, DirPartyTable tablosunun sistemdeki benzersiz kimliğini (Id) ve SQL Server üzerindeki fiziksel adını (SqlName) getirir.</blockquote><p><strong>2. Bir Tabloya Ait Alan Bilgilerini Listelemek</strong></p><pre> SELECT Id, FIELDID, Name, SqlName <br> FROM SysTableFieldIdView <br> WHERE Id = &#39;2303&#39;;</pre><blockquote><em>Tablo kimliği </em><em>2303 olan tabloya ait tüm alanların isimlerini, sistem kimliklerini ve SQL karşılıklarını listelemek için bu sorguyu kullanabilirsiniz.</em></blockquote><p>Bu sorgular, tablolar ve alanlar üzerinde detaylı analiz yapmayı kolaylaştırır ve özel geliştirmelerde zaman kazandırır.</p><p><em>Originally published at </em><a href="https://bayramcetin.com/how-to-retrieve-tableid-and-fieldid-information-in-dynamics-365-using-sql-queries"><em>https://bayramcetin.com</em></a><em> on November 26, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=733f7af1d4dc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dialog Field Lookups with Multi-Select Capability in Dynamics 365]]></title>
            <link>https://bayramcetin.medium.com/dialog-field-lookups-with-multi-select-capability-in-dynamics-365-309549fe761d?source=rss-c2a0d53dd981------2</link>
            <guid isPermaLink="false">https://medium.com/p/309549fe761d</guid>
            <category><![CDATA[dialog-multiselect]]></category>
            <category><![CDATA[dialog-field-multiselect]]></category>
            <category><![CDATA[dialog-multiselect-lookup]]></category>
            <category><![CDATA[d365-fo]]></category>
            <category><![CDATA[dynamics-365]]></category>
            <dc:creator><![CDATA[Bayram ÇETİN]]></dc:creator>
            <pubDate>Thu, 07 Nov 2024 16:00:49 GMT</pubDate>
            <atom:updated>2025-01-05T10:51:00.948Z</atom:updated>
            <content:encoded><![CDATA[<h4>Dynamics 365&#39;te Dialog Field Lookup’ını Çoklu Seçim Yapılabilir Hale Getirme</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/652/1*2GHTrvqjTXn0ElD27GZGEg.png" /></figure><p>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.</p><h4>Kullanılacak Yöntem: SysLookupMultiSelectGrid</h4><p>SysLookupMultiSelectGrid sınıfı, Dynamics 365&#39;te çoklu seçim yapılabilir bir grid oluşturmak için kullanılır. Bu sınıfı, dialog&#39;un bir alanında çoklu seçim sağlayan bir lookup ile entegre edeceğiz.</p><h3>Adım 1: Dialog Alanını Tanımlama</h3><p>Dialog alanını oluşturmak için bir Dialog nesnesi kullanılır. Aşağıda, bir dialog&#39;un nasıl oluşturulacağı ve bir alanın lookup özelliğinin nasıl geçersiz kılınacağı gösterilmiştir:</p><pre>private boolean dialog()<br>{<br>    Dialog dialog = new Dialog(&quot;Personelleri ekle&quot;);<br>    DialogField field  = dialog.addField(extendedTypeStr(String500), &quot;Personel&quot;);<br><br>    field.registerOverrideMethod(methodStr(FormStringControl, lookup),<br>        methodStr(BCResponsibleAddMultiLine, lookupPerson), this);<br>    <br>    if(dialog.run())<br>    {<br>        if (!field.value())<br>            throw warning(&quot;Personelleri seçiniz.&quot;);<br>    <br>        dialogValue = field.value();<br><br>        return true;<br>    }<br><br>    return false;<br>}</pre><p>Yukarıdaki kodda:</p><ul><li>Dialog nesnesi ile bir dialog penceresi oluşturuluyor.</li><li>registerOverrideMethod kullanılarak, ilgili alanın lookup metodu geçersiz kılınıyor ve kendi lookupPerson metodumuz ile değiştiriliyor.</li></ul><h3>Adım 2: Çoklu Seçim Lookup’ını Oluşturma</h3><p>Dialog alanına çoklu seçim özelliği eklemek için SysLookupMultiSelectGrid sınıfını kullanacağız. İşte örnek kod:</p><pre>public void lookupPerson(FormStringControl _formControl)<br>{<br>    Query query = new Query();<br>    QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(HcmWorker));<br><br>    queryBuildDataSource.addSelectionField(fieldNum(HcmWorker, Person));<br><br>    container Person;<br><br>    SysLookupMultiSelectGrid::lookup(query,_formControl,_formControl,_formControl, Person);<br>}</pre><p>Bu metotta:</p><ul><li>Query nesnesi ile HcmWorker tablosundan veriler alınıyor.</li><li>SysLookupMultiSelectGrid::lookup metodu, verilen sorgu ile çoklu seçim yapılabilir bir grid oluşturuyor.</li></ul><h3>Adım 3: Seçimlerin İşlenmesi</h3><p>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:</p><pre>private void run()<br>{<br>   if(this.validate() &amp;&amp; this.dialog())<br>   {<br>      BCResponsible bcResponsibleNew;<br>      RecId person;<br>      List strlist = new List(Types::Int64);<br>    <br>      strlist = strSplit(dialogValue, &quot;;&quot;);<br>    <br>      ListIterator it = new ListIterator(strlist);<br>    <br>      ttsbegin;<br>      while (it.more())<br>      {<br>         person = it.value();<br>      <br>         bcResponsibleNew.clear();<br>         bcResponsibleNew.Number = record.Number;<br>         bcResponsibleNew.PersonnelHcm = HcmWorker::findByPerson(person).RecId;<br>         bcResponsibleNew.insert();<br>      <br>         it.next();<br>      }<br>    <br>      ttscommit;<br>      info(strFmt(&quot;Personeller oluşturuldu.&quot;));<br>   }<br>}</pre><p>Bu kodda:</p><ul><li>strSplit ile dialog alanından alınan değerler ayrıştırılıyor.</li><li>Her bir seçim işlenerek, ilgili tabloya kayıt ekleniyor.</li></ul><h3>Sonuç</h3><p>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.</p><p>Umarım bu yazı, Dynamics 365 projelerinizde çoklu seçim özellikleri eklemek için size ilham verir! 😊</p><h3>Tam Kod</h3><pre>class BCResponsibleAddMultiLine<br>{<br>    BCTable record;<br><br>    str dialogValue;<br><br>    public void lookupPerson(FormStringControl _formControl)<br>    {<br>        Query query = new Query();<br>        QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(HcmWorker));<br><br>        queryBuildDataSource.addSelectionField(fieldNum(HcmWorker, Person));<br><br>        container Person;<br><br>        SysLookupMultiSelectGrid::lookup(query,_formControl,_formControl,_formControl, Person);<br>    }<br><br>    private boolean dialog()<br>    {<br>        Dialog dialog = new Dialog(&quot;Personelleri ekle&quot;);<br>        DialogField field  = dialog.addField(extendedTypeStr(String500), &quot;Personel&quot;);<br><br>        field.registerOverrideMethod(methodStr(FormStringControl, lookup),<br>            methodStr(BCResponsibleAddMultiLine, lookupPerson), this);<br>        <br>        if(dialog.run())<br>        {<br>            if (!field.value())<br>                throw warning(&quot;Personelleri seçiniz.&quot;);<br>        <br>            dialogValue = field.value();<br><br>            return true;<br>        }<br>    <br>        return false;<br>    }<br><br>    private void run()<br>    {<br>        if(this.validate() &amp;&amp; this.dialog())<br>        {<br>            BCResponsible bcResponsibleNew;<br>            RecId person;<br>            List strlist = new List(Types::Int64);<br><br>            strlist = strSplit(dialogValue, &quot;;&quot;);<br><br>            ListIterator it = new ListIterator(strlist);<br><br>            ttsbegin;<br>            while (it.more())<br>            {<br>                person = it.value();<br><br>                bcResponsibleNew.clear();<br>                bcResponsibleNew.Number = record.Number;<br>                bcResponsibleNew.PersonnelHcm = HcmWorker::findByPerson(person).RecId;<br>                bcResponsibleNew.insert();<br><br>                it.next();<br>            }<br><br>            ttscommit;<br>            info(strFmt(&quot;Personeller oluşturuldu.&quot;));<br>        }<br>    }<br><br>    private boolean validate()<br>    {<br>        boolean isValid = true;<br><br>        return isValid;<br>    }<br><br>    public BCTable parmRecord(BCTable _record = record)<br>    {<br>        record = _record;<br>        return record;<br>    }<br><br>    public void new()<br>    {<br>        <br>    }<br><br>    public static BCResponsibleAddMultiLine construct()<br>    {<br>        return new BCResponsibleAddMultiLine();<br>    }<br><br>    public static void main(Args _args)<br>    {<br>        if (! _args || ! _args.dataset() || ! _args.record() ||<br>            _args.record().TableId != tablenum(BCTable))<br>        {<br>            throw error(Error::missingRecord(funcname()));<br>        }<br>        <br>        BCResponsibleAddMultiLine process = BCResponsibleAddMultiLine::construct();<br>        process.parmRecord(_args.record());<br>        process.run();<br>    }<br><br>}</pre><p><em>Originally published at </em><a href="https://bayramcetin.com/dynamics-365-dialog-field-multiselect-lookup-method"><em>https://bayramcetin.com</em></a><em> on November 7, 2024.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=309549fe761d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>