Posts Tagged ‘ Dynamics 365 ERP

Microsoft Dynamics 365 F&O: Uzak Masaüstü Bağlantısı Sırasında Çıkan “As a security precaution, the user account has been locked because there were too many logon attempts or password change attempts..” hatası nasıl giderilir?

Bu yazıda Dynamics 365 F&O için oluşturulan Cloud-hosted environments’lara uzak masaüstü ile bağlanırken karşımıza sıklıkla çıkan “As a security precaution, the user account has been locked because there were too many logon attempts or password change attempts. Wait a while before trying again, or contact your system administrator or technical support” hatasının sebebini ve çözüm yollarını anlatacağım.

Hatadan da anlaşılacağı gibi çok fazla hatalı giriş denemesi sebebiyle kullanıcımız kilitlenmiş durumda. Bu bizim güvenlik ayarlarınızla ve bir çok faklı etkenle ilişkili bir durum. Her zaman bizim yanlış şifre ile giriş yapmaya çalışmanızdan kaynaklanmıyor olabiliyor. Uzak masaüstü için kullanılan araçlar sürekli bağlantının açık olmasını sağlamak için özellikle biz ekran başında değilken bağlantı denemesi yapması. Ayrıca standart masaüstü uygulaması ile bağlandıktan sonra bilgisayarı uykuya almak veya ekranı kilitlemek suretiyle bağlantıyı kapatmadan yapılan bu işlemler buna sebep olabiliyor.

Resim-1

Çözüm olarak makineyi yeniden başlatmayı ve bir süre bekleyip giriş yapmayı deneyebilirsiniz. Ancak bunlar çözüm olmazsa dev ortamları için otomatik oluşan ikinci bir kullanıcı mevcut onun ile giriş yapabilirsiniz. Ancak Demo tipinde kurduğunuz ortamlarda tek bir kullanıcı oluşuyor. Bu yüzden ikinci bir kullanıcıyı makinede oluşturmakta faydalı olabilir. Bunlar yoksa kullanıcı şifresini sıfırlamak bir çözüm olabilir.

Resim-2

Azure portal e giriş yapıp ilgili makineye geliyoruz. Connect sekmesinden More Options -> Reset password or keys’e tıklatıyoruz.

Resim-3

Açılan sayfadan yeni şifre girişini yapıp güncelle diyoruz.

Resim-4

Böylelikle kullanıcı şifresini sıfırlamış olduk artık uzak masaüstü ile bağlantıyı deneyebiliriz.

Bu yöntemle şifre değiştirdiğinizde versiyon güncellemelerinde sorun çıkabilir. Şifreyi eski haline getirmek buna çözüm olabilir.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Power Automate, Power Apss, Dynamics 365 ERP, Dynamics 365 CRM

Dynamics 365 Finance and Operations Cross-company Data Sharing.

Cross-company data sharing kavramı, ERP içindeki şirketler arasında şirket özel ana, referans ve kurulum verilerini paylaşmanızı sağlar.

İki veri paylaşımı kavramı mevcuttur:

Duplicate record sharing (DRS), bir politikada herhangi bir şirket için kayıtların oluşturulması, güncellenmesi veya silinmesinin, politikadaki tüm şirketlere kopyalanması/çoğaltılması kavramıdır. Alanların güncellemeleri, politikada paylaşılmak üzere seçilmişse çoğaltılır. DRS, ilk olarak sunulan paylaşım türüydü.

Single record sharing (SRS), bir ana şirkete ait tek bir fiziksel kaydın sanal olarak tüm alt şirketler arasında paylaşıldığı bir kavramdır. Herhangi bir şirkette oluşturma, güncelleme veya silme, tüm şirketler arasında kullanılan tek ortak kayıtta işlem yapar. Ana şirket paylaşımı şu anda ön izlemede ama kısa sürede buda aktif edilecektir. Biraz eski sanal şirket mantığı gibi düşünebilirsiniz.

Basit bir kurulumla DRS için bir örnek yapalım. Cross-company Data Sharing özelliği açık olmayabilir. Feature management kullanarak aktif edebilirsiniz. Sonrasında aşağıdaki formu açalım. Yeni bir kayıt oluşturup Tablo olarak CustGroup ekleyelim. Tablo listesi burada mevcut. Veri paylaşma istediğimiz iki şirketi seçtim.

Resim-1

USMF te veri mevcut.

Resim-2

SIR şirketinde hiç veri yok.

Resim-3

Kaydettikten sonra Enable edip senkronizasyonu başlatıyoruz.

Resim-4

Veri kopyalama devam ediyor.

Resim-5

İşlem tamamlandıktan sonra SIR şirketini yenilediğinizde verilerin oluştuğunu göreceksiniz. Resim1 de görüldüğü gibi PeymTermId seçmediğimiz için verileri kopyalanmadı. Bu şekilde istediğimiz alanı seçebiliriz. Tabi Ana tablolu bir alansa onun tablosunundu paylaşılması gerekecektir.

Resim-6

Ana veri paylaşımı çok sık karşımıza çıkan bir konu benzer kodları çok defa yazmak zorunda kalmışımdır. Bu özellik benzer ihtiyaçları sistem içinden çözmek için çok iyi olmuş. Hala geliştirilmeye devam ediyor. Tam olgunlaştığında özellikle danışmanlar tarafından yoğun kullanılacak bir fonksiyon olacaktır.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, DefaultAccount, LedgerDimension, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Segmented Entry, Power Automate, Power Apss, Power Virtual Agents, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM

query::insert_recordset nasıl kullanılır?

Merhaba,

Bu yazıda X++ da sık kullandığımız toplu SQL işlemlerinden biri olan Insert_RecordSet fonksiyonunu Query ile nasıl kullanırız bir örnekle anlatmaya çalışacağım.

DmrBillsIncomingHeader tablosunda bulunan tüm kayıtların iki alanını DmrBillsIncominTest tablosuna insert etmek istiyorum. Bir Query oluşturmalı ve DmrBillsIncomingHeader tablosunu sorgulamalıyım.

Ayrıca hangi alanları insert etmek istiyorsam onları Map kullanarak işaretlemeliyim. Klasik yöntemle aşağıdaki gibi yazmalıydım.

    insert_recordset billsIncominTest (BillsIncomingId, Description  )
            select BillsIncomingId, Description from DmrBillsIncomingHeader ;

Şimdi bunu Query ile yazalım.

internal final class DmrFDJobQueryInsertRecordList
{
    public static void main(Args _args)
    {
        DmrBillsIncominTest     billsIncominTest;
        Map                     fieldMap;
        Query                   q;
        QueryBuildDataSource    qbdsBillsIncomingHeader;
        QueryBuildFieldList     flBills;

        delete_from billsIncominTest;

        q = new Query();
        qbdsBillsIncomingHeader = q.addDataSource(tableNum(DmrBillsIncomingHeader));

        flBills = qbdsBillsIncomingHeader.fields();
        flBills.addField(fieldNum(DmrBillsIncomingHeader, BillsIncomingId));
        flBills.addField(fieldNum(DmrBillsIncomingHeader, Description));

        fieldMap = new Map(Types::String, Types::Container);
        fieldMap.insert( fieldStr(DmrBillsIncominTest, BillsIncomingId), [qbdsBillsIncomingHeader.uniqueId(),
                                    fieldStr(DmrBillsIncomingHeader, BillsIncomingId)]);
        fieldMap.insert(fieldStr(DmrBillsIncominTest, Description), [qbdsBillsIncomingHeader.uniqueId(),
                                    fieldStr(DmrBillsIncomingHeader, Description)]);

        query::insert_recordset(billsIncominTest, fieldMap, q);

    }

}

Selamlar.

www.fatihdemirci.net

TAGs: Dynamics 365 Finance and Operations, MsDyn365FO,insert_recordset , Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 ERP, X++

Dynamics 365 Finance and Operations Sorguya dinamik filtre eklemek?

Bu yazıda Dynamics 365 Finance and Operations içinde yazdığınız herhangi bir sorguya filtre eklerken eğer sadece değişken doluysa filtre eklemek istiyorsanız kullanabileceğiniz bir teknikten bahsedeceğim.

Örnek bir kodu inceleyelim. Öncelikle Generateonly ile sorgunuzu sadece hazırlamış oluyorsunuz çalıştırılmıyor bu sayede SQL çıktısını görebiliyorsunuz.

static void DmrFDQuerySQLStatment(Args _args)

{

CustAccount custAccount;

CustTable   custTable;

custAccount = “C00003″;

select generateonly custTable

where custTable.AccountNum == custAccount;

// 1. sorgu

info(custTable.getSQLStatement());

// Eğer değişkenin boş mu dolu mu olduğunu kontrol etmek istersem if kullanmalıyım. Birden çok değişken olduğunda bu çok karışık bir hal alabilir.

if(custAccount != “”)

{

select generateonly custTable

where custTable.AccountNum == custAccount;

info(custTable.getSQLStatement());

}

else

{

select generateonly custTable ;

info(custTable.getSQLStatement());

}

// Bu şekilde yazarak eğer değişken doluysa ekliyor. Eğişken boşsa hiç eklemiyor if e ihtiyaç duymadan işimizi hallediyoru.

// 3. sorgu

custAccount = “”;

select generateonly custTable

where (( custTable.AccountNum == custAccount && custAccount ) || (!custAccount));

info(custTable.getSQLStatement());

}

  1. sorgu

SELECT T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.CUSTGROUP,T1.LINEDISC,

T1.PAYMTERMID,T1.CASHDISC,T1.CURRENCY,

T1.INTERCOMPANYAUTOCREATEORDERS,T1.SALESGROUP,T1.BLOCKED,

T1.ONETIMECUSTOMER,T1.ACCOUNTSTATEMENT,

T1.CREDITMAX,T1.MANDATORYCREDITLIMIT,T1.VENDACCOUNT,

T1.PRICEGROUP,T1.MULTILINEDISC,T1.ENDDISC,T1.VATNUM,

T1.INVENTLOCATION,T1.DLVTERM,T1.DLVMODE,T1.MARKUPGROUP,

T1.CLEARINGPERIOD,T1.FREIGHTZONE,T1.CREDITRATING,T1.TAXGROUP,

T1.STATISTICSGROUP,T1.PAYMMODE,T1.COMMISSIONGROUP,

T1.BANKACCOUNT,T1.PAYMSCHED,T1.CONTACTPERSONID,T1.INVOICEADDRESS,

T1.OURACCOUNTNUM,T1.SALESPOOLID,T1.INCLTAX,T1.CUSTITEMGROUPID,

T1.NUMBERSEQUENCEGROUP,T1.PAYMDAYID,T1.LINEOFBUSINESSID,

T1.DESTINATIONCODEID,T1.GIROTYPE,T1.SUPPITEMGROUPID,

T1.GIROTYPEINTERESTNOTE,T1.TAXLICENSENUM,T1.WEBSALESORDERDISPLAY,

T1.PAYMSPEC,T1.BANKCENTRALBANKPURPOSETEXT,T1.BANKCENTRALBANKPURPOSECODE,

T1.INTERCOMPANYALLOWINDIRECTCREATION,

T1.PACKMATERIALFEELICENSENUM,T1.TAXBORDERNUMBER_FI,T1.EINVOICEEANNUM,

T1.FISCALCODE,T1.DLVREASON,T1.FORECASTDMPINCLUDE,

T1.GIROTYPECOLLECTIONLETTER,T1.SALESCALENDARID,T1.CUSTCLASSIFICATIONID,

T1.INTERCOMPANYDIRECTDELIVERY,T1.ENTERPRISENUMBER,

T1.SHIPCARRIERACCOUNT,T1.GIROTYPEPROJINVOICE,T1.INVENTSITEID,

T1.ORDERENTRYDEADLINEGROUPID,T1.SHIPCARRIERID,

T1.SHIPCARRIERFUELSURCHARGE,T1.SHIPCARRIERBLINDSHIPMENT,

T1.SHIPCARRIERACCOUNTCODE,T1.GIROTYPEFREETEXTINVOICE,

T1.SYNCENTITYID,T1.SYNCVERSION,T1.SALESDISTRICTID,

T1.SEGMENTID,T1.SUBSEGMENTID,T1.RFIDITEMTAGGING,T1.RFIDCASETAGGING,

T1.RFIDPALLETTAGGING,T1.COMPANYCHAINID,T1.COMPANYIDSIRET,

T1.PARTY,T1.IDENTIFICATIONNUMBER,T1.PARTYCOUNTRY,T1.PARTYSTATE,

T1.ORGID,T1.PAYMIDTYPE,T1.FACTORINGACCOUNT,T1.DEFAULTDIMENSION,

T1.CUSTEXCLUDECOLLECTIONFEE,T1.CUSTEXCLUDEINTERESTCHARGES,

T1.COMPANYNAFCODE,T1.BANKCUSTPAYMIDTABLE,T1.GIROTYPEACCOUNTSTATEMENT,

T1.MAINCONTACTWORKER,T1.CREDITCARDADDRESSVERIFICATION,

T1.CREDITCARDCVC,T1.CREDITCARDADDRESSVERIFICATIONVOID,

T1.CREDITCARDADDRESSVERIFICATIONLEVEL,T1.COMPANYTYPE_MX,T1.RFC_MX,T1.CURP_MX,

T1.STATEINSCRIPTION_MX,T1.RESIDENCEFOREIGNCOUNTRYREGIONID_IT,

T1.BIRTHCOUNTYCODE_IT,T1.BIRTHDATE_IT,T1.BIRTHPLACE_IT,T1.EINVOICE,

T1.CCMNUM_BR,T1.CNPJCPFNUM_BR,T1.PBACUSTGROUPID,T1.IENUM_BR,

T1.SUFRAMANUMBER_BR,T1.SUFRAMA_BR,T1.CUSTFINALUSER_BR,T1.INTERESTCODE_BR,

T1.FINECODE_BR,T1.SUFRAMAPISCOFINS_BR,T1.TAXWITHHOLDCALCULATE_TH,

T1.TAXWITHHOLDGROUP_TH,T1.CONSDAY_JP,T1.NIT_BR,T1.INSSCEI_BR,T1.CNAE_BR,

T1.ICMSCONTRIBUTOR_BR,T1.SERVICECODEONDLVADDRESS_BR,

T1.INVENTPROFILETYPE_RU,T1.INVENTPROFILEID_RU,T1.TAXWITHHOLDCALCULATE_IN,

T1.UNITEDVATINVOICE_LT,T1.ENTERPRISECODE,T1.COMMERCIALREGISTERSECTION,

T1.COMMERCIALREGISTERINSETNUMBER,T1.COMMERCIALREGISTER,

T1.REGNUM_W,T1.ISRESIDENT_LV,T1.INTBANK_LV,T1.PAYMENTREFERENCE_EE,

T1.PACKAGEDEPOSITEXCEMPT_PL,T1.FEDNONFEDINDICATOR,

T1.IRS1099CINDICATOR,T1.AGENCYLOCATIONCODE,T1.FEDERALCOMMENTS,

T1.USEPURCHREQUEST,T1.MCRMERGEDPARENT,T1.MCRMERGEDROOT,

T1.AFFILIATED_RU,T1.CASHDISCBASEDAYS,T1.CUSTTRADINGPARTNERCODE,

T1.CUSTWHTCONTRIBUTIONTYPE_BR,T1.DAXINTEGRATIONID,

T1.DEFAULTDIRECTDEBITMANDATE,T1.DEFAULTINVENTSTATUSID,

T1.ENTRYCERTIFICATEREQUIRED_W,T1.EXPORTSALES_PL,T1.EXPRESSBILLOFLADING,

T1.FISCALDOCTYPE_PL,T1.FOREIGNRESIDENT_RU,

T1.GENERATEINCOMINGFISCALDOCUMENT_BR,T1.INVOICEPOSTINGTYPE_RU,

T1.ISSUEOWNENTRYCERTIFICATE_W,T1.ISSUERCOUNTRY_HU,

T1.LVPAYMTRANSCODES,T1.MANDATORYVATDATE_PL,T1.PASSPORTNO_HU,

T1.PDSCUSTREBATEGROUPID,T1.PDSFREIGHTACCRUED,T1.PDSREBATETMAGROUP,

T1.TAXPERIODPAYMENTCODE_PL,T1.USECASHDISC,T1.FIELD1,

T1.MODIFIEDDATETIME,T1.DEL_MODIFIEDTIME,T1.MODIFIEDBY,

T1.CREATEDDATETIME,T1.DEL_CREATEDTIME,T1.RECVERSION,T1.PARTITION,

T1.RECID,T1.MEMO FROM CUSTTABLE T1 WHERE (((PARTITION=?) AND (DATAAREAID=?)) AND (ACCOUNTNUM=?))

  1. sorgu

SELECT T1.ACCOUNTNUM,T1.INVOICEACCOUNT,T1.CUSTGROUP,T1.LINEDISC,

T1.PAYMTERMID,T1.CASHDISC,T1.CURRENCY,T1.INTERCOMPANYAUTOCREATEORDERS,

T1.SALESGROUP,T1.BLOCKED,T1.ONETIMECUSTOMER,T1.ACCOUNTSTATEMENT,

T1.CREDITMAX,T1.MANDATORYCREDITLIMIT,T1.VENDACCOUNT,

T1.PRICEGROUP,T1.MULTILINEDISC,T1.ENDDISC,T1.VATNUM,

T1.INVENTLOCATION,T1.DLVTERM,T1.DLVMODE,T1.MARKUPGROUP,T1.CLEARINGPERIOD,

T1.FREIGHTZONE,T1.CREDITRATING,T1.TAXGROUP,T1.STATISTICSGROUP,

T1.PAYMMODE,T1.COMMISSIONGROUP,T1.BANKACCOUNT,T1.PAYMSCHED,

T1.CONTACTPERSONID,T1.INVOICEADDRESS,T1.OURACCOUNTNUM,

T1.SALESPOOLID,T1.INCLTAX,T1.CUSTITEMGROUPID,T1.NUMBERSEQUENCEGROUP,

T1.PAYMDAYID,T1.LINEOFBUSINESSID,T1.DESTINATIONCODEID,

T1.SUPPITEMGROUPID,T1.TAXLICENSENUM,T1.WEBSALESORDERDISPLAY,T1.PAYMSPEC,

T1.BANKCENTRALBANKPURPOSETEXT,T1.BANKCENTRALBANKPURPOSECODE,

T1.INTERCOMPANYALLOWINDIRECTCREATION,T1.PACKMATERIALFEELICENSENUM,

T1.DLVREASON,T1.FORECASTDMPINCLUDE,T1.SALESCALENDARID,

T1.CUSTCLASSIFICATIONID,T1.INTERCOMPANYDIRECTDELIVERY,T1.SHIPCARRIERACCOUNT,

T1.INVENTSITEID,T1.ORDERENTRYDEADLINEGROUPID,

T1.SHIPCARRIERID,T1.SHIPCARRIERFUELSURCHARGE,T1.SHIPCARRIERBLINDSHIPMENT,

T1.SHIPCARRIERACCOUNTCODE,T1.SYNCENTITYID,T1.SYNCVERSION,

T1.SALESDISTRICTID,T1.SEGMENTID,T1.SUBSEGMENTID,T1.RFIDITEMTAGGING,

T1.RFIDCASETAGGING,T1.RFIDPALLETTAGGING,T1.COMPANYCHAINID,

T1.PARTY,T1.IDENTIFICATIONNUMBER,T1.PARTYCOUNTRY,T1.PARTYSTATE,

T1.DEFAULTDIMENSION,T1.CUSTEXCLUDECOLLECTIONFEE,

T1.CUSTEXCLUDEINTERESTCHARGES,T1.MAINCONTACTWORKER,

T1.CREDITCARDADDRESSVERIFICATION,T1.CREDITCARDCVC,

T1.CREDITCARDADDRESSVERIFICATIONVOID,T1.CREDITCARDADDRESSVERIFICATIONLEVEL,

T1.PBACUSTGROUPID,T1.FEDNONFEDINDICATOR,T1.IRS1099CINDICATOR,

T1.AGENCYLOCATIONCODE,T1.FEDERALCOMMENTS,T1.USEPURCHREQUEST,

T1.MCRMERGEDPARENT,T1.MCRMERGEDROOT,T1.CASHDISCBASEDAYS,

T1.CUSTTRADINGPARTNERCODE,T1.DAXINTEGRATIONID,T1.DEFAULTDIRECTDEBITMANDATE,

T1.DEFAULTINVENTSTATUSID,T1.ENTRYCERTIFICATEREQUIRED_W,

T1.EXPRESSBILLOFLADING,T1.ISSUEOWNENTRYCERTIFICATE_W,T1.PDSCUSTREBATEGROUPID,

T1.PDSFREIGHTACCRUED,T1.PDSREBATETMAGROUP,T1.USECASHDISC,

T1.FIELD1,T1.MODIFIEDDATETIME,T1.DEL_MODIFIEDTIME,T1.MODIFIEDBY,T1.CREATEDDATETIME,

T1.DEL_CREATEDTIME,T1.RECVERSION,T1.PARTITION,T1.RECID,

T1.MEMO FROM CUSTTABLE T1 WHERE ((PARTITION=?) AND (DATAAREAID=?))

  1. Sorguda gördüğünüz gibi AccountNum filtresi verilmiyor. Değişkene değer verip tekrar çalıştırırsanız filtrenin eklendiğini görebilirsiniz. Değerlerin görünmemesi normal. SQL üzerinden bakarsanız değerleri de görebilirsiniz.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM, X++, Query, Filter

Dynamics 365 Finance and Operations: Seçilen çoklu kayıtları formlar arasında transfer etme.

Bu yazıda Dynamics 365 Finance and Operations içinde bir formda seçilen çoklu kayırları faklı bir forma nasıl aktarabiliriz anlatmaya çalışacağım.

Bu örnekte iki formum var. Birinci forma bir buton ekleyip clicked metodunu eziyorum.

public void clicked()

{

VendPackingSlipJour vendPackingSlipJourSelected;

container           con;

Args                args;

str                 packingSlipIds;

;

// For döngüsü ile veri kaynağında seçilen kayıtları dolaşabiliyorum. Bunu faklı döndülerlede yapabilirsiniz.

for (vendPackingSlipJourSelected = VendPackingSlipJour_ds.getFirst(true) ? VendPackingSlipJour_ds.getFirst(true) : VendPackingSlipJour_ds.cursor();

vendPackingSlipJourSelected; vendPackingSlipJourSelected = VendPackingSlipJour_ds.getnext())

{

con = conIns(con,1,vendPackingSlipJourSelected.PackingSlipId); // Sonrasında bir contanier oluşturuyorum.

packingSlipIds = con2Str(con,”,”);

}

args = new Args();

args.parm(packingSlipIds);

new MenuFunction(menuitemDisplayStr(DmrVendInvoicePost), MenuItemType::Display).run(args);

// MenuFunction kullanarak ikinci formu açıyorum.

}

Şimdi ikinci formda ilk formda seçtiğim kayıtlara nasıl ulaşıyorum bakalım.

public void init()

{

int                 i;

str                 packingSlipIds;

super();

isRecordExists = false;

packingSlipIds = element.args().parm();  // args ile oluşturduğumuz string değişkene ulaşıyoruz.

con = str2con(packingSlipIds,”,”); // Containera alıyoruz.

for(i = 1; i<= conLen(con) ; i++)

{

// Döngüye sokup range olarak veriyorum. Aslında virgül ile oluşturduğum için direk range olarak ta verebilirim.

DmrPurchParmTable_ds.query().dataSourceTable(tableNum(DmrPurchParmTable)).addRange(fieldNum(DmrPurchParmTable , PackingSlipId)).value(SysQuery::value(conPeek(con,i)));

}

}

Bu yazıda iki forma arasında çoklu seçilmiş kayıtları nasıl aktarabilirsiniz anlatmaya çalıştım.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM, X++

Dynamics 365 Finance and Operations LedgerDimension ve Segmented Entry nasıl eklenir?

Bu yazıda Dynamics 365 Finance and Operations içinde bir tabloya LedgerDimension nasıl eklenir ve bu alanı formda Segmented entry control ile nasıl kullanıcıya kullandırabiliriz anlatmaya çalışacağım.

LedgerDimension aslında DimensionAttributeValueCombination kaydıdır. LedgerDimension MainAccount ve DefaultDimension’ın bileşimidir.

Öncelikle Tabloya LedgerDimensionAccount EDT sini kullanarak bir alan ekleyelim. Eğer sürükle bırak ile eklerseniz otomatik ilişkiyi oluşturacak. Yoksa elle eklemeniz gerekir.

Resim-1

Sonrasında forma gelip eklediğimiz alanı tasarımda istediğimiz bir yere sürükleyip bırakıyoruz. Segmented Entry oluşuyor. Özelliklerinde resimde görünen tanımları yapmalıyız. Özellikle Controller Class çok önemli.

Resim-2

Derleyip çalıştırdığımızda formda alanımızı göreceğiz. DefaultAccount ile aradaki farkı görebilirsiniz. Sadece Main Account değil boyutlarda geliyor ve bir kombinasyon oluşturuluyor.

Resim-3

Oluşan verileri Sql üzerinden incelediğimizde aradaki fark çok net bir şekilde ortaya çıkıyor.

Resim-4

Bu yazıda LedgerDimension nedir ve nasıl eklenir anlatmaya çalıştım. Sonraki yazılarımda bunları kodda nasıl kullanıp birbirlerine çeviriyoruz anlatmaya devam edeceğim.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, DefaultAccount, LedgerDimension, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Segmented Entry, Power Automate, Power Apss, Power Virtual Agents, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM

Dynamics 365 Finance and Operations Event Handler Kullanımı?

Bu yazıda Dynamics 365 Finance and Operations içinde standart bir formda Event Handler kullanarak nasıl işlemler yapabilirsiniz göstermeye çalışacağım.

Bir önceki yazımda Form DataSource metotlarına Extension ile ekleme yapmayı anlatmıştım. CustInvoiceJournal formuna E-Fatura filtresi için bir DataSource eklemiştim. Şimdi orada eklenen filtreyi kullanıcının kaldırabilmesi için bir CustInvoiceJournal formuna CheckBox ekledim. Bu CheckBox’ın işaretlenmesi ile tüm kayıtları göstereceğim.

Events kısmından OnClicked’e sağ tıklayıp Copy event handler method diyorum.

Resim-1

Yeni bir class oluşturup kodu yapıştırıyorum.

class CustInvoiceJournal_FD_EventHandler // Class isimlendirmede hala bazen karışıyor ama ekip içinde bir standart oturtmak lazım.

{

/// <summary>

///

/// </summary>

/// <param></param>

/// <param></param>

[FormControlEventHandler(formControlStr(CustInvoiceJournal, DmrShowAllRecord), FormControlEventType::Clicked)] // Kopyalama sonucu bu geliyor zaten.

public static void DmrShowAllRecord_OnClicked(FormControl sender, FormControlEventArgs e)

{

QueryBuildDataSource    custInvoiceJourDS;

QueryBuildDataSource    eInvoicePoolTableDS;

FormRun                 elementForm         = sender.formRun();

FormCheckBoxControl     showAllRecord      ;

FormDataSource          custInvoiceJour_ds  = elementForm.dataSource(formDataSourceStr(CustInvoiceJournal, CustInvoiceJour)) as FormDataSource;

#IsoCountryRegionCodes

if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoTR]))

{

showAllRecord       = elementForm.design().controlName(formControlStr(CustInvoiceJournal, DmrShowAllRecord));

custInvoiceJourDS   = custInvoiceJour_ds.query().dataSourceTable(tableNum(custInvoiceJour));

eInvoicePoolTableDS = custInvoiceJour_ds.query().dataSourceTable(tableNum(FDEInvoicePoolTable));

if(showAllRecord.checked())

{

eInvoicePoolTableDS.enabled(false);

}

else

{

eInvoicePoolTableDS.enabled(true);

}

custInvoiceJour_ds.executeQuery();

}

}

}

Bu yazıda form kontrolleri için EventHandler kullanımını anlatmaya çalıştım.

Selamlar.

www.fatihdemirci.net

TAGs: Dynamics 365 Finance and Operations, MsDyn365FO, OnClicked (), DataSource, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 ERP, X++

Dynamics 365 Finance and Operations Form DataSource Metotlarında Extension Kullanımı.

Bu yazıda Dynamics 365 Finance and Operations içinde standart bir formun DataSource metotlarına Extension ile nasıl ekleme yapabiliriz anlatmaya çalışacağım. Eski versiyonlarda bu işlem çok kolay ve hızlı yapılabiliyordu. Artık direk müdahale edemediğimiz için Extension mantığıyla ulaşmak zorundayız.

Bir örnek kodla DataSource metotlarına nasıl ulaştığımızı görelim. Bu örnekte CustInvoiceJournal formuna E-Fatura havuzuna gönderilenler ilk açılırken gelmesin diye bir filtre eklemek istiyorum. Bunun için CustInvoiceJour veri kaynağının init() metoduna ulaşıp bir join yapmam gerekiyor.  Yeni bir class oluşturuyorum.

[ExtensionOf(formDataSourceStr(CustInvoiceJournal,CustInvoiceJour))] // Bu satır asıl işi yapan hangi DataSource ise onu seçiyorum.

final class CustInvoiceJournalDS_FD_Extension // final eklemeyi unutmayın.

{

public void init()

{

FormDataSource          formDS = this; // DataSource metodunda olduğum için This direk DataSource u veriyor.

QueryBuildDataSource    custInvoiceJourDS;

QueryBuildDataSource    eInvoicePoolTableDS;

#IsoCountryRegionCodes

next init();  // asıl metodu çağıran kısım.

if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoTR]) //

{

custInvoiceJourDS = formDS.query().dataSourceTable(tableNum(custInvoiceJour));

// FormDS form dataSource olduğu için ona ekleme yapamazsınız. Aslında bize QueryBuildDataSource nesnesi lazım FormDS üzerinden ulaşıyorum.

eInvoicePoolTableDS = custInvoiceJourDS.addDataSource(tableNum(FDEInvoicePoolTable)); // Eklemeyi yapıyorum.

eInvoicePoolTableDS.addLink(fieldNum(custInvoiceJour , recId), fieldNum(FDEInvoicePoolTable ,RefRecId ));

eInvoicePoolTableDS.addLink(fieldNum(custInvoiceJour , TableId), fieldNum(FDEInvoicePoolTable,RefTableId ));

eInvoicePoolTableDS.joinMode(JoinMode::NoExistsJoin);

}

}

}

Bu yazıda standart bir formun herhangi bir DataSource metoduna Extension ile nasıl ekleme yapılır anlatmaya çalıştım.

Selamlar.

www.fatihdemirci.net

TAGs: Dynamics 365 Finance and Operations, MsDyn365FO, init(), DataSource, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 ERP, X++

Dynamics 365 Finance and Operations LedgerDimension Yeni Bir Finansal Boyut Nasıl Eklenir?

Bu yazıda Dynamics 365 Finance and Operations için yeni bir finansal boyut nasıl eklenir anlatmaya çalışacağım.

Hazırda olan boyut seçeneklerini görmek için General ledger-> Chart of accounts -> Dimensions -> Financial dimensions formunu açıyoruz.

Resim-1

Bu formda hazırda kurulmuş boyutlar geliyor. New ile yeni boyut oluşturuyoruz. Açılan listeden istediğimizi seçebiliriz. Bu yazıda ben bu listeye nasıl ekleme yaptığımızı anlatacağım.

Resim-2

Bu örnekte standart bir tabloyu boyut haline getirmeyi göstereceğim. Örnek olarak BankGroup tablosunu seçtim. Tamamen yeni bir tablo da kullanabilirsiniz.

Öncelikle bir View oluşturmak gerekiyor. Aşağıdaki yapının aynı olmalı yazım hataları bile listede görünmesini engelleyecektir. İsmi DimAttribute ile başlamalı. DataSoruce’a kendi tablomuzu ekleyip ismini BackingEntity yapmalısınız.

3 alana ihtiyaç var.

  1. Key     : RecId
  2. Value : BankGroupId
  3. Name : Name

Resim-3

Yeni bir metot ekleyip View ismini yazıyoruz.

Resim-4

Bu haliyle derleme ve eşitleme yaptığınızda listede göremeyeceksiniz. Eğer Debug modda açarsanız hatayı görebilirsiniz. Boyut olacak tablo için mutlaka RecId nin bir tekil index’te ilk sırada olmasını bekliyor.

VendGroup tablosunda RecId Index oluşturulmamış. Entension ile de değiştiremiyoruz. Bu yüzden yeni bir index oluşturdum. Burada sorun tek başına RecId ye izin vermiyor. Mecbur başka bir alanla eklemem gerekti.

Resim-5

Bu işlemlerden sonra derleme ve eşitleme yaparsanız listeye geldiğini görebilirsiniz. Eğer listeye gelmiyorsa mutlaka Debug modda çalıştırın sorunlu View de hatayı gösterecektir.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, DefaultAccount, LedgerDimension, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Segmented Entry, Power Automate, Power Apss, Power Virtual Agents, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM

Standart Tabloların initFrom…() Metodlarına Extension ile Nasıl Ekleme Yapılır?

Bu yazıda Extension kullanımını faklı bir örnek vereceğim. Bir örnekle açıklayayım. SalesTable ve CustInvoiceJour’a bir alan açtım ve fatura oluştuğunda bu alan SalesTable’dan CustInvoiceJour’a taşınsın istiyorum.

Eski versiyonda bu çok kolaydı CustInvoiceJour-> initFromSalesTable() metoduna bir satır ekleyip işi çözebilirdiniz. Yeni mantıkla birlikte bir Extension sınıfı yazıp onun içinde halletmek zorundasınız.

Resim-1

Sınıfı oluşturup aşağıdaki gibi bir iki metot yazdım. Ben iki faklı metodu aynı sınıfta düzenledim. Burada dikkat etmeniz gereken iki konu var. Birincisi PostHandlerFor kullanımı. Bu standart metot bitince buraya girecek demek. İkincisi getArgs() ile aldığım salesTable değişkeni. Burada standart metottaki değişkenle aynı isimde olmalı yoksa çalışmaz. Ben direk _ kullanılmıştır diye düşünüp ekledim çalışmadı sonra bakınca fark ettim standart metot kullanmamış.

Resim-2

Bu yazıda initFrom metotlarına Extension ile nasıl ekleme yapabileceğinizi anlatmaya çalıştım. Eskiye nazaran biraz daha uzun bir işlem buda geliştirme sürelerini arttırıyor.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps,  initFrom, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Segmented Entry, Power Automate, Power Apss, Power Virtual Agents, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM

Page 1 of 111234510...Last »