{"id":2225,"date":"2020-07-22T11:43:00","date_gmt":"2020-07-22T08:43:00","guid":{"rendered":"https:\/\/guvensahin.com\/?p=2225"},"modified":"2020-07-29T23:49:44","modified_gmt":"2020-07-29T20:49:44","slug":"dynamics-365-fo-events","status":"publish","type":"post","link":"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-events\/","title":{"rendered":"Dynamics 365 F&#038;O &#8211; Events"},"content":{"rendered":"\n<p>Bu yaz\u0131da Dynamics 365 Finance and Operations da yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z ve <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/extensibility-home-page\">extensibility framework<\/a>&#8216;\u00fcn bir par\u00e7as\u0131 olan event kavram\u0131ndan bahsece\u011fim. Hem tablo-form gibi \u00e7e\u015fitli objelerin \u00fczerinde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz <strong>event<\/strong>&#8216;lerden hem de methodlar i\u00e7in kullan\u0131lan <strong>pre-post event<\/strong>&#8216;lere de\u011finece\u011fiz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Event Nedir ?<\/h2>\n\n\n\n<p>Ad\u0131ndan da anla\u015f\u0131labilece\u011fi gibi \u00e7e\u015fitli durumlarda tetiklenen yer tutuculard\u0131r. \u00d6rne\u011fin bir tabloya kay\u0131t eklendi\u011finde <strong>OnInserted<\/strong> event&#8217;i tetiklenir. Kay\u0131t silindi\u011finde <strong>OnDeleted<\/strong> \u00e7al\u0131\u015f\u0131r. Siz ihtiyac\u0131n\u0131za uygun olan\u0131 se\u00e7ip, kullanabilirsiniz. Neredeyse her event standartta var olan ve override ederek kulland\u0131\u011f\u0131m\u0131z sistem methodlar\u0131na kar\u015f\u0131l\u0131k gelir. \u00d6rne\u011fin insert methodunun super \u00f6ncesi i\u00e7in OnInserting, super sonras\u0131 i\u00e7in OnInserted event&#8217;i bulunur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kullan\u0131m\u0131<\/h3>\n\n\n\n<p>D365 F&amp;O i\u00e7inde tablo-form gibi \u00e7e\u015fitli objelerde <strong>Events<\/strong> isminde bir b\u00f6l\u00fcm oldu\u011funu g\u00f6rm\u00fc\u015fs\u00fcn\u00fczd\u00fcr. Bu b\u00f6l\u00fcm, o obje i\u00e7in kullanabilece\u011finiz event listesini i\u00e7erir. Her obje i\u00e7in bu liste farkl\u0131d\u0131r. Listede ilgili event \u00fczerine gelip sa\u011f t\u0131k &gt; kopyala diyerek ald\u0131\u011f\u0131n\u0131z kodu, yeni olu\u015fturdu\u011funuz bir s\u0131n\u0131f\u0131n i\u00e7ine yap\u0131\u015ft\u0131rarak kullanabilirsiniz. Yap\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z method&#8217;un i\u00e7ini kendinize uygun \u015fekilde doldurduktan sonra de\u011fi\u015fikliklerin yans\u0131mas\u0131 i\u00e7in Visual Studio&#8217;yu build etmeniz yeterli.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"562\" height=\"480\" src=\"https:\/\/guvensahin.com\/tr\/wp-content\/uploads\/2020\/07\/d365-fo-copy-event-handler-exptable.png\" alt=\"\" class=\"wp-image-2273\" srcset=\"https:\/\/guvensahin.com\/tr\/wp-content\/uploads\/2020\/07\/d365-fo-copy-event-handler-exptable.png 562w, https:\/\/guvensahin.com\/tr\/wp-content\/uploads\/2020\/07\/d365-fo-copy-event-handler-exptable-300x256.png 300w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u00d6rnekler<\/h3>\n\n\n\n<p>Event&#8217;lerde <strong>this<\/strong> yada <strong>element<\/strong> gibi \u00f6zel ifadeleri direkt kullanam\u0131yorsunuz. Bu sebeple a\u015fa\u011f\u0131da en \u00e7ok kullanaca\u011f\u0131n\u0131z objeler i\u00e7in \u00e7e\u015fitli \u00f6rnek kodlar ekledim.<\/p>\n\n\n\n<p>\u00d6zellikle form event&#8217;lerinin kullan\u0131m\u0131 ba\u015flarda kar\u0131\u015f\u0131k gelebilir. Form i\u00e7indeki di\u011fer objelere nas\u0131l eri\u015fece\u011finizi anlayabilmeniz i\u00e7in a\u015fa\u011f\u0131daki \u00f6rnek kodlar\u0131 inceleyebilirsiniz.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tablo \u00d6rnek 1 &#8211; Updating<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;DataEventHandler(tableStr(TrvRequisitionTable), DataEventType::Updating)]\npublic static void TrvRequisitionTable_onUpdating(Common sender, DataEventArgs e)\n{\n\tTrvRequisitionTable trvRequisitionTable = sender;\n\n\tif (trvRequisitionTable.orig()\n\t\t&amp;&amp; trvRequisitionTable.orig().GvnField != trvRequisitionTable.GvnField)\n\t{\n\t\t\/\/ do something\n\t}\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Tablo \u00d6rnek 2 &#8211; ValidateWrite<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;DataEventHandler(tableStr(TrvRequisitionTable), DataEventType::ValidatingWrite)]\npublic static void TrvRequisitionTable_onValidatingWrite(Common sender, DataEventArgs e)\n{\n\tValidateEventArgs   validateEventArgs   = e as ValidateEventArgs;\n\tboolean             ret                 = validateEventArgs.parmValidateResult();\n\tTrvRequisitionTable trvRequisitionTable = sender;\n\t\n\tif (ret\n\t\t&amp;&amp; !trvRequisitionTable.TravelPurpose)\n\t{\n\t\tret = checkFailed(strFmt(\"@GVN:TravelPurposeEmpty\"));\n\t}\n\n\tif (ret\n\t\t&amp;&amp; trvRequisitionTable.GvnEndDateTime\n\t\t&amp;&amp; trvRequisitionTable.GvnStartDateTime\n\t\t&amp;&amp; trvRequisitionTable.GvnEndDateTime &lt; trvRequisitionTable.GvnStartDateTime)\n\t{\n\t\tret = checkFailed(\"@GVN:StartEndDateError\");\n\t}\n\n\tvalidateEventArgs.parmValidateResult(ret);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Form &#8211; Initialized<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;FormEventHandler(formStr(TrvExpenses), FormEventType::Initialized)]\npublic static void TrvExpenses_OnInitialized(xFormRun sender, FormEventArgs e)\n{\n\tFormDataSource  trvExpTableDs   = sender.dataSource(formDataSourceStr(TrvExpenses, TrvExpTable));\n\tTrvExpTable     trvExpTable     = trvExpTableDs.cursor();\n\tFormDataSource  trvExpTransDs   = sender.dataSource(formDataSourceStr(TrvExpenses, TrvExpTrans));\n\tFormDesign      design          = sender.design();\n\n\t\/\/ field gizlili\u011fi\n\ttrvExpTableDs.object(fieldNum(TrvExpTable, MyField)).visible(false);\n\n\t\/\/ buton gizlili\u011fi\n\tdesign.controlName(formControlStr(TrvExpenses, GvnDummyButton)).enabled(false);\n\n\t\/\/ dataSource\n\ttrvExpTransDs.allowCreate(false);\n\ttrvExpTransDs.allowDelete(false);\n\ttrvExpTransDs.allowEdit(false);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">FormDataSource &#8211; Activated<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;FormDataSourceEventHandler(formDataSourceStr(TrvRequisition, TrvRequisitionTable), FormDataSourceEventType::Activated)]\npublic static void TrvRequisitionTable_OnActivated(FormDataSource sender, FormDataSourceEventArgs e)\n{\n\tsender.object(fieldNum(TrvRequisitionTable, GvnDummyField)).visible(trvRequisitionTable.CurrencyCode != \"\");\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">FormDataSource Field &#8211; Modified<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;FormDataFieldEventHandler(formDataFieldStr(TrvCashAdvances, TrvCashAdvance, GvnWorker), FormDataFieldEventType::Modified)]\npublic static void GvnWorker_OnModified(FormDataObject sender, FormDataFieldEventArgs e)\n{\n\tFormDataSource formDs = sender.datasource();\n\tTrvCashAdvance trvCashAdvance = formDs.cursor();\n\t\n\t\/\/ do something\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">FormControl &#8211; Lookup<\/h4>\n\n\n\n<p>Lookup ile ilgili detayl\u0131 yaz\u0131ma <a href=\"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-lookup-hakkinda-hersey\/\">buradan<\/a> bakabilirsiniz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;FormControlEventHandler(formControlStr(TrvCashAdvances, General_GvnWorker), FormControlEventType::Lookup)]\npublic static void General_GvnWorker_OnLookup(FormControl sender, FormControlEventArgs e)\n{\n\tTrvCashAdvance          trvCashAdvance = sender.formRun().dataSource(formdatasourcestr(TrvCashAdvances, TrvCashAdvance)).cursor();\n\tQuery                   query;\n\tQueryBuildDataSource    qbds;\n\tSysReferenceTableLookup sysTableLookup;\n\n\tquery = new Query();\n\tqbds = query.addDataSource(tableNum(HcmWorker));\n\n\n\tsysTableLookup = SysReferenceTableLookup::newParameters(tableNum(HcmWorker), sender);\n\tsysTableLookup.addLookupMethod(\"name\");\n\tsysTableLookup.addLookupfield(fieldNum(HcmWorker, PersonnelNumber));\n\n\tsysTableLookup.parmQuery(query);\n\tsysTableLookup.performFormLookup();\n\n\n\tFormControlCancelableSuperEventArgs event = e;\n\tevent.CancelSuperCall();\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Pre-Post Event Handler<\/h2>\n\n\n\n<p>D365 F&amp;O objelerinde yer alan methodlar\u0131n \u00f6ncesine veya sonras\u0131na kod yazmak i\u00e7in kullan\u0131l\u0131rlar.<\/p>\n\n\n\n<p>Herhangi bir tabloda, s\u0131n\u0131fta yada formda (sadece form methodlar\u0131 i\u00e7in, datasource ve design daki methodlar i\u00e7in de\u011fil) bulunan method&#8217;a sa\u011f t\u0131klay\u0131p <strong>Copy event handler method &gt; Pre \/ Post<\/strong> diyerek kopyalad\u0131\u011f\u0131n\u0131z kodu, bir s\u0131n\u0131f i\u00e7erisine yap\u0131\u015ft\u0131r\u0131p kullanabilirsiniz. \u00d6rnek kullan\u0131mlar a\u015fa\u011f\u0131daki gibidir.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pre<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;PreHandlerFor(classStr(RetailTransactionServiceCustomer), staticMethodStr(RetailTransactionServiceCustomer, updateCustomer))]\npublic static void RetailTransactionServiceCustomer_Pre_updateCustomer(XppPrePostArgs args)\n{       \n\tRetailTransactionServiceCustomer serviceCustomer = args.getThis();\n\n\t\/\/ do something\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Post<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;PostHandlerFor(formStr(TrvCashAdvances), formMethodStr(TrvCashAdvances, init))]\npublic static void TrvCashAdvances_Post_init(XppPrePostArgs args)\n{\n\tFormRun formRun = args.getThis();\n\tFormDataSource formDs = formRun.dataSource(formdatasourcestr(TrvCashAdvances, TrvCashAdvance));\n\t\n\tformDs.object(fieldNum(TrvCashAdvance, RequestingWorker)).visible(true);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Bilinen K\u0131s\u0131tlamalar<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Sadece public olan methodlar i\u00e7in bu y\u00f6ntemi kullanabilirsiniz. Protected veya private bir method da visual studio&#8217;nun hata verdi\u011fini g\u00f6receksiniz.<\/li><li>E\u011fer method public oldu\u011fu halde <strong>Hookable(false)<\/strong> olarak i\u015faretlenmi\u015f ise yine bu y\u00f6ntemi kullanamass\u0131n\u0131z.<\/li><li>Method&#8217;un d\u00f6nd\u00fc\u011f\u00fc veriye m\u00fcdahale edemessiniz. Sadece \u00f6ncesine veya sonras\u0131na kod yazabilirsiniz. Veriye m\u00fcdahale etmek i\u00e7in <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/fin-ops-core\/dev-itpro\/extensibility\/method-wrapping-coc\">class extension &#8211; chain of command<\/a> y\u00f6ntemini kullanmal\u0131s\u0131n\u0131z. Bu konu hakk\u0131ndaki yaz\u0131ma <a href=\"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-class-extension-chain-of-command\/\">buradan<\/a> ula\u015fabilirsiniz.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Son olarak<\/h2>\n\n\n\n<p>Eventler hakk\u0131nda 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>Bu yaz\u0131da Dynamics 365 Finance and Operations da yeni tan\u0131\u015ft\u0131\u011f\u0131m\u0131z ve extensibility framework&#8216;\u00fcn bir par\u00e7as\u0131 olan event kavram\u0131ndan bahsece\u011fim. Hem tablo-form gibi \u00e7e\u015fitli objelerin \u00fczerinde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz event&#8216;lerden hem de methodlar i\u00e7in kullan\u0131lan pre-post event&#8216;lere de\u011finece\u011fiz. 1. Event Nedir ? Ad\u0131ndan da anla\u015f\u0131labilece\u011fi gibi \u00e7e\u015fitli durumlarda tetiklenen yer tutuculard\u0131r. \u00d6rne\u011fin bir tabloya kay\u0131t eklendi\u011finde OnInserted event&#8217;i&hellip;&nbsp;<a href=\"https:\/\/guvensahin.com\/tr\/dynamics-365-fo-events\/\" rel=\"bookmark\">Daha fazlas\u0131n\u0131 oku &raquo;<span class=\"screen-reader-text\">Dynamics 365 F&#038;O &#8211; Events<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2246,"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,394,438,198,444,285],"class_list":["post-2225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dynamics-365-fo","tag-axapta","tag-dynamics-365","tag-dynamics-365-finance-and-operations","tag-dynamics-ax-2","tag-event","tag-x"],"_links":{"self":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2225","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=2225"}],"version-history":[{"count":25,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2225\/revisions"}],"predecessor-version":[{"id":2324,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/posts\/2225\/revisions\/2324"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media\/2246"}],"wp:attachment":[{"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/media?parent=2225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/categories?post=2225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guvensahin.com\/tr\/wp-json\/wp\/v2\/tags?post=2225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}