Posts Tagged ‘ MsDyn365CE

Veri Yönetiminde Yeni Bir Dönem: Microsoft Fabric ve Dynamics 365 Entegrasyonu nasıl yapılır?

Öncelikle Microsoft Fabric’i biraz tanıyalım: Microsoft Fabric, çeşitli veri yönetimi ve analitik çözümlerini tek bir platformda birleştiren, uçtan uca bir veri işleme ve analiz platformudur.

  • Temel Bileşenler:
    • Veri Entegrasyonu: Farklı veri kaynaklarını birleştirir.
    • Veri Hazırlama: Verileri temizlemek ve düzenlemek için araçlar sunar.
    • Veri Depolama ve Yönetimi: Azure Data Lake, SQL, NoSQL gibi çeşitli depolama seçenekleri mevcuttur.
    • Analitik: Veri analizini hızlandıran, yapay zeka destekli araçlar içerir.
  • Gelişmiş Özellikler:
    • Yapay zeka ve makine öğrenimi entegrasyonları mevcuttur.
    • Gerçek zamanlı analizler ve raporlama yapma imkanı sunar.
  • Microsoft Fabric’in Power Platform ile Entegrasyonu
    • Veri Analitiği ve Power BI: Fabric, özellikle Power BI ile sıkı bir entegrasyon içindedir. Power BI raporları Fabric üzerinden daha geniş veri kaynaklarıyla beslenir, böylece raporlamalar ve görselleştirmeler çok daha güçlü hale gelir.
    • Power Apps ile Veri Yönetimi: Microsoft Fabric, Power Apps ile entegre çalışarak, uygulamalar için gerekli verilerin doğrudan erişimini ve kullanımını sağlar. Veri yönetimi süreçlerini hızlandırır ve uygulamaların kullanıcı deneyimini iyileştirir.
    • Power Automate ile İş Akışlarının Otomasyonu: Power Automate, Microsoft Fabric’in sunduğu veri işleme yetenekleri ile birleştiğinde, veriler üzerinden tetiklenen otomatik iş akışları oluşturmak çok daha kolay hale gelir.
    • Power Virtual Agents ile Yapay Zeka Entegrasyonu: Fabric’in veri analizi yetenekleri, yapay zeka tabanlı çözümlerin geliştirilmesine katkıda bulunur ve Power Virtual Agents ile daha akıllı botlar oluşturulmasını sağlar.

Ön Şartlar

  1. Power BI Premium Lisansı veya Fabric Kapasitesi:
    • Dataverse ortamınızla aynı Azure bölgesinde bir Power BI premium lisansı veya Fabric kapasitesi gereklidir. Desteklenen premium kapasite seçenekleri şunlardır: “P1″, “P2″, “P3″, “P4″, “P5″, “F2″, “F4″, “F8″, “F16″, “F32″, “F64″, “F128″, “F256″, “F512″, “F1024″, “F2048″, “DCT1″, “FT1.”
    • Bu lisanslara sahip değilseniz, bir kapasite satın alabilir veya ücretsiz Fabric deneme kapasitesine kaydolabilirsiniz.
  2. Yönetici İzinleri:
    • Fabric Öğeleri Oluşturma: Fabric lakehouses ve diğer öğeleri oluşturmak için yöneticinizin bu izni vermesi gerekir. Ayarlar, Microsoft Fabric yönetim portalında yapılır.
    • Dataverse Güvenlik Rolü: Dataverse ortamında sistem yöneticisi rolüne sahip olmanız gerekir.
    • Power BI Yönetimi: Power BI çalışma alanının yöneticisi ve aynı coğrafi konumda bir kapasitenin yöneticisi olmalısınız.
  3. Premium Kapasite Erişimi:
    • Power BI’de çalışma alanına giderek Premium kapasite seçeneğini kontrol edin ve Trial veya Premium kapasitesinin seçili olduğundan emin olun.

Öncelikle Dynamics 365 ürünleri ile Fabric bağlantısı kurabilmek için Dynamics 365 ortamlarımızın hazır olması gerekiyor. Bu yazıda Power Platform Admin Center’da Dynamics 365 Finance and Operations ve Dataverse ortamının olduğu varsayılmıştır.

Bu ortam için https://make.powerapps.com/a giriyoruz. Aşağıdaki resimde görüldüğü gibi Tables menüsünden Analyze->Link to Microsoft Fabric’e tıklıyoruz.

Resim-1

Sonrasında açılan pencerenden hangi ortamın bağlantısını yapmak istiyorsak seçiyoruz. Buraya CMR linkini girmelisiniz. Sign in olmamız gerekecek.

Resim-2

Sonrasında Save Connection diyoruz.

Resim-3

Bir çalışma alanı seçiyoruz veya yeni oluşturabiliriz.

Resim-4

Tüm adımlar hatasız tamamlandığında Microsoft Fabric ile Dynamics 365 bağlantısı kurulmuş oluyor. Fabric sayfası otomatik açılacaktır. Tablolaron dolması ve senkronize olması biraz zaman alıyor. Bu aşamada tüm Dataverse tabloları otomatik bağlanıyor. FO tablolarını sonradan elle seçmemiz gerekiyor. Aşağıda bahsedeceğim.

Resim-5

Oluşan Fabric linki görmek için Azure Snapse Link menüsüne giriyoruz. Microsoft OneLake’e tıklıyoruz. Sanırım Fabric link ile Snapse link aynı yapıyı kullanıyorlar menu henüz değişmemiş ilerde iki faklı menu olabilir.

Resim-6

Açılan sayfada bağlantısı kurulmuş tabloların listesi geliyor.  Manage tables menüsünden tablo ekleme işlemlerini yapabiliyoruz.

Resim-7

Açılan sayfada hem Dataverse tablolarını hemde FO tablolarını görebilirsiniz. Tabloların bu listede görünebilmesi için bazı şartlar var en önemlisi tabloda Change tracking aktif edilmiş  olmalı. Buradan bağlantısını kurmak istediğiniz tabloları seçebilirsiniz. Ben CustTable ve CustGrup tablolarını seçtim.

Resim-8

Artık Fabric sayfasına gidebiliriz. Bir çalışma sayfası oluşturmuştum. İçine girdiğimde bir kaç faklı linkin olduğunu göreceksiniz. Lakehouse’a tıklayalım.

Resim-9

Lakehouse’a girdiğimde bağlantısını kurduğum tabloları görebiliyorum.

Resim-10

FO tablolarını listeden bulabilirsiniz. FO ortamı üzerinden veri değişiklikleri yaparak buraya yansımasını test edebilirsiniz. Şu anda saatte bir güncelleniyor.

Resim-11

Bu iki tabloyu kullaraka çok basit bir liste Power BI raporu yaptım.

Resim-12

Sonuç olarak, bu yazıda Microsoft Fabric ile Dynamics 365 entegrasyonunun nasıl sağlandığını anlatmaya çalıştım. Microsoft Fabric, Dynamics 365 ve Power Platform’un birleşimi, müşterilerde yoğun olarak kullanılacak güçlü bir yapı oluşturuyor. Bu entegrasyon, özellikle standart çözümler konusunda yaşadığımız bazı zorlukları ortadan kaldıracak gibi görünüyor. Ürün hala geliştirilmeye devam ediyor ve özellikle gelecekte yapay zeka ile olan iş birliği sayesinde projelerimizde büyük katkı sağlayacağını düşünüyorum.

Detaylar için buraya göz atabilirsiniz.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Fabric, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Power Automate, Power Apss, Power Virtual Agents, Dynamics 365 nedir, Dynamics 365 ERP, Dynamics 365 CRM, Power BI, Dataverse

PowerShell ile Power Platform Admin Center’a yeni bir Dynamics 365 Finance ortamı nasıl kurulur?

X++ geliştiricileri olarak büyük bir dönüşümün eşiğindeyiz. Geliştirme ortamımız Visual Studio olduğundan beri hayalını kurduğumuz kendi makinemizden kod yazabilme imkanı artık hazır sayılır. Ben bir kaç kez denedim gayatte iyi çalışıyor. Microsoft ve ekosistem bununla alaki bir çok içerik yayınladı bende elimden geldiğince kendi tecrübelerimi akatarmaya çalışacağım. Öncelikle bir ortama ihtiyacımız var ve bu ortam Power platform admin center üzerinden kurulmuş olmalı. LCS üzerinden kurulmuş ortamlara direk bağlanamıyoruz. Bu sebeple bu yazıda yeni bir FO ortamını Power platform admin center’a nasıl kuruyoruz anlatmaya çalıcağım.

Kurulumu yapabilmek için kullanıcınızın Dynamics 365 FO lisansına sahip olması gerekiyor. Benim buradaki lisansım iş ortağı lisansı olduğu için adı faklı ama kurulumu yapabiliyorum. Ayrıca kullanıcının Admin haklarına sahip olduğundan emin olun.

Resim-1

Şimdilik kurulum ara yüzden yapılamıyor. PowerShell ile kurulum yapıyoruz. Admin olarak açıp aşağıdaki kodları çalıştırmalısınız. DisplayName ortamınızın isminde ve linkinde  olacak bu sebeple uygun bir seçim yapmalısınız.

Add-PowerAppsAccount adımında kullanıcınız ile giriş yapmalısınız.

#Install the module

Install-Module -Name Microsoft.PowerApps.Administration.PowerShell

Write-Host “Creating a session against the Power Platform API”

Add-PowerAppsAccount -Endpoint prod

$jsonObject= @”

{

“PostProvisioningPackages”:

[

{

"applicationUniqueName": "msdyn_FinanceAndOperationsProvisioningAppAnchor",

"parameters": "DevToolsEnabled=true|DemoDataEnabled=true"

}

]

}

“@ | ConvertFrom-Json

New-AdminPowerAppEnvironment -DisplayName “DMRD365PowerShell” -EnvironmentSku Sandbox -Templates “D365_FinOps_Finance” -TemplateMetadata $jsonObject -LocationName “Europe” -ProvisionDatabase

Resim-2

Resim-3

Eğer her şey yolunda olursa Environment sekmesinden oluşturduğunuz  ortamı görebilirsiniz. Hem Dataverse ortamı hem de FO ortamı oluşturulacak. Linki kullanıp giriş yapabilirisiniz.

Resim-3

Dynamics 365 Finance ortamına girebilirsiniz.

Resim-4

Burada D365_FinOps_Finance kullanarak ortam oluşturduk. İhtiyaca göre aşağıdakilerden birinde kullanabiliriz ancak development açısından bir farkı yok.

Dynamics 365 Finance  Finance (preview)                               D365_FinOps_Finance

Dynamics 365 Supply Chain Management (preview)            D365_FinOps_SCM

Dynamics 365 Project Operations                                              D365_FinOps_ProjOps

Dynamics 365 Operations Application Partner Sandbox      D365_FinOps_ProjOps

Dynamics 365 Commerce                                                             D365_FinOps_Commerce

Bu yazıda Unified Admin Experience için gerekli olan ortam kurulumunun nasıl yapıldığını anlatmaya çalıştım. Sonraki yazılarımda bu ortama bağlanıp nasıl kod yazabiliyoruz anlatmaya çalışacağım.

Selamlar.

www.fatihdemirci.net

Kaynak: https://learn.microsoft.com/en-us/power-platform/admin/unified-experience/tutorial-deploy-new-environment-with-erp-template?tabs=PowerShell

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

Cloud Hosted Golden Configuration Ortamından UAT Ortamına Veri Tabanı Nasıl Kopyalanır?

Bu yazıda Dynamics 365 Finance and Operations içinde Golden Configuration olarak kullanılan bir Cloud Hosted ortamın verileri test ve canlı sisteme nasıl kopyalanır anlatmaya çalışacağım.

Öncelikle veriyi taşımak istediğimiz ortama bağlanıyoruz. Backup Restore ile AxDB nin bir kopyasını oluşturuyoruz. Kopyalama işlemini bu DB üzerinden yapacağız. Bu aşamadan sonra  kopyalamak istemediğiniz veriler varsa buradan temizleyebilirsiniz.

Resim-1

Sonrasında forma aşağıdaki scripti çalıştırıyoruz. Bu script bizim için bazı ayarları yapıyor ve bazı istenmeyen konfigürasyon verilerini temizliyor.

update sysglobalconfiguration

set value = ‘SQLAZURE’

where name = ‘BACKENDDB’

update sysglobalconfiguration

set value = 1

where name = ‘TEMPTABLEINAXDB’

drop procedure if exists XU_DisableEnableNonClusteredIndexes

drop procedure if exists SP_ConfigureTablesForChangeTracking

drop procedure if exists SP_ConfigureTablesForChangeTracking_V2

drop schema [NT AUTHORITY\NETWORK SERVICE]

drop user [NT AUTHORITY\NETWORK SERVICE]

drop user axdbadmin

drop user axdeployuser

drop user axmrruntimeuser

drop user axretaildatasyncuser

drop user axretailruntimeuser

drop user axdeployextuser

–Tidy up the batch server config from the previous environment

DELETE FROM SYSSERVERCONFIG

–Tidy up server sessions from the previous environment

DELETE FROM SYSSERVERSESSIONS

–Tidy up printers from the previous environment

DELETE FROM SYSCORPNETPRINTERS

–Tidy up client sessions from the previous environment

DELETE FROM SYSCLIENTSESSIONS

–Tidy up batch sessions from the previous environment

DELETE FROM BATCHSERVERCONFIG

–Tidy up batch server to batch group relation table

DELETE FROM BATCHSERVERGROUP

– Clear encrypted hardware profile merchant properties

update dbo.RETAILHARDWAREPROFILE set SECUREMERCHANTPROPERTIES = null where SECUREMERCHANTPROPERTIES is not null

Eğer kurulu değilse .NET Core for Windows Get sqlpackage .NET Core for Windows.  paketini kuruyoruz.

Command Prompt’u admin olarak açıp aşağıdaki scripti çalıştırıyoruz.  SqlPackage.exe sizde faklı klasörde olabilir biraz aramanız gerekebilir.

cd C:\Program Files\Microsoft SQL Server\160\DAC\bin

SqlPackage.exe /a:export /ssn:localhost /sdn:AXDB_CopyForExport /tf:D:\Exportedbacpac\AXDB_CopyForExport.bacpac /p:CommandTimeout=1200 /p:VerifyFullTextDocumentTypesSupported=false /SourceTrustServerCertificate:True

Resim-2

Export tamamlandıktan sonra Asset library’e yüklüyoruz.

Resim-3

UAT ortamına gidip Maintain menüsünden Move Database deyip açılan ekrandan Import database’i seçiyoruz.

Resim-4

Yüklediğimiz dosyayı seçip işlemi başlatıyoruz.

Resim-5

Bir kaç saat içinde işlemler tamamlanacak. History’den işlemin başarılı tamamlandığını görebilirsiniz.

Resim-6

Böylelikle Golden ortamından UAT ortamına veriyi taşımış olduk. Bu aşamadan sonra eğer istersek direk UAT den canlı ortama veriyi kopyalayabiliriz. Bu zaten ara yüzden basit bir işlemle yapılabiliyor.

Selamlar.

Kaynak: https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/database/dbmovement-scenario-goldenconfig

www.fatihdemirci.net

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

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: Ürün reçetesi günlüğü oluşturma ve nakletme.

Bu yazıda Dynamics 365 Finance and Operations içinde kodla ürün reçetesi günlüğü oluşturup deftere nakletmek için basit bir örnek vereceğim.

Bu günlükler ara yüzden de girilebilir. Ancak birçok durumda bizim otomatik oluşturmamız istenir.

Gelelim örnek kodumuzu. Bu örnek kod tek satırlı ve miktarı 1 olan basit bir günlük oluşturuyor ve deftere naklediyor. Burada bir madde kodundan diğerine aktarım yapıyoruz gibi düşünebilirsiniz.  Siz ihtiyacınıza göre değiştirebilirsiniz.

class DmrCreateBomJournal

{

public static void main(Args _args)

{

InventJournalTableData  journalTableData;

InventJournalTrans      inventJournalTrans;

InventJournalTrans      InventJournalTransOld;

JournalCheckPost        journalCheckPost;

InventJournalTable      journalTable;

InventDim               FromInventDim,toInventDim;

ItemId                  ItemId      = “I0002″;

ItemId                  toItemId    = “I0003″;

inventDimId             inventDimId = “D0003″;

InventJournalNameId     TransferJournalNameId;

InventTable             inventTable;

InventBatch             InventBatchNew;

InventDim               InventDim;

InventDim               inventDimFrom;

int i;

;

ttsbegin;

inventTable = inventTable::find(ItemId);

InventDim   = InventDim::find(inventDimId);

TransferJournalNameId = “S0944″;

journalTable.clear();

journalTable.JournalNameId  = TransferJournalNameId;

journalTable.initFromInventJournalName(InventJournalName::find(TransferJournalNameId));

journalTableData            = JournalTableData::newTable(journalTable);

journalTable.JournalId      = journalTableData.nextJournalId();

journalTable.JournalType    = InventJournalType::BOM;

journalTableData.initFromJournalName(journalTableData.JournalStatic().findJournalName(journalTable.journalNameId));

journalTable.Description    = “Bom journal”;

journalTable.insert();

i++;

inventDimFrom.clear();

inventDimFrom.initValue();

inventDimFrom.InventSiteId      = InventDim.InventSiteId;

inventDimFrom.InventLocationId  = InventDim.InventLocationId;

inventDimFrom.InventSizeId      = InventDim.InventSizeId;

inventDimFrom.inventBatchId     = InventDim.inventBatchId;

inventDimFrom = inventDim::findOrCreate(inventDimFrom);

InventJournalTransOld.clear();

InventJournalTransOld.ItemId           = ItemId;

InventJournalTransOld.InventDimId      = inventDimFrom.InventDimId;

InventJournalTransOld.JournalId        = journalTable.JournalId;

InventJournalTransOld.TransDate        = today();

InventJournalTransOld.BOMLine          = NoYes::Yes;

InventJournalTransOld.Qty              = -1;

InventJournalTransOld.JournalType      = InventJournalType::BOM;

InventJournalTransOld.LineNum = i;

InventJournalTransOld.insert();

i++;

InventJournalTrans.clear();

InventJournalTrans.ItemId              = toItemId;

if(!InventBatch::find(InventDim.inventBatchId ,toItemId) )

{

InventBatchNew.clear();

InventBatchNew.itemId = toItemId;

InventBatchNew.inventBatchId = InventDim.inventBatchId;

InventBatchNew.insert();

}

InventJournalTrans.InventDimId         = inventDimFrom.InventDimId;

InventJournalTrans.ItemId              = toItemId;

InventJournalTrans.Qty                 = 1;

InventJournalTrans.JournalId           = journalTable.JournalId;

InventJournalTrans.JournalType         = InventJournalType::BOM;

InventJournalTrans.TransDate           = today();

inventJournalTrans.LineNum = i;

InventJournalTrans.insert();

InventJournalTransold.InventTransIdFather = InventJournalTrans.InventTransId;

InventJournalTransOld.update();

journalCheckPost = InventJournalCheckPost::newPostJournal(journalTable);

if(journalCheckPost.validate())

{

journalCheckPost.run();

}

info(strFmt(“%1 journal created.”, journalTable.JournalId));

ttscommit;

}

}

Bu yazıda ürün reçetesi günlüğü oluşturma örneği paylaştım. Umarım faydalı olur.

Selamlar.

www.fatihdemirci.net

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

Page 1 of 171234510...Last »