Import HRM Positions from Excel through X++
You can use different options to import data into Dynamics AX 2012 specially the subject line entity (Positions). Data import/export framework would be the best option to import it, you can also use excel addins for this purpose. However, due to large number of tables involved in few import process it might be difficult to judge right tables and their sequence. You can also use X++ code to import data into AX either from CSV file or from Excel file. The following job in X++ may help you in importing positions from excel file. static void ImportHRPosition(Args _args) { SysExcelApplication application; SysExcelWorkbooks workbooks; SysExcelWorkbook workbook; SysExcelWorksheets worksheets; SysExcelWorksheet worksheet; SysExcelCells cells; COMVariantType type; OMOperatingUnit OMOperatingUnit; int row=1; Name name; FileName filename; HcmPosition HcmPosition; HcmPositionDetail HcmPositionDetail; HcmPositionWorkerAssignment HcmPositionWorkerAssignment; HcmPositionDuration HcmPositionDuration; str job; OMOperatingUnitNumber department; ; application = SysExcelApplication::construct(); workbooks = application.workbooks(); filename = “C:\import\HRPosition.xlsx”; ttsBegin; try { workbooks.open(filename); } catch (Exception::Error) { throw error(“File cannot be opened.”); } workbook = workbooks.item(1); worksheets = workbook.worksheets(); worksheet = worksheets.itemFromNum(1); cells = worksheet.cells(); do { row++; HcmPosition.PositionId = cells.item(row, 1).value().bStr(); HcmPosition.insert(); department = cells.item(row, 2).value().bStr(); job = cells.item(row, 3).value().bStr(); select firstOnly OMOperatingUnit where OMOperatingUnit.OMOperatingUnitNumber == department; if(OMOperatingUnit) { HcmPositionDetail.Department = OMOperatingUnit.RecId; HcmPositionDetail.Job = HcmJob::findByJob(job).RecId; HcmPositionDetail.Position = HcmPosition.RecId; HcmPositionDetail.Title = HcmTitle::findByTitle(HcmJobDetail::findByJob(HcmPositionDetail.Job).Description).RecId; HcmPositionDetail.Description = cells.item(row, 4).value().bStr(); HcmPositionDetail.ValidFrom = DateTimeUtil::newDateTime(cells.item(row, 5).value().date(),timeNow()); HcmPositionDetail.ValidTo = DateTimeUtil::maxValue(); HcmPositionDetail.insert(); HcmPositionWorkerAssignment.ValidFrom = DateTimeUtil::newDateTime(cells.item(row, 5).value().date(),timeNow()); HcmPositionWorkerAssignment.ValidTo = DateTimeUtil::maxValue(); HcmPositionWorkerAssignment.Position = HcmPosition.RecId; HcmPositionWorkerAssignment.Worker = HcmWorker::findByPersonnelNumber(cells.item(row, 6).value().bStr()).RecId; HcmPositionWorkerAssignment.insert(); HcmPositionDuration.Position = HcmPosition.RecId; HcmPositionDuration.ValidFrom = HcmPositionWorkerAssignment.ValidFrom; HcmPositionDuration.ValidTo = DateTimeUtil::maxValue(); HcmPositionDuration.insert(); type = cells.item(row+1, 1).value().variantType(); } } while (type != COMVariantType::VT_EMPTY); application.quit(); ttsCommit; }
SysDictTable object not intialized – Data Import/Export Framework
I got the following error while importing Employee Master data using Data Import/Export Framework (from staging to target entities). After doing some debugging I found there was a table “RetailStaffTable” in Emloyee Entity structure but the Retail configuration key was turned off or Retail components were not installed. I ended up deleting the record from the DMFTargetEntityHierarchy table. (Alt+F9 to delete from table browser). I reran the process and it went fine.
Restrict non-admin users to open multiple sessions in AX
Few times client asked to restrict their users to not open AX sessions multiple times. As It may impact on performance somehow. The following code snipet can do this job for you. NOTE: Please take backup of your application before copying code Copy Paste the Following Code in startupPost method of info class in AOTvoid startupPost(){ // To restrict user login form second login xSession session; SysClientSessions SysClientSessions; UserId currentUserId; int counter; currentUserId = curUserId(); if(currentUserId!=”Admin”)// Allow Admin User to login multiple time { while select SysClientSessions where SysClientSessions.userId == currentUserId && SysClientSessions.Status == 1 // 1 : Login 0 : Logout { session = new xSession(SysClientSessions.SessionId, true); if (session && session.userId()) { counter++; } } if (counter >= 2) { Box::stop(“Already Logged-in : The same user id can’t log in twice.”); infolog.shutDown(true); } }}