Pages

Saturday, June 13, 2026

LCS’den PPAC’e Geçiş: D365 Finance & Operations’ta Elastic Compute Dönemi

 Microsoft’un Dynamics 365 Finance & Operations platformunda gerçekleştirdiği LCS (Lifecycle Services) → PPAC (Power Platform Admin Center) dönüşümü, ilk bakışta yalnızca bir yönetim portalı değişikliği gibi görünebilir. Ancak gerçekte bu geçiş, D365 FO altyapısının çalışma mantığında köklü bir değişimi temsil etmektedir.

Bu dönüşümün en önemli parçalarından biri ise “Elastic Compute” modelidir.

Sabit Katman (Tier) Döneminin Sonu

Uzun yıllar boyunca D365 Finance & Operations ortamları sabit katman mantığı ile yönetiliyordu. Örneğin bir Tier 2 Sandbox veya Production ortamı belirli bir CPU ve bellek kapasitesine sahipti.

Bu model bazı önemli kısıtlar getiriyordu:

  • Sandbox ve Production ortamları farklı topolojilere sahipti.
  • UAT ve performans testleri gerçek Production davranışını tam olarak yansıtmıyordu.
  • Kapasite artırımı için destek talepleri, sözleşme değişiklikleri veya ortam yükseltmeleri gerekiyordu.

Sonuç olarak müşteriler, gelecekteki yüklerini önceden tahmin etmek ve buna göre kapasite satın almak zorundaydı.

Elastic Compute Nedir?

PPAC ile birlikte Microsoft, sabit sunucu kapasitesi yaklaşımından uzaklaşarak elastik ölçeklenebilirlik modeline geçiyor.

Yeni modelde müşteriler artık belirli boyutta sunucular satın almıyor; bunun yerine ihtiyaç duyulduğunda otomatik olarak genişleyen bir kapasite havuzundan faydalanıyor.

Bu sayede Sandbox ve Production ortamları aynı performans modelini kullanıyor.

Bunun en önemli sonucu şudur:

Sandbox ortamlarında yapılan performans testleri, Production davranışına çok daha yakın sonuçlar vermeye başlayacaktır.

AOS Mimarisi Nasıl Değişiyor?

D365 Finance & Operations’ın temel işlem katmanı olan Application Object Server (AOS), sistemin iş yükünü taşımaya devam ediyor.

AOS sunucuları;

  • X++ iş mantığını çalıştırır,
  • Kullanıcı işlemlerini yönetir,
  • OData ve özel servis çağrılarını işler,
  • Entegrasyon trafiğini yönetir,
  • Batch süreçlerini yürütür.

Yeni mimaride bir ortam en fazla:

  • 40 adet Interactive AOS
  • 40 adet Batch AOS

olmak üzere toplam 80 AOS instance’a kadar ölçeklenebilmektedir.

Microsoft yeni ortamları minimum kapasitede değil, orta seviyede bir başlangıç kapasitesi ile oluşturmaktadır. Böylece günlük operasyonlarda performans sorunları yaşanmasının önüne geçilmektedir.

Kullanıcı sayısı arttığında veya sistem yükü yükseldiğinde platform otomatik olarak yeni AOS instance’ları devreye alabilmektedir.

Bu ölçekleme sırasında:

  • Servis kesintisi yaşanmaz,
  • Kullanıcı oturumları kaybolmaz,
  • Uygulama erişilebilir kalmaya devam eder.

Ölçek Küçültme Neden Daha Farklı?

Ölçek büyütmek görece kolaydır. Ancak ölçek küçültmek daha dikkatli yönetilmesi gereken bir süreçtir.

Bunun nedeni AOS sunucularının “stateful” yapıda olmasıdır. Kullanıcı oturumları ve önbellek bilgileri sunucu belleğinde tutulmaktadır.

Bu nedenle Microsoft, ölçek küçültme işlemlerini genellikle:

  • Planlı bakım süreçlerinde,
  • Uygulama güncellemelerinde,
  • Deploy işlemleri sırasında

gerçekleştirmektedir.

Böylece kullanıcı deneyimi korunurken sistem yeniden temel kapasitesine dönebilmektedir.

Yeni Kapasite Birimi: Power Platform Requests (PPR)

Elastic Compute ile birlikte lisanslama yaklaşımı da değişmektedir.

Eskiden kapasite sunucu katmanları üzerinden tanımlanırken, yeni modelde kapasite Power Platform Requests (PPR) üzerinden yönetilmektedir.

Temel prensipler şu şekildedir:

  • Her AOS instance yaklaşık 650.000 PPR kapasitesine karşılık gelmektedir.
  • Dynamics 365 lisansı bulunan tenant’lara başlangıçta 500.000 PPR verilmektedir.
  • Kullanıcı lisansları ilave PPR kapasitesi sağlamaktadır.
  • Gerektiğinde ek PPR satın alınarak kapasite artırılabilmektedir.

Bu yaklaşım, altyapı satın alma modelinden tüketim bazlı bulut modeline geçiş anlamına gelmektedir.

Müşteriler İçin Ne Değişecek?

Örneğin;

  • 300 kullanıcısı olan,
  • Yoğun API entegrasyonları kullanan,
  • Power Automate süreçleri çalıştıran,
  • Copilot ve Dataverse yeteneklerinden faydalanan

bir şirket düşünelim.

Ay sonu finansal kapanış döneminde sistem yükü ciddi şekilde artabilir.

Eski modelde bu durum için önceden kapasite planlaması yapmak gerekiyordu.

Yeni modelde ise yeterli PPR kapasitesi bulunduğu sürece sistem ihtiyaca göre otomatik olarak büyüyebilecektir.

Bu da D365 Finance & Operations’ı klasik ERP altyapısından uzaklaştırarak, Azure benzeri gerçek bir bulut platformuna dönüştürmektedir.

Sonuç

LCS’den PPAC’e geçiş yalnızca yeni bir yönetim ekranı anlamına gelmiyor.

Bu değişim, Dynamics 365 Finance & Operations’ın Power Platform ile bütünleşmiş, otomatik ölçeklenebilen ve tüketim bazlı çalışan modern bir SaaS platformuna dönüşümünü temsil ediyor.

Gelecekte D365 FO yöneten ekiplerin yalnızca ortam yönetimini değil, aynı zamanda PPR kapasitesi, ölçeklenebilirlik ve Power Platform entegrasyonlarını da yönetmesi gerekecek.

Çünkü artık D365 dünyasında asıl soru:

“Kaç sunucu kullanıyorum?” değil, “Ne kadar kapasite tüketiyorum?” olacaktır.

Saturday, November 26, 2022

D365 FO error: Unable to install this application because an application with the same identity is already installed

I was trying to open workflow configuration form in D365 Finance and getting below error.

Unable to install this application because an application with the same identity is already installed. To install this application, either modify the manifest version for this application or uninstall the preexisting application.

Cause

This issue occurs if the application was cached in the ClickOnce application cache. The application must be removed from the cache before you can successfully run it.

Solution

To clear the ClickOnce application cache, follow these steps:

  1. Click Start, click Run, type cmd, and then click OK.
  2. Type the following command, and then press Enter: rundll32 dfshim CleanOnlineAppCache

Monday, October 25, 2021

D365 FO Task recorder screenshots

 https://syedrafayali.wordpress.com/2019/02/14/dynamics-365-task-recorder-screenshots-extensions/

Wednesday, October 28, 2020

Setting up PowerBI embedded and Analytical workspaces in Dynamics 365 for Finance and Operations in a OneBox Environment


https://docs.microsoft.com/en-us/archive/blogs/dynamicsaxbi/accessing-analytical-workspaces-on-1box-environment

 


http://www.everythingdynamicsaxbi.com/2019/02/03/how-to-configure-power-bi-embedded-for-dynamics-365-for-finance-and-operations-one-box-environment/


Saturday, December 28, 2019

Attaching a selected document to Dynamics 365 for Finance and Operations



 PurchTable              purchaseTable;
       System.Net.WebClient    webClient;
       System.IO.MemoryStream  stream;

FileUploadTemporaryStorageResult fileUploadResult = File::GetFileFromUser (classstr(ImageFileUploadTemporaryStorageStrategy));
       
        if (fileUploadResult && fileUploadResult.getUploadStatus())
        {
            str imageFilePathName = fileUploadResult.getDownloadUrl();

            InteropPermission perm = newInteropPermission(InteropKind::ClrInterop);
            perm.assert();
            
            // BP Deviation Documented
            webClient = new System.Net.WebClient();
            // BP Deviation Documented
            stream = newSystem.IO.MemoryStream(webClient.DownloadData(imageFilePathName));
           
select purchaseTable where purchaseTable.PurchId == "PO-0002"// any record for tables

DocuRef docuref =DocumentManagement::attachFile(purchaseTable.TableId,purchaseTable.RecId, purchaseTable.DataAreaId,DocuType::typeFile(),stream,fileUploadResult.getFileName(), fileUploadResult.getFileContentType(),fileUploadResult.getFileName());
            // download/view the attachment
            str displayUrl = DocumentManagement::getAttachmentPublicUrl(docuref);
            Browser br = new Browser();
            br.navigate(displayUrl);
            CodeAccessPermission::revertAssert();
        }

thanks for great help...

Wednesday, November 13, 2019

run report not in d365 fo menu

Wednesday, November 6, 2019

default dimension ve ledger dimension relationship


thank you for blog Bill Frandsen..

https://blogs.msdn.microsoft.com/ax_gfm_framework_team_blog/2013/02/15/ledger-account-combinations-part-1-dimensions/

Introduction

In Dynamics AX 2009, dimensions were limited to a minimum of three and a maximum of ten, and entered in a set order that required code customizations and database synchronization for each dimension added. In Dynamics AX 2012, the dimension framework was expanded to allow unlimited dimensions which can be dynamically created by the user, and entered in any order. The unlimited nature of the new model, coupled with taking advantage of relational database design as well as optimizing for performance requirements has led to a more complex data model than existed in the past.  In this series of blog posts, we will discuss the various areas of the dimension framework, and how they work together to give a better understanding of “What happens when I create a ledger account combination?”
The model below in figure 1 shows the various areas within the dimension framework.
Figure 1: Dimensions in framework
This initial blog post covers the Dimensions, Dimension Values, Categorizations and Backing Entities regions highlighted in figure 1 above in pale yellow.
Subsequent blog posts will cover:

Dimension Attributes

A dimension attribute, which will be referred to as a dimension, simply represents an additional piece of classifying information that a user would like to associate with a ledger account combination. It represents classes of things, not specific instances. Examples of things that can be used to create a dimension are Department, Cost Center, Expense Purpose, Customer, Vendor, Item – which are all classes of entities that already exist in the system; or custom entities that are specific to a particular installation such as license plate number or event name or ticket number.
When a dimension is created, the user chooses to use values for it from either an existing entity in the system such as Customers or Departments, or to create a custom list. The dimension framework keeps track of a reference for this dimension to a table in the system.  For existing entities such as Customers, a reference to the CustTable table is used.  For custom entities that are defined by the user, a reference to the DimensionFinancialTag table is used.  This metadata about what a dimension represents is stored in the DimensionAttribute table for each dimension defined. 
The following form shows an example of two dimensions, one to represent customers that already exist in the application, and another that represents a new custom list.
Figure 2: Financial dimensions form
The data is stored in the DimensionAttribute table. The SQL query below in figure 3 shows some of the basic information associated with each dimension.
Figure 3: DimensionAttribute storage query results
The Type determines whether the dimension is backed by an existing entity in the system or a custom list.  It is also important to note that the dimension framework does not directly reference the existing entity backing table such as CustTable. Instead, a custom view is created to make an entity available in the system for use in the dimension framework. As of Dynamics AX 2012 R2, 36 existing entities have been enabled to be used as dimensions in the system.  
It is possible for a user to create more than one dimension based on the same entity. There may be instances where an entity in the system is used for multiple different purposes when classifying transaction activity in the system.  In this case, multiple dimensions can be defined for it, one for each of its purposes.  A common example would be a cost center backing entity used to represent the primary cost center (e.g. selling) and the cost center the transaction is being traded against (e.g. purchasing).
Internally, special dimensions exist that are automatically created to support key functionality of the dimension framework. A primary example is the Main Account dimension. This allows a main account to be treated as a dimension by the dimension framework, but also prevents it from being used by a user to create a dimension. The other types of special dimensions are system generated ones that are used by the dimension framework for internal purposes.

Dimension Attribute Values

A dimension attribute value is a specific instance of a dimension used within the dimension framework. The values for a dimension are determined by the ViewName specified on the DimensionAttribute record. In the case of an existing entity, such as CustTable, values consist of the records in that table. In the case of a custom list, it is a specific set of records within the DimensionFinancialTag table.  Values that are available for a particular dimension are viewable by clicking the “Financial dimension values” button on the Dimension details form as shown in figure 2 above. When the list is provided by an existing entity, such as CustTable, it is not editable from this form. To create a new dimension value for Customer, the user would go directly to the Customer form and create a new customer.  Once created, the new customer will become available for use in the dimension framework. When the list is provided by the user as a custom list, the user will be able to modify the list directly on this form.
Example of a list of values provided by CustTable (with no values stored in the dimension framework):
Figure 4: Financial dimensions values form (existing list)
 Example when provided by a custom list (with values stored in the dimension framework):
  Figure 5: Financial dimensions form (custom list)
Figure 6: Dimension setup tables query results
In both of these cases, the Financial dimension values form is displaying what values exist for the entity, not what values have actually been used within the dimension framework.  The dimension framework representation of these values is not created until it is used within the framework requiring it to hold a reference to it. This allows for the ability for values to be deleted that have not yet been used, and for storage size and performance optimization.
Once a dimension value is referenced requiring it to be saved by the dimension framework, it is stored in the DimensionAttributeValue table.  This table is the link between the DimensionAttribute and the specific RecId of the record in the ViewName view or table referenced on the DimensionAttribute. Both the DimensionAttribute and DimensionAttributeValue records are needed to navigate back to the originating value that the user has entered.
In a system where nothing has been referenced by the dimension framework, there will be no records in the DimensionAttributeValue table.
In the next blog post, the storage of dimensions as dimension enumerations and of dimension values as default dimensions will be explained.

Monday, July 29, 2019

Create warehouse addresses through code


  

 InventLocation                           warehouse;
    LogisticsPostalAddressView      postalAddressView;
    LogisticsPostalAddress              postalAddress;
    LogisticsEntityLocationMap       locationMap;
    container                                   role, roleMap;
    Map                                         LocationRoleMap;
    LogisticsPostalAddressEntity    postalAddressEntity  = new LogisticsPostalAddressEntity();
    ;
    warehouse                                            = InventLocation::find('CR004');
    postalAddressView.Street                    = 'Test street222';
    postalAddressView.City                       = 'Tcity';
    postalAddressView.State                     = '';
    postalAddressView.ZipCode               = '622001';
    postalAddressView.CountryRegionId   = 'SASCO';
    postalAddressView.LocationName       = 'TDlvAddr';
    postalAddress        = postalAddressEntity.createPostalAddress(postalAddressView);
    locationMap           = LogisticsEntityLocationMap::find(tableNum(InventLocationLogisticsLocation), warehouse.RecId, postalAddress.Location);
    locationMap.Entity                      = warehouse.RecId;
    locationMap.Location                 = postalAddress.Location;
    locationMap.IsPostalAddress     = NoYes::Yes;
    locationMap.IsPrimary               = NoYes::Yes;
    locationMap.IsPrivate                = NoYes::No;
    LocationRoleMap       = LogisticsLocationEntity::getDefaultLocationRoleFromEntity(tableName2id("InventLocation"));
    roleMap                     = map2Con(LocationRoleMap);
    role                            = conpeek(roleMap, 1);
    locationMap.addEntityLocation(role ,true);



thanks. http://axcorner.blogspot.com/2014/01/create-warehouse-addresses-through-code.html

Tuesday, December 12, 2017

Lookup not works in Enterprise portal

If user clicks on lookups then lookup form will display but the selected value will not reflect in to the text box.
Solution: Disable IE ESC for the users
1. Open the Server Manager Tool. Configure IE ESC is located on the right hand side of the interface in the section heading Security Information.
2. Select the link Configure IE Esc and the configuration window will open. At this point you can choose whether to turn off IE ESC for Administrators or for Users or for both.

Wednesday, November 1, 2017

hata: excel aktarım: The number of arguments provided is different from the number of arguments accepted by the method.

The number of arguments provided is different from the number of arguments accepted by the method.
Update post : 
The solution is  :
boolean importLines()
{
    SysExcelApplication         application = SysExcelApplication::construct();
    SysExcelWorkBooks           workBooks   = application.workbooks();
    SysExcelWorkSheets          workSheets;
    SysExcelWorkSheet           workSheet;
    SysExcelCells               cells;
    
// the solution is puting the bellow line code  after initializing SysExcelApplication
application.displayAlerts(false);
//.... code

//and In the end 
application.workbooks().close(); 
application.quit(); 
application.finalize(); 
application = null;
 }

Sunday, February 12, 2017

Approve Workflow by Code x++


WorkflowWorkItemTable WorkflowWorkItemTable;

    while select WorkflowWorkItemTable
    where
        WorkflowWorkItemTable.UserId == 'hasan.bi'
    &&  workflowWorkItemTable.Type == WorkflowWorkItemType::WorkItem
    &&  workflowWorkItemTable.Status == WorkflowWorkItemStatus::Pending
    &&  WorkflowWorkItemTable.RefTableId == tableNum(CPMContractAdvanceRequest)
    {
        WorkflowWorkItemActionManager::dispatchWorkItemAction(
                                    WorkflowWorkItemTable,
                                    "Auto Approve by ADMIN", // comment
                                    'hasan.bi', // << user ID
                                    WorkflowWorkItemActionType::Complete,
                                    "CPMContractAdvanceRequestAppApprove", // << menu item action approval workflow
                                    false); //is not web Menu Item
    }

Sunday, February 5, 2017

CIL generation errors and solutions

thansks blog..

http://axvuongbao.blogspot.com.tr/2013/12/fix-parameter-could-not-be-serialized.html


Fix some errors from: CIL generation, Database Synchronize in AX 2012

1.) "A parameter could not be serialized":
For a quick resolve: uncheck option "Excute business operations in CIL"  under Tools-> Options -> Development tab.












The reason is that you haven't been able to do a successful FULL CIL compile.
Run again and try to fix the error in CIL.

2.)"CIL generation: source array was not long enough...":

1. Stop the AOS.
2. Delete all of the source in the C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\XppIL directory.
3. Start the AOS.
4. Perform a full CIL generation.
5.(Only do if errors are still there and you have no error when compile X++, just comment the code notice in Compiler output with /*..*/, recompile CIL and delete comment tag)

3.) "CIL generation error : The given key was not present in the dictionary":

1. Check the CIL log file, generally located at "C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\XppIL\Dynamics.Ax.Application.dll.log"
2. You will find the AOT object for which the CIL generator found the error.
3. Compile that object, fix the error, or delete (if needed) and then regenerate the IL.
4. (Only do if errors are still there : Stop AOS > Delete the .auc file from users\\Appdata  folder > Restart AOS)

4.) DB synchronize error: "Field mismatch in union query. Field ... is not compatible with field ..."

Check your EDT concern to that field ( in query, table, view). They have different size.
So you just change the size to be the same.
Or check someone changed size of standard EDT. It's the reason cause this error

5.) "Duplicate type with name 'Dynamics.Ax.application.' in assembly 'Dynamics.Ax.application "

1. Stop the ax service.

2. Truncate the SysXPPAssembly in db model
3. Delete all the files in below directory in server where AOS hosted:

C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\XppIL

4. Start the service

5. Compile full CIL

Tuesday, January 3, 2017

Email drill-down link not working

Copy the AxHLink.Exe...

Wednesday, December 28, 2016

Ax 2012 deki Word-Add in çilesine karşı 2009 Document Handling ile devam



https://www.youtube.com/watch?v=NVSxc2jg2iY


Tuesday, November 15, 2016

Document Attachment through X++

static void hb_attach(Args _args)

{

DocuRef docuRef;

DocuActionArchive archive;

CustTable _custtable;

str _name;

;

 

_name=@"c:\\hb.docx";

select RecId from _custtable where _custtable.AccountNum =="M0001";

 

if (_custtable!=null)

{

ttsBegin;

docuRef.clear();

docuRef.RefRecId = _custtable.RecId;

docuRef.RefTableId = tableNum("custtable");

docuRef.RefCompanyId = curext();

docuRef.Name = _name;

docuRef.TypeId = 'File';

docuRef.insert();

archive = new DocuActionArchive();

archive.add(docuRef, _name);

ttsCommit;

}

}

Get full physical path on attachment AX 2012

select firstOnly  DocuReforder by docuRef.RecId DESC   where       DocuRef.RefRecId     == 645484   &&  docuRef.RefTableId   == 56446   &&  docuRef.RefCompanyId == curext();
   filename            =   DocuRef.completeFilename();

Monday, November 14, 2016

Send event by x++

static void Event_sendAlertByCode(Args _args)
{
    EventNotificationSource _source;
    EventNotification       event = EventNotification::construct(EventNotificationSource::Sync);
    InventTable             inventTable;
    ;

    inventTable = InventTable::find('03.09.2013');  // sample record for which alert is shown

    event.parmRecord(inventTable);
    event.parmUserId(curuserid());      // user for which this alert to be shown
    event.parmDataSourceName('InventTable');  //form datasource
    event.parmMenuFunction(new MenuFunction('InventTable', MenuItemtype::Display));
    event.parmSubject('Test');
    event.parmMessage('Test Event alert');
    event.create();

}

Send mail with outlook


    Description255             recipientEmail;
    Notes                            emailBody;
    Description255             subjectText;
    Filename                       fileName;
    SmmOutlookEmail         smmOutlookEmail = new SmmOutlookEmail();
  
    recipientEmail = "test@hotmail.com";
    subjectText     = "Test Email";
    fileName          = @"C:\Users\admin\Desktop\test.jpg";
    emailBody       = "Hi,\nThis is a test email";
  
    if (smmOutlookEmail.createMailItem())
    {
        smmOutlookEmail.addEMailRecipient(recipientEmail);
        smmOutlookEmail.addSubject(subjectText);
        smmOutlookEmail.addFileAsAttachment(fileName);
        smmOutlookEmail.addBodyText(emailBody);
        smmOutlookEmail.sendEMail(smmSaveCopyOfEMail::No,true);// false for outlook popup
    }
    else
    {
        error("Could not communicate with Microsoft Outlook Client.");
    }

Friday, November 11, 2016

progressbar sample

static void operationProgress_progressBars(Args _args)
{
#AviFiles
SysOperationProgress progress = new SysOperationProgress();
int i;
;

progress.setCaption("Progress bar example…");
progress.setAnimation(#AviUpdate);
progress.setTotal(10000);
    progress.getCount_RU();
for (i = 1; i <= 10000; i++)
{
 progress.setText(strfmt("The value of i is %1", i));
 progress.setCount(i, 1);
}

Thursday, November 10, 2016

Kill the excel


System.Collections.IEnumerable processes;
System.Collections.IEnumerator enumerator;
System.Diagnostics.Process process;
    
try
{
    processes = System.Diagnostics.Process::GetProcessesByName("EXCEL");
    enumerator = processes.GetEnumerator();
    
    while (enumerator.MoveNext())
    {
        process = enumerator.get_Current();
        process.Kill();
    }
}
catch (Exception::CLRError)
{
    throw error(AifUtil::getClrErrorMessage());
}

thanks for Martin. Martin!!! you are the man:)
https://dynamicsuser.net/ax/f/developers/68865/axapta-close-windows-application-process-with-x