MicrosoftDynamicsAxapta
Monday 29 July 2024
Override Lookup of form control.
[ExtensionOf(formStr(VendEditInvoice))]
final class XXX_VendEditInvoice_Extension
{
public void overridePaymSpecLookup(FormStringControl _formControl)
{
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(VendPaymModeSpec), _formControl);
Query query = new Query();
QueryBuildDataSource queryBuildDataSource;
VendInvoiceInfoTable vendInvoiceInfoTable = _formControl.formRun().dataSource().cursor() as VendInvoiceInfoTable;
queryBuildDataSource = query.addDataSource(tableNum(VendPaymModeSpec));
queryBuildDataSource.addRange(fieldNum(VendPaymModeSpec, PaymMode)).value(queryValue(vendInvoiceInfoTable.PaymMode));
sysTableLookup.addLookupfield(fieldNum(VendPaymModeSpec, Specification));
sysTableLookup.addLookupfield(fieldNum(VendPaymModeSpec, PaymMode));
sysTableLookup.addLookupfield(fieldNum(VendPaymModeSpec, Name));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
public void init()
{
next init();
PaymentInvoice_PaymSpec.registerOverrideMethod(methodStr(FormDataObject, lookup), formMethodStr(VendEditInvoice, overridePaymSpecLookup));
}
}
Wednesday 21 December 2022
SQL related
Restart UAT services.
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/deployment/maintenanceoperationsguide-newinfrastructure#restart-services
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/database/dbmovement-scenario-debugdiag
DevTest environment to connect to the UAT database
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/database/dbmovement-scenario-debugdiag
=================================================================================================
NET START "MR2012ProcessService"
NET START "DynamicsAxBatch"
NET START "Microsoft.Dynamics.AX.Framework.Tools.DMF.SSISHelperService.exe"
NET START "W3SVC"
PAUSE
NET STOP "MR2012ProcessService"
NET STOP "DynamicsAxBatch"
NET STOP "Microsoft.Dynamics.AX.Framework.Tools.DMF.SSISHelperService.exe"
NET STOP "W3SVC"
PAUSE
====================================================================================================
Shrink log file
https://www.linkedin.com/pulse/transaction-log-database-full-easy-steps-resolve-ashish-kale/
ALTER DATABASE AXDB
SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (PreProdDBBACKUP02_log, 1000)
GO
ALTER DATABASE AXDB
SET RECOVERY FULL //to get log file name and keep the file name above USE AxDB
GO
EXEC sp_helpfile
GO
=====================================
K:\AOSService\webroot\bin\Microsoft.Dynamics.AX.Deployment.Setup.exe -bindir "K:\AosService\PackagesLocalDirectory" metadatadir "K:\AosService\PackagesLocalDirectory" -sqluser "axdbadmin" -sqlserver "." -sqldatabase "AxDB" -setupmode "sync" -syncmode "fullall" -isazuresql "false" -sqlpwd "**axdbadmin p/w from LCS env page***"
pause
update userinfo
set ENABLE=1
where ID = 'Nicolas.Ramirez'
Power Shell command
CD "C:\Users\Admin281589b1f6\Desktop\SPE\sqlpackage-win7-x64-en-16.1.6374.0"
.\SqlPackage.exe /a:import /sf:K:\Newfolder\me-uatbackup.bacpac /tsn:localhost /tdn:AxDB_UAT0222 /p:CommandTimeout=1200 /TargetTrustServerCertificate:True
How to Backup And Restore Database In SQL Server
https://www.systoolsgroup.com/updates/backup-and-restore-database-in-sql-server/
ALTER DATABASE AxDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE AxDB MODIFY NAME = ORIG_4thJan2022;
ALTER DATABASE ORIG_4thJan2022 SET MULTI_USER
==============================================================================
DB properties >> Options >> Recovery model- Simple
Shrink file >> change file type to Log
DB backup >> Backup Options >> set backup compression - "Compress backup"
To check which tables are occupying more data , RC on DB >> Reports >> Standard Reports>> Disk usage by top tables.
Change DB in single user to multiuser
Use master
GO
select
d.name,
d.dbid,
spid,
login_time,
nt_domain,
nt_username,
loginame
from sysprocesses p
inner join sysdatabases d
on p.dbid = d.dbid
where d.name = 'AXDB'
Get the spid, use side to kill. , execute below both statements at a time.
GO
Kill 59
GO
ALTER DATABASE AXDB
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
=========================================================================================================================
ALTER DATABASE AXDB
SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (PreProdDBBACKUP02_log, 1000)
GO
ALTER DATABASE AXDB
SET RECOVERY FULL //to get log file name and keep the file name above USE AxDB
GO
EXEC sp_helpfile
GO
========================================================================================================================
--Find the logical name of database’s log file--
USE AXDB
GO
SELECT Name AS LogicalName, filename AS PhysicalFile
FROM sys.sysfiles
GO
--SHRINKFILE command--
USE AXDB
GO
-- Shrink the truncated log file to 8 MB--
DBCC SHRINKFILE (AXDB_UAT2402, 8);
GO
USE AXDB
GO
-- Shrink the truncated log file to 8 MB--
DBCC SHRINKFILE (AXDB_UAT2402_log, 8);
GO
USE AxDB;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AxDB
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AXDB_UAT2402_log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AxDB
SET RECOVERY FULL;
GO
======================================
dbcc sqlperf(logspace)
select * from sys.database_files
ALTER DATABASE AXDB
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (2, 1000);
GO
-- Reset the database recovery model.
ALTER DATABASE AXDB
SET RECOVERY FULL;
=====================================================
Compare Power BI reports
C:\Temp>fc "Financial Analysis - Fiscal - Copy.pbix" "Financial Analysis - Fiscal (1).pbix"
Comparing files Financial Analysis - Fiscal - Copy.pbix and FINANCIAL ANALYSIS - FISCAL (1).PBIX
FC: no differences encountered
Wednesday 26 January 2022
Restart services through power shell
NET START "MR2012ProcessService"
NET START "DynamicsAxBatch"
NET START "Microsoft.Dynamics.AX.Framework.Tools.DMF.SSISHelperService.exe"
NET START "W3SVC"
PAUS
ALTER DATABASE AXDBORIG SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE AXDBORIG MODIFY NAME = AXDB;
ALTER DATABASE AXDB SET MULTI_USER
Open In Excel
https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/financial/dimensions-overview
https://statics.teams.cdn.office.net/evergreen-assets/safelinks/1/atp-safelinks.html
https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/user-interface/add-templates-open-lines-excel-menu
For lookup add relations :
https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/financial/add-dimensions-excel-templates
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/office-integration/office-integration-edit-excel
Wednesday 23 June 2021
Customized lookup for form datasource field
class PurchtableFormEventHandler
{
[FormDataSourceEventHandler(formDataSourceStr(PurchTable, InventDim), FormDataSourceEventType::Initialized)]
public static void InventDim_OnInitialized(FormDataSource sender, FormDataSourceEventArgs e)
{
var overrides = PurchReqTableFormExtensionOverrides::construct();
sender.object(fieldNum(InventDim, InventSiteId)).registerOverrideMethod(methodStr(FormDataObject, lookup),
methodStr(PurchReqTableFormExtensionOverrides, InventSiteId_OnLookup), overrides);
}
}
==================================================================================================
public class PurchReqTableFormExtensionOverrides
{
protected void new()
{
}
public static PurchReqTableFormExtensionOverrides construct()
{
return new PurchReqTableFormExtensionOverrides();
}
public void InventSiteId_OnLookup(FormStringControl _callingControl)
{
String255 sUserId = curUserId();
HcmWorkerRecId workerRecId = HcmWorker::findByPerson(DirPersonuser::find(sUserId).PersonParty).RecId;
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(EmployeesSites), _callingControl);
Query query= new Query();
QueryBuildDataSource qbds = query.addDataSource(tableNum(EmployeesSites));
qbds.addRange(fieldNum(EmployeesSites, EmployeeID)).value(queryValue(workerRecId));
qbds.addRange(fieldNum(EmployeesSites, Company)).value(curExt());
sysTableLookup.addLookupfield(fieldNum(EmployeesSites, SiteId));
sysTableLookup.addLookupfield(fieldNum(EmployeesSites, SiteName));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
}
Thursday 19 November 2020
Display inventory dimensions dynamically in D365
The table must have the field InventDimId and it must have a relation with InventDim.
Image
2. Create a new Form. My form has two data sources, InventDimDisplay and InventDim (required) and a grid.
Image
3. Set the InventDim data source properties to:
Image
REPORT THIS AD
4. On form Design, create a new Grid and move the ItemId to your grid and then create a new Group and then set the properties below:
Image
5. On class declaration add the following piece of code:
1
2
3
4
5
public class FormRun extends ObjectRun
{
// Declare the class InventDimCtrl_Frm_EditDimensions
InventDimCtrl_Frm_EditDimensions inventDimFormSetup;
}
6. Now, create a new method in form.
1
2
3
4
public InventDimCtrl_Frm_EditDimensions inventDimSetupObject()
{
return inventDimFormSetup;
}
7. Override the form’s method Init.
1
2
3
4
5
6
public void init()
{
super();
// This method will be used to show default fields at form startup
element.updateDesign(InventDimFormDesignUpdate::Init);
}
8. Create a new method, this method is responsible to show the Inventory Controls.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void updateDesign(InventDimFormDesignUpdate mode)
{
InventDimParm inventDimParmVisible;
switch (mode)
{
// Form Init
case InventDimFormDesignUpdate::Init :
if (!inventDimFormSetup)
inventDimFormSetup = InventDimCtrl_Frm_EditDimensions::newFromForm(element);
inventDimFormSetup.parmSkipOnHandLookUp( true);
// Use the methods on InventDimParm
// to set which dimensions to show when form is initialized
inventdimparmvisible.inventsiteidflag = true;
inventdimparmvisible.InventLocationIdFlag = true;
inventDimFormSetup.parmDimParmVisibleGrid(inventDimParmVisible);
// Datasource Active
case InventDimFormDesignUpdate::Active :
inventDimFormSetup.formActiveSetup(InventDimGroupSetup::newItemId(InventDimDisplay.ItemId)); //InventDimDisplay is the datasource name.
inventDimFormSetup.formSetControls( true);
break;
// Datasource Field change
case InventDimFormDesignUpdate::FieldChange :
inventDimFormSetup.formActiveSetup(InventDimGroupSetup::newItemId(InventDimDisplay.ItemId)); //InventDimDisplay is the datasource name.
InventDim.clearNotSelectedDim(inventDimFormSetup.parmDimParmEnabled()); // InventDim is referring to datasource name
inventDimFormSetup.formSetControls( true);
break;
default :
throw error(strFmt ("@SYS54195", funcName()));
}
}
9. We have to create a method on data source to update our table InventDimId and use the method Active to refresh the controls.
Override Data source’s method Active.
1
2
3
4
5
6
7
public int active()
{
int ret;
ret = super();
element.updateDesign(InventDimFormDesignUpdate::Active);
return ret;
}
10. Now, override the method Modified for ItemId field in your data source.
1
2
3
4
5
6
7
public void modified()
{
super();
element.updateDesign(InventDimFormDesignUpdate::FieldChange);
InventDim.clearNotSelectedDim(element.inventDimSetupObject().parmDimParmEnabled());
}
11. We have to create a MenuItemButton to call the Display Dimension form where the user can select which dimensions he want to display.
Set the following properties:
MenuItemType: Display
MenuItemName: InventDimParmFixed
12. By the end of this tutorial, your form should look like this.
Image
13. The results:
Image
Monday 28 September 2020
Use data entity and import through X++ code
EcoResProductV2Entity ecoResProductEntity;
NumberSequenceReference numberSequenceReference = EcoResProductParameters::numRefProductNumber();
NumberSequenceTable numberSequenceTable = numberSequenceReference.numberSequenceTable();
NumberSeq numberSeq = NumberSeq::newGetNumFromId(numberSequenceTable.RecId);
ecoResProductEntity.ProductNumber = numberSeq.num();
ecoResProductEntity.ProductSearchName = _prodIntegrationTable.SearchName;
switch (_prodIntegrationTable.ProductType)
{
case 'Item':
ecoResProductEntity.ProductType = EcoResProductType::Item;
break;
case 'Service':
ecoResProductEntity.ProductType = EcoResProductType::Service;
break;
}
switch (_prodIntegrationTable.ProductSubType)
{
case 'Product':
ecoResProductEntity.ProductSubType = EcoResProductSubtype::Product;
break;
case 'Product Master':
ecoResProductEntity.ProductSubType = EcoResProductSubtype::ProductMaster;
break;
}
ecoResProductEntity.RetailProductCategoryName = _prodIntegrationTable.Category;
if (ecoResProductEntity.ProductSubType == EcoResProductSubtype::ProductMaster)
{
ecoResProductEntity.ProductDimensionGroupName = _prodIntegrationTable.ProductDimensionGroup;
switch (_prodIntegrationTable.ConfigTechnology)
{
case "@SYS301180":
ecoResProductEntity.VariantConfigurationTechnology = EcoResVariantConfigurationTechnologyType::PredefinedVariants;
break;
case "@SYS301187":
ecoResProductEntity.VariantConfigurationTechnology = EcoResVariantConfigurationTechnologyType::DimensionBased;
break;
case "@SYS301188":
ecoResProductEntity.VariantConfigurationTechnology = EcoResVariantConfigurationTechnologyType::ConstraintBased;
break;
}
ecoResProductEntity.ProductVariantNameNomenclatureName = _prodIntegrationTable.ProdVariantNameNomenclature;
ecoResProductEntity.ProductVariantNumberNomenclatureName = _prodIntegrationTable.ProdVariantNumNomenclature;
}
EcoResProductV2EntityToCrossTableDataAdaptor adaptor = EcoResProductV2EntityToCrossTableDataAdaptor::newFromEntity(ecoResProductEntity);
EcoResProduct product = EcoResProductCrossTableManager::makeProductRecord(adaptor);
EcoResProductCrossTableManager::insert(adaptor, product);
BisProductCreationNPIImportProductCreation::updateEcoResProduct(_prodIntegrationTable, product.DisplayProductNumber);
return product;
Subscribe to:
Posts (Atom)