我正在学习C#并正在为SAP Business One制作一个Payroll Add-On。
我已完成计算净支付,总工资,PAYE,收入,扣除等的工资核算流程。每位员工的这些计算都会输入到临时流程数据表中。
我现在想要每月进行一次翻转(关闭当月)。为此,我必须进行一些验证,以确保在将临时过程数据表中的内容移除到永久数据表之前正确完成计算。
我想通过比较两个列表来做到这一点。
第一个来自SAP的员工主数据,它包含员工ID,姓名,电话,工资单位等。我只选择了employeeID。
第二个来自Process_Data_Temp,它包含员工ID,净工资(U_PD_code = SYS001)等。
我希望匹配此列表,确保第1个中的所有empID都包含在第2个(完全)中,并且第2个列表中的净工资不为空即(U_PD_code,其中== SYS001不为空或空)等。
我想根据工资单位进行三次比较,即。每月= M,半月= S和每周= W. 现在我对每月感兴趣。
现场工资单位在员工主数据中,但不在流程数据临时表中,因此我不确定如何在临时表中获得每月工资的不同empID以进行比较。我首先比较月度员工。
Process_Data_Temp字段
Code Name, U_Tax_year, U_Employee_ID, U_Process_month, U_PD_code U_Amount, U_Balance,
U_Employer_cont_amnt
如何做到这一点?
我的代码到目前为止
private void DoMonthEndRollover()
{
// Get service instances needed
var getAllEmployees = Program.Kernel.Get<IEmployeeService>().GetAllEmployees().Where(x => x.salaryUnit.ToString() == "M");
var tempProcessData = Program.Kernel.Get<IProcessDataTempService>().GetAllProcessDataTemps();
// Get all employee IDs from first list
var employeeIdList = (from el in getAllEmployees select el.empID).Distinct();
// Get information from second list
var tempList = (from tl in tempProcessData orderby tl.U_Employee_ID select tl).Distinct(); ......not finished
// Check if all Employee IDs have net pay (Contained in Process Data Temporary table)
}
注意:流程数据临时表包含所有员工的月度,半月或每周计算。
我希望我足够清楚
答案 0 :(得分:0)
假设employeeIDList
和tempList
都是整数列表,您可以使用IEnumerable.Intersect
查找两个列表中的元素。
int[] id1 = { 44, 26, 92, 30, 71, 38 };
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 };
IEnumerable<int> both = id1.Intersect(id2);
如果输出列表与输入列表的长度相同,则它们是相同的。
但是,在第一个实例中检查两个列表的长度是否相同。如果不是,则该过程失败。只有Intersect
检查两个列表的长度是否相同。
还有IEnumerable.Except
方法:
使用默认的相等比较器来比较值,生成两个序列的集合差异。