Transforming X++ into a General Web-Based Application Development Platform.

Microsoft Dynamics 365 F&SCM/FO/AX/Axapta was originally developed in collaboration between IBM and the Danish company Damgaard Data, with the first version released as IBM Axapta in March 1998. Axapta included its own development system, a combination of MorphX and the X++ programming language. MorphX and X++ had went through a significant evolution after Microsoft acquired the product in 2002. Initially, it was only designed to support enterprise resource planning processes, but today, with the support of Microsoft’s vision and technologies, X++ has become a powerful web development platform, but is still only available within Dynamics 365 F&SCM.

Along with its rapid development capabilities, strong database integration, high performance, object-oriented programming and the ability to efficiently manage business rules, X++ is able to provide fast and excellent solutions to the complexity of the business world. Currently, thousands of additional solutions developed with X++ are successfully used in ERP. However, the dependency of these solutions on Dynamics 365 F&SCM infrastructure limits their potential customer base.

In this article, we will discover the benefits of X++ becoming a mainstream web development platform and the opportunities this transformation can create for business, Microsoft and the X++ ecosystem. With detailed analysis and examples, we will evaluate how this transformation can be realized, the implications and challenges it may bring. Finally, we will try to create a platform for the entire ecosystem to discuss this transformation.

Why should this transformation be essential, and what benefits will it bring when completed?

  • There are currently thousands of modules and functions are written by X++. While these are currently dependent on Dynamics 365 F&SCM, many of them can be productized and sold independently. Developing these products with a different language that lacks of an  infrastructure similar to X++ is both costly and challenging. Leveraging these existing products through AppSource or independent sales could create numerous opportunities for Dynamics 365.
  • X++ allows for the rapid and easy development of many corporate web products, providing opportunities for both the X++ and Dynamics 365 ecosystems. Additionally, product and solution diversity will will support to growing Dynamics 365′s competitive position. Producing products with X++ is faster and more reliable than other languages.
  • This transformation will expand X++ ecosystem. The interaction of different resources working with X++ will allow for solutions to emerge in unexpected areas. Moreover, the growth of this ecosystem will positively impact the growth of Dynamics 365 F&SCM, enhancing its visibility.
  • Making X++ a new and easily accessible language for training resources will increase its appeal, especially for individuals at the beginning of their careers. Additionally, there will be no need for virtual machines or lengthy installations for training, making X++ development easily experiencable for many.
  • Open-source logic can be applied to X++ projects, resulting in the development of more powerful products. Furthermore, aligning with Microsoft‘s vision, this transformation will accelerate the development of X++.
  • The existing X++ ecosystem simplifies the widespread adoption and training of this new structure. Numerous X++ trainers and creators are already exists and more can be quickly added.
  • Along with these new products and ecosystem, cross-sell and co-sell opportunities will be increased.
  • The current structure of the X++ development environment is already suitable for this transformation. I believe that this transformation can be accomplished with a relatively uncomplicated project. With the contribution of volunteers from the X++ ecosystem, an initial version for training purposes could be released. In this version, the ability to create new objects would be sufficient.
  • Given that products developed with X++ can be easily integrated into the Microsoft ecosystem and provides cost advantages, they will be preferable.
  • X++ can be a language and platform for education, particularly for foundational software training in schools, especially in Object-Oriented Programming and Database Management courses. To support this, educational content can be prepared.
  • X++ language and development framework are enable the easy, fast, and reliable development of products. Particularly, the simplicity in database transactions, the structure of EDT and Enum, the security architecture, and the organized nature of Events provide for well-organized code and the creation of straightforward solutions for complex needs. Applications hosting large volumes of data can be developed easily.
  • It’s noteworthy that within the current X++ environment, developers already possess the capability to write code in C# and make use of .NET libraries seamlessly. This inherent flexibility allows for a powerful synergy between the robust features of X++ and the extensive functionalities offered by C# and the broader .NET ecosystem. Leveraging this advantage, the transformation of X++ into a comprehensive web-based development platform gains an extra layer of versatility. Developers, familiar with C# syntax and accustomed to working with .NET libraries, can seamlessly transition their skills to enhance X++ applications. This not only streamlines the development process but also extends the potential areas of application, making X++ an even more adaptable and developer-friendly platform.
  • While Microsoft currently offers Power Pages for citizen developers as a web development tool, there is no such tool for core developers. X++ can quickly fill this gap. This transformation will not only avoid competition with Microsoft‘s other products,it will also increase the usage of Power Platform and Dynamics 365. On the Azure side, it is anticipated to have an even greater impact.
  • Especially in corporate web solutions where data processing is crucial and complex code is required, X++ can be quickly and easily put into operation, making it a highly preferred tool.

How can X++ be transformed into a general web development platform?

  • The most important step towards X++‘s goal of becoming a general software development language starts with having a structure that can be easily developed locally like C#. At this point, the current state is very close to this goal, but the size of the system complicates this transformation. A language that gets rid of this complexity can realize this evolution much more smoothly.
  • X++ should be come with a framework that simplifies development, not just the language itself. When I refer to X++, I mean the development structure that comes with the framework. This structure is the main goal we want to achieve. Thus, while there will be an Application Object Tree (AOT), almost no standard objects will be present initially. When developing a new application, we should be able to include different modules in our project if we wish.

Structures that can be optionally added include:

  1. User management
  2. Standard EDTs and Enums
  3. Security infrastructure
  4. Workflow management
  5. Address management
  6. Company structure
  7. Data Management Framework (DMF)
  8. SQL Server Reporting Services (SSRS)
  9. Office integration
  10. Batch jobs
  11. Web service structure
  12. Power platform integration
  13. Power BI
  14. Model package management
  • Servers for a product developed with X++ can be made ready on Azure. These offers make advantage of Azure consumption.. However, this should not be a requirement and alternative options should be available.
  • It should be compatible with different versions of SQL Server. It can be done in the future to enhance its ability to work with various databases, expanding integration opportunities with different databases.
  • The initial version can start in a simpler form, leaving out structures that could complicate matters initially, such as Map, Extension, Table Extension, etc.
  • The standard Dynamics 365 F&SCM structure can remain the same. This should be released as a new product.

In Conclusion:

Throughout this article, we have examined many advantages of transforming X++ into a general web development platform. X++ is known as a language that stands out with its robust database management, rapid development capabilities, object-oriented programming features, and effective business rule management. However, using these powerful features in the context of general web development will open up access to a wider user base and offer potential solutions in various projects.

The evolution of X++ into a general web development platform not only creates new opportunities but also allows for the modernization of existing projects. Developers can produce more efficient, faster, and powerful projects with this transformation. This feature will gives companies a competitive advantage and allowing the language to create a richer ecosystem with a broader developer base.

However, achieving these goals requires not only technical challenges but also community support, educational resources and developer collaboration. Get through these challenges and leveraging the potential of X++ can provide benefits to developers and to the business world.

In conclusion, the transformation of X++ into a general web development platform allows for a wider perspective on the language. This transformation will carry out the foundations of the language into general web applications, providing more effective and competitive solutions in future projects.The X++ community, the developer team, and Microsoft can contribute together to ensure the success of this journey. I can’t wait to see what the future holds!

Happy Daxing!

Fatih Demirci

2024

X++, Genel Bir Web Geliştirme Teknolojisi Haline Getirilmelidir!

Microsoft Dynamics 365 F&SCM/FO/AX/Axapta, orijinal olarak IBM ve Danimarka firması Damgaard Data işbirliği ile geliştirilmiş ve ilk versiyonu IBM Axapta olarak Mart 1998′de piyasaya sürülmüştü. Axapta kendi geliştirme sistemi içeriyordu MorphX ve X++ programlama dilinin bir kombinasyonu. MorphX ve X++ 2002’de Microsoft’un ürünü satınalmasından sonra önemli bir evrim geçirdi. Başlangıçta, sadece kurumsal kaynak planlama süreçlerini desteklemek amacıyla tasarlanmıştı ancak bugün Microsoft’un vizyonu ve teknolojilerinin desteğiyle birlikte, X++ güçlü bir web geliştirme platformu haline geldi ama hala sadece Dynamics 365 ERP içinde kullanılabiliyor.

X++, hızlı geliştirme yetenekleri, güçlü veri tabanı entegrasyonu, yüksek performans, nesne yönelimli programlama ve iş kurallarını etkili bir şekilde yönetme yetenekleri ile iş dünyasının karmaşıklığına hızlı ve mükemmel çözümler sunabiliyor. Şu an için X++ ile geliştirilmiş binlerce ek çözüm ERP içinde başarıyla kullanılıyor. Ancak bu çözümlerin Dynamics 365 ERP altyapısına bağımlı olması potansiyel müşteri kitlesini sınırlıyor.

Bu makalede X++‘ın genel bir web geliştirme platformu haline gelmesinin faydalarını ve bu dönüşümün iş dünyası, Microsoft ve X++ ekosistemi için yaratabileceği fırsatları keşfedeceğiz. Detaylı analizler ve örneklerle bu dönüşümün nasıl gerçekleştirilebileceğini, beraberinde getireceği sonuçları, karşılaşabileceği zorlukları değerlendireceğiz. Nihayetinde, bu dönüşümün tüm ekosistem tarafından tartışılmasını sağlayacak bir zemin oluşturmaya çalışacağız.

İyi okumalar dilerim!

Neden bu dönüşüm yapılmalı ve yapıldığında ne gibi faydaları olacak?

  • X++ ile yazılmış binlerce modül ve fonksiyon mevcut. Şu anda bunlar Dynamics 365 ERP’ye bağımlı durumda. Birçoğu ürünleştirilip tek başına satılabilir. X++ benzeri altyapısı olmayan farklı bir dil ile bu ürünleri geliştirmek çok maliyetli ve zor. Oysa ki hazır olan bu ürünler, AppSource aracılığıyla veya bağımsız bir şekilde kolayca satılabilir. Bu sayede Dynamics 365 için de birçok fırsatın ortaya çıkması mümkün olacaktır.
  • Birçok kurumsal web ürünü, X++ sayesinde hızlı ve kolay bir şekilde geliştirilebilir. Bu durum, hem X++ hem de Dynamics 365 ekosistemine birçok fırsat sunacaktır. Ayrıca, ürün ve çözüm çeşitliliği, Dynamics 365‘in rekabet içinde daha güçlü bir konuma gelmesine katkı sağlayacaktır. Diğer dillerle kıyaslandığında X++ ile ürün ortaya çıkarmak çok daha hızlı ve güvenilir olacaktır.
  • Bu dönüşüm, X++ ekosistemini genişletecektir. X++ ile çalışan farklı kaynakların etkileşimi, beklenmeyen alanlarda çözümlerin ortaya çıkmasına olanak tanıyacaktır. Ayrıca, bu büyüyen ekosistem sayesinde Dynamics 365 ERP‘nin büyümesine de olumlu etkisi olacak, bilinirliliğini arttıracaktır.
  • Bu dönüşüm, X++ için yeni kaynak eğitimini çok kolay ve çekici hale getirecektir. Kariyerinin başında olan kişiler için tercih edilebilir bir dil olma özelliğini artıracaktır. Ayrıca, eğitim vermek için sanal makineler veya uzun kurulumlara ihtiyaç olmayacak; bu sayede birçok kişi X++ ile geliştirmeyi kolayca deneyimleyebilecektir.
  • Açık kaynak kod mantığı ile projeler geliştirilebilir. Bu sayede çok daha güçlü ürünlerin ortaya çıkması sağlanabilir. Ayrıca, Microsoft vizyonuna uygun olarak X++‘ın gelişimini de hızlandıracaktır.
  • Hazır bir X++ ekosistemi olduğu için, bu yeni yapının yaygınlaştırılması ve eğitimi çok kolayca yapılabilir. Halihazırda birçok X++ eğitmeni ve içerik üreticisi mevcut; bunlara hızlıca yenileri eklenecektir.
  • Bu yeni ürünler ve ekosistem sayesinde cross-sell ve co-sell imkanları artacaktır.
  • X++ geliştirme ortamının son yapısı zaten bu dönüşüm için çok uygun. Çok karmaşık olmayan bir proje ile bu dönüşümün yapılabileceğine inanıyorum. X++ ekosisteminden gönüllülerin de katkısıyla öncelikle eğitim amaçlı bir sürüm çıkarılabilir. Bu sürümde sadece yeni nesne oluşturma imkanı olması yeterli olacaktır.
  • X++ ile üretilen bu ürünlerin Microsoft ekosistemine kolayca entegre edilebilecek olması ve maliyet avantajları sunması, tercih edilebilir olmasını sağlayacaktır.
  • X++ bir eğitim dili ve platformu haline gelebilir. Okullarda temel yazılım eğitimlerinde kullanılabilir, özellikle Nesne Yönelimli Programlama ve Veri Tabanı Yönetimi derslerinde temel dil olarak öğretilebilir. Bunu desteklemek için eğitim içerikleri hazırlanabilir.
  • X++ dili ve geliştirme frameworku çok kolay, hızlı ve güvenilir ürün geliştirmeye olanak sağlıyor. Özellikle veri tabanı ile olan işlemlerdeki kolaylık, EDT ve Enum yapısı, güvenlik yapısı, ve Event’lerin düzenlenmiş olması, kodların çok daha iyi organize olmasına ve karmaşık ihtiyaçlar için bile yalın çözümlerin üretilebilmesini sağlamaktadır. Büyük verileri barındıracak uygulamalar kolayca geliştirilebilecektir.
  • Microsoft hali hazırda Power Pages ile citizen developerlar için bir web geliştirme aracı sunuyor ancak core developerlar için böyle bir araç yok bu eksikliği X++ çok kolay ve hızlıca kapatabilir.
  • Bu dönüşüm Microsoft’un diğer ürünleri ile rekabet etmeyecek hatta Power Platfrom ve Dynamics 365 kullanımını arttıracaktır. Azure tarafında ise çok daha büyük bir etkisi olması öngörülmüştür.
  • X++ ile özellikle veri işlemenin önemli olduğu, karmaşık kod ihtiyacı olan kurumsal web çözümleri çok kolay ve hızlıca devreye alınabilir. Bu da çok tercih edilen bir araç olmasını sağlayacaktır.

X++, genel web geliştirme platformu haline nasıl getirilebilir?

  • X++‘ın genel bir yazılım geliştirme dili olma hedefine yönelik en önemli adım, C# gibi yerelde kolayca geliştirilebilen bir yapıya sahip olması ile başlar. Bu noktada, mevcut durum bu hedefe oldukça yaklaşmış durumdadır ancak sistem büyüklüğü bu dönüşümü karmaşıklaştırmaktadır. Bu karmaşıklıktan sıyrılan bir dil, bu evrimi çok daha sorunsuz bir şekilde gerçekleştirebilir.
  • X++ tek başına değil geliştirmeyi kolaylaştıran framework ile birlikte gelmelidir. Bu yüzden ben X++ derken sadece dili değil framework ile birlikte olan geliştirme yapısını kastediyorum. Bu yapı zaten asıl ulaşmak istediğimiz hedef. Dolayısıyla AOT olacak ama nerdeyse standart hiç bir nesne başlangıçta olmayacak. Standart hiç bir nesnenin kullanılmadığı yeni bir geliştirme yaptığımızda neler yapıyorsak aynısını yapabileceğimiz bir yapı hayal ediyorum. Yeni bir uygulamaya başlarken istersek faklı modulleri projemize dahil edebilmeliyiz.

İsteğe bağlı olarak eklenebilecek yapılar şunlar olabilir:

  1. Standart EDT ve Enumlar.
  2. Güvenlik altyapısı
  3. Kullanıcı yönetimi
  4. İş akışı yönetimi
  5. Adres yönetimi
  6. Şirket yapısı
  7. DMF
  8. SSRS (SQL Server Reporting Services)
  9. Ofis entegrasyonu
  10. Toplu işler
  11. Web servis yapısı
  12. Power platform entegrasyonu
  13. Power BI
  14. Model paket yönetimi
  • X++ ile geliştirilen bir ürün için sunucular Azure üzerinde hazır hale getirilebilir. Bu, Azure tüketimini sağlama avantajı sunar. Ancak, bu bir zorunluluk olmamalı ve farklı alternatifler de kullanılabilir olmalıdır.
  • SQL Server‘ın farklı versiyonları ile uyumlu olmalıdır. Gelecekte çeşitli veri tabanlarıyla çalışabilme yeteneğini geliştirmek adına çalışmalar yapılabilir. Bu çeşitli veri tabanlarıyla entegrasyon imkanlarını genişletebilir bu yeni olanakları beraberinde getirebilir.
  • İlk versiyon, daha basit bir formda başlayabilir. Karmaşıklaştırabilecek yapılar başlangıçta dışarıda bırakılabilir. Örneğin Map, Extension, Table Extension vs.

Sonuç;

Bu yazı boyunca, X++ dilinin genel bir web geliştirme platformu haline getirilmesinin pek çok avantajını inceledik. X++ güçlü veri tabanı yönetimi, hızlı geliştirme yetenekleri, nesne yönelimli programlama özellikleri ve iş kurallarını etkili bir şekilde yönetme kabiliyetleri ile öne çıkan bir dil olarak bilinir. Ancak bu güçlü özelliklerin genel web geliştirme bağlamında kullanılması, daha geniş bir kullanıcı kitlesine erişme ve çeşitli projelerde etkili çözümler sunma potansiyelini ortaya çıkaracaktır.

X++‘ın genel web geliştirme platformu olarak evrimleşmesi, yeni fırsatlar yaratmanın yanı sıra mevcut projeleri de modernleştirme şansı sunar. Geliştiriciler, bu dönüşümle birlikte daha verimli, hızlı ve güçlü projeler üretebilirler. Bu, şirketlere rekabet avantajı kazandırırken, geniş bir geliştirici kitlesiyle dilin daha zengin bir ekosistem oluşturmasına olanak tanır.

Ancak, bu hedeflere ulaşmak için teknik zorlukların yanı sıra topluluk desteğine, eğitim kaynaklarına ve geliştirici işbirliğine ihtiyaç vardır. X++ genel web geliştirme platformu haline getirilirken, bu zorlukları aşmak ve dilin potansiyelini tam anlamıyla değerlendirmek, sadece geliştiricilere değil aynı zamanda iş dünyasına da büyük avantajlar sağlayabilir.

Sonuç olarak, X++‘ın genel web geliştirme platformu haline getirilmesi, dilin daha geniş bir perspektiften değerlendirilmesini sağlar. Bu dönüşüm, dilin güçlü temellerini genel web uygulamalarına taşırken, gelecekteki projelerde daha etkili ve rekabetçi çözümler sunma potansiyelini artırır. X++ topluluğu, geliştirici ekibi ve Microsoft bu yolculukta birlikte çalışarak dilin başarıya ulaşmasına katkıda bulunabilir. Gelecekteki gelişmeleri sabırsızlıkla bekliyorum.

İyi kodlamalar!

SysDa Sınıflarını Kullanarak Join Nasıl Yazılır?

Bu yazıda Dynamics 365 Finance and Operations içinde sorgu yazmanın yeni bir yöntemi olan SysDa API ‘ından bahsetmeye devam edeceğim. Bir önceki yazımda Order By örneği paylaşmıştım. Bu örnekte Join yazımını inceleyeceğim.

Gelelim örneğimize,

internal final class DmrFDJobSysDaSelect6

{

public static void main(Args _args)

{

InventTable inventTable;

InventTrans inventTrans;

while select ItemId , Qty from inventTrans

where inventTrans.Qty > 30000000

join NameAlias from inventTable

where inventTrans.ItemId == inventTable.ItemId

{

info(strFmt("%1 %2 %3" , inventTrans.ItemId , inventTable.NameAlias , inventTrans.Qty));

}

var sysDaQInventTrans = new SysDaQueryObject(InventTrans);

var sysDaQInventTable = new SysDaQueryObject(InventTable);

sysDaQInventTrans.joinClause(SysDaJoinKind::InnerJoin , sysDaQInventTable);

var flInventTrans = sysDaQInventTrans.projection()

.add(fieldStr(InventTrans, ItemId ))

.add(fieldStr(InventTrans, qty));

var flInventTable = sysDaQInventTable.projection()

.add(fieldStr(inventTable, NameAlias ));

sysDaQInventTable.WhereClause(new SysDaEqualsExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, itemId)),

new SysDaFieldExpression(inventTable, fieldStr(inventTable, itemId))));

sysDaQInventTrans.WhereClause(new SysDaGreaterThanExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, qty)),

new SysDaValueExpression(30000000)));

var sysDaSO = new SysDaSearchObject(sysDaQInventTrans);

var sysDaSS = new SysDaSearchStatement();

while (sysDaSS.findNext(sysDaSO))

{

info(strFmt("%1 %2 %3" , inventTrans.ItemId , inventTable.NameAlias , inventTrans.Qty));

}

}

}

Selamlar.

www.fatihdemirci.net

TAGs: SysDa, Microsoft Dynamics 365, MsDyn365FO, MsDyn365, X++, Azure DevOps,

SysDa Sınıflarını Kullanarak Order By ve Group By Nasıl Yazılır?

Bu yazıda Dynamics 365 Finance and Operations içinde sorgu yazmanın yeni bir yöntemi olan SysDa API ‘ından bahsetmeye devam edeceğim. Bir önceki yazımda select örneği paylaşmıştım. Bu örnekte Order By ve Group By yazımını inceleyeceğim.

Gelelim örneğimize, Aşağıdaki gibi bir Order By ifadesimi SysDa ile nasıl yapacağımız bakalım.

internal final class DmrFDJobSysDaSelect3

{

public static void main(Args _args)

{

InventTrans inventTrans;

while select ItemId , Qty from inventTrans

order by ItemId desc

where inventTrans.Qty > 30000000

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

var sysDaQ = new SysDaQueryObject(InventTrans);

var s = sysDaQ.projection()

.add(fieldStr(InventTrans, ItemId ))

.add(fieldStr(InventTrans, qty));

sysDaQ.orderByClause().addDescending(fieldStr(InventTrans, itemId));

sysDaQ.WhereClause(new SysDaGreaterThanExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, qty)),

new SysDaValueExpression(30000000)));

var sysDaSO = new SysDaSearchObject(sysDaQ);

var sysDaSS = new SysDaSearchStatement();

while (sysDaSS.findNext(sysDaSO))

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

}

}

Şimdi Group by yazımına bakalım:

internal final class DmrFDJobSysDaSelect3

{

public static void main(Args _args)

{

InventTrans inventTrans;

while select ItemId , sum(qty) from inventTrans

group by ItemId

where inventTrans.Qty > 20000000

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

var sysDaQ = new SysDaQueryObject(InventTrans);

var s = sysDaQ.projection()

.add(fieldStr(InventTrans, ItemId ))

.addSum(fieldStr(InventTrans, qty));

sysDaQ.groupByClause().add(fieldStr(InventTrans, ItemId));

sysDaQ.WhereClause(new SysDaGreaterThanExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, qty)),

new SysDaValueExpression(20000000)));

var sysDaSO = new SysDaSearchObject(sysDaQ);

var sysDaSS = new SysDaSearchStatement();

while (sysDaSS.findNext(sysDaSO))

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

}

}

Selamlar.

www.fatihdemirci.net

TAGs: SysDa, Microsoft Dynamics 365, MsDyn365FO, MsDyn365, X++, Azure DevOps,

SysDa Sınıflarını Kullanarak Select Nasıl Yazılır?

Bu yazıda Dynamics 365 Finance and Operations içinde sorgu yazmanın yeni bir yöntemi olan SysDa API ‘ından bahsetmeye devam edeceğim. Bir önceki yazımda While select örneği paylaşmıştım. Bu örnekte direk select yazımını inceleyeceğim.

Gelelim örneğimize, Aşağıdaki gibi bir select ifadesimi SysDa ile nasıl yapacağımız bakalım.

select ItemId , Qty from inventTrans

where inventTrans.Qty > 30000000;

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

Şimdi SysDa ile yazalım:

var sysDaQ = new SysDaQueryObject(InventTrans);

var s = sysDaQ.projection()

.add(fieldStr(InventTrans, ItemId ))

.add(fieldStr(InventTrans, qty));

sysDaQ.WhereClause(new SysDaGreaterThanExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, qty)),

new SysDaValueExpression(30000000)));

var sysDaSO = new SysDaFindObject(sysDaQ);

new SysDaFindStatement().execute(sysDaSO);

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

Bu yazıda SysDa API’ına giriş yaptım. Daha ileri seviye örneklerle anlatmaya devam edeceğim.

Selamlar.

www.fatihdemirci.net

TAGs: SysDa, Microsoft Dynamics 365, MsDyn365FO, MsDyn365,  X++, Azure DevOps,

SysDa Sınıflarını Kullanarak Sorgu Nasıl Yazılır?

Bu yazıda Dynamics 365 Finance and Operations içinde sorgu yazmanın yeni bir yöntemi olan SysDa API ‘ından bahsedeceğim. Extend edilebilir yapısıyla neredeyse X++ ile yapılan tüm DB işlemlerini destekliyor. Performansı Normal select ifadesiyle nerdeyse aynı. Ayrıca set-based işlemleri destekliyor. (Update_recordset, insert_recordset, and delete_from)

Gelelim örneğimize, Aşağıdaki gibi bir select ifadesimi SysDa ile nasıl yapacağımız bakalım.

InventTrans inventTrans;

while select ItemId , Qty from inventTrans

where inventTrans.Qty > 30000000

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

Şimdi SysDa ile yazalım:

InventTrans inventTrans;

var sysDaQ = new SysDaQueryObject(InventTrans);

var s = sysDaQ.projection()

.add(fieldStr(InventTrans, ItemId ))

.add(fieldStr(InventTrans, qty));

sysDaQ.WhereClause(new SysDaGreaterThanExpression(

new SysDaFieldExpression(inventTrans, fieldStr(InventTrans, qty)),

new SysDaValueExpression(30000000)));

var sysDaSO = new SysDaSearchObject(sysDaQ);

var sysDaSS = new SysDaSearchStatement();

while (sysDaSS.findNext(sysDaSO))

{

info(strFmt("%1 %2" , inventTrans.ItemId , inventTrans.Qty));

}

Bu yazıda SysDa API’ına giriş yaptım. Daha ileri seviye örneklerle anlatmaya devam edeceğim. Select mi Query mi sorunu çok sorardık. Artık Select mi, Query mi, SysDa mı diyeceğiz gibi duruyor.

Selamlar.

www.fatihdemirci.net

TAGs: SysDa, Microsoft Dynamics 365, MsDyn365FO, MsDyn365,  X++, Azure DevOps,

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

Page 1 of 4012345102030...Last »