// http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx //============================================================================================== Date GetDateByMonthWeekWeekday(int year, int month, int week, int weekday) { Date workDate(year, month, 1); // Calculate first while (DayOfWeek(workDate) != weekday) { workDate+= 1; } Date result; if (week == 1) { result = workDate; } else { int addDays = (week * 7) - 7; int day = workDate.day + addDays; if (day > LastDayOfMonth(workDate).day) { day = day - 7; } result = Date(workDate.year, workDate.month, day); } return result; }
void CDailyOpsAB::OnChangeDate() { // // Cycle through the entries for this operator // LVITEM LVI; CString s; CTime time = CTime::GetCurrentTime(); long thisDate; long startDate; long year, month, day; char lastName[DRIVERS_LASTNAME_LENGTH + 1]; char firstName[DRIVERS_FIRSTNAME_LENGTH + 1]; char badgeNumber[DRIVERS_BADGENUMBER_LENGTH + 1]; int iItem = 0; int rcode2; // // Clear the control // pListCtrlLIST->DeleteAllItems(); // // Get the date // // Date // COleVariant v; v = pDTPickerDATE->GetYear(); year = v.lVal; v = pDTPickerDATE->GetMonth(); month = v.lVal; v = pDTPickerDATE->GetDay(); day = v.lVal; // // Database verify 11-Jan-07 // thisDate = year * 10000 + month * 100 + day; startDate = (year - 1) * 10000 + month * 100 + day; DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_ABSENCE; DAILYOPSKey1.pertainsToDate = startDate; DAILYOPSKey1.pertainsToTime = NO_TIME; DAILYOPSKey1.recordFlags = 0; rcode2 = btrieve(B_GETGREATER, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); while(rcode2 == 0 && (DAILYOPS.recordTypeFlag & DAILYOPS_FLAG_ABSENCE) && DAILYOPS.pertainsToDate <= thisDate) { if(thisDate >= DAILYOPS.pertainsToDate && thisDate <= DAILYOPS.DOPS.Absence.untilDate && (DAILYOPS.recordFlags & DAILYOPS_FLAG_ABSENCEREGISTER)) { if(!ANegatedRecord(DAILYOPS.recordID, 1)) { // // Date/time of entry // LVI.mask = LVIF_TEXT | LVIF_PARAM; LVI.iItem = iItem; LVI.iSubItem = 0; sprintf(tempString, "%s", ctime(&DAILYOPS.entryDateAndTime)); LVI.pszText = tempString; LVI.lParam = DAILYOPS.recordID; LVI.iItem = pListCtrlLIST->InsertItem(&LVI); // // Operator // LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 1; DRIVERSKey0.recordID = DAILYOPS.DRIVERSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0); if(rcode2 != 0) { strcpy(tempString, "Driver not found"); } else { strncpy(badgeNumber, DRIVERS.badgeNumber, DRIVERS_BADGENUMBER_LENGTH); trim(badgeNumber, DRIVERS_BADGENUMBER_LENGTH); strncpy(lastName, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH); trim(lastName, DRIVERS_LASTNAME_LENGTH); strncpy(firstName, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH); trim(firstName, DRIVERS_FIRSTNAME_LENGTH); strcpy(tempString, badgeNumber); strcat(tempString, " - "); strcat(tempString, lastName); strcat(tempString, ", "); strcat(tempString, firstName); } LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // Reason // LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 2; if(DAILYOPS.DOPS.Absence.reasonIndex == NO_RECORD) { strcpy(tempString, "Assignment cleared manually"); } else { strcpy(tempString, m_AbsenceReasons[DAILYOPS.DOPS.Absence.reasonIndex].szText); } LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // From Date and time // GetYMD(DAILYOPS.pertainsToDate, &year, &month, &day); LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 3; sprintf(tempString, "%02ld-%s-%04ld at %s", day, szMonth[month - 1], year, Tchar(DAILYOPS.pertainsToTime)); LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // To Date and time // GetYMD(DAILYOPS.DOPS.Absence.untilDate, &year, &month, &day); LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 4; sprintf(tempString, "%02ld-%s-%04ld at %s", day, szMonth[month - 1], year, Tchar(DAILYOPS.DOPS.Absence.untilTime)); LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // Set up the next row // iItem++; } } rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1); } // // Display operators with an off day? // if(m_bAutomatic || !pButtonSHOWOFF->GetCheck()) { return; } GetYMD(thisDate, &year, &month, &day); // // Get the list of drivers and assume they're not working // long DRIVERSrecordIDs[500]; int numDrivers = 0; rcode2 = btrieve(B_GETFIRST, TMS_DRIVERS, &DRIVERS, &DRIVERSKey2, 2); while(rcode2 == 0) { if(ConsideringThisDriverType(DRIVERS.DRIVERTYPESrecordID)) { DRIVERSrecordIDs[numDrivers] = DRIVERS.recordID; numDrivers++; } rcode2 = btrieve(B_GETNEXT, TMS_DRIVERS, &DRIVERS, &DRIVERSKey2, 2); } // // Eliminate those who are working sometime today // CTime workDate(year, month, day, 0, 0, 0); int nI, nJ; int indexToRoster[7] = {6, 0, 1, 2, 3, 4, 5}; int today = indexToRoster[workDate.GetDayOfWeek() - 1]; ROSTERKey1.DIVISIONSrecordID = m_DailyOpsROSTERDivisionInEffect; ROSTERKey1.rosterNumber = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1); while(rcode2 == 0 && ROSTER.DIVISIONSrecordID == m_DailyOpsROSTERDivisionInEffect) { if(ROSTER.DRIVERSrecordID != NO_RECORD && ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[today] != NO_RECORD) { for(nI = 0; nI < numDrivers; nI++) { if(DRIVERSrecordIDs[nI] != NO_RECORD) { if(ROSTER.DRIVERSrecordID == DRIVERSrecordIDs[nI]) { DRIVERSrecordIDs[nI] = NO_RECORD; break; } } } } rcode2 = btrieve(B_GETNEXT, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1); } // // Eliminate those that are already marked as absent // int numItems = pListCtrlLIST->GetItemCount(); for(nI = 0; nI < numItems; nI++) { // // Determine the operator // DAILYOPSKey0.recordID = pListCtrlLIST->GetItemData(nI); rcode2 = btrieve(B_GETEQUAL,TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey0, 0); if(rcode2 == 0) { for(nJ = 0; nJ < numDrivers; nJ++) { if(DRIVERSrecordIDs[nJ] != NO_RECORD) { if(DRIVERSrecordIDs[nJ] == DAILYOPS.DRIVERSrecordID) { DRIVERSrecordIDs[nJ] = NO_RECORD; break; } } } } } // // Spit out those that remain on the list // for(nI = 0; nI < numDrivers; nI++) { if(DRIVERSrecordIDs[nI] == NO_RECORD) { continue; } // // Date/time of entry // LVI.mask = LVIF_TEXT | LVIF_PARAM; LVI.iItem = iItem; LVI.iSubItem = 0; LVI.pszText = ""; LVI.lParam = NO_RECORD; LVI.iItem = pListCtrlLIST->InsertItem(&LVI); // // Operator // LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 1; DRIVERSKey0.recordID = DRIVERSrecordIDs[nI]; rcode2 = btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0); if(rcode2 != 0) { strcpy(tempString, "Driver not found"); } else { strncpy(badgeNumber, DRIVERS.badgeNumber, DRIVERS_BADGENUMBER_LENGTH); trim(badgeNumber, DRIVERS_BADGENUMBER_LENGTH); strncpy(lastName, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH); trim(lastName, DRIVERS_LASTNAME_LENGTH); strncpy(firstName, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH); trim(firstName, DRIVERS_FIRSTNAME_LENGTH); strcpy(tempString, badgeNumber); strcat(tempString, " - "); strcat(tempString, lastName); strcat(tempString, ", "); strcat(tempString, firstName); } LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // Reason // LVI.mask = LVIF_TEXT; LVI.iItem = iItem; LVI.iSubItem = 2; strcpy(tempString, "Day Off"); LVI.pszText = tempString; LVI.iItem = pListCtrlLIST->SetItem(&LVI); // // Set up the next row // iItem++; } }