Create Ledger Dimension for Legder journal Trans line in D365 using X++
To create a General journal header and Line using excel/CSV file(It was a client requirement , instead of using DMF).
internal final class CSVLedgerJournalImportCSV extends RunBaseBatch
{
private str availableTypes = ".csv";
//In the class Declaration control names for OK and upload control
private const str OkButtonName = 'OkButton';
private const str FileUploadName = 'FileUpload';
Dialog dialog;
str textFile;
QueryRun gQueryRun;
HCL_tempLedgerJournalTransForImport tempLedgerJournalTransForImport;
#define.CurrentVersion(3)
public Object dialog()
{
DialogGroup dialogGroup;
FormBuildControl formBuildControl;
FileUploadBuild dialogFileUpload;
Set enumSet = new Set(Types::Enum);
dialog = super();
dialogGroup = dialog.addGroup("File path");
formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());
dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);
dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));
dialogFileUpload.fileTypesAccepted(availableTypes);
dialogFileUpload.fileNameLabel("@SYS308842");
return dialog;
}
protected void setDialogOkButtonEnabled(DialogRunbase _dialog, boolean _isEnabled)
{ FormControl okButtonControl = this.getFormControl(_dialog, OkButtonName);
if (okButtonControl)
{
okButtonControl.enabled(_isEnabled);
}
}
protected FormControl getFormControl(DialogRunbase _dialog, str _controlName)
{
return _dialog.formRun().control(_dialog.formRun().controlId( _controlName));
}
protected void uploadCompleted()
{
FileUpload fileUpload = this.getFormControl(dialog, FileUploadName);
fileUpload.notifyUploadCompleted -= eventhandler(this.UploadCompleted);
textFile = fileUpload.fileName();
this.setDialogOkButtonEnabled(dialog, true);
}
/// Disables the dialog Ok button until the file upload is complete.
public void dialogPostRun(DialogRunbase _dialog)
{
FileUpload fileUpload = this.getFormControl(_dialog, FileUploadName);
fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);
this.setDialogOkButtonEnabled(_dialog, false);
}
/// <summary>
/// Prcoess class where the CSV file is accesed and storeinto table for furhter journal creations
/// </summary>
void processCSVFile()
{
#File
container currentLine;
int totalOfLines;
CommaTextStreamIo localStream;
Num number;
int fileLineNumber;
CSVLedgerJournalImportCSV ledgerJournalmportCSV;
FileUpload fileUploadControl = this.getFormControl(dialog, FileUploadName);
FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();
if (fileUploadResult != null && fileUploadResult.getUploadStatus())
{
textFile = fileUploadResult.getDownloadUrl();
}
localStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(textFile));
if (localStream.status() != IO_Status::Ok)
{
throw error(strfmt('Is not possible to open the file. Error %1',enum2str(localStream.status())));
}
localStream.inFieldDelimiter("\,");
localStream.inRecordDelimiter("\n");
currentLine = localStream.read();
fileLineNumber++;
if(conlen(currentLine) == 1)
{
throw error('Is not possible to import the file, incorrect format');
}
currentLine = localStream.read();
fileLineNumber++;
while(currentLine)
{
tempLedgerJournalTransForImport.clear();
LedgerJournalACType ledgerJournalACType;
tempLedgerJournalTransForImport.COMPANY = conPeek(currentLine,1);//Company
//tempLedgerJournalTransForImport.JOURNALNUM = conPeek(currentLine,2);//Journal
tempLedgerJournalTransForImport.JOURNALNAME = conPeek(currentLine,2);//Name
tempLedgerJournalTransForImport.TRANSDATE = str2Date(conPeek(currentLine,3),213);//Date
tempLedgerJournalTransForImport.ACCOUNTTYPE = str2Enum(ledgerJournalACType,conPeek(currentLine,4));//AccountType
tempLedgerJournalTransForImport.LINENUM = conPeek(currentLine,5);//LineNum
tempLedgerJournalTransForImport.LedgerDimension = this.getLedgerDimension(conPeek(currentLine,6),conPeek(currentLine,7),conPeek(currentLine,8),conPeek(currentLine,9),conPeek(currentLine,10),conPeek(currentLine,11),NoYes::Yes);
tempLedgerJournalTransForImport.TXT = conPeek(currentLine,12);//Text
tempLedgerJournalTransForImport.AMOUNTCURDEBIT = conPeek(currentLine,13);//Debit
tempLedgerJournalTransForImport.AMOUNTCURCREDIT = conPeek(currentLine,14);//Credit
tempLedgerJournalTransForImport.INVOICE = conPeek(currentLine,15);//Inv006oiceNumber
tempLedgerJournalTransForImport.DUE = str2Date(conPeek(currentLine,16),213);//Due Date
tempLedgerJournalTransForImport.OFFSETACCOUNTTYPE = str2Enum(ledgerJournalACType,conPeek(currentLine,17));//OffsetAccountType
if (conPeek(currentLine,18))
{
tempLedgerJournalTransForImport.OffsetLedgerDimension = this.getLedgerDimension(conPeek(currentLine,18),conPeek(currentLine,19),conPeek(currentLine,20),conPeek(currentLine,21),conPeek(currentLine,22),conPeek(currentLine,23),NoYes::No);
}
tempLedgerJournalTransForImport.PAYMENT = conPeek(currentLine,24);//Terms of payment
tempLedgerJournalTransForImport.DOCUMENTNUM = conPeek(currentLine,25);//Document
tempLedgerJournalTransForImport.DOCUMENTDATE = conPeek(currentLine,26);//Document Date
tempLedgerJournalTransForImport.PAYMMODE = conPeek(currentLine,27);//Method of Payment
tempLedgerJournalTransForImport.CURRENCYCODE = conPeek(currentLine,28);//Currency
tempLedgerJournalTransForImport.BANKTRANSTYPE = conPeek(currentLine,29);//Bank Transaction Type
tempLedgerJournalTransForImport.PAYMREFERENCE = conPeek(currentLine,30);//Payment Reference
tempLedgerJournalTransForImport.insert();
//info(strFmt("Number : %1",number));
currentLine = localStream.read();
}
ledgerJournalmportCSV = new CSVLedgerJournalImportCSV();
ledgerJournalmportCSV.createJournal();
}
/// <summary>
/// Class entry point. The system will call this method when a designated menu
/// is selected or when execution starts and this class is set as the startup class.
/// </summary>
/// <param name = "_args">The specified arguments.</param>
public static void main(Args _args)
{
CSVLedgerJournalImportCSV ledgerJournalmportCSV;
ledgerJournalmportCSV = new HCL_LedgerJournalImportCSV();
ledgerJournalmportCSV.prompt();
{
ttsbegin;
ledgerJournalmportCSV.processCSVFile();
ttscommit;
}
}
protected void createJournal()
{
LedgerJournalTable ledgerJournalTable;
JournalTableData journalTableData;
LedgerjournalTrans ledgerjournalTrans;
HCL_tempLedgerJournalTransForImport tempLedgerJournalTransForImportLoc1, tempLedgerJournalTransForImportLoc2;
while select journalName,CurrencyCode from tempLedgerJournalTransForImportLoc1
group by journalName
{
ledgerJournalTable.initFromLedgerJournalName("");//from excel file
journalTableData = JournalTableData::newTable(ledgerJournalTable);
ledgerJournalTable.JournalNum = journalTableData.nextJournalId();
ledgerJournalTable.JournalName = tempLedgerJournalTransForImportLoc1.JournalName;
ledgerJournalTable.CurrencyCode = tempLedgerJournalTransForImportLoc1.CurrencyCode;
if (ledgerJournalTable.validateWrite())
{
ledgerJournalTable.insert();
}
if (ledgerJournalTable.RecId)
{
//create a Temp table // based on excel
while select * from tempLedgerJournalTransForImportLoc2
where tempLedgerJournalTransForImportLoc2.JournalName == ledgerJournalTable.JournalName
{
ledgerJournalTrans.COMPANY = tempLedgerJournalTransForImportLoc2.COMPANY;
ledgerJournalTrans.JOURNALNUM = ledgerJournalTable.JournalNum;
ledgerjournalTrans.Voucher = this.getVoucher(ledgerJournalTable);
//ledgerJournalTrans.JOURNALNAME = tempLedgerJournalTransForImportLoc2.JOURNALNAME;
ledgerJournalTrans.TRANSDATE = tempLedgerJournalTransForImportLoc2.TRANSDATE;
ledgerJournalTrans.ACCOUNTTYPE = tempLedgerJournalTransForImportLoc2.ACCOUNTTYPE;
ledgerJournalTrans.LINENUM = tempLedgerJournalTransForImportLoc2.LINENUM;
ledgerJournalTrans.LedgerDimension = tempLedgerJournalTransForImportLoc2.LedgerDimension;
ledgerJournalTrans.TXT = tempLedgerJournalTransForImportLoc2.TXT;
ledgerJournalTrans.AMOUNTCURDEBIT = tempLedgerJournalTransForImportLoc2.AMOUNTCURDEBIT;
ledgerJournalTrans.AMOUNTCURCREDIT = tempLedgerJournalTransForImportLoc2.AMOUNTCURCREDIT;
ledgerJournalTrans.INVOICE = tempLedgerJournalTransForImportLoc2.INVOICE;
ledgerJournalTrans.DUE = tempLedgerJournalTransForImportLoc2.DUE;
ledgerJournalTrans.OFFSETACCOUNTTYPE = tempLedgerJournalTransForImportLoc2.OFFSETACCOUNTTYPE;
ledgerJournalTrans.OffsetLedgerDimension = tempLedgerJournalTransForImportLoc2.OffsetLedgerDimension;
ledgerJournalTrans.PAYMENT = tempLedgerJournalTransForImportLoc2.PAYMENT;
ledgerJournalTrans.DOCUMENTNUM = tempLedgerJournalTransForImportLoc2.DOCUMENTNUM;
ledgerJournalTrans.DOCUMENTDATE = tempLedgerJournalTransForImportLoc2.DOCUMENTDATE;
ledgerJournalTrans.PAYMMODE = tempLedgerJournalTransForImportLoc2.PAYMMODE;
ledgerJournalTrans.CURRENCYCODE = tempLedgerJournalTransForImportLoc2.CURRENCYCODE;
ledgerJournalTrans.BANKTRANSTYPE = tempLedgerJournalTransForImportLoc2.BANKTRANSTYPE;
ledgerJournalTrans.PAYMREFERENCE = tempLedgerJournalTransForImportLoc2.PAYMREFERENCE;
ledgerjournalTrans.Approved = NoYes::Yes;
ledgerJournalTrans.SkipBlockedForManualEntryCheck = true;
/*
ledgerJournalTrans.defaultRow();
*/
if (ledgerJournalTrans.validateWrite())
{
ledgerjournalTrans.insert();
}
}
}
//return ledgerJournalTable.JournalNum;
}
delete_from tempLedgerJournalTransForImport;
}
public Voucher getVoucher(ledgerJournalTable _ledgerJournalTable)
{
NumberSequenceTable numberSequenceTable;
numberSequenceTable = NumberSequenceTable::find(LedgerJournalName::find(_ledgerJournalTable.JournalName).NumberSequenceTable);
return NumberSeq::newGetVoucherFromCode(numberSequenceTable.NumberSequence).voucher();
//return NumberSequenceTable::find(numberSequenceTable.RecId).vouch
}
/// <summary>
/// </summary>
/// <returns>Return the class desc</returns>
public client server static ClassDescription description()
{
return "Ledger journal import CSV";
}
/// <summary>
/// </summary>
/// <returns>Whether the class can be used in a batch task</returns>
protected boolean canGoBatchJournal()
{
return true;
}
/// <summary>
/// <returns></returns>
public container pack()
{
container pack = conNull();
if (gQueryRun)
{
pack = gQueryRun.pack();
}
return [#CurrentVersion] + [pack];
}
/// <summary>
/// </summary>
/// <param name = "packedClass"></param>
/// <returns></returns>
public boolean unpack(container _packedClass)
{
boolean ret = true;
int version = RunBase::getVersion(_packedClass);
container packedQuery = conNull();
switch (version)
{
case #CurrentVersion:
[version, packedQuery] = _packedClass;
if (SysQuery::isPackedOk(packedQuery))
{
gQueryRun = new QueryRun(packedQuery);
ret = true;
}
break;
default:
ret = false;
}
return ret;
}
/// <summary>
/// Allows the class go batch
/// </summary>
/// <returns>Return the result</returns>
public boolean canGoBatch()
{
return true;
}
/// <summary>
/// </summary>
/// <returns>Return the true result</returns>
public boolean runsImpersonated()
{
return true;
}
/// <summary>
/// Doesn't allows the class run in the new session
/// </summary>
/// <returns>Return the result</returns>
protected boolean canRunInNewSession()
{
return true;
}
/// <summary>
/// </summary>
/// <returns></returns>
public boolean showQueryValues()
{
return true;
}
/// <summary>
/// </summary>
/// <returns></returns>
public QueryRun queryRun()
{
return gQueryRun;
}
/// <summary>
/// Retruns the ledger dimenion for below param list
/// </summary>
/// <param name = "_ledgerAccount"> main account id</param>
/// <param name = "_BusinessUnit"></param>
/// <param name = "_RegionalSurgicalOffice"></param>
/// <param name = "_ConsultationOffice"></param>
/// <param name = "_Department"></param>
/// <param name = "_Category"></param>
/// <param name = "_isLedgerYesOrOffSetDim"> Dummy param, just to identified the Ledger Dimension and Offset Ledeger Dimension to execute if block</param>
/// <returns></returns>
public DimensionDynamicAccount getLedgerDimension(str _ledgerAccount,
str _BusinessUnit,
str _RegionalSurgicalOffice,
str _ConsultationOffice,
str _Department,
str _Category,
NoYes _isLedgerYesOrOffSetDim)
{
DimensionServiceProvider DimensionServiceProvider = new DimensionServiceProvider();
LedgerAccountContract LedgerAccountContract = new LedgerAccountContract();
DimensionAttributeValueContract ValueContract;
List ListValueContract = new List(Types::Class);
dimensionAttributeValueCombination dimensionAttributeValueCombination;
DimensionStorage dimStorage;
if (_isLedgerYesOrOffSetDim == NoYes::Yes)
{
if (_businessUnit)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('BusinessUnit') ;
ValueContract.parmValue(_BusinessUnit);
ListValueContract.addEnd(ValueContract);
}
if (_RegionalSurgicalOffice)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('RegionalSurgicalOffice') ;
ValueContract.parmValue(_RegionalSurgicalOffice);
ListValueContract.addEnd(ValueContract);
}
//Department
if (_ConsultationOffice)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('ConsultationOffice') ;
ValueContract.parmValue(_ConsultationOffice);
}
if (_Department)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Department') ;
ValueContract.parmValue(_Department);
ListValueContract.addEnd(ValueContract);
}
if (_Category)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Category') ;
ValueContract.parmValue(_Category);
ListValueContract.addEnd(ValueContract);
}
}
else
{
if (_businessUnit)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Offset BusinessUnit') ;
ValueContract.parmValue(_BusinessUnit);
ListValueContract.addEnd(ValueContract);
}
if (_RegionalSurgicalOffice)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Offset RegionalSurgicalOffice') ;
ValueContract.parmValue(_RegionalSurgicalOffice);
ListValueContract.addEnd(ValueContract);
}
//Department
if (_ConsultationOffice)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Offset ConsultationOffice') ;
ValueContract.parmValue(_ConsultationOffice);
}
if (_Department)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Offset Department') ;
ValueContract.parmValue(_Department);
ListValueContract.addEnd(ValueContract);
}
if (_Category)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName('Offset Category') ;
ValueContract.parmValue(_Category);
ListValueContract.addEnd(ValueContract);
}
}
LedgerAccountContract.parmMainAccount(_ledgerAccount);
LedgerAccountContract.parmValues(ListValueContract);
dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());
return dimensionAttributeValueCombination.RecId;
}
}
other user full link.
http://daxvisionerp.com/axdappdimensionutil-does-not-designate-a-class-or-table/
http://daxingwitheshant.blogspot.com/2016/02/importing-invoice-journal-lines-from_15.html
https://krishhdax.blogspot.com/2012/03/ax2012-import-ledger-journal-trans-from.html
https://www.linkedin.com/pulse/generate-financial-dimension-ledgerdimension-dynamics-yadav
http://dynamicsnavax.blogspot.com/2018/01/resolve-ledger-dimension-through-xd365fo.html
Comments
Post a Comment