I am getting out of range exception for this code-
public ActionResult AttendanceTable() {
//var tbl_emp_attendance = db.tbl_emp_attendance.Include(t => t.tbl_employee);
var attendanceTable = db.tbl_emp_attendance
.OrderBy(a => a.date_and_time).ToList();
var count = attendanceTable.Count;
for (var i = 0; i < count; i = i + 2) {
if (attendanceTable[i].date_and_time.Value.Date == attendanceTable[i + 1].date_and_time.Value.Date &&
attendanceTable[i].employee_id == attendanceTable[i + 1].employee_id) {
//Check which value is less using Time now,as it is sorted first value will be less than second
if (attendanceTable[i].date_and_time.Value.TimeOfDay <
attendanceTable[i + 1].date_and_time.Value.TimeOfDay) {
//OUttime Greater one
var inTime = attendanceTable[i].date_and_time.Value.TimeOfDay;
var outTime = attendanceTable[i + 1].date_and_time.Value.TimeOfDay;
var actualInTime = attendanceTable[i].date_and_time.Value.Date + new TimeSpan(10, 00, 00);
var actualOutTime = attendanceTable[i].date_and_time.Value.Date + new TimeSpan(17, 00, 00);
var actualWorkingHour = actualOutTime - actualInTime;
if (inTime < actualInTime.TimeOfDay) {
inTime = actualInTime.TimeOfDay;
}
var employeeworkingHour = outTime - inTime;
var overTime = outTime - actualOutTime.TimeOfDay;
var lateTime = actualInTime.TimeOfDay - inTime;
var actualMonthlyWorkingMinute = (int) actualWorkingHour.TotalMinutes * 30;
var mainSalary = attendanceTable[i].tbl_employee.emp_gross_amount;
var mainPerminuteSalary = mainSalary / ((int) actualMonthlyWorkingMinute);
var perHoursalary = (int) employeeworkingHour.TotalMinutes * mainPerminuteSalary;
var overtimeHourlySalary = (int) overTime.TotalMinutes * mainPerminuteSalary;
var deductedHourlySalary = (int) lateTime.TotalMinutes * mainPerminuteSalary;
var actualSalary = ((int) employeeworkingHour.TotalMinutes) * mainPerminuteSalary * 30;
if (actualSalary < mainSalary) {
var deductedSalary = mainSalary - actualSalary;
}
if (actualSalary > mainSalary) {
var overTimeSalary = actualSalary - mainSalary;
}
attendanceTable[i].emp_inTime = inTime;
attendanceTable[i].emp_outTime = outTime;
attendanceTable[i].emp_workingHour = employeeworkingHour;
attendanceTable[i].emp_calculatedSalary = perHoursalary;
attendanceTable[i].emp_overTime = overTime;
attendanceTable[i].emp_late = lateTime.Duration();
attendanceTable[i].emp_overtime_hourly_salary = overtimeHourlySalary;
attendanceTable[i].emp_late_hourly_salary = deductedHourlySalary;
}
}
}
return View(attendanceTable.DistinctBy(a => a.date_and_time.Value.Date));
}
I know what is the problem. Problem is when I am entering a value it is checking and comparing with two values of same employee_id. Now when I am entering another value in database, it can't get the (i+1) element value because it doesn't exist. When I enter another value, it works fine. Now how can I solve it?
You are accessing value which outside Array Index, or you can say array Length, you need to adjust code so that your array doesn't call out of length data.
Suppose If i have Array of Length 3, then To handle this type of exception, I will code something like this
int[] arr1 = new int[] { 3, 4, 5 };
for (int index = 0; index < arr1.Length; index++)
{
Console.WriteLine(arr1[index]);
}
//here index < arr1.Length helps to stay away from Index out of range error
According to your description "when I am entering another value in database, it can't get the (i+1) element value because it doesn't exist"
When you enter another value, offcourse database is changed, now you need to change code according to it, please consider changing your code according to your database values and handle Index out of range as described above.
Update:
Solved the problem by putting a foreach loop within another foreach loop-
public ActionResult AttendanceTable()
{
var att = db.tbl_emp_attendance.OrderBy(a => a.date_and_time).ToList();
foreach (var employee in att)
{
var emp = db.tbl_emp_attendance.OrderBy(a=>a.date_and_time).ToList();
foreach (var emp1 in emp)
{
if (employee.date_and_time.Value.Date == emp1.date_and_time.Value.Date &&
employee.employee_id == emp1.employee_id)
{
var actualInTime = employee.date_and_time.Value.Date + new TimeSpan(10, 00, 00);
var actualOutTime = employee.date_and_time.Value.Date + new TimeSpan(17, 00, 00);
var actualWorkingHour = actualOutTime - actualInTime;
if (employee.date_and_time.Value.TimeOfDay < emp1.date_and_time.Value.TimeOfDay)
{
employee.emp_inTime = employee.date_and_time.Value.TimeOfDay;
employee.emp_outTime = emp1.date_and_time.Value.TimeOfDay;
}
else if (employee.date_and_time.Value.TimeOfDay == emp1.date_and_time.Value.TimeOfDay)
{
employee.emp_inTime = employee.date_and_time.Value.TimeOfDay;
employee.emp_outTime = actualOutTime.TimeOfDay;
}
else
{
employee.emp_inTime = emp1.date_and_time.Value.TimeOfDay;
employee.emp_outTime = employee.date_and_time.Value.TimeOfDay;
}
var inTime = employee.emp_inTime;
var outTime = employee.emp_outTime;
if (inTime < actualInTime.TimeOfDay)
{
inTime = actualInTime.TimeOfDay;
}
var employeeworkingHour = outTime- inTime;
var overTime = outTime - actualOutTime.TimeOfDay;
var lateTime = actualInTime.TimeOfDay - inTime;
var actualMonthlyWorkingMinute = (int)actualWorkingHour.TotalMinutes * 30;
var mainSalary = employee.tbl_employee.emp_gross_amount;
var mainPerminuteSalary = mainSalary / ((int)actualMonthlyWorkingMinute);
var perHoursalary = (int)employeeworkingHour.TotalMinutes * mainPerminuteSalary;
var overtimeHourlySalary = (int)overTime.TotalMinutes * mainPerminuteSalary;
var deductedHourlySalary = (int)lateTime.TotalMinutes * mainPerminuteSalary;
var actualSalary = ((int)employeeworkingHour.TotalMinutes) * mainPerminuteSalary * 30;
employee.emp_workingHour = employeeworkingHour;
employee.emp_calculatedSalary = perHoursalary;
employee.emp_overTime = overTime;
employee.emp_late = lateTime.Duration();
employee.emp_overtime_hourly_salary = overtimeHourlySalary;
employee.emp_late_hourly_salary = deductedHourlySalary;
}
}
}
return View(att.DistinctBy(a=>a.date_and_time.Value.Date));
}
Subscribe to our weekly Newsletter & Keep getting latest article/questions in your inbox weekly