Tuesday, July 16, 2013

SSRS Report Sample Controller Class

class NSGEmployeePayslipReportController extends SrsReportRunController
{

}
/// <summary>
/// Set SRS Report query range based on caller.
/// </summary>
/// <param name="_args">
/// The <c>Args</c> object.
/// </param>
/// <param name="_query">
/// The <c>Controller</c> object.
/// </param>
public void setRange(Args _args, Query _query)

{
// HcmWorker HcmWorker;
QueryBuildDataSource qbds;

QueryBuildRange qbr;

NsgSalaryCalculationTrans _NsgSalaryCalculationTrans;

_NsgSalaryCalculationTrans = _args.record();

 
qbds = _query.dataSourceTable(tableNum(EmpPayroll));

qbr = qbds.findRange(fieldName2id(tableNum(EmpPayroll),fieldStr(EmpPayroll, SalaryTransId)));

if (!qbr)
{
qbr = qbds.addRange(fieldNum(EmpPayroll, SalaryTransId));

}

qbr.value(_NsgSalaryCalculationTrans.SalaryTransId);

}


public static NSGEmployeePayslipReportController construct(Args _args)
{
NSGEmployeePayslipReportController controller = new NSGEmployeePayslipReportController();

controller.parmReportName(ssrsReportStr(EmpDetailedPayslip, PrecisionDesign1));

controller.parmArgs(_args);
return controller;
}


public static void main(Args _args)
{
NsgSalaryCalculationTrans _NsgSalaryCalculationTrans;
 
NSGEmployeePayslipReportController controller = new NSGEmployeePayslipReportController();

controller.parmReportName(ssrsReportStr(EmpDetailedPayslip, PrecisionDesign1));


controller.parmArgs(_args);
 
if(_args.dataset() == tableNum(NsgSalaryCalculationTrans))
{
_NsgSalaryCalculationTrans = _args.record();
 
// _args.record(NsgSalaryCalculationTrans::find(_args.record().RecId));
//hcmWorkerLoc = NsgSalaryCalculationTrans::find(_args.record().RecId);
//controller.parmShowDialog(false);


controller.setRange(_args, controller.parmReportContract().parmQueryContracts().lookup(controller.getFirstQueryContractKey()));
}
 

 
 
//// controller.parmReportName(#reportName);
//controller.parmArgs(_args);
//controller.setRange(_args, controller.parmReportContract().parmQueryContracts().lookup(controller.getFirstQueryContractKey()));


controller.startOperation();
 
//controller.parmArgs(_args);
////NSGMonthlySalaryReportController::run(controller);
//NSGEmployeePayslipReportController::construct(_args).startOperation();

}
 
 

SSRS Report Sample Contract Class

/// <summary>
/// The <c>CustInvoiceContract</c> class is the data contract class for the <c>CustInvoice</c> SSRS
/// report.
/// </summary>
[
DataContractAttribute
//SysOperationContractProcessingAttribute(classstr(CustInvoiceUIBuilder)),

//SysOperationGroupAttribute('Criteria', "@SYS13128", "1")
]
public class NSGEmployeePayslipContractClass //implements SysOperationInitializable, SysOperationValidatable

{
NsgMonth salMonth;
NsgSalaryYear salYear;
}


[ DataMemberAttribute('Month')
//SysOperationLabelAttribute(literalstr("@SYS328562")),
//SysOperationHelpTextAttribute(literalstr("@SYS328563")),
//SysOperationGroupMemberAttribute('Criteria'),
//SysOperationDisplayOrderAttribute('2')

]
public NsgMonth parmMonth(NsgMonth _NsgMonth = salMonth)
{
salMonth = _NsgMonth;
return salMonth;
}


[DataMemberAttribute('SalYear')

//SysOperationLabelAttribute(literalstr("@SYS328564")),

//sOperationHelpTextAttribute(literalstr("@SYS328565")),

//SysOperationGroupMemberAttribute('Criteria'),

//SysOperationDisplayOrderAttribute('3')
]
public NsgSalaryYear parmYear(NsgSalaryYear _salYear = salYear)
{
salYear = _salYear;
 
return salYear;
}


/// <summary>
/// Validates the data contract values.
/// </summary>
/// <returns>
/// true if all the contract values are valid; otherwise, false.
/// </returns>
public boolean validate()

{
 
boolean isValid = true;
// Force date to be included in the restrictions. Without a date
// range the resulting SQL query will need to do a cartesian product
// against CustInvoiceJour, CustInvoiceTrans and CustTrans before
// restricting down. Even with a relatively small database this
// will result in filling up tempdb and crashing the report as well
// as degrading all other queries against the SQL server. With date
// range included, the date indexes on CustInvoiceJour will be used
// to generate index seeks and allow a reasonable query.

if (!salMonth)
{
 
isValid = checkFailed("month is required");
}
if (!salYear)
{
 
isValid = checkFailed("year is required");
}
 
 
return isValid;
}


public static NSGEmployeePayslipContractClass construct()
{
 
return new NSGEmployeePayslipContractClass();
}

 
 

Testing SSRS report output using RDP class through Job

static void TestEOSCompensation(Args _args)
{
EmplContractTmp EmplContractTmp;
Query q;
date sdate = str2Date('31/12/2012',123);
//date sdate = systemDateGet();
NSGEOSCompensationDP dataProvider = new NSGEOSCompensationDP();
NSGEOSCompensationContractClass contract = new NSGEOSCompensationContractClass();
contract.parmUptoDate(sdate);
q = dataProvider.parmQuery();
q.dataSourceTable(tableNum(EmplContract)).addRange(fieldNum(EmplContract, EmplId)).value("I0012"); //000545"); //"000042"); //"DNG998877");
dataProvider.parmDataContract(contract);
dataProvider.processReport();
EmplContractTmp = dataProvider.getEmplContractTmp();
while select EmplContractTmp
{
print(EmplContractTmp.EmplId);
print(EmplContractTmp.StartDate);
print(EmplContractTmp.Housing);
print(EmplContractTmp.Phone);
print(EmplContractTmp.Fuel);
print(EmplContractTmp.Other);
print(EmplContractTmp.CompensationValue);
print (EmplContractTmp.DeptDescription);
print (EmplContractTmp.JobPosition);
print(EmplContractTmp.DeptDescription);
print(EmplContractTmp.BasicSalary);
print(EmplContractTmp.Housing);
print(EmplContractTmp.Transportation);
print(EmplContractTmp.Other);
print(EmplContractTmp.TotalPackage);
print(EmplContractTmp.StartDate);
print(EmplContractTmp.UptoDate);
print(EmplContractTmp.EoSDaysOfService);
print(EmplContractTmp.CompensationValue);
}
pause;
}

Friday, July 5, 2013

Getting Main account from the ledger dimension record id

private DimensionValue gettingMainAccount(LedgerDimensionDefaultAccount _ledgerJournalId)
{
DimensionAttributeValueCombination DimensionAttributeValueCombination;
DimensionAttributeValueGroupCombination DimensionAttributeValueGroupCombination;
DimensionAttributeValueGroup DimensionAttributeValueGroup;
DimensionHierarchyLevel DimensionHierarchyLevel;
DimensionAttribute DimensionAttribute;
DimensionAttributeLevelValueAllView DimensionAttributeLevelValueAllView;
DimensionValue MainAccount = '';

select DimensionAttributeValueCombination where DimensionAttributeValueCombination.RecId==_ledgerJournalId;

while select DimensionAttributeValueGroupCombination
where DimensionAttributeValueGroupCombination.DimensionAttributeValueCombination==DimensionAttributeValueCombination.RecId
{
//print DimensionAttributeValueGroupCombination.DimensionAttributeValueGroup;
//pause;
//5637158202, 5637158203

while select DimensionAttributeValueGroup
where DimensionAttributeValueGroup.RecId==DimensionAttributeValueGroupCombination.DimensionAttributeValueGroup
{
//print DimensionAttributeValueGroup.DimensionHierarchy;
//pause;
//5637145368

while select DimensionHierarchyLevel
where DimensionHierarchyLevel.DimensionHierarchy==DimensionAttributeValueGroup.DimensionHierarchy
&& DimensionHierarchyLevel.Level==1
{
//print DimensionHierarchyLevel.DimensionAttribute;
//pause;
//5637144840, 5637144850, 5637144851, 5637144849

while select DimensionAttribute
where DimensionAttribute.RecId==DimensionHierarchyLevel.DimensionAttribute
&& DimensionAttribute.Type==DimensionAttributeType::MainAccount
{
//print DimensionAttribute.BackingEntityType;

//print DimensionAttribute.Name;

//pause;

select DimensionAttributeLevelValueAllView
where DimensionAttributeLevelValueAllView.DimensionAttribute==DimensionAttribute.RecId
&& DimensionAttributeLevelValueAllView.DimensionAttributeValueGroup==DimensionAttributeValueGroupCombination.DimensionAttributeValueGroup
//&& DimensionAttributeLevelValueAllView.AttributeValueHashKey==dimAttrWorker.Key

;
MainAccount = DimensionAttributeLevelValueAllView.DisplayValue;
}
}
}
}
return MainAccount;
}

Creating new ledger dimension for the given combination of dimension in Ax 2012

private LedgerDimensionDefaultAccount gettingLedgerDimensionAll(LedgerDimensionDefaultAccount _ledgerJournalId, HcmPersonnelNumberId _emplId)
{
HcmWorker HcmWorker;
HcmEmployment HcmEmployment;
DimensionAttributeValueSetItem DimensionAttributeValueSetItem;
RefRecId emplDimAttrRecId; // For ex. purpose defaulting it to required DimensionAttributeValueSet RecordId

LedgerDimensionAccount ledgerDimension; // Record id for LedgerDimension(DimensionAttributeValueCombination) containing combination of dimensions
RefRecId dimensionRecId; // For ex. purpose defaulting it to required DimensionAttributeValueSet RecordId
LedgerDimensionAccount mainAccDimension; // Record id for LedgerDimension(DimensionAttributeValueCombination) containing default account for main account RecId
DimensionValue MainAccount;
MainAccount = this.gettingMainAccount(_ledgerJournalId);
select HcmWorker
where HcmWorker.PersonnelNumber==_emplId
join HcmEmployment
where HcmEmployment.Worker==HcmWorker.RecId //5637144698
join DimensionAttributeValueSetItem
where DimensionAttributeValueSetItem.DimensionAttributeValueSet==HcmEmployment.DefaultDimension; //5637145447

dimensionRecId = HcmEmployment.DefaultDimension;//5637145447
emplDimAttrRecId = DimensionAttributeValueSetItem.DimensionAttributeValueSet; //5637145447

// Get the default account for main account
mainAccDimension = DimensionStorage::getDefaultAccountForMainAccountNum(MainAccount); //5637160041

//Find or create the LedgerDimension record for required combination
//Param1 – Ledger Dimension record id, in our case Default account for main account
//Param2 – Default Dimension Record Id for 1st Dimension Combination
//Param3 – Default Dimension Record Id for 2nd Dimension Combination
//Param4 – Default Dimension Record Id for 3rd Dimension Combination

ledgerDimension = DimensionDefaultingService::serviceCreateLedgerDimension(
mainAccDimension,
dimensionRecId,
emplDimAttrRecId);
//5637157272:

//info(strFmt("%1: %2", ledgerDimension, DimensionAttributeValueCombination::find(ledgerDimension).DisplayValue));
return ledgerDimension;
}