You're correct same i did it but how to get 12 months that SQL,
public server static void populateTempTable_Earning(MPAnnualEarningSummary _tmp, FromDate fromDate, ToDate toDate)
{
MPPayCycleWorkers payCycleWorkers;
MPPayCycles payCycles;
MPPayCycleLines payCycleLine;
UserConnection userconn = new UserConnection();
str fieldName;
Statement statement;
int fldCnt;
str tmpTableName, rangeStr, sql;
MPAnnualEarningSummary summaryTmp;
Query query = new Query();
QueryBuildDataSource qbdsWorker, qbdsLine;
QueryRun queryRun;
DimensionFocusNameTmp focusTmp;
delete_from _tmp;
insert_recordset summaryTmp ( HcmPersonnelNumberId, Worker, FromDate, ToDate)
select HcmPersonnelNumberId ,Worker, FromDate, ToDate from payCycleWorkers
join payCycles
where payCycleWorkers.paycycleId == payCycles.MPPaycycleId
&& payCycles.FromDate >= fromDate
&& payCycles.ToDate <= toDate;
&& payCycleLine.DimensionDefault != 0;
qbdsLine = query.addDataSource(tableNum(MPPayCycleLines));
qbdsLine.addSelectionField(fieldNum(MPPayCycleLines, AmountCur), SelectionField::Sum);
qbdsLine.addOrderByField(fieldNum(MPPayCycleLines, TransTypes));
qbdsLine.addOrderByField(fieldNum(MPPayCycleLines, Paycode));
qbdsLine.addGroupByField(fieldNum(MPPayCycleLines, TransTypes));
qbdsLine.addGroupByField(fieldNum(MPPayCycleLines, Paycode));
rangeStr = strFmt('((%1 == %2) && (%3 != %4))',
fieldStr(MPPayCycleLines, Accrual),
enum2int(NoYes::No),
fieldStr(MPPayCycleLines, TransTypes),
enum2int(MPTransactionType::Basic));
qbdsLine.addRange(fieldNum(MPPayCycleLines, TransTypes)).value(rangeStr);
qbdsWorker = qbdsLine.addDataSource(tableNum(MPPayCycleWorkers));
qbdsWorker.addSelectionField(fieldNum(MPPayCycleWorkers, RecId));
qbdsWorker.addLink(fieldNum(MPPayCycleLines,RefPaycycleWorkerLine), fieldNum(MPPayCycleWorkers, RecID));
queryRun = new QueryRun(query);
tmpTableName = summaryTmp.getPhysicalTableName();
while (queryRun.next())
{
payCycleLine = queryRun.get(tableNum(MPPayCycleLines));
fldCnt ;
if (fldCnt <= 9)
{
fieldName = strFmt('Value0%1',fldCnt);
}
else
{
fieldName = strFmt('Value%1',fldCnt);
}
// Update using direct SQL here so that the field can be set dynamically as update_recordset function
// in AX doesnt support dynamic fields
sql = strFmt('UPDATE %1 ',tmpTableName);
sql = strFmt('SET %1 = lineTable.AmountCurSum',fieldName);
switch (payCycleLine.TransTypes)
{
case MPTransactionTypeAll::Basic:
case MPTransactionTypeAll::Allowance:
case MPTransactionTypeAll::Increase:
case MPTransactionTypeAll::LeaveSalary:
case MPTransactionTypeAll::Overtime:
case MPTransactionTypeAll::Loan:
case MPTransactionTypeAll::TicketPaym:
case MPTransactionTypeAll::EoS:
case MPTransactionTypeAll::BusTrip:
sql = strFmt(', TotalEarnings = (tmp.TotalEarnings lineTable.AmountCurSum)');
break;
default:
sql = strFmt(', TotalDeductions = (tmp.TotalDeductions lineTable.AmountCurSum)');
break;
}
sql = strFmt(' From %1 tmp ', tmpTableName);
sql = strFmt('INNER JOIN (select sum(AmountCur) as AmountCurSum, Accrual, RefPaycycleWorkerLine, TransTypes, PayCode ');
sql = strFmt('from MPPayCycleLines group by TransTypes, Paycode, RefPaycycleWorkerLine, Accrual) as lineTable ');
sql = strFmt('on lineTable.RefPaycycleWorkerLine = tmp.PayCycleWorker ');
sql = strFmt('WHERE lineTable.TransTypes = %1 ',enum2int(payCycleLine.TransTypes));
sql = strFmt("AND lineTable.Paycode = '%1'", payCycleLine.PayCode);
sql = strFmt(' AND lineTable.Accrual = %1', enum2int(NoYes::No));
new SqlStatementExecutePermission(sql).assert();
statement = userConn.createStatement();
statement.executeUpdate(sql);
CodeAccessPermission::revertAssert();
}
insert_recordset _tmp
(
HcmPersonnelNumberId, Worker, Jan, Feb, Mar, Apl, May, Jun, July, Aug, Sep, Oct, Nov, Dec
)
select HcmPersonnelNumberId, Worker, sum(Jan), sum(Feb),
sum(Mar), sum(Apl), sum(May), sum(Jun), sum(July),
sum(Aug), sum(Sep), sum(Oct), sum(Nov), sum(Dec)
from summaryTmp
group by summaryTmp.HcmPersonnelNumberId, summaryTmp.Worker;
update_recordSet _tmp
setting NetSalary = _tmp.NetSalary;
}