{"id":2226,"date":"2020-07-29T23:21:00","date_gmt":"2020-07-29T20:21:00","guid":{"rendered":"https:\/\/guvensahin.com\/?p=2226"},"modified":"2020-07-29T23:49:13","modified_gmt":"2020-07-29T20:49:13","slug":"dynamics-365-fo-class-extension-chain-of-command","status":"publish","type":"post","link":"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-class-extension-chain-of-command\/","title":{"rendered":"Dynamics 365 F&#038;O &#8211; Class Extension &#038; Chain of Command"},"content":{"rendered":"\n<p>AX 2012&#8217;den D365 F&amp;O&#8217;a ge\u00e7i\u015f ile birlikte \u00f6nceki s\u00fcr\u00fcmlerde kulland\u0131\u011f\u0131m\u0131z OverLayering y\u00f6ntemi devre d\u0131\u015f\u0131 kald\u0131. Art\u0131k geli\u015ftirme yapmak istersek yeni gelen <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/extensibility-home-page\">extensibility framework<\/a>&#8216;\u00fcn bize sa\u011flad\u0131\u011f\u0131 ara\u00e7lar\u0131 kullanmam\u0131z gerekiyor. Bu yaz\u0131da Dynamics 365 Finance and Operations ile yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z class extension ve chain of command kavramlar\u0131ndan bahsedece\u011fim. Ayr\u0131ca bu konu ba\u011flant\u0131l\u0131, event kullan\u0131m\u0131n\u0131 anlatt\u0131\u011f\u0131m yaz\u0131ma <a href=\"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-events\/\">buradan<\/a> ula\u015fabilirsiniz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Class Extension Kullan\u0131m\u0131<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00d6rnek Senaryo<\/h3>\n\n\n\n<p>\u00d6rne\u011fin TrvExpTable \u00fczerinde validateSubmit isminde bir method var. Bu method, TrvExpTable kayd\u0131n\u0131 workflow&#8217;a g\u00f6nderirken \u00e7al\u0131\u015f\u0131yor. Bu method true d\u00f6n\u00fc\u015f yaparsa kayd\u0131 workflow&#8217;a g\u00f6nderebiliyorsunuz. Sizden de bu method&#8217;a ek bir kontrol yazman\u0131z isteniyor. Burada class extension y\u00f6ntemini kullanarak, method&#8217;un d\u00f6n\u00fc\u015f\u00fcne m\u00fcdahale edebilirsiniz.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ad\u0131mlar<\/h3>\n\n\n\n<p><strong>TrvExpTable_Extension<\/strong> isminde yeni bir s\u0131n\u0131f yarat\u0131n. Burada s\u0131n\u0131f\u0131n ad\u0131n\u0131n _<strong>Extension<\/strong> ifadesi ile bitmesi <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/naming-guidelines-extensions#naming-extension-classes\">gerekmektedir<\/a>.<\/p>\n\n\n\n<p>S\u0131n\u0131f\u0131n ba\u015f\u0131na <strong>final<\/strong> ifadesini eklemeli ve <strong>ExtensionOf<\/strong> attribute&#8217;unu dahil etmelisiniz. Yani s\u0131n\u0131f\u0131n imzas\u0131 a\u015fa\u011f\u0131daki gibi olmal\u0131.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;ExtensionOf(tableStr(TrvExpTable))]\nfinal public class TrvExpTable_Extension\n{\n}<\/code><\/pre>\n\n\n\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gibi m\u00fcdahale etmek istedi\u011finiz method&#8217;un imzas\u0131n\u0131 s\u0131n\u0131fa dahil etmelisiniz. Bu kodu build etti\u011finizde de\u011fi\u015fiklikler aktif olacakt\u0131r.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;ExtensionOf(tableStr(TrvExpTable))]\nfinal public class TrvExpTable_DmrTrv_Extension\n{\n    public boolean validateSubmit()\n    {\n        boolean ret = next validateSubmit();\n        \n        ret = ret &amp;&amp; GvnUtil::validSubmitExpTable(this);\n\n        return ret;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kodu Analiz Edelim<\/h3>\n\n\n\n<p>Next ifadesi Chain of Command (CoC) design pattern&#8217;inin bir par\u00e7as\u0131. Yukar\u0131daki kodda yer alan <strong>next<\/strong> ifadesi ile \u00f6nce orjinal kodun \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011fl\u0131yorum. Bu bir nevi <strong>super<\/strong> ifadesine kar\u015f\u0131l\u0131k geliyor. <\/p>\n\n\n\n<p>Sonras\u0131nda kendi custom kontrol\u00fcm\u00fc \u00e7al\u0131\u015ft\u0131r\u0131yorum. B\u00f6ylece standart method&#8217;un d\u00f6n\u00fc\u015f\u00fcne m\u00fcdahale etmi\u015f oluyorum. \u0130stersem next ifadesinin \u00f6ncesine de kodumu yazabilirim. Burada \u00f6nemli nokta, next ifadesini method i\u00e7inde mutlaka kullanmak zorunday\u0131z.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kodun \u00c7al\u0131\u015fma S\u0131ras\u0131<\/h3>\n\n\n\n<p>Art\u0131k <strong>TrvExpTable.validateSubmit<\/strong> method&#8217;u tetiklendi\u011fi zaman<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>D365 F&amp;O validateSubmit method&#8217;u i\u00e7in olu\u015fturulan t\u00fcm extension s\u0131n\u0131flar\u0131n\u0131 tarar.<\/li><li>Next \u00f6ncesine yaz\u0131lm\u0131\u015f olanlar var ise rastgele \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li><li>Orjinal kodunu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li><li>Next sonras\u0131na yaz\u0131lm\u0131\u015f olanlar var ise rastgele \u00e7al\u0131\u015ft\u0131r\u0131r. <strong>TrvExpTable_Extension<\/strong> s\u0131n\u0131f\u0131 i\u00e7inde yazd\u0131\u011f\u0131m\u0131z kodda bu a\u015famada \u00e7al\u0131\u015f\u0131r.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c7e\u015fitli \u00d6rnekler<\/h2>\n\n\n\n<p>Yukar\u0131daki \u00f6rnekte class extension&#8217;\u0131 tablo i\u00e7in kulland\u0131k. \u0130stersek Class, View, DataEntity, FormDataSource, FormDataSource Field ve Form Control&#8217;\u00fc i\u00e7inde kullanabiliriz. A\u015fa\u011f\u0131da syntax&#8217;\u0131 daha iyi kavrayabilmeniz i\u00e7in birka\u00e7 \u00f6rnek kod b\u0131rak\u0131yorum. Daha detayl\u0131 \u00f6rneklere <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/method-wrapping-coc#form-data-sources\">buradan<\/a> ula\u015fabilirsiniz.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Class<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;ExtensionOf(classStr(TrvExpenseLinesVisibilityController))]\nfinal class TrvExpenseLinesVisibilityController_Gvn_Extension\n{\n    public void setGridVisibility()\n    {\n        next setGridVisibility();\n\n        trvExpenseForm.dataSource(identifierStr(TrvExpTrans)).object(fieldNum(TrvExpTrans, ReceiptNumber)).visible(true);\n        trvExpenseForm.dataSource(identifierStr(TrvExpTrans)).object(fieldNum(TrvExpTrans, Description)).visible(true);\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">FormDataSource<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;ExtensionOf(formDataSourceStr(TrvExpenses, TrvExpTrans))]\nfinal public class TrvExpTransDS_Gvn_Extension\n{\n    public void write()\n    {\n        next write();\n        \n        FormDataSource formDs = element.dataSource(formDataSourceStr(TrvExpenses, TrvExpTable));\n        formDs.reread();\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u00d6nemli Notlar<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Sadece public ve protected methodlar da class extension y\u00f6ntemini kullanabilirsiniz. Private methodlar i\u00e7in kullan\u0131lamaz.<\/li><li>Bu y\u00f6ntemde eventlerden farkl\u0131 olarak this ifadesini kullanabiliyoruz.<\/li><li>Next ifadesini <strong>if<\/strong>, <strong>while<\/strong>,\u00a0<strong>do-while<\/strong>, <strong>for<\/strong> ifadeleri ile beraber kullanamazs\u0131n\u0131z.<\/li><li>Burada yazd\u0131\u011f\u0131m\u0131z kodlar, eventlerden \u00f6nce tetiklenir.<ul><li>\u00d6rne\u011fin bir tablonun <strong>insert<\/strong> method&#8217;u i\u00e7in class extension olu\u015ftural\u0131m. Ayn\u0131 \u015fekilde <strong>OnInserted<\/strong> event&#8217;inede kod yazal\u0131m. \u00d6nce class extension sonra event \u00e7al\u0131\u015f\u0131r.<\/li><\/ul><\/li><li>Display method tan\u0131mlamak i\u00e7in de class extension <a href=\"https:\/\/community.dynamics.com\/365\/financeandoperations\/b\/nareshsdynamicsaxblog\/posts\/create-display-method-to-table-extension-in-d365\">kullan\u0131l\u0131r<\/a>.<\/li><li>Extension s\u0131n\u0131f\u0131 i\u00e7ine yazd\u0131\u011f\u0131m\u0131z custom methodlara tableName.methodName notasyonu ile ula\u015fabilirsiniz.<\/li><li>Bu konuda bilinen k\u0131s\u0131tlamalara ve daha detay okumaya <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/class-extensions\">buradan<\/a> ve <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/method-wrapping-coc\">\u015furadan<\/a> ula\u015fabilirsiniz.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Son olarak<\/h2>\n\n\n\n<p>Class extension ile ilgili bahsedeceklerim bu kadard\u0131. Di\u011fer D365 F&amp;O yaz\u0131lar\u0131ma <a href=\"https:\/\/guvensahin.com\/tr\/category\/dynamics-365\/\">buradan<\/a>, Dynamics AX yaz\u0131lar\u0131ma da <a href=\"https:\/\/guvensahin.com\/tr\/category\/dynamics-ax\/\">\u015furadan<\/a> bakabilirsiniz. Ho\u015f\u00e7akal\u0131n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AX 2012&#8217;den D365 F&amp;O&#8217;a ge\u00e7i\u015f ile birlikte \u00f6nceki s\u00fcr\u00fcmlerde kulland\u0131\u011f\u0131m\u0131z OverLayering y\u00f6ntemi devre d\u0131\u015f\u0131 kald\u0131. Art\u0131k geli\u015ftirme yapmak istersek yeni gelen extensibility framework&#8216;\u00fcn bize sa\u011flad\u0131\u011f\u0131 ara\u00e7lar\u0131 kullanmam\u0131z gerekiyor. Bu yaz\u0131da Dynamics 365 Finance and Operations ile yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z class extension ve chain of command kavramlar\u0131ndan bahsedece\u011fim. Ayr\u0131ca bu konu ba\u011flant\u0131l\u0131, event kullan\u0131m\u0131n\u0131 anlatt\u0131\u011f\u0131m yaz\u0131ma buradan&hellip;&nbsp;<a href=\"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-class-extension-chain-of-command\/\" rel=\"bookmark\">Daha fazlas\u0131n\u0131 oku &raquo;<span class=\"screen-reader-text\">Dynamics 365 F&#038;O &#8211; Class Extension &#038; Chain of Command<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2247,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"off","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[405],"tags":[193,445,394,438,198,441,285],"class_list":["post-2226","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dynamics-365-fo","tag-axapta","tag-chain-of-command","tag-dynamics-365","tag-dynamics-365-finance-and-operations","tag-dynamics-ax-2","tag-extension","tag-x"],"_links":{"self":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/comments?post=2226"}],"version-history":[{"count":19,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2226\/revisions"}],"predecessor-version":[{"id":2323,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2226\/revisions\/2323"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media\/2247"}],"wp:attachment":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media?parent=2226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/categories?post=2226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/tags?post=2226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}