예제 #1
0
void CSkinManager::RefreshAllSkins(bool bReload)
{
	Combo()->Refresh();
	MainFrame()->Refresh();
	FavorBar()->Refresh();
	MenuBar()->Refresh();
	Tab()->Refresh();
	Category()->Refresh();
	Toolbar()->Refresh();
	HelpButton()->Refresh();
	LoadButton()->Refresh();
	LoginButton()->Refresh();
	SepButton()->Refresh();
	SettingButton()->Refresh();
	BigButton()->Refresh();
	SSLLockButton()->Refresh();
	StatusBar()->Refresh();
	Tooltip()->Refresh();
	MenuButton()->Refresh();
	LogoButton()->Refresh();
	Common()->Refresh(bReload);

	BackButton()->Refresh();
	ForwardButton()->Refresh();
	RefreshButton()->Refresh();

	CoolMenuSkin()->Refresh();
}
예제 #2
0
파일: Human.c 프로젝트: dkrivets/gtkgo
void ActivateHuman (void)
{
  if (ichangecolorh == 1)
  {
    sprintf (wplayername, "%s", gtk_entry_get_text (GTK_ENTRY (humentry)));
    wiscomputer = 0;
  }
  else
  {
    sprintf (bplayername, "%s", gtk_entry_get_text (GTK_ENTRY (humentry)));
    biscomputer = 0;
  }
  gtk_widget_destroy (humwindow);
  iyesno = 0;
  StatusBar ();
}
예제 #3
0
void CAppWnd::OnCreate(const CRect& rcClient)
{
	//
	// Create and attach the components.
	//
	m_Accel.LoadRsc(IDR_APPACCEL);
	Accel(&m_Accel);

	m_Menu.LoadRsc(IDR_APPMENU);
	Menu(&m_Menu);

	m_StatusBar.Create(*this, IDC_STATUS_BAR, rcClient);
	StatusBar(&m_StatusBar);

	m_AppDlg.RunModeless(*this);

	// Call base class.
	CDlgFrame::OnCreate(rcClient);
}
예제 #4
0
void Explorerplusplus::OnTreeViewRightClick(WPARAM wParam,LPARAM lParam)
{
	LPITEMIDLIST pidl = NULL;
	POINT *ppt = NULL;
	HTREEITEM hItem;
	HTREEITEM hPrevItem;
	IShellFolder *pShellParentFolder = NULL;
	LPITEMIDLIST pidlRelative = NULL;
	HRESULT hr;

	hItem	= (HTREEITEM)wParam;
	ppt		= (POINT *)lParam;

	m_bTreeViewRightClick = TRUE;

	hPrevItem = TreeView_GetSelection(m_hTreeView);
	TreeView_SelectItem(m_hTreeView,hItem);
	pidl = m_pMyTreeView->BuildPath(hItem);

	hr = SHBindToParent(pidl, IID_PPV_ARGS(&pShellParentFolder),
	(LPCITEMIDLIST *)&pidlRelative);

	if(SUCCEEDED(hr))
	{
		HTREEITEM hParent;
		LPITEMIDLIST pidlParent	= NULL;

		hParent = TreeView_GetParent(m_hTreeView,hItem);

		/* If we right-click on the "Desktop" item in the treeview, there is no parent.
		   In such case, use "Desktop" as parent item as well, to allow the context menu
		   to be shown. */
		if(hParent == NULL)
		{
			hParent = hItem;
		}

		if(hParent != NULL)
		{
			pidlParent = m_pMyTreeView->BuildPath(hParent);

			if(pidlParent != NULL)
			{
				m_bTreeViewOpenInNewTab = FALSE;

				std::list<LPITEMIDLIST> pidlList;

				pidlList.push_back(pidlRelative);

				CFileContextMenuManager fcmm(m_hContainer,pidlParent,
					pidlList);

				FileContextMenuInfo_t fcmi;
				fcmi.uFrom = FROM_TREEVIEW;

				CStatusBar StatusBar(m_hStatusBar);

				fcmm.ShowMenu(this,MIN_SHELL_MENU_ID,MAX_SHELL_MENU_ID,ppt,&StatusBar,
					reinterpret_cast<DWORD_PTR>(&fcmi),TRUE,GetKeyState(VK_SHIFT) & 0x80);

				CoTaskMemFree(pidlParent);
			}
		}

		pShellParentFolder->Release();
	}

	/* Don't switch back to the previous folder if
	the folder that was right-clicked was opened in
	a new tab (i.e. can just keep the selection the
	same). */
	if(!m_bTreeViewOpenInNewTab)
		TreeView_SelectItem(m_hTreeView,hPrevItem);

	m_bTreeViewRightClick = FALSE;

	CoTaskMemFree(pidl);
}
예제 #5
0
파일: Tmsrpt04.c 프로젝트: ems/TMS
BOOL FAR TMSRPT04(TMSRPTPassedDataDef *pPassedData)
{
  GenerateTripDef GTResults;
  REPORTPARMSDef REPORTPARMS;
  HFILE hfOutputFile;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  char  routeNumber[ROUTES_NUMBER_LENGTH + 1];
  char  serviceName[SERVICES_NAME_LENGTH + 1];
  char  outputString[512];
  long  statbarTotal;
  int   nI;
  int   nJ;
  int   nK;
  int   nL;
  int   rcode2;

  pPassedData->nReportNumber = 3;
  pPassedData->numDataFiles = 1;
//
//  See what he wants
//
  REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
  REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
  REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
  REPORTPARMS.COMMENTSrecordID = NO_RECORD;
  REPORTPARMS.pRouteList = NULL;
  REPORTPARMS.pServiceList = NULL;
  REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS;
  bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
        hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
  if(!bRC)
  {
    return(FALSE);
  }
//
//  Check the list of routes and services
//
  if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
  {
    goto deallocate;
  }
//
//  Open the output file
//
  strcpy(tempString, szReportsTempFolder);
  strcat(tempString, "\\tmsrpt04.txt");
  hfOutputFile = _lcreat(tempString, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Loop through the routes
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
  statbarTotal = REPORTPARMS.numRoutes * REPORTPARMS.numServices;
  for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      goto deallocate;
    }
    ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
    rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
    if(rcode2 != 0)
    {
      continue;
    }
    strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(routeNumber, ROUTES_NUMBER_LENGTH);
//
//  Loop through the services
//
    for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
    {
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
      SERVICESKey0.recordID = REPORTPARMS.pServiceList[nJ];
      rcode2 = btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      if(rcode2 != 0)
      {
        continue;
      }
      strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(serviceName, SERVICES_NAME_LENGTH);
      LoadString(hInst, TEXT_118, szarString, sizeof(szarString));
      sprintf(tempString, szarString, routeNumber, serviceName);
      StatusBarText(tempString);
      StatusBar((long)(nI * REPORTPARMS.numServices + nJ), (long)statbarTotal);
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
//
//  Loop through the directions
//
      for(nK = 0; nK < 2; nK++)
      {
        if(StatusBarAbort())
        {
          bKeepGoing = FALSE;
          goto deallocate;
        }
        if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
        {
          continue;
        }
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nK];
        rcode2 = btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        if(rcode2 != 0)
        {
          continue;
        }
        m_bEstablishRUNTIMES = TRUE;
//
//  Get all the trips
//
        TRIPSKey1.ROUTESrecordID = REPORTPARMS.pRouteList[nI];
        TRIPSKey1.SERVICESrecordID = REPORTPARMS.pServiceList[nJ];
        TRIPSKey1.directionIndex = nK;
        TRIPSKey1.tripSequence = NO_TIME;
        rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        while(rcode2 == 0 &&
              TRIPS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] &&
              TRIPS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] &&
              TRIPS.directionIndex == nK)
        {
//
//  Generate the trip
//
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Set up the output string
//
          strcpy(outputString, "");
          for(nL = 0; nL < NUMCOLS; nL++)
          {
            switch(nL)
            {
//
//  Route number
//
              case 0:
                strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
                tempString[ROUTES_NUMBER_LENGTH] = '\0';
                sprintf(szarString, "\"%s\"", tempString);
                break;
//
//  Route name
//
              case 1:
                strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH);
                tempString[ROUTES_NAME_LENGTH] = '\0';
                sprintf(szarString, "\"%s\"", tempString);
                break;
//
//  Service Name
//
              case 2:
                strncpy(tempString, SERVICES.name, SERVICES_NAME_LENGTH);
                tempString[SERVICES_NAME_LENGTH] = '\0';
                sprintf(szarString, "\"%s\"", tempString);
                break;
//
//  Direction
//
              case 3:
                strncpy(tempString, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
                tempString[DIRECTIONS_LONGNAME_LENGTH] = '\0';
                sprintf(szarString, "\"%s\"", tempString);
                break;
//
//  Trip time (in minutes)
//
              case 4:
                sprintf(szarString, "%ld", GTResults.lastNodeTime - GTResults.firstNodeTime);
                break;
//
//  Distance
//
              case 5:
                sprintf(szarString, "%7.2f", GTResults.tripDistance);
                break;
            }  // End of switch
            strcat(outputString, szarString);
            strcat(outputString, nL == NUMCOLS - 1 ? "\r\n" : "\t");
          }  // nL
          _lwrite(hfOutputFile, outputString, strlen(outputString));
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        }  // while
      }  // nK
    }  // nJ
  }  // nI
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    _lclose(hfOutputFile);
    StatusBarEnd();
    if(!bKeepGoing)
    {
      return(FALSE);
    }
//
//  All done
//
  return(TRUE);
}
예제 #6
0
파일: Tmsrpt67.c 프로젝트: ems/TMS
BOOL FAR TMSRPT67(TMSRPTPassedDataDef *pPassedData)
{
  NodesAndStopsDef NodesAndStops[TMSRPT67_MAXNODESANDSTOPS];
  GetConnectionTimeDef GCTData;
  GenerateTripDef  GTResults;
  BLOCKSDef       *pTRIPSChunk;
  double  prevLat, prevLon;
  HFILE   hfOutputFile;
  HFILE   hfErrorLog;
  float   distanceToHere;
  float   tripDistances[100];
  float   distance;
  struct  tm tmED, tmUD, today;
  time_t  EDmktime;
  time_t  UDmktime;
  time_t  now;
  BOOL  bFound;
  BOOL  bGotError;
  BOOL  bFinishedOK;
  BOOL  bBikeRack;
  BOOL  bFirst;
  long  SERVICESinEffect[TMSRPT66_MAXSERVICES];
  long  year, month, day;
  long  serviceRecordID;
  long  previousPattern;
  long  timeAtStop;
  long  absRecID;
  long  stopFlags;
  long  stopNumber;
  long  assignedToNODESrecordID;
  long  blockNumber;
  long  fromNODESrecordID;
  long  toNODESrecordID;
  long  toTime;
  long  fromTime;
  long  dhd;
  long  number;
  char  outputString[1024];
  char  outputStringSave[1024];
  char  out2[1024];
  char *ptr;
  char *pszReportName;
  char  outputFileName[64];
  char  szServiceCode[SERVICES_NAME_LENGTH + 1];
  char  szTripCode[16];
  int   nI;
  int   rcode2;
  int   dayOfWeek;
  int   numServices;
  int   tripIndex;
  int   numNodes;
  int   seq;

  bFinishedOK = FALSE;
//
//  Maintain the distance measure
//
  distanceMeasureSave = distanceMeasure;
  distanceMeasure = PREFERENCES_MILES;
//
//  Set up the trip planner
//
  if(bUseDynamicTravels)
  {
    if(bUseCISPlan)
    {
      CISfree();
      if(!CISbuild(FALSE, TRUE))
      {
        goto done;
      }
    }
    else
    {
      rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      while(rcode2 == 0)
      {
        serviceRecordID = SERVICES.recordID;
        InitTravelMatrix(serviceRecordID, TRUE);
        SERVICESKey0.recordID = serviceRecordID;
        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        btrieve(B_GETPOSITION, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        btrieve(B_GETDIRECT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
        rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      }
    }
  }
//
//  Create the sub-folder for the output files and chdir into it
//
  nI = (_mkdir(OUTPUT_FOLDER_NAME) == 0) ? TEXT_333 : TEXT_334;
  LoadString(hInst, nI, szFormatString, SZFORMATSTRING_LENGTH);
  sprintf(tempString, szFormatString, OUTPUT_FOLDER_NAME);
  MessageBeep(MB_ICONINFORMATION);
  MessageBox(NULL, tempString, TMS, MB_OK);
  chdir(OUTPUT_FOLDER_NAME);
//
//  Open the error log and fire up the status bar
//
  hfErrorLog = _lcreat("error.log", 0);
  if(hfErrorLog == HFILE_ERROR)
  {
    TMSError((HWND)NULL, MB_ICONSTOP, ERROR_226, (HANDLE)NULL);
    goto done;
  }
  bGotError = FALSE;
  pPassedData->nReportNumber = 66;
  for(nI = 0; nI < m_LastReport; nI++)
  {
    if(TMSRPT[nI].originalReportNumber == pPassedData->nReportNumber)
    {
      pszReportName = TMSRPT[nI].szReportName;
      StatusBarStart(hWndMain, TMSRPT[nI].szReportName);
      break;
    }
  }
//
//  Get today's date
//
   time(&now);
   today = *localtime(&now);
//
//  ==============================
//  Service File - oci_service.csv
//  ==============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_service.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
  StatusBarText(outputFileName);
//
//  Write out the header
//
  strcpy(outputString, "\"ServiceCode\",\"Date\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  numServices = 0;
//
//  Dump out the service day based on calendar days
//
//  Effective date
//
  GetYMD(effectiveDate, &year, &month, &day);
  memset(&tmED, 0x00, sizeof(tmED));
  tmED.tm_mday = day;
  tmED.tm_mon = month - 1;
  tmED.tm_year = year - 1900;
//
//  Until date
//
  GetYMD(untilDate, &year, &month, &day);
  memset(&tmUD, 0x00, sizeof(tmUD));
  tmUD.tm_mday = day;
  tmUD.tm_mon = month - 1;
  tmUD.tm_year = year - 1900;
//
//  Start at the effective date and go to the until date
//
  EDmktime = mktime(&tmED);
  if(EDmktime == (time_t)(-1))
  {
    LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(outputString, szFormatString, 1);
    _lwrite(hfErrorLog, outputString, strlen(outputString));
    bGotError = TRUE;
  }
  else
  {
    UDmktime = mktime(&tmUD);
    while(EDmktime <= UDmktime)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      dayOfWeek = (tmED.tm_wday == 0 ? 6 : tmED.tm_wday - 1);
      for(bFound = FALSE, nI = 0; nI < numServices; nI++)
      {
        if(ROSTERPARMS.serviceDays[dayOfWeek] == SERVICESinEffect[nI])
        {
          bFound = TRUE;
          break;
        }
      }
      if(!bFound)
      {
        SERVICESinEffect[numServices] = ROSTERPARMS.serviceDays[dayOfWeek];
        numServices++;
      }
//
//  ServiceCode (SERVICES.recordID)
//
      SERVICESKey0.recordID = ROSTERPARMS.serviceDays[dayOfWeek];
      btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      strncpy(tempString, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(tempString, SERVICES_NAME_LENGTH);
      sprintf(szarString, "\"%s\",", tempString);
      strcpy(outputString, szarString);
//
//  Date
//
      sprintf(szarString, "\"%4ld%02ld%02ld\"\r\n", tmED.tm_year + 1900, tmED.tm_mon + 1, tmED.tm_mday);
      strcat(outputString, szarString);
//
//  Write out the record
//
      _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Figure out the next day
//
      tmED.tm_mday++;
      EDmktime = mktime(&tmED);
      if(EDmktime == (time_t)(-1))
      {
        LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH);
        sprintf(outputString, szFormatString, 1);
        _lwrite(hfErrorLog, outputString, strlen(outputString));
        bGotError = TRUE;
      }
    }
  }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ============================
//  Routes File - oci_routes.csv
//  ============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_routes.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
  StatusBarText(outputFileName);
//
//  Write out the header
//
  strcpy(outputString, "\"RouteCode\",\"RouteName\",\"DirectionCode\",\"DirectionName\",\"PatternCode\",\"PatternName\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Traverse the Routes Table
//
    rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
//
//  Go through the directions
//
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  RouteName (ROUTES.name)
//
        strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH);
        trim(tempString, ROUTES_NAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  DirectionName (DIRECTIONS.longName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
        trim(tempString, DIRECTIONS_LONGNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
// Cycle through the patterns for route/service/direction
//
        strcpy(outputStringSave, outputString);
        rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        while(rcode2 == 0)
        {
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          previousPattern = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                PATTERNS.directionIndex == nI)
          {
            if(PATTERNS.PATTERNNAMESrecordID != previousPattern)
            {
//
//  PatternCode (SERVICES.recordID-PATTERNNAMES.recordID)
//
              sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID);
              strcat(outputString, szarString);
//
//  PatternName (PATTERNNAMES.name)
//
              PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID;
              btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
              strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
              trim(tempString, PATTERNNAMES_NAME_LENGTH);
              sprintf(szarString, "\"%s\"\r\n", tempString);
              strcat(outputString, szarString);
//
//  Write out the record and get the next pattern
//
              _lwrite(hfOutputFile, outputString, strlen(outputString));
              strcpy(outputString, outputStringSave);
              previousPattern = PATTERNS.PATTERNNAMESrecordID;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          }
          rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        }
      } // nI
//
//  Get the next route
//
      rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ==============================
//  Bus Stops File - oci_stops.csv
//  ==============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_stops.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"StopCode\",\"StopName\",\"Latitude\",\"Longitude\",\"Shelter\",\"Bench\",\"Accessible\",\"TimingPoint\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Get the list of nodes
//
//
//  Cycle through the Nodes Table to get associated stop numbers
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  numNodes = 0;
  while(rcode2 == 0)
  {
    if(!(NODES.flags & NODES_FLAG_STOP))
    {
      NodesAndStops[numNodes].NODESrecordID = NODES.recordID;
      NodesAndStops[numNodes].StopNumber = NODES.number;
      NodesAndStops[numNodes].OutboundStopNumber = NODES.OBStopNumber;
      NodesAndStops[numNodes].InboundStopNumber = NODES.IBStopNumber;
      numNodes++;
      if(numNodes >= TMSRPT67_MAXNODESANDSTOPS)
      {
        MessageBeep(MB_ICONSTOP);
        MessageBox(NULL, "TMSRPT67_MAXNODESANDSTOPS Exceeded.\n\nPlease contact Schedule Masters, Inc. for help", TMS, MB_OK | MB_ICONSTOP);
        goto done;
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Cycle through the Nodes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  while(rcode2 == 0)
  {
//
//  StopCode (NODES.number or NODES.abbrName)
//
    if(NODES.flags & NODES_FLAG_STOP)
    {
      sprintf(szarString, "\"%04ld\",", NODES.number);
    }
    else
    {
//      strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
//      trim(tempString, NODES_ABBRNAME_LENGTH);
//      sprintf(szarString, "\"%s\",", tempString);
      if(nI == 0)
      {
        number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
      }
      else
      {
        number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
      }
      sprintf(szarString, "\"%04ld\",", number);
    }
    strcpy(outputString, szarString);
//
//  StopName (NODES.intersection)
//
    strncpy(tempString, NODES.intersection, NODES_INTERSECTION_LENGTH);
    trim(tempString, NODES_INTERSECTION_LENGTH);
    ptr = strstr(tempString, "&&");
    if(ptr)
    {
      *ptr = 'a';
      *(ptr + 1) = 't';
    }
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Latitude (NODES.latitude)
//
    sprintf(tempString, "%12.6f", NODES.latitude);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(szarString, "\"%s\",", ptr);
    strcat(outputString, szarString);
//
//  Longitude (NODES.longitude)
//
    sprintf(tempString, "%12.6f", NODES.longitude);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(szarString, "\"%s\",", ptr);
    strcat(outputString, szarString);
//
//  If this isn't a stop, look to see if we can find the stop in the Nodes Table
//
    if(NODES.flags & NODES_FLAG_STOP)
    {
      stopFlags = NODES.stopFlags;
    }
    else
    {
      stopFlags = 0;
      stopNumber = NO_RECORD;
      if(NODES.number > 0)
      {
        stopNumber = NODES.number;
      }
      if(stopNumber == NO_RECORD && NODES.OBStopNumber > 0)
      {
        stopNumber = NODES.OBStopNumber;
      }
      if(stopNumber == NO_RECORD && NODES.IBStopNumber > 0)
      {
        stopNumber = NODES.IBStopNumber;
      }
      if(stopNumber != NO_RECORD)
      {
        btrieve(B_GETPOSITION, TMS_NODES, &absRecID, &NODESKey0, 0);
        rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
        while(rcode2 == 0)
        {
          if(NODES.flags & NODES_FLAG_STOP)
          {
            if(NODES.number == stopNumber)
            {
              stopFlags = NODES.stopFlags;
              break;
            }
          }
          rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
        }
        NODES.recordID = absRecID;
        btrieve(B_GETDIRECT, TMS_NODES, &NODES, &NODESKey0, 0);
      }
    }
//
//  Shelter (item 12 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 12) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Bench (item 5 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 5) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Accessible (item 16 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 6) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Timing point?
//
    if(!(NODES.flags & NODES_FLAG_STOP))
    {
      bFound = TRUE;
    }
    else
    {
      bFound = FALSE;
      for(nI = 0; nI < numNodes; nI++)
      {
        if(NodesAndStops[nI].StopNumber == NODES.number ||
              NodesAndStops[nI].OutboundStopNumber == NODES.number ||
              NodesAndStops[nI].InboundStopNumber == NODES.number)
        {
          bFound = TRUE;
          break;
        }
      }
    }
    sprintf(tempString, (bFound ? "True" : "False"));
    sprintf(szarString, "\"%s\"\r\n", tempString);
    strcat(outputString, szarString);
//
//  Write it out and get the next node
//
    _lwrite(hfOutputFile, outputString, strlen(outputString));
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ====================================
//  Bus Patterns File - oci_patterns.csv
//  ====================================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_patterns.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"StopCode\",\"Sequence\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Traverse the Routes Table
//
    rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  Go through all the services
//
        strcpy(outputStringSave, outputString);
        rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        while(rcode2 == 0)
        {
//
//  Go through all the patterns
//
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.nodeSequence = -1;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          previousPattern = NO_RECORD;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID && 
                PATTERNS.directionIndex == nI)
          {
            if(previousPattern != PATTERNS.PATTERNNAMESrecordID)
            {
              previousPattern = PATTERNS.PATTERNNAMESrecordID;
              seq = 1;
            }
//
//  PatternCode (SERVICES.recordID-PATTERNS.PATTERNNAMESrecordID)
//
            sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID);
            strcat(outputString, szarString);
//
//  StopCode (NODES.number or NODES.abbrName)
//
            NODESKey0.recordID = PATTERNS.NODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            if(!(NODES.flags & NODES_FLAG_STOP))
            {
              if(nI == 0)
              {
                number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
              }
              else
              {
                number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
              }
              sprintf(tempString, "%04ld", number);
//              strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
//              trim(tempString, NODES_ABBRNAME_LENGTH);
            }
            else
            {
              sprintf(tempString, "%04ld", NODES.number);
            }
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  Sequence
//
            sprintf(tempString, "\"%d\"\r\n", seq++);
            strcat(outputString, tempString);
//
//  Write it out and get the next node on the pattern
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
            strcpy(outputString, outputStringSave);
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } // while on patterns
          rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        }
      } // nI
//
//  Get the next route
//
      rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ==========================================
//  Bus Trips File - oci_trips_{RouteCode}.dat
//  ==========================================
//
//
//  Traverse the Routes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      goto done;
    }
    strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(tempString, ROUTES_NUMBER_LENGTH);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(outputFileName, "oci_trips_%s.csv", ptr);
    hfOutputFile = _lcreat(outputFileName, 0);
    if(hfOutputFile == HFILE_ERROR)
    {
      LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
      sprintf(szarString, szFormatString, outputFileName);
      MessageBeep(MB_ICONSTOP);
      MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
      goto done;
    }
//
//  Write out the header
//
    strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"TripCode\",\"StopCode\",\"Sequence\",\"ArrivalTime\",\"DepartureTime\",\"TimingPoint\",\"Bicycles\",\"ServiceCode\"\r\n");
    _lwrite(hfOutputFile, outputString, strlen(outputString));
    StatusBarText(outputFileName);
//
//  Go through the services
//
    rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(szServiceCode, SERVICES_NAME_LENGTH);
//
//  Loop through the directions
//
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
        strcpy(out2, outputString);

//
//  Get the trips for this route/ser/dir
//
        TRIPSKey1.ROUTESrecordID = ROUTES.recordID;
        TRIPSKey1.SERVICESrecordID = SERVICES.recordID;
        TRIPSKey1.directionIndex = nI;
        TRIPSKey1.tripSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        while(rcode2 == 0 &&
              TRIPS.ROUTESrecordID == ROUTES.recordID &&
              TRIPS.SERVICESrecordID == SERVICES.recordID &&
              TRIPS.directionIndex == nI)
        {
          strcpy(outputString, out2);
//
//  PatternCode (SERVICES.recordID-PATTERNNAMES.recordID)
//
          sprintf(szarString, "\"%ld-%ld\",", TRIPS.SERVICESrecordID, TRIPS.PATTERNNAMESrecordID);
          strcat(outputString, szarString);
//
//  TripCode (TRIPS.tripNumber)
//
          sprintf(szarString, "\"%ld\",", TRIPS.tripNumber);
          strcat(outputString, szarString);
//
//  Does this vehicle have a bike rack?
//
          bBikeRack = FALSE;
          if(TRIPS.BUSTYPESrecordID != NO_RECORD)
          {
            BUSTYPESKey0.recordID = TRIPS.BUSTYPESrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_BUSTYPES, &BUSTYPES, &BUSTYPESKey0, 0);
            if(rcode2 == 0)
            {
              if(BUSTYPES.flags & BUSTYPES_FLAG_CARRIER)
              {
                bBikeRack = TRUE;
              }
            }
          }
//
//  Generate the trip
//           
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Go through the pattern twice
//
//  Pass 1 - Determine distances at each timepoint
//
          if(GTResults.tripDistance != 0.0)
          {
            PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
            PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
            PATTERNSKey2.directionIndex = nI;
            PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            PATTERNSKey2.nodeSequence = NO_RECORD;
            rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            tripIndex = 0;
            distanceToHere = 0.0;
            while(rcode2 == 0 &&
                  PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                  PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                  PATTERNS.directionIndex == nI &&
                  PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
            {
              NODESKey0.recordID = PATTERNS.NODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
              if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)
              {
                distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude);
              }
              else
              {
                tripDistances[tripIndex] = distanceToHere;
                tripIndex++;
              }
              prevLat = NODES.latitude;
              prevLon = NODES.longitude;
              rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            }
          }
//
//  Save outputString to this point
//
          strcpy(outputStringSave, outputString);
//
//  Pass 2 - Determine time interpolations and output the records
//
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          tripIndex = 0;
          seq = 1;
          distanceToHere = 0.0;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                PATTERNS.directionIndex == nI &&
                PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
          {
            NODESKey0.recordID = PATTERNS.NODESrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)
            {
              if(GTResults.tripDistance == 0)
              {
                timeAtStop = GTResults.tripTimes[tripIndex - 1];
              }
              else
              {
                distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude);
                timeAtStop = (long)((GTResults.tripTimes[tripIndex] - GTResults.tripTimes[tripIndex - 1]) *
                      (distanceToHere / (tripDistances[tripIndex] - tripDistances[tripIndex - 1])));
                timeAtStop += (GTResults.tripTimes[tripIndex - 1]);
              }
            }
            else
            {
              timeAtStop = GTResults.tripTimes[tripIndex];
              distanceToHere = 0.0;
              tripIndex++;
            }
//
//  StopCode (NODES.number or NODES.abbrName)
//
/*
            if(NODES.flags & NODES_FLAG_STOP)
            {
              sprintf(szarString, "\"%04ld\",", NODES.number);
            }
            else
            {
              strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
              trim(tempString, NODES_ABBRNAME_LENGTH);
              sprintf(szarString, "\"%s\",", tempString);
            }
*/
            if(!(NODES.flags & NODES_FLAG_STOP))
            {
              if(nI == 0)
              {
                number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
              }
              else
              {
                number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
              }
              sprintf(szarString, "\"%04ld\",", number);
            }
            else
            {
              sprintf(szarString, "\"%04ld\",", NODES.number);
            }

            strcat(outputString, szarString);
//
//  Sequence
//
            sprintf(szarString, "\"%d\",", seq++);
            strcat(outputString, szarString);
//
//  ArrivalTime (Time at the stop, in seconds)
//
//  Now time is in HHMM (11-Aug-08)
//
//            sprintf(szarString, "\"%ld\",", timeAtStop);
            sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE));
            strcat(outputString, szarString);
//
//  DepartureTime (Time at the stop, in seconds)
//
//  Now time is in HHMM (11-Aug-08)
//
//            sprintf(szarString, "\"%ld\",", timeAtStop);
            sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE));
            strcat(outputString, szarString);
//
//  Timepoint?
//
            sprintf(tempString, "%s", (NODES.flags & NODES_FLAG_STOP ? "False" : "True"));
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  Bicycles?
//
            sprintf(tempString, "%s", (bBikeRack ? "True" : "False"));
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  ServiceCode
//
            sprintf(szarString, "\"%s\"\r\n", szServiceCode);
            strcat(outputString, szarString);
//
//  Write it out and go back
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
            strcpy(outputString, outputStringSave);
            prevLat = NODES.latitude;
            prevLon = NODES.longitude;
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } // while on pattern
//
//  Get the next trip
//
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        } // while on trips
      } // nI (directions on the route)
//
//  Get the next service
//
      rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    }
//
//  Close the file
//
    _lclose(hfOutputFile);
//
//  Get the next route
//
    rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  }
//
//  Blocks
//
//
//  ============================
//  Blocks File - oci_blocks.dat
//  ============================
//
  pTRIPSChunk = &TRIPS.standard;
  sprintf(outputFileName, "oci_blocks.csv", ptr);
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"BlockCode\",\"ServiceCode\",\"TripCode\",\"Sequence\",\"StartStopCode\",\"EndStopCode\",\"InService\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Traverse the Routes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      goto done;
    }
//
//  Go through the services
//
    rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(szServiceCode, SERVICES_NAME_LENGTH);
//
//  Get all the blocks on this route group
//
      NODESKey1.flags = NODES_FLAG_GARAGE;
      memset(NODESKey1.abbrName, 0x00, NODES_ABBRNAME_LENGTH);
      rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_NODES, &NODES, &NODESKey1, 1);
      bFirst = TRUE;
      while(rcode2 == 0 && NODES.flags & NODES_FLAG_GARAGE)
      {
//
//  Cycle through the blocks
//
        assignedToNODESrecordID = bFirst ? NO_RECORD : NODES.recordID;
        TRIPSKey2.assignedToNODESrecordID = assignedToNODESrecordID;
        TRIPSKey2.RGRPROUTESrecordID = ROUTES.recordID;
        TRIPSKey2.SGRPSERVICESrecordID = SERVICES.recordID;
        TRIPSKey2.blockNumber = 1;
        TRIPSKey2.blockSequence = NO_TIME;
        rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        blockNumber = NO_RECORD;
//
//  Get the first trip on the block
//
        while(rcode2 == 0 &&
              pTRIPSChunk->assignedToNODESrecordID == assignedToNODESrecordID &&
              pTRIPSChunk->RGRPROUTESrecordID == ROUTES.recordID &&
              pTRIPSChunk->SGRPSERVICESrecordID == SERVICES.recordID)
        {
          if(StatusBarAbort())
          {
            goto done;
          }
          if(pTRIPSChunk->blockNumber != blockNumber)
          {
            seq = 1;
            blockNumber = pTRIPSChunk->blockNumber;
          }
//
//  Gen the whole trip
//
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Pullout?
//
          if(pTRIPSChunk->POGNODESrecordID == NO_RECORD)
          {
            fromNODESrecordID = GTResults.firstNODESrecordID;
            fromTime = GTResults.firstNodeTime;
          }
          else
          {
            GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.fromNODESrecordID = pTRIPSChunk->POGNODESrecordID;
            GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
            GCTData.timeOfDay = GTResults.firstNodeTime;
            dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
            distance = (float)fabs((double)distance);
            if(dhd == NO_TIME)
            {
              dhd = 0;
            }
            fromNODESrecordID = pTRIPSChunk->POGNODESrecordID;
            fromTime = GTResults.firstNodeTime - dhd;
//
//  Output the pull-out deadhead record
//
//  Start and End Stop codes
//
            NODESKey0.recordID = pTRIPSChunk->POGNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(tempString, NODES_ABBRNAME_LENGTH);
            NODESKey0.recordID = GTResults.firstNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
            sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n",
                  pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString);
           _lwrite(hfOutputFile, outputString, strlen(outputString));
           seq++;
          }
//
//  Start/end trip details
//
          sprintf(szTripCode, "%ld", TRIPS.tripNumber);
//
//  Start and End Stop codes
//
          NODESKey0.recordID = GTResults.firstNODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(tempString, NODES_ABBRNAME_LENGTH);
          NODESKey0.recordID = GTResults.lastNODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
          sprintf(outputString, "\"%ld\",\"%s\",\"%s\",\"%d\",\"%s\",\"%s\",\"True\"\r\n",
                pTRIPSChunk->blockNumber, szServiceCode, szTripCode, seq, tempString, szarString);
          _lwrite(hfOutputFile, outputString, strlen(outputString));
          seq++;
//
//  Pullin
//
          if(pTRIPSChunk->PIGNODESrecordID == NO_RECORD)
          {
            toNODESrecordID = GTResults.lastNODESrecordID;
            toTime = GTResults.lastNodeTime;
          }
          else
          {
            GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
            GCTData.toNODESrecordID = pTRIPSChunk->PIGNODESrecordID;
            GCTData.timeOfDay = GTResults.lastNodeTime;
            dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
            distance = (float)fabs((double)distance);
            if(dhd == NO_TIME)
            {
              dhd = 0;
            }
            toNODESrecordID = pTRIPSChunk->PIGNODESrecordID;
            toTime = GTResults.lastNodeTime + dhd;
//
//  Output the pull-in deadhead record
//
//  Start and End Stop codes
//
            NODESKey0.recordID = GTResults.lastNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(tempString, NODES_ABBRNAME_LENGTH);
            NODESKey0.recordID = pTRIPSChunk->PIGNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
            sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n",
                  pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString);
           _lwrite(hfOutputFile, outputString, strlen(outputString));
           seq++;
          }
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        }  // while blocks on this garage node

//
//  Get the next garage node
//
        if(bFirst)
        {
          bFirst = FALSE;
        }
        else
        {
          rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey1, 1);
        }
      }  // while cycling through garage nodes
//
//  Get the next service
//
      rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    }
//
//  Get the next route
//
    rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  }  
//
//  Close the file
//
  _lclose(hfOutputFile);
  
//
//  All done
//
  StatusBar(-1L, -1L);
  bFinishedOK = TRUE;
  
  done:
    chdir("..");  // Back to where we started from
    StatusBarEnd();
  
  if(!bFinishedOK)
  {
    TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_227, (HANDLE)NULL);
  }
  if(bGotError)
  {
    TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_350, (HANDLE)NULL);
  }
  _lclose(hfErrorLog);
  distanceMeasure = distanceMeasureSave;
  recordLength[TMS_COMMENTS] = COMMENTS_FIXED_LENGTH;
  return(bFinishedOK);
}
예제 #7
0
파일: TMSRpt51.c 프로젝트: ems/TMS
BOOL FAR TMSRPT51(TMSRPTPassedDataDef *pPassedData)
{
  REPORTPARMSDef REPORTPARMS;
  PROPOSEDRUNDef PROPOSEDRUN;
  COSTDef COST;
  HFILE hfOutputFile;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  BOOL  bCoach;
  char  outputString[512];
  char  szDate[16];
  char  szEmployee[16];
  char  szRunNumber[7];
  char  *ptr;
  long  numPieces;
  long  time;
  long  platformTime;
  long  reportTime;
  long  turninTime;
  long  travelTime;
  long  dd,  mm, yyyy;
  int   nI;
  int   nJ;
  int   nK;
  int   rcode2;
  int   seq;
  int   numRosters;

  pPassedData->nReportNumber = 48;
  pPassedData->numDataFiles = 1;
//
//  See what he wants
//
  REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
  REPORTPARMS.DIVISIONSrecordID = m_DivisionRecordID;
  REPORTPARMS.pDivisionList = NULL;
  REPORTPARMS.flags = RPFLAG_DIVISIONS;
  bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
        hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
  if(!bRC)
    return(FALSE);
//
//  Check the list of routes, services, and divisions
//
  if(REPORTPARMS.numDivisions == 0)
    goto deallocate;
//
//  Open the output file
//
  strcpy(tempString, szDatabaseFileName);
  if((ptr = strrchr(tempString, '\\')) != NULL)
    *ptr = '\0';
  strcat(tempString, "\\Fleet-Net Payroll.txt");
  hfOutputFile = _lcreat(tempString, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
//
//  Fire up the status bar
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
//
//  Determine the extent of the status bar
//
  rcode2 = btrieve(B_STAT, TMS_ROSTER, &BSTAT, outputString, 0);
  if(rcode2 != 0 || BSTAT.numRecords == 0)
  {
    TMSError((HWND)NULL, MB_ICONSTOP, ERROR_319, (HANDLE)NULL);
    goto deallocate;
  }
  numRosters = BSTAT.numRecords;
//
//  Get today's date
//
  if(CalendarDate(&dd, &mm, &yyyy) == NO_RECORD)
  {
    goto deallocate;
  }
//
//  Loop through all the divisions
//
  bKeepGoing = TRUE;
  seq = 0;
  for(nI = 0; nI < REPORTPARMS.numDivisions; nI++)
  {
    if(StatusBarAbort())
    {
      goto deallocate;
    }
    DIVISIONSKey0.recordID = REPORTPARMS.pDivisionList[nI];
    btrieve(B_GETEQUAL, TMS_DIVISIONS, &DIVISIONS, &DIVISIONSKey0, 0);
    strncpy(tempString, DIVISIONS.name, DIVISIONS_NAME_LENGTH);
    trim(tempString, DIVISIONS_NAME_LENGTH);
    bCoach = (strstr(tempString, "Coach") > 0);
//
//  Cycle through the roster
//
    ROSTERKey1.DIVISIONSrecordID = DIVISIONS.recordID;
    ROSTERKey1.rosterNumber = NO_RECORD;
    rcode2 = btrieve(B_GETGREATER, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
    while(rcode2 == 0 &&
          ROSTER.DIVISIONSrecordID == DIVISIONS.recordID)
    {
      if(StatusBarAbort())
      {
        goto deallocate;
      }
//
//  Get the employee - must be assigned
//
      StatusBar((long)(seq + 1), (long)numRosters);
      if(ROSTER.DRIVERSrecordID != NO_RECORD)
      {
        DRIVERSKey0.recordID = ROSTER.DRIVERSrecordID;
        btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
        strncpy(szEmployee, DRIVERS.badgeNumber, TMSRPT51_MAX_EMPLOYEENUMBERLENGTH);
        szEmployee[TMSRPT51_MAX_EMPLOYEENUMBERLENGTH] = '\0';
//
//  Loop through the runs
//
        for(nJ = 0; nJ < ROSTER_MAX_DAYS; nJ++)
        {
          if(StatusBarAbort())
          {
            goto deallocate;
          }
          if(ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[nJ] == NO_RECORD)
          {
            continue;
          }
//
//  Establish "today's" date
//
          strcpy(szDate, CalendarDateWithOffset(dd, mm, yyyy, nJ));
//
//  Get the characteristics of the run
//
          RUNSKey0.recordID = ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[nJ];
          rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0);
          if(rcode2 != 0)
          {
            continue;
          }
          sprintf(szRunNumber, "%6ld", RUNS.runNumber);
          numPieces = GetRunElements(NULL, &RUNS, &PROPOSEDRUN, &COST, TRUE);
          platformTime = 0;
          reportTime = 0;
          turninTime = 0;
          travelTime = 0;
          for(nK = 0; nK < numPieces; nK++)
          {
            platformTime += RUNSVIEW[nK].platformTime;
            reportTime += RUNSVIEW[nK].reportTime;
            turninTime += RUNSVIEW[nK].turninTime;
            travelTime += RUNSVIEW[nK].travelTime;
          }
//
//  Spit out the various components
//
          for(nK = 0; nK < TMSRPT51_NUMCOMPONENTS; nK++)
          {
//
//  Set up the output record
//
            strcpy(outputString, szDate);
            strcat(outputString, "\t");
            strcat(outputString, szEmployee);
            strcat(outputString, "\t");
            switch(nK)
            {
//
//  Platform time
//
              case  TMSRPT51_PLATFORMTIME:
                strcat(outputString, (bCoach ? "PLT" : "PLV"));
                time = platformTime;
                break;
//
//  Makeup time
//
              case  TMSRPT51_MAKEUPTIME:
                strcat(outputString, (bCoach ? "GCS" : "GUV"));
                time = RUNSVIEW[numPieces - 1].makeUpTime;
                break;
//
//  Report time
//
              case  TMSRPT51_REPORTTIME:
                strcat(outputString, (bCoach ? "REC" : "RPV"));
                time = reportTime;
                break;
//
//  Turnin time
//
              case  TMSRPT51_TURNINTIME: 
                strcat(outputString, (bCoach ? "CHT" : "CHV"));
                time = turninTime;
                break;
//
//  Travel time
//
              case  TMSRPT51_TRAVELTIME:
                strcat(outputString, (bCoach ? "TRT" : "TRV"));
                time = travelTime;
                break;
//
//  Overtime
//
              case  TMSRPT51_OVERTIME:
                strcat(outputString, (bCoach ? "OCS" : "OVS"));
                time = (long)(RUNSVIEW[numPieces - 1].overTime / 1.5);
                break;
            }
//
//  Fill in the rest of the record
//
//  Time
//
            sprintf(tempString, "\t%5ld\t", time);
            strcat(outputString, tempString);
//
//  Run number
//
            strcat(outputString, szRunNumber);
            strcat(outputString, "\r\n");
//
//  Write the record
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
          }
        }
      }
//
//  Get the next roster record
//
      seq++;
      rcode2 = btrieve(B_GETNEXT, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
    }
  }  // nI loop on divisions
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    TMSHeapFree(REPORTPARMS.pDivisionList);
    StatusBarEnd();
    _lclose(hfOutputFile);
    SetCursor(hCursorArrow);
    if(!bKeepGoing)
      return(FALSE);
//
//  Let him know
//
    strcpy(tempString, "Fleet-Net Payroll.txt was written to:\n");
    strcpy(szarString, szDatabaseFileName);
    if((ptr = strrchr(szarString, '\\')) != NULL)
      *ptr = '\0';
    strcat(tempString, szarString);
    MessageBox(hWndMain, tempString, TMS, MB_OK);
//
//  All done
//
  return(TRUE);
}
예제 #8
0
파일: Tmsrpt30.c 프로젝트: ems/TMS
BOOL FAR TMSRPT30(TMSRPTPassedDataDef *pPassedData)
{
  DISPATCHSHEETPassedDataDef RParamData;
  DISPATCHSHEETRosterDataDef RData[MAXRUNSINRUNLIST];
  PROPOSEDRUNDef PROPOSEDRUN;
  COSTDef  COST;
  HFILE hfOutputFile;
  BOOL  bFound;
  char  lastName[DRIVERS_LASTNAME_LENGTH + 1];
  char  firstName[DRIVERS_FIRSTNAME_LENGTH + 1];
  char  badgeNumber[DRIVERS_BADGENUMBER_LENGTH + 1];
  char  abbrName[NODES_ABBRNAME_LENGTH + 1];
  char  outputString[TEMPSTRING_LENGTH];
  char  *pszReportName;
  long  onTime;
  long  offTime;
  long  seq;
  long  time;
  long  flatPay;
  long  makeUpTime;
  long  pieceNumber;
  long  runNumber;
  long  cutAsRuntype;
  long  startTime;
  long  onNode;
  long  offNode;
  int   numRuns;
  int   nI;
  int   nJ;
  int   numPieces;
  int   rcode2;
//
//  See what he wants to unload
//
  RParamData.flags = 0;
  RParamData.nReportNumber = 29;
  if(DispatchSheet(&RParamData) != IDOK)
    return(FALSE);
  if(ROSTERPARMS.serviceDays[RParamData.dayOfWeek] == NO_RECORD)
  {
    TMSError(hWndMain, MB_ICONSTOP, ERROR_318, (HANDLE)NULL);
    return(FALSE);
  }
//
//  Back ok - set up the status bar
//
  pPassedData->nReportNumber = 29;
  pPassedData->numDataFiles = 1;
  for(nI = 0; nI < m_LastReport; nI++)
  {
    if(TMSRPT[nI].originalReportNumber == pPassedData->nReportNumber)
    {
      pszReportName = TMSRPT[nI].szReportName;
      StatusBarStart(hWndMain, TMSRPT[nI].szReportName);
      break;
    }
  }
//
//  Open the output file
//
  StatusBarText("Opening output file...");
  strcpy(tempString, szReportsTempFolder);
  strcat(tempString, "\\tmsrpt30.txt");
  hfOutputFile = _lcreat(tempString, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
  StatusBar(-1L, -1L);
//
//  Loop through the roster to set up drivers, their associated
//  runs, and the start time of each run.  There's a data integrity
//  check here to ensure that the run pointed to by the roster actually exists.
//
  StatusBarText("Examining the roster...");
  numRuns = 0;
  ROSTERKey1.DIVISIONSrecordID = RParamData.DIVISIONSrecordID;
  ROSTERKey1.rosterNumber = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
  while(rcode2 == 0 &&
        ROSTER.DIVISIONSrecordID == RParamData.DIVISIONSrecordID)
  {
    if(StatusBarAbort())
    {
      goto deallocate;
    }
    if(ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[RParamData.dayOfWeek] != NO_RECORD)
    {
      if(ROSTER.WEEK[m_RosterWeek].flags & (1 << RParamData.dayOfWeek))  // Crew-only run
      {
        CREWONLYKey0.recordID = ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[RParamData.dayOfWeek];
        rcode2 = btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0);
        if(rcode2 == 0)
        {
          RData[numRuns].flags = RDATA_FLAG_CREWONLY;
          RData[numRuns].DRIVERSrecordID = ROSTER.DRIVERSrecordID;
          RData[numRuns].RUNSrecordID = ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[RParamData.dayOfWeek];
          RData[numRuns].startTime = CREWONLY.startTime;
          RData[numRuns].runNumber = CREWONLY.runNumber;
          RData[numRuns].replacementDRIVERSrecordID = NO_RECORD;
          RData[numRuns].rosterNumber = NO_RECORD;
          RData[numRuns].BUSESrecordID = NO_RECORD;
          RData[numRuns].blockNumber = NO_RECORD;
          RData[numRuns].TRIPSrecordID = NO_RECORD;
          RData[numRuns].RGRPROUTESrecordID = NO_RECORD;
          RData[numRuns].SGRPSERVICESrecordID = NO_RECORD;
          numRuns++;
        }
      }
      else
      {
        RUNSKey0.recordID = ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[RParamData.dayOfWeek];
        rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0);
        if(rcode2 == 0)
        {
          RData[numRuns].flags = 0;
          RData[numRuns].DRIVERSrecordID = ROSTER.DRIVERSrecordID;
          RData[numRuns].RUNSrecordID = ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[RParamData.dayOfWeek];
          RunStartAndEnd(RUNS.start.TRIPSrecordID, RUNS.start.NODESrecordID,
                NO_RECORD, NO_RECORD, &onTime, &offTime);
          RData[numRuns].startTime = onTime;
          RData[numRuns].runNumber = RUNS.runNumber;
          RData[numRuns].replacementDRIVERSrecordID = NO_RECORD;
          RData[numRuns].rosterNumber = NO_RECORD;
          RData[numRuns].BUSESrecordID = NO_RECORD;
          RData[numRuns].blockNumber = NO_RECORD;
          RData[numRuns].TRIPSrecordID = RUNS.start.TRIPSrecordID;
          RData[numRuns].RGRPROUTESrecordID = NO_RECORD;
          RData[numRuns].SGRPSERVICESrecordID = NO_RECORD;
          numRuns++;
        }
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
  }
//
//  Now go through the runs to add any unassigned runs to RData
//
  StatusBarText("Setting up unassigned runs...");
  RUNSKey1.DIVISIONSrecordID = RParamData.DIVISIONSrecordID;
  RUNSKey1.SERVICESrecordID = ROSTERPARMS.serviceDays[RParamData.dayOfWeek];
  RUNSKey1.runNumber = NO_RECORD;
  RUNSKey1.pieceNumber = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_RUNS, &RUNS, &RUNSKey1, 1);
  while(rcode2 == 0 && 
        RUNS.DIVISIONSrecordID == RParamData.DIVISIONSrecordID &&
        RUNS.SERVICESrecordID == ROSTERPARMS.serviceDays[RParamData.dayOfWeek])
  {
    if(StatusBarAbort())
    {
      goto deallocate;
    }
    if(RUNS.pieceNumber == 1)
    {
      for(bFound = FALSE, nI = 0; nI < numRuns; nI++)
      {
        if(RUNS.recordID == RData[nI].RUNSrecordID &&
              !(RData[nI].flags & RDATA_FLAG_CREWONLY))
        {
          bFound = TRUE;
          break;
        }
      }
      if(!bFound)
      {
        RData[numRuns].DRIVERSrecordID = NO_RECORD;
        RData[numRuns].RUNSrecordID = RUNS.recordID;
        RunStartAndEnd(RUNS.start.TRIPSrecordID, RUNS.start.NODESrecordID,
              NO_RECORD, NO_RECORD, &onTime, &offTime);
        RData[numRuns].startTime = onTime;
        RData[numRuns].runNumber = RUNS.runNumber;
        RData[numRuns].replacementDRIVERSrecordID = NO_RECORD;
        RData[numRuns].rosterNumber = NO_RECORD;
        RData[numRuns].BUSESrecordID = NO_RECORD;
        RData[numRuns].blockNumber = NO_RECORD;
        RData[numRuns].TRIPSrecordID = RUNS.start.TRIPSrecordID;
        RData[numRuns].RGRPROUTESrecordID = NO_RECORD;
        RData[numRuns].SGRPSERVICESrecordID = NO_RECORD;
        RData[numRuns].flags = 0;
        numRuns++;
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_RUNS, &RUNS, &RUNSKey1, 1);
  }
//
//  Now go through the runs to add any unassigned crew-only runs to RData
//
  CREWONLYKey1.DIVISIONSrecordID = RParamData.DIVISIONSrecordID;
  CREWONLYKey1.SERVICESrecordID = ROSTERPARMS.serviceDays[RParamData.dayOfWeek];
  CREWONLYKey1.runNumber = NO_RECORD;
  CREWONLYKey1.pieceNumber = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_CREWONLY, &CREWONLY, &CREWONLYKey1, 1);
  while(rcode2 == 0 && 
        CREWONLY.DIVISIONSrecordID == RParamData.DIVISIONSrecordID &&
        CREWONLY.SERVICESrecordID == ROSTERPARMS.serviceDays[RParamData.dayOfWeek])
  {
    if(StatusBarAbort())
    {
      goto deallocate;
    }
    if(CREWONLY.pieceNumber == 1)
    {
      for(bFound = FALSE, nI = 0; nI < numRuns; nI++)
      {
        if(CREWONLY.recordID == RData[nI].RUNSrecordID &&
              (RData[nI].flags & RDATA_FLAG_CREWONLY))
        {
          bFound = TRUE;
          break;
        }
      }
      if(!bFound)
      {
        RData[numRuns].flags = RDATA_FLAG_CREWONLY;
        RData[numRuns].DRIVERSrecordID = NO_RECORD;
        RData[numRuns].RUNSrecordID = CREWONLY.recordID;
        RData[numRuns].startTime = CREWONLY.startTime;
        RData[numRuns].runNumber = CREWONLY.runNumber;
        RData[numRuns].replacementDRIVERSrecordID = NO_RECORD;
        RData[numRuns].rosterNumber = NO_RECORD;
        RData[numRuns].BUSESrecordID = NO_RECORD;
        RData[numRuns].blockNumber = NO_RECORD;
        RData[numRuns].TRIPSrecordID = NO_RECORD;
        RData[numRuns].RGRPROUTESrecordID = NO_RECORD;
        RData[numRuns].SGRPSERVICESrecordID = NO_RECORD;
        numRuns++;
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_CREWONLY, &CREWONLY, &CREWONLYKey1, 1);
  }
//
//  Check for changes made via Daily Ops
//
  AdjustDispatchSheetRosterData(&RData[0], RParamData.todaysDate, RParamData.date, numRuns, TRUE, FALSE);
//
//  Sort by run number
//
  qsort((void *)RData, numRuns, sizeof(DISPATCHSHEETRosterDataDef), sort_TMSRPT30);
//
//  Generate the run details, and print them
//  out along with any associated driver data.
//
  StatusBarText("Generating run details...");
  seq = 0;
//
//  Initialize the travel matrix
//
  StatusBarEnd();
  if(bUseDynamicTravels)
  {
    SERVICESKey0.recordID = ROSTERPARMS.serviceDays[RParamData.dayOfWeek];
    btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
    LoadString(hInst, bUseCISPlan ? TEXT_154 : TEXT_135, tempString, TEMPSTRING_LENGTH);
    StatusBarText(tempString);
    if(bUseCISPlan)
    {
      CISfree();
      if(!CISbuildService(FALSE, TRUE, SERVICES.recordID))
        goto deallocate;
    }
    else
    {
      InitTravelMatrix(SERVICES.recordID, FALSE);
    }
  }
//
//  Cycle through the runs
//
  StatusBarStart(hWndMain, pszReportName);
  StatusBarText("Cycling through the runs...");
  for(nI = 0; nI < numRuns; nI++)
  {
    StatusBar((long)(nI + 1), (long)numRuns);
    if(StatusBarAbort())
    {
      goto deallocate;
    }
//
//  Run data
//
    if(RData[nI].flags & RDATA_FLAG_CREWONLY)
    {
      CREWONLYKey0.recordID = RData[nI].RUNSrecordID;
      btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0);
    }
    else
    {
      RUNSKey0.recordID = RData[nI].RUNSrecordID;
      btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0);
    }
//
//  Set up the output string
//
//  Sequence # and Service
//
    sprintf(outputString, "%d\t%s\t", seq++, RParamData.szDate);
//
//  Driver
//
    if(RData[nI].replacementDRIVERSrecordID != NO_RECORD)
    {
      DRIVERSKey0.recordID = RData[nI].replacementDRIVERSrecordID;
    }
    else if(RData[nI].DRIVERSrecordID != NO_RECORD)
    {
      DRIVERSKey0.recordID = RData[nI].DRIVERSrecordID;
    }
    else
    {
      DRIVERSKey0.recordID = NO_RECORD;
    }
    if(DRIVERSKey0.recordID != NO_RECORD)
    {
      btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
      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);
      strcat(outputString, badgeNumber);
      strcat(outputString, " - ");
      strcat(outputString, lastName);
      strcat(outputString, ", ");
      strcat(outputString, firstName);
    }
    strcat(outputString, "\t");
//
//  Run number
//
    sprintf(tempString, "%ld\t", RData[nI].runNumber);
    strcat(outputString, tempString);
//
//  Run details
//
    makeUpTime = 0;
//
//  Crew only
//
    if(RData[nI].flags & RDATA_FLAG_CREWONLY)
    {
      btrieve(B_GETPOSITION, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0);
      rcode2 = btrieve(B_GETDIRECT, TMS_CREWONLY, &CREWONLY, &CREWONLYKey1, 1);
      pieceNumber = 0;
      runNumber = CREWONLY.runNumber;
      while(rcode2 == 0 && CREWONLY.runNumber == runNumber)
      {
        onTime = CREWONLY.startTime;
        offTime = CREWONLY.endTime;
        if(CREWONLY.pieceNumber == 1)
        {
          cutAsRuntype = CREWONLY.cutAsRuntype;
          startTime = onTime;
          onNode = CREWONLY.startNODESrecordID;
        }
        PROPOSEDRUN.piece[pieceNumber].fromTime = onTime;
        PROPOSEDRUN.piece[pieceNumber].fromNODESrecordID = CREWONLY.startNODESrecordID;
        PROPOSEDRUN.piece[pieceNumber].fromTRIPSrecordID = NO_RECORD;
        PROPOSEDRUN.piece[pieceNumber].toTime = offTime;
        PROPOSEDRUN.piece[pieceNumber].toNODESrecordID = CREWONLY.endNODESrecordID;
        PROPOSEDRUN.piece[pieceNumber].toTRIPSrecordID = NO_RECORD;
        PROPOSEDRUN.piece[pieceNumber].prior.startTime = NO_TIME;
        PROPOSEDRUN.piece[pieceNumber].prior.endTime = NO_TIME;
        PROPOSEDRUN.piece[pieceNumber].after.startTime = NO_TIME;
        PROPOSEDRUN.piece[pieceNumber++].after.endTime = NO_TIME;
        offNode = CREWONLY.endNODESrecordID;
        rcode2 = btrieve(B_GETNEXT, TMS_CREWONLY, &CREWONLY, &CREWONLYKey1, 1);
      }
      PROPOSEDRUN.numPieces = pieceNumber;
      RunCoster(&PROPOSEDRUN, cutAsRuntype, &COST);
      numPieces = PROPOSEDRUN.numPieces;
      for(nJ = 0; nJ < numPieces; nJ++)
      {
        RUNSVIEW[nJ].platformTime = COST.PIECECOST[nJ].platformTime;
        RUNSVIEW[nJ].makeUpTime = COST.PIECECOST[nJ].makeUpTime;
        RUNSVIEW[nJ].reportTime = COST.PIECECOST[nJ].reportTime;
        RUNSVIEW[nJ].turninTime = COST.PIECECOST[nJ].turninTime;
        RUNSVIEW[nJ].travelTime = COST.TRAVEL[nJ].startTravelTime + COST.TRAVEL[nJ].endTravelTime;
        RUNSVIEW[nJ].paidBreaks = COST.PIECECOST[nJ].paidBreak;
        RUNSVIEW[nJ].blockNumber = NO_RECORD;
        RUNSVIEW[nJ].runOnNODESrecordID = PROPOSEDRUN.piece[nJ].fromNODESrecordID;
        RUNSVIEW[nJ].runOnTime = PROPOSEDRUN.piece[nJ].fromTime;
        RUNSVIEW[nJ].runOffTime = PROPOSEDRUN.piece[nJ].toTime;
        RUNSVIEW[nJ].runOffNODESrecordID = PROPOSEDRUN.piece[nJ].toNODESrecordID;
      }
    }
//
//  Regular run
//
    else
    {
      numPieces = GetRunElements(hWndMain, &RUNS, &PROPOSEDRUN, &COST, TRUE);
    }
//
//  Cycle through the pieces
//
    for(nJ = 0; nJ < numPieces; nJ++)
    {
      if(nJ != 0)
      {
        sprintf(outputString,
              "%d\t%s\t\t%ld\t", seq++, RParamData.szDate, RData[nI].runNumber);
      }
//
//  Block number
//
      if(RUNSVIEW[nJ].blockNumber != NO_RECORD)
      {
        sprintf(tempString, "%ld\t", RUNSVIEW[nJ].blockNumber);
      }
      else
      {
        strcpy(tempString, "STBY\t");
      }
      strcat(outputString, tempString);
//
//  Location of origin
//
      NODESKey0.recordID = RUNSVIEW[nJ].runOnNODESrecordID;
      btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      strncpy(abbrName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
      trim(abbrName, NODES_ABBRNAME_LENGTH);
      strcat(outputString, abbrName);
      strcat(outputString, "\t");
//
//  Time of report
//
      time = RUNSVIEW[nJ].runOnTime - RUNSVIEW[nJ].reportTime;
      if(RParamData.flags & DISPATCHSHEET_FLAG_INCLUDESTARTOFPIECETRAVEL)
        time -= RUNSVIEW[nJ].startOfPieceTravel;
      if(RUNSVIEW[nJ].startOfPieceExtraboardStart != NO_TIME)
        time = RUNSVIEW[nJ].startOfPieceExtraboardStart;
      strcat(outputString, Tchar(time));
      strcat(outputString, "\t");
// 
//  On time
//
      strcat(outputString, Tchar(RUNSVIEW[nJ].runOnTime));
      strcat(outputString, "\t");
//
//  Off time
//
      strcat(outputString, Tchar(RUNSVIEW[nJ].runOffTime));
      strcat(outputString, "\t");
//
//  Location of destination
//
      NODESKey0.recordID = RUNSVIEW[nJ].runOffNODESrecordID;
      btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      strncpy(abbrName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
      trim(abbrName, NODES_ABBRNAME_LENGTH);
      strcat(outputString, abbrName);
      strcat(outputString, "\t");
//
//  Platform time
//
      strcat(outputString, Tdec(RUNSVIEW[nJ].platformTime));
      strcat(outputString, "\t");
//
//  Report time
//
      if(RUNSVIEW[nJ].reportTime > 0)
        strcat(outputString, Tdec(RUNSVIEW[nJ].reportTime));
      strcat(outputString, "\t");
//
//  Pad time
//
      if(RUNSVIEW[nJ].makeUpTime > 0)
        makeUpTime += RUNSVIEW[nJ].makeUpTime;
      if(RUNSVIEW[nJ].paidBreaks > 0)
        makeUpTime += RUNSVIEW[nJ].paidBreaks;
      if(makeUpTime > 0)
        strcat(outputString, Tdec(makeUpTime));
      strcat(outputString, "\t");
//
//  Spread time
//
      strcat(outputString, "\t");
//
//  Travel and Dwell Time
//
      if(RUNSVIEW[nJ].travelTime > 0)
        strcat(outputString, Tdec(RUNSVIEW[nJ].travelTime));
      strcat(outputString, "\t\r\n");
//
//  Write it out
//
      _lwrite(hfOutputFile, outputString, strlen(outputString));
    }
//
//  Write out the summary record
//
    sprintf(outputString,
          "%d\t%s\t\t%ld\t\t\t\t\t\tTotals\t", seq++, RParamData.szDate, RData[nI].runNumber);
//
//  Sum the platform, report, makeup, travel, and intervening times
//
//  Change all NO_TIMEs to 0
//
    for(nJ = 0; nJ < numPieces; nJ++)
    {
      if(RUNSVIEW[nJ].platformTime == NO_TIME)
        RUNSVIEW[nJ].platformTime = 0;
      if(RUNSVIEW[nJ].makeUpTime == NO_TIME)
        RUNSVIEW[nJ].makeUpTime = 0;
      if(RUNSVIEW[nJ].reportTime == NO_TIME)
        RUNSVIEW[nJ].reportTime = 0;
      if(RUNSVIEW[nJ].travelTime == NO_TIME)
        RUNSVIEW[nJ].travelTime = 0;
      if(RUNSVIEW[nJ].paidBreaks == NO_TIME)
        RUNSVIEW[nJ].paidBreaks = 0;
      if(RUNSVIEW[nJ].turninTime == NO_TIME)
        RUNSVIEW[nJ].turninTime = 0;
    }
//
//  Generate the sums
//
    for(nJ = 1; nJ < numPieces; nJ++)
    {
      RUNSVIEW[0].platformTime += RUNSVIEW[nJ].platformTime;
      RUNSVIEW[0].makeUpTime += RUNSVIEW[nJ].makeUpTime;
      RUNSVIEW[0].reportTime += RUNSVIEW[nJ].reportTime;
      RUNSVIEW[0].turninTime += RUNSVIEW[nJ].turninTime;
      RUNSVIEW[0].travelTime += RUNSVIEW[nJ].travelTime;
      RUNSVIEW[0].paidBreaks += RUNSVIEW[nJ].paidBreaks;
    }
//
//  And write them out
//
//  Platform time
//
    strcat(outputString, Tdec(RUNSVIEW[0].platformTime));
    strcat(outputString, "\t");
    flatPay = RUNSVIEW[0].platformTime;
//
//  Report and turnin time
//
    if(RUNSVIEW[0].reportTime > 0 || RUNSVIEW[0].turninTime > 0)
    {
      strcat(outputString, Tdec(RUNSVIEW[0].reportTime + RUNSVIEW[0].turninTime));
      flatPay += RUNSVIEW[0].reportTime + RUNSVIEW[0].turninTime;
    }
    strcat(outputString, "\t");
//
//  Pad time
//
    makeUpTime = 0;
    if(RUNSVIEW[0].makeUpTime > 0)
      makeUpTime += RUNSVIEW[0].makeUpTime;
    if(RUNSVIEW[0].paidBreaks > 0)
      makeUpTime += RUNSVIEW[0].paidBreaks;
    if(makeUpTime > 0)
    {
      strcat(outputString, Tdec(makeUpTime));
      flatPay += makeUpTime;
    }
    strcat(outputString, "\t");
//
//  Spread overtime
//
    if(RUNSVIEW[numPieces - 1].spreadOT > 0)
    {
      strcat(outputString, Tdec(RUNSVIEW[numPieces - 1].spreadOT));
      flatPay += RUNSVIEW[numPieces - 1].spreadOT;
    }
    strcat(outputString, "\t");
//
//  Travel and Dwell Time
//
    if(RUNSVIEW[0].travelTime > 0)
    {
      strcat(outputString, Tdec(RUNSVIEW[0].travelTime));
      flatPay += RUNSVIEW[0].travelTime;
    }
    strcat(outputString, "\t");
//
//  Flat Pay time
//
    strcat(outputString, Tdec(flatPay));
    strcat(outputString, "\t");
//
//  School?
//
    strcat(outputString, "\r\n");
//
//  Write it out
//
    _lwrite(hfOutputFile, outputString, strlen(outputString));
  }

//
//  All done
//
  deallocate:
    StatusBarEnd();
    _lclose(hfOutputFile);

  return(TRUE);
}
예제 #9
0
void ReallyReStart (GtkWidget *rrw, GtkFileSelection *rrfs)
{
  gfloat pvalue = 0;
  if ((ihistory > 0) && (isave == 1))
  {
    JudgeBoard ('w');
    Save ();
  }
  if (isavemes == 1)
  {
    Message (ssavemes, 2, 1);
  }

  x = 0;
  y = 0;
  iCapturedW = 0;
  iCapturedB = 0;
  ilimit = 0;
  ijustundo = 0;
  ifilestuff = 0;
  iduh = 0;
  iother = 0;
  isave = 1;
  iquit = 0;
  isavemes = 0;
  iiamblack = 0;
  ihistory = 0;
  imoves = 0;
  ilastmoveb = 1000;
  ilastmovew = 1000;
  StatusBar ();

  for (iPlace = 1; iPlace <= 361; iPlace++)
  {
    sprintf (Board[iPlace], "%s", "mme");
  }
  sprintf (Board[1], "%s", "lte");
  for (iPlace = 2; iPlace <= 18; iPlace++)
  {
    sprintf (Board[iPlace], "%s", "mte");
  }
  sprintf (Board[19], "%s", "rte");
  sprintf (Board[20], "%s", "lme");
  sprintf (Board[38], "%s", "rme");
  sprintf (Board[39], "%s", "lme");
  sprintf (Board[57], "%s", "rme");
  sprintf (Board[58], "%s", "lme");
  sprintf (Board[61], "%s", "mms");
  sprintf (Board[67], "%s", "mms");
  sprintf (Board[73], "%s", "mms");
  sprintf (Board[76], "%s", "rme");
  sprintf (Board[77], "%s", "lme");
  sprintf (Board[95], "%s", "rme");
  sprintf (Board[96], "%s", "lme");
  sprintf (Board[114], "%s", "rme");
  sprintf (Board[115], "%s", "lme");
  sprintf (Board[133], "%s", "rme");
  sprintf (Board[134], "%s", "lme");
  sprintf (Board[152], "%s", "rme");
  sprintf (Board[153], "%s", "lme");
  sprintf (Board[171], "%s", "rme");
  sprintf (Board[172], "%s", "lme");
  sprintf (Board[175], "%s", "mms");
  sprintf (Board[181], "%s", "mms");
  sprintf (Board[187], "%s", "mms");
  sprintf (Board[190], "%s", "rme");
  sprintf (Board[191], "%s", "lme");
  sprintf (Board[209], "%s", "rme");
  sprintf (Board[210], "%s", "lme");
  sprintf (Board[228], "%s", "rme");
  sprintf (Board[229], "%s", "lme");
  sprintf (Board[247], "%s", "rme");
  sprintf (Board[248], "%s", "lme");
  sprintf (Board[266], "%s", "rme");
  sprintf (Board[267], "%s", "lme");
  sprintf (Board[285], "%s", "rme");
  sprintf (Board[286], "%s", "lme");
  sprintf (Board[289], "%s", "mms");
  sprintf (Board[295], "%s", "mms");
  sprintf (Board[301], "%s", "mms");
  sprintf (Board[304], "%s", "rme");
  sprintf (Board[305], "%s", "lme");
  sprintf (Board[323], "%s", "rme");
  sprintf (Board[324], "%s", "lme");
  sprintf (Board[342], "%s", "rme");
  sprintf (Board[343], "%s", "lue");
  for (iPlace = 344; iPlace <= 360; iPlace++)
  {
    sprintf (Board[iPlace], "%s", "mue");
  }
  sprintf (Board[361], "%s", "rue");

  DoHandicap ();

  for (ibuttonrr = 1; ibuttonrr <= 361; ibuttonrr++)
  {
    sprintf (History[ihistory][ibuttonrr], "%s", Board[ibuttonrr]);
  }
  gtk_widget_hide (window1);

  loadingw = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_position (GTK_WINDOW (loadingw), GTK_WIN_POS_CENTER);
  gtk_window_set_title (GTK_WINDOW (loadingw), "loading...");
  gtk_signal_connect (GTK_OBJECT (loadingw), "delete_event",
    GTK_SIGNAL_FUNC (Quit), NULL);
  gtk_window_set_policy (GTK_WINDOW (loadingw), 0, 0, 1);
  gtk_container_border_width (GTK_CONTAINER (loadingw), 0);
  gtk_widget_realize (loadingw);

  lbox1 = gtk_vbox_new (FALSE, 0);
  gtk_container_border_width (GTK_CONTAINER (lbox1), 0);
  gtk_container_add (GTK_CONTAINER (loadingw), lbox1);
  gtk_widget_show (lbox1);
  lbox2 = gtk_hbox_new (FALSE, 0);
  gtk_container_border_width (GTK_CONTAINER (lbox2), 0);
  gtk_box_pack_start (GTK_BOX (lbox1), lbox2, FALSE, FALSE, 0);
  gtk_widget_show (lbox2);
  ltable1 = gtk_table_new (1, 2, FALSE);
  gtk_box_pack_start (GTK_BOX (lbox2), ltable1, TRUE, TRUE, 0);
  gtk_widget_show (ltable1);

#ifdef USE_GNOME
  im9 = gdk_imlib_load_image (PKGDATADIR"pix/gologog.png");
#else
  im9 = gdk_imlib_load_image (PKGDATADIR"pix/gologo.png");
#endif
  w9 = im9->rgb_width;
  h9 = im9->rgb_height;
  gdk_imlib_render (im9, w9, h9);
  lpixmap = gdk_imlib_move_image (im9);
  lpixmapwid = gtk_pixmap_new (lpixmap, NULL);
  gtk_table_attach (GTK_TABLE (ltable1), lpixmapwid, 0, 1, 0, 1,
    GTK_FILL, GTK_FILL, 0, 0);
  gtk_widget_show (lpixmapwid);
  gdk_flush ();

  lbar = gtk_progress_bar_new ();
  gtk_table_attach (GTK_TABLE (ltable1), lbar, 0, 1, 1, 2,
    GTK_FILL, GTK_FILL, 0, 0);
  gtk_widget_show (lbar);

  gtk_widget_show (loadingw);
  while (gtk_events_pending ())
  {
    gtk_main_iteration ();
  }

  for (ibuttonrr = 1; ibuttonrr <= 361; ibuttonrr++)
  {
    PixmapOnButton (ibuttonrr);
    pvalue = lprogress (pvalue);
  }
  gtk_widget_destroy (loadingw);
  if (itooltips == 0)
  {
    itooltips = 1;
    Tooltips ();
  }
  gtk_widget_show (window1);
}
예제 #10
0
void InitTravelMatrix(long SERVICESrecordID, BOOL bDisplayStatus)
{
  typedef struct PATHStruct
  {
    long NODESrecordID;
    long ROUTESrecordID;
    long directionIndex;
    long PATTERNNAMESrecordID;
    long nodeSequence;
  } PATHDef;
  typedef struct COMBINEDStruct
  {
    long fromNODESrecordID;
    long toNODESrecordID;
    long ROUTESrecordID;
    long directionIndex;
    long PATTERNNAMESrecordID;
    int  fromNodePos;
    int  toNodePos;
  } COMBINEDDef;
  typedef struct BESTStruct
  {
    long fromNODESrecordID;
    long toNODESrecordID;
    long TRIPSrecordID;
    long cushionTime;
    long dwellTime;
    long tripTime[2];
  } BESTDef;
  PATHDef from[UPPERLIMIT];
  PATHDef to[UPPERLIMIT];
  COMBINEDDef fromTo[UPPERLIMIT];
  GenerateTripDef      GTResults;
  GetConnectionTimeDef GCTData;
  float distance;
  long fromEquiv[UPPERLIMIT];
  long toEquiv[UPPERLIMIT];
  long NODESrecordID;
  long nodeList[50];
  long fromNODESrecordID;
  long toNODESrecordID;
  long deadheadTime;
  BOOL bFound;
  int  rcode2;
  int  numNodes;
  int  nI;
  int  nJ;
  int  nK;
  int  nL;
  int  nM;
  int  pos;
  int  numFromEquiv;
  int  numToEquiv;
  int  numFromTo;
  int  numFrom;
  int  numTo;
  int  serviceIndex;

//
//  Set up the service index
//
  SERVICESKey0.recordID = SERVICESrecordID;
  btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
  serviceIndex = SERVICES.number - 1;
  if(serviceIndex < 0 || serviceIndex > NODES_RELIEFLABELS_LENGTH - 1)
  {
    serviceIndex = 0;
  }
  strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
  trim(szarString, SERVICES_NAME_LENGTH);
//
//  Show the status bar
//
  if(bDisplayStatus)
  {
    sprintf(tempString, "Status for service %s", szarString);
    StatusBarStart(NULL, tempString);
    LoadString(hInst, TEXT_135, tempString, TEMPSTRING_LENGTH);
    StatusBarText(tempString);
  }
//
//  Set up the node equivalences
//
  rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
  numNodeEquiv = 0;
  while(rcode2 == 0 && numNodeEquiv < MAXNODEEQUIV)
  {
    if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT)
    {
      NODEEQUIV[numNodeEquiv].fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
      NODEEQUIV[numNodeEquiv].toNODESrecordID = CONNECTIONS.toNODESrecordID;
      numNodeEquiv++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
  }
//
//  Set up, along with all garages, all relief points
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  numNodes = 0;
  while(rcode2 == 0)
  {
    if(NODES.flags & NODES_FLAG_GARAGE ||
          (NODES.reliefLabels[serviceIndex] != ' ' && NODES.reliefLabels[serviceIndex] != '-'))
    {
      nodeList[numNodes] = NODES.recordID;
      numNodes++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Free any previous incarnation of the travel matrix
//
  for(nI = 0; nI < numInTM[serviceIndex]; nI++)
  {
    TMSHeapFree(TRAVELMATRIX[serviceIndex][nI].pTrips);
  }
//
//  Build the matrix
//
  numInTM[serviceIndex] = 0;
  for(nI = 0; nI < numNodes - 1; nI++)
  {
    if(bDisplayStatus)
    {
      StatusBar((long)nI, (long)numNodes);
    }
    for(nJ = 1; nJ < numNodes; nJ++)
    {
      for(nK = 0; nK < 2; nK++)
      {
        fromNODESrecordID = nK == 0 ? nodeList[nI] : nodeList[nJ];
        toNODESrecordID = nK == 0 ? nodeList[nJ] : nodeList[nI];
//
//  Get the node equivalences from the NODEEQUIV structure
//
        numFromEquiv = 0;
        numToEquiv = 0;
        for(nL = 0; nL < numNodeEquiv; nL++)
        {
          if(NODEEQUIV[nL].fromNODESrecordID == fromNODESrecordID)
          {
            fromEquiv[numFromEquiv++] = NODEEQUIV[nL].toNODESrecordID;
          }
          else if(NODEEQUIV[nL].toNODESrecordID == fromNODESrecordID)
          {
            fromEquiv[numFromEquiv++] = NODEEQUIV[nL].fromNODESrecordID;
          }
          else if(NODEEQUIV[nL].fromNODESrecordID == toNODESrecordID)
          {
            toEquiv[numToEquiv++] = NODEEQUIV[nL].toNODESrecordID;
          }
          else if(NODEEQUIV[nL].toNODESrecordID == toNODESrecordID)
          {
            toEquiv[numToEquiv++] = NODEEQUIV[nL].fromNODESrecordID;
          }
        }
//
//  Ok, we know where we are (fromNODESrecordID) and where we have to go to (toNODESrecordID).
//
//  The algorithm is find the route required to get us from a to b in the shortest time,
//  placing instructions in "travelInstructions".
//
//  First, get a list of patterns that fromNODESrecordID (or one of its equivalences) reside in.
//  Note that we keep PATTERNS.NODESrecordID, as it may actually be the substituted, equivalent, node.
//
        numFrom = 0;
        for(nL = 0; nL < numFromEquiv + 1; nL++)
        {
          NODESrecordID = nL == 0 ? fromNODESrecordID : fromEquiv[nL - 1];
          PATTERNSKey1.NODESrecordID = NODESrecordID;
          rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID)
          {
            if(PATTERNS.SERVICESrecordID == SERVICESrecordID)
            {
              from[numFrom].NODESrecordID = PATTERNS.NODESrecordID;
              from[numFrom].ROUTESrecordID = PATTERNS.ROUTESrecordID;
              from[numFrom].directionIndex = PATTERNS.directionIndex;
              from[numFrom].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
              from[numFrom].nodeSequence = PATTERNS.nodeSequence;
              numFrom++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          }
        }
//
//  If there weren't any, cycle through
//
        if(numFrom == 0)
        {
          continue;
        }
//
//  Now, get a list of patterns that toNODESrecordID are in.
//
        numTo = 0;
        for(nL = 0; nL < numToEquiv + 1; nL++)
        {
          NODESrecordID = nL == 0 ? toNODESrecordID : toEquiv[nL - 1];
          PATTERNSKey1.NODESrecordID = NODESrecordID;
          rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID)
          {
            if(PATTERNS.SERVICESrecordID == SERVICESrecordID)
            {
              to[numTo].NODESrecordID = PATTERNS.NODESrecordID;
              to[numTo].ROUTESrecordID = PATTERNS.ROUTESrecordID;
              to[numTo].directionIndex = PATTERNS.directionIndex;
              to[numTo].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
              to[numTo].nodeSequence = PATTERNS.nodeSequence;
              numTo++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          }
        }
//
//  If there weren't any, cycle through
//
        if(numTo == 0)
          continue;
//
//  Develop a list of patterns that have both the from and to nodes
//  on them, and that have the "to" node following the "from" node.
//
//  First, "merge" the lists
//
        numFromTo = 0;
        for(nL = 0; nL < numFrom; nL++)
        {
          for(nM = 0; nM < numTo; nM++)
          {
            if(from[nL].ROUTESrecordID == to[nM].ROUTESrecordID &&
                  from[nL].directionIndex == to[nM].directionIndex &&
                  from[nL].PATTERNNAMESrecordID == to[nM].PATTERNNAMESrecordID &&
                  from[nL].nodeSequence < to[nM].nodeSequence)
            {
              fromTo[numFromTo].fromNODESrecordID = from[nL].NODESrecordID;
              fromTo[numFromTo].toNODESrecordID = to[nM].NODESrecordID;
              fromTo[numFromTo].ROUTESrecordID = from[nL].ROUTESrecordID;
              fromTo[numFromTo].directionIndex = from[nL].directionIndex;
              fromTo[numFromTo].PATTERNNAMESrecordID = from[nL].PATTERNNAMESrecordID;
              fromTo[numFromTo].fromNodePos = NO_RECORD;
              fromTo[numFromTo].toNodePos = NO_RECORD;
              numFromTo++;
            }
          }
        }
//
//  Did we get any?
//
        if(numFromTo == 0)
          continue;
//
//  Second, establish fromNodePos and toNodePos so we
//  know where to look on the tripTimes array later on
//
        for(nL = 0; nL < numFromTo; nL++)
        {
          PATTERNSKey2.ROUTESrecordID = fromTo[nL].ROUTESrecordID;
          PATTERNSKey2.SERVICESrecordID = SERVICESrecordID;
          PATTERNSKey2.directionIndex = fromTo[nL].directionIndex;
          PATTERNSKey2.PATTERNNAMESrecordID = fromTo[nL].PATTERNNAMESrecordID;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          pos = 0;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == fromTo[nL].ROUTESrecordID &&
                PATTERNS.SERVICESrecordID == SERVICESrecordID &&
                PATTERNS.directionIndex == fromTo[nL].directionIndex &&
                PATTERNSKey2.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID)
          {
            if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
            {
              if(PATTERNS.NODESrecordID == fromTo[nL].fromNODESrecordID &&
                    fromTo[nL].fromNodePos == NO_RECORD)
              {
                fromTo[nL].fromNodePos = pos;
              }
              else if(PATTERNS.NODESrecordID == fromTo[nL].toNODESrecordID &&
                    fromTo[nL].toNodePos == NO_RECORD)
              {
                fromTo[nL].toNodePos = pos;
                break;
              }
              pos++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } 
        }
//
//  Build the matrix
//
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].fromNODESrecordID = fromNODESrecordID; // nodeList[nI];
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].toNODESrecordID = toNODESrecordID; // nodeList[nJ];
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
              (TMTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TMTRIPSDef) * 50); 
        if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
        {
          AllocationError(__FILE__, __LINE__, FALSE);
          return;
        }
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc = 50;
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips = 0;
        for(nL = 0; nL < numFromTo; nL++)
        {
          TRIPSKey1.ROUTESrecordID = fromTo[nL].ROUTESrecordID;
          TRIPSKey1.SERVICESrecordID = SERVICESrecordID;
          TRIPSKey1.directionIndex = fromTo[nL].directionIndex;
          TRIPSKey1.tripSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          while(rcode2 == 0 &&
                TRIPS.ROUTESrecordID == fromTo[nL].ROUTESrecordID &&
                TRIPS.SERVICESrecordID == SERVICESrecordID &&
                TRIPS.directionIndex == fromTo[nL].directionIndex)
          {
            if(TRIPS.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID)
            {
              GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
              nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[fromTo[nL].fromNodePos];
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[fromTo[nL].toNodePos];
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
              if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
              {
                TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                      (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                      HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                      sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                {
                  AllocationError(__FILE__, __LINE__, TRUE);
                  return;
                }
              }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          }
//
//  Pass 2 - check on pullouts and pullins
//
          rcode2 = btrieve(B_GETFIRST, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
          while(rcode2 == 0)
          {
//
//  Pullout
//
            if(TRIPS.SERVICESrecordID == SERVICESrecordID &&
                  TRIPS.standard.POGNODESrecordID == fromNODESrecordID)
            {
              PATTERNSKey1.NODESrecordID = toNODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              bFound = FALSE;
              while(rcode2 == 0 && PATTERNS.NODESrecordID == toNODESrecordID)
              {
                if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  bFound = TRUE;
                  break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              }
              if(bFound)
              {
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                pos = 0;
                while(rcode2 == 0 &&
                      PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                  {
                    if(PATTERNS.NODESrecordID == toNODESrecordID)
                      break;
                    pos++;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                } 
                GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                      TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                      TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
                GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID;
                GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
                GCTData.timeOfDay = GTResults.firstNodeTime;
                deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                distance = (float)fabs((double)distance);
                if(deadheadTime != NO_RECORD)
                {
                  nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.firstNodeTime - deadheadTime;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[pos];
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
                  if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
                  {
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                          (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                          sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                    if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, FALSE);
                      return;
                    }
                  }
                }
              }
            }
//
//  Pullin
//
            if(TRIPS.SERVICESrecordID == SERVICESrecordID &&
                  TRIPS.standard.PIGNODESrecordID == toNODESrecordID)
            {
              PATTERNSKey1.NODESrecordID = fromNODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              bFound = FALSE;
              while(rcode2 == 0 && PATTERNS.NODESrecordID == fromNODESrecordID)
              {
                if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  bFound = TRUE;
                  break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              }
              if(bFound)
              {
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                pos = 0;
                while(rcode2 == 0 &&
                      PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                  {
                    if(PATTERNS.NODESrecordID == fromNODESrecordID)
                      break;
                    pos++;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                } 
                GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                      TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                      TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
                GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
                GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                GCTData.timeOfDay = GTResults.lastNodeTime;
                deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                distance = (float)fabs((double)distance);
                if(deadheadTime != NO_RECORD)
                {
                  nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[pos];
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.lastNodeTime + deadheadTime;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
                  if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
                  {
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                          (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                          sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                    if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, FALSE);
                      return;
                    }
                  }
                }
              }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
          }
        }// nL
        numInTM[serviceIndex]++;
      }  // nK
    }    // nJ
  }      // nI
  if(bDisplayStatus)
  {
    StatusBar((long)numNodes, (long)numNodes);
    StatusBarEnd();
  }
}
예제 #11
0
파일: TMSRpt63.c 프로젝트: ems/TMS
BOOL FAR TMSRPT63(TMSRPTPassedDataDef *pPassedData)
{
  REPORTPARMSDef REPORTPARMS;
  HFILE hfOutputFile;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  BOOL  bIncludeRouteDescriptions;
  char  outputString[512];
  char  routeNumberAndName[ROUTES_NUMBER_LENGTH + 3 + ROUTES_NAME_LENGTH + 1];
  char  serviceName[SERVICES_NAME_LENGTH + 1];
  char  directionName[DIRECTIONS_LONGNAME_LENGTH + 1];
  char  patternName[PATTERNNAMES_NAME_LENGTH + 1];
  char *tempString2;
  long  statbarTotal;
  long  patternInUse;
  int   nI;
  int   nJ;
  int   nK;
  int   rcode2;
  int   seq;

  pPassedData->nReportNumber = 62;
  pPassedData->numDataFiles = 1;
//
//  See what he wants
//
  REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
  REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
  REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
  REPORTPARMS.COMMENTSrecordID = NO_RECORD;
  REPORTPARMS.pRouteList = NULL;
  REPORTPARMS.pServiceList = NULL;
  REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_PATTERNNAMES | RPFLAG_COMMENTS;
  bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
        hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
  if(!bRC)
  {
    return(FALSE);
  }
//
//  Check the list of routes and services
//
  if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
  {
    goto deallocate;
  }
//
//  Open the output file
//
  strcpy(tempString, szReportsTempFolder);
  strcat(tempString, "\\TMSRPT63.txt");
  hfOutputFile = _lcreat(tempString, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  See if he wants to include route descriptions
//
  LoadString(hInst, TEXT_378, tempString, TEMPSTRING_LENGTH);
  MessageBeep(MB_ICONQUESTION);
  bIncludeRouteDescriptions = (MessageBox(NULL, tempString, TMS, MB_ICONQUESTION | MB_YESNO) == IDYES);
//
//  Loop through the routes
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
  statbarTotal = REPORTPARMS.numRoutes * REPORTPARMS.numServices;
  seq = 0;
  for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      goto deallocate;
    }
    ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
    rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
    if(rcode2 != 0)
    {
      continue;
    }
    strncpy(routeNumberAndName, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(routeNumberAndName, ROUTES_NUMBER_LENGTH);
    strcat(routeNumberAndName, " - ");
    strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH);
    trim(tempString, ROUTES_NAME_LENGTH);
    strcat(routeNumberAndName, tempString);
//
//  Loop through the services
//
    for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
    {
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
      SERVICESKey0.recordID = REPORTPARMS.pServiceList[nJ];
      rcode2 = btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      if(rcode2 != 0)
      {
        continue;
      }
      strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(serviceName, SERVICES_NAME_LENGTH);
      LoadString(hInst, TEXT_118, szarString, sizeof(szarString));
      sprintf(tempString, szarString, routeNumberAndName, serviceName);
      StatusBarText(tempString);
      StatusBar((long)(nI * REPORTPARMS.numServices + nJ), (long)statbarTotal);
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
//
//  Loop through the directions
//
      for(nK = 0; nK < 2; nK++)
      {
        if(StatusBarAbort())
        {
          bKeepGoing = FALSE;
          goto deallocate;
        }
        if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
        {
          continue;
        }
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nK];
        rcode2 = btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        if(rcode2 != 0)
        {
          continue;
        }
        strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
        trim(directionName, DIRECTIONS_LONGNAME_LENGTH);
//
//  See if this pattern exists on this route/ser/dir.
//  If not, use the BASE pattern instead.
//
        PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
        PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
        PATTERNSKey2.directionIndex = nK;
        PATTERNSKey2.PATTERNNAMESrecordID = REPORTPARMS.PATTERNNAMESrecordID;
        PATTERNSKey2.nodeSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        if(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID &&
              PATTERNS.directionIndex == nK && PATTERNSKey2.PATTERNNAMESrecordID == REPORTPARMS.PATTERNNAMESrecordID)
        {
          patternInUse = REPORTPARMS.PATTERNNAMESrecordID;
        }
        else
        {
          patternInUse = basePatternRecordID;
        }
        PATTERNNAMESKey0.recordID = patternInUse;
        btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
        strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
        trim(patternName, PATTERNNAMES_NAME_LENGTH);
//
//  Get the pattern nodes
//
        PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
        PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
        PATTERNSKey2.directionIndex = nK;
        PATTERNSKey2.PATTERNNAMESrecordID = patternInUse;
        PATTERNSKey2.nodeSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        while(rcode2 == 0 &&
              PATTERNS.ROUTESrecordID == ROUTES.recordID &&
              PATTERNS.SERVICESrecordID == SERVICES.recordID &&
              PATTERNS.directionIndex == nK &&
              PATTERNSKey2.PATTERNNAMESrecordID == patternInUse)
        {
          NODESKey0.recordID = PATTERNS.NODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
//
//  Build the output string
//
//  Sequence, service, route, direction
//
          sprintf(outputString, "%d\t%s\t%s\t%s\t", seq++, serviceName, routeNumberAndName, directionName);
//
//  Jurisdiction
//
          if(NODES.JURISDICTIONSrecordID == NO_RECORD)
          {
            strcpy(tempString, "");
          }
          else
          {
            JURISDICTIONSKey0.recordID = NODES.JURISDICTIONSrecordID;
            btrieve(B_GETEQUAL, TMS_JURISDICTIONS, &JURISDICTIONS, &JURISDICTIONSKey0, 0);
            strncpy(tempString, JURISDICTIONS.name, JURISDICTIONS_NAME_LENGTH);
            trim(tempString, JURISDICTIONS_NAME_LENGTH);
          }
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Comment code
//
          if(NODES.COMMENTSrecordID == NO_RECORD)
          {
            strcpy(tempString, "");
          }
          else
          {
            COMMENTSKey0.recordID = NODES.COMMENTSrecordID;
            btrieve(B_GETEQUAL, TMS_COMMENTS, &COMMENTS, &COMMENTSKey0, 0);
            strncpy(tempString, COMMENTS.code, COMMENTS_CODE_LENGTH);
            trim(tempString, COMMENTS_CODE_LENGTH);
          }
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Node abbreviation
//
          strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(tempString, NODES_ABBRNAME_LENGTH);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Node long name
//
          strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH);
          trim(tempString, NODES_LONGNAME_LENGTH);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Node intersection
//
          strncpy(tempString, NODES.intersection, NODES_INTERSECTION_LENGTH);
          trim(tempString, NODES_INTERSECTION_LENGTH);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Latitude
//
          sprintf(tempString, "%12.6f", NODES.latitude);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Longitude
//
          sprintf(tempString, "%12.6f", NODES.longitude);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Node description
//
          strncpy(tempString, NODES.description, NODES_DESCRIPTION_LENGTH);
          trim(tempString, NODES_DESCRIPTION_LENGTH);
          strcat(outputString, tempString);
          strcat(outputString, "\t");
//
//  Pattern name
//
          strcat(outputString, patternName);          
          strcat(outputString, "\r\n");
//
//  Write it out
//
          _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Get the next node in the BASE pattern
//
          rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        }  // while
//
//  Spit out the comments
//
        if(bIncludeRouteDescriptions && ROUTES.COMMENTSrecordID != NO_RECORD)
        {
          sprintf(outputString, "%d\t%s\t%s\t%s\r\n", seq++, serviceName, routeNumberAndName, directionName);
          _lwrite(hfOutputFile, outputString, strlen(outputString));
          recordLength[TMS_COMMENTS] = COMMENTS_TOTAL_LENGTH;
          COMMENTSKey0.recordID = ROUTES.COMMENTSrecordID;
          btrieve(B_GETEQUAL, TMS_COMMENTS, pCommentText, &COMMENTSKey0, 0);
          recordLength[TMS_COMMENTS] = COMMENTS_FIXED_LENGTH;
          for( tempString2 = strtok(&pCommentText[COMMENTS_FIXED_LENGTH], "\r\n"); tempString2;
               tempString2 = strtok(NULL, "\r\n") )
          {
            sprintf(outputString, "%d\t%s\t%s\t%s\t\t\t\t\"%s\"\r\n",
                  seq++, serviceName, routeNumberAndName, directionName, tempString2);
            _lwrite(hfOutputFile, outputString, strlen(outputString));
          }
        }
      }  // nK
    }  // nJ
  }  // nI
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    _lclose(hfOutputFile);
    StatusBarEnd();
    if(!bKeepGoing)
    {
      return(FALSE);
    }
//
//  All done
//
  return(TRUE);
}
예제 #12
0
파일: TMSRpt86.c 프로젝트: ems/TMS
BOOL FAR TMSRPT86(TMSRPTPassedDataDef *pPassedData)
{
  GenerateTripDef GTResults;
  HFILE hfOutputFile;
  BOOL  bKeepGoing = FALSE;
  BOOL  bFound;
  char  dummy[256];
  char  outputString[512];
  long  statbarTotal;
  long  saveTimeFormat;
  long  lastTripNumber;
  long  maxTrips;
  long  patternNodes[MAXTRIPTIMES];
  long  tempLong;
  int   nI;
  int   nJ;
  int   currentRoute;
  int   currentService;
  int   numRoutes;
  int   numServices;
  int   rcode2;
  int   numNodes;

  saveTimeFormat = timeFormat;
  timeFormat = PREFERENCES_MILITARY;
//
//  Create the sub-folder for the output files and chdir into it
//
  nI = (_mkdir(OUTPUT_FOLDER_NAME) == 0) ? TEXT_333 : TEXT_334;
  LoadString(hInst, nI, szFormatString, SZFORMATSTRING_LENGTH);
  sprintf(tempString, szFormatString, OUTPUT_FOLDER_NAME);
  MessageBeep(MB_ICONINFORMATION);
  MessageBox(NULL, tempString, TMS, MB_OK);
  chdir(OUTPUT_FOLDER_NAME);
//
//  Open the output file
//
  hfOutputFile = _lcreat("tripschedule.csv", 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
//
//  Get the number of routes and services
//  for the benefit of the status bar
//
  rcode2 = btrieve(B_STAT, TMS_ROUTES, &BSTAT, dummy, 0);
  if(rcode2 != 0 || BSTAT.numRecords == 0)
  {
    TMSError(NULL, MB_ICONSTOP, ERROR_008, (HANDLE)NULL);
    goto deallocate;
  }
  numRoutes = BSTAT.numRecords;
  rcode2 = btrieve(B_STAT, TMS_SERVICES, &BSTAT, dummy, 0);
  if(rcode2 != 0 || BSTAT.numRecords == 0)
  {
    TMSError(NULL, MB_ICONSTOP, ERROR_007, (HANDLE)NULL);
    goto deallocate;
  }
  numServices = BSTAT.numRecords;
//
//  maxTrips
//
  rcode2 = btrieve(B_STAT, TMS_TRIPS, &BSTAT, dummy, 0);
  maxTrips = rcode2 == 0 ? BSTAT.numRecords : 0;
//
//  Verify that all trips in the system are numbered
//
  StatusBarText("Checking if all trips are numbered");
  rcode2 = btrieve(B_GETFIRST, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
  nI = 0;
  bFound = FALSE;
  lastTripNumber = NO_RECORD;
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      goto deallocate;
    }
    StatusBar((long)nI, (long)maxTrips);
    if(TRIPS.tripNumber <= 0)
    {
      MessageBeep(MB_ICONQUESTION);
      LoadString(hInst, ERROR_344, tempString, TEMPSTRING_LENGTH);
      if(MessageBox(NULL, tempString, TMS, MB_ICONQUESTION | MB_OK) != IDOK)
      {
        goto deallocate;
      }
      bFound = TRUE;
      break;
    }
    if(TRIPS.tripNumber > lastTripNumber)
    {
      lastTripNumber = TRIPS.tripNumber;
    }
    nI++;
    rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
  }
  if(bFound)
  {
    StatusBarText("Renumbering Trips");
    rcode2 = btrieve(B_GETFIRST, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
    nI = 1;
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto deallocate;
      }
      StatusBar((long)nI, (long)maxTrips);
      TRIPS.tripNumber = (long)nI;
      nI++;
      rcode2 = btrieve(B_UPDATE, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
      rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
    }
    lastTripNumber = nI;
  }
//
//  Loop through the routes
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
  statbarTotal = numRoutes * numServices;
  currentRoute = 0;
  rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      goto deallocate;
    }
//
//  Do not process employee shuttles
//
    if(!(ROUTES.flags & ROUTES_FLAG_EMPSHUTTLE))
    {
//
//  Loop through the services
//
      currentService = 1;
      rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      while(rcode2 == 0)
      {
        if(StatusBarAbort())
        {
          bKeepGoing = FALSE;
          goto deallocate;
        }
//
//  Loop through all the trips on this route/service/direction
//
        for(nI = 0; nI < 2; nI++)
        {
          if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
          {
            continue;
          }
//
//  Get the trips
//
          TRIPSKey1.ROUTESrecordID = ROUTES.recordID;
          TRIPSKey1.SERVICESrecordID = SERVICES.recordID;
          TRIPSKey1.directionIndex = nI;
          TRIPSKey1.tripSequence = NO_TIME;
          rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          while(rcode2 == 0 &&
                TRIPS.ROUTESrecordID == ROUTES.recordID &&
                TRIPS.SERVICESrecordID == SERVICES.recordID &&
                TRIPS.directionIndex == nI)
          {
            DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
            btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
//
//  Display where we are in the status bar
//
            strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(tempString, ROUTES_NUMBER_LENGTH);
            strcat(tempString, " - ");
            strncpy(szarString, ROUTES.name, ROUTES_NAME_LENGTH);
            trim(szarString, ROUTES_NAME_LENGTH);
            strcat(tempString, szarString);
            strcat(tempString, "\n");
            strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(szarString, SERVICES_NAME_LENGTH);
            strcat(tempString, szarString);
            strcat(tempString, " - ");
            strncpy(szarString, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
            trim(szarString, DIRECTIONS_LONGNAME_LENGTH);
            strcat(tempString, szarString);
            StatusBarText(tempString);
            StatusBar((long)(currentRoute * (numServices - 1) + currentService), (long)statbarTotal);
            if(StatusBarAbort())
            {
              bKeepGoing = FALSE;
              goto deallocate;
            }
//
//  Build up the output string
//
//  Company Id
//
            sprintf(outputString, "%s,", COMPANY_ID);
//
//  Service name
//
            strncpy(tempString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(tempString, SERVICES_NAME_LENGTH);
            strcat(outputString, tempString);
            strcat(outputString, ",");
//
//  Trip number
//
            sprintf(tempString, "%ld,", TRIPS.tripNumber);
            strcat(outputString, tempString);
//
//  Block number
//
            sprintf(tempString, "%ld,", TRIPS.standard.blockNumber);
            strcat(outputString, tempString);
//
//  Duty number (currently unused)
//
            strcat(outputString, ",");
//
//  Pattern name
//
            PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID;
            btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
            strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
            trim(tempString, PATTERNNAMES_NAME_LENGTH);
            strcat(outputString, tempString);
            strcat(outputString, ",");
//
//  Sign code
//
            SIGNCODESKey0.recordID = TRIPS.SIGNCODESrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_SIGNCODES, &SIGNCODES, &SIGNCODESKey0, 0);
            if(rcode2 != 0)
            {
              strcpy(tempString, "");
            }
            else
            {
              strncpy(tempString, SIGNCODES.code, SIGNCODES_CODE_LENGTH);
              trim(tempString, SIGNCODES_CODE_LENGTH);
            }
            strcat(outputString, tempString);
            strcat(outputString, ",");
//
//  Nodes times
//
//  Generate the trip
//
            GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                  TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                  TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Get the pattern nodes
//
            PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
            PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
            PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            PATTERNSKey2.directionIndex = TRIPS.directionIndex;
            PATTERNSKey2.nodeSequence = NO_RECORD;
            numNodes = 0;
            rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            while(rcode2 == 0 &&
                  PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                  PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                  PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID &&
                  PATTERNS.directionIndex == TRIPS.directionIndex)
            {
              if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
              {
                patternNodes[numNodes] = PATTERNS.NODESrecordID;
                numNodes++;
              }
              rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            }
//
//  tripTimes[] contains the times at the timepoints in this pattern
//
//  We're only interested in departure times, so if we
//  run into an arrive/leave, skip over the arrive time
//
            for(nJ = 0; nJ < numNodes; nJ++)
            {
              if(nJ < numNodes - 1)
              {
                if(NodesEquivalent(patternNodes[nJ], patternNodes[nJ + 1], &tempLong))
                {
                  continue;
                }
              }
              strcat(outputString, Tchar(GTResults.tripTimes[nJ]));
              strcat(outputString, " ");
            }
//
//  End of record
//
            strcat(outputString, "\r\n");
//
//  Write it out
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Next trip
//
            rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          }
//
//  Next direction
//
        }  // nI
//
//  Next service
//
        currentService++;
        rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      }
//
//  Not a shuttle
//
    }
//
//  Next route
//
    currentRoute++;
    rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  }
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    timeFormat = saveTimeFormat;
    _lclose(hfOutputFile);
    StatusBarEnd();
    chdir("..");
//
//  Let him know
//
  strcpy(tempString, "Download of tripschedule.csv complete\n");
  MessageBox(hWndMain, tempString, TMS, MB_OK);

  if(!bKeepGoing)
  {
    return(FALSE);
  }
//
//  All done
//
  return(TRUE);
}
예제 #13
0
파일: InternetGo.c 프로젝트: dkrivets/gtkgo
void InternetGo (void)
{
  if ((ifilestuff == 0) && (inet == 0))
  {
    shost = gtk_entry_get_text (GTK_ENTRY (connectentry1));
    theaddress = atoaddr (shost);
    iport = atoi (gtk_entry_get_text (GTK_ENTRY (connectentry2)));

    gtk_widget_destroy (connectwindow);
    iyesno = 0;

    bzero ((char *) &host_addr, sizeof (host_addr));
    host_addr.sin_family = AF_INET;
    host_addr.sin_addr.s_addr = inet_addr (inet_ntoa (*theaddress));
    host_addr.sin_port = htons (iport);

    if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
      Message ("Unable to open socket.", 3, 0);
    }
    itheerror = connect (sockfd, (struct sockaddr *) &host_addr, sizeof
      (host_addr));
    if (itheerror < 0)
    {
      sprintf (serrortemp, "Unable to connect to host (%s).", strerror
        (errno));
      Message (serrortemp, 3, 0);
    }
    else
    {
      fcntl (sockfd, F_SETFL, O_NONBLOCK);
      biscomputer = 0;
      sprintf (bplayername, "%s", "unknown");
      wiscomputer = 0;
      sprintf (wplayername, "%s", "unknown");
      StatusBar ();

      if (ichangestuff == 0)
      {
        Play ("open.mp3", 0);
      }

      internetwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (internetwindow), "Internet window");
      gtk_signal_connect (GTK_OBJECT (internetwindow), "delete_event",
        GTK_SIGNAL_FUNC (CloseSocket), NULL);
      gtk_window_set_policy (GTK_WINDOW (internetwindow), 0, 0, 1);
      gtk_container_border_width (GTK_CONTAINER (internetwindow), 0);
      gtk_widget_realize (internetwindow);

      internetbox1 = gtk_vbox_new (FALSE, 0);
      gtk_container_border_width (GTK_CONTAINER (internetbox1), 0);
      gtk_container_add (GTK_CONTAINER (internetwindow), internetbox1);
      gtk_widget_show (internetbox1);
      internetbox2 = gtk_hbox_new (FALSE, 0);
      gtk_container_border_width (GTK_CONTAINER (internetbox2), 0);
      gtk_box_pack_start (GTK_BOX (internetbox1), internetbox2, TRUE, TRUE, 5);
      gtk_widget_show (internetbox2);
      internetbox3 = gtk_vbox_new (FALSE, 0);
      gtk_container_border_width (GTK_CONTAINER (internetbox3), 0);
      gtk_box_pack_start (GTK_BOX (internetbox2), internetbox3, TRUE, TRUE, 0);
      gtk_widget_show (internetbox3);
      internettable1 = gtk_table_new (2, 1, FALSE);
      gtk_widget_show (internettable1);
      gtk_box_pack_start (GTK_BOX (internetbox3), internettable1, TRUE, TRUE,
        0);
      internettable2 = gtk_table_new (2, 3, FALSE);
      gtk_widget_show (internettable2);
      gtk_box_pack_start (GTK_BOX (internetbox3), internettable2, TRUE, TRUE,
        0);

      text = gtk_text_new (NULL, NULL);
      gtk_widget_set_usize (text, 535, 266);
      gtk_text_set_editable (GTK_TEXT (text), FALSE);
      gtk_table_attach (GTK_TABLE (internettable1), text, 0, 1, 0, 1,
        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 0);
      gtk_widget_show (text);

      vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
      adj = (GTK_TEXT (text))->vadj;
      gtk_table_attach (GTK_TABLE (internettable1), vscrollbar, 1, 2, 0, 1,
        GTK_FILL, GTK_EXPAND  | GTK_FILL, 5, 0);
      gtk_widget_show (vscrollbar);

      cmap = gdk_colormap_get_system ();
      color.red = 0xffff;
      color.green = 0;
      color.blue = 0;
      if (!gdk_color_alloc (cmap, &color))
      {
        Message ("Could not allocate color.", 3, 0);
      }

      gtk_widget_realize (text);

      wrapcheck = gtk_check_button_new_with_label ("wrap");
      gtk_table_attach (GTK_TABLE (internettable2), wrapcheck, 0, 1, 0, 1,
        GTK_FILL, GTK_FILL, 5, 10);
      gtk_signal_connect (GTK_OBJECT (wrapcheck), "toggled",
        GTK_SIGNAL_FUNC (ToggleWrap), text);
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wrapcheck), FALSE);
      gtk_widget_show (wrapcheck);

      internetentry = gtk_entry_new_with_max_length (50);
      gtk_signal_connect (GTK_OBJECT (internetentry), "activate",
        GTK_SIGNAL_FUNC (SendData), NULL);
      gtk_table_attach (GTK_TABLE (internettable2), internetentry, 1, 2, 0, 1,
        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 10);
      gtk_widget_grab_focus (internetentry);
      gtk_widget_show (internetentry);

      inetsep = gtk_hseparator_new ();
      gtk_table_attach (GTK_TABLE (internettable2), inetsep, 0, 2, 1, 2,
        GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
      gtk_widget_show (inetsep);

      inetbutton = gtk_button_new_with_label ("Disconnect");
      gtk_signal_connect (GTK_OBJECT (inetbutton), "clicked",
        GTK_SIGNAL_FUNC (CloseSocket), NULL);
      GTK_WIDGET_SET_FLAGS (inetbutton, GTK_CAN_DEFAULT);
      gtk_window_set_default (GTK_WINDOW (internetwindow), inetbutton);
      gtk_table_attach (GTK_TABLE (internettable2), inetbutton, 0, 2, 2, 3,
        GTK_EXPAND | GTK_FILL, GTK_FILL, 2, 2);
      gtk_widget_show (inetbutton);

      gtk_widget_show (internetwindow);
      inet = 1;
      ReceiveData ();
    }
  }
}
예제 #14
0
파일: ADDBLOCK.c 프로젝트: ems/TMS
BOOL CALLBACK ADDBLOCKMsgProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
  typedef struct STATSStruct
  {
    float dhdDist;
    long  dhdTime;
    long  layTime;
    float revDist;
    long  revTime;
  } STATSDef;
  typedef struct PARMSStruct
  {
    BOOL bStandard;
    BOOL bDropback;
    BOOL bInterlining;
    BOOL bServiceWrap;
    BOOL bDeadheading;
    BOOL bDeadheadAll;
    long maxDeadheadTime;
  } PARMSDef;
  static PDISPLAYINFO   pDI;
  static HANDLE hCtlALLROUTES;
  static HANDLE hCtlCC;
  static HANDLE hCtlCOMMENTCODE;
  static HANDLE hCtlORROUTE;
  static HANDLE hCtlFROMROUTE;
  static HANDLE hCtlFROMSERVICE;
  static HANDLE hCtlLISTBOXTITLE;
  static HANDLE hCtlTRIPS;
  static HANDLE hCtlMIN;
  static HANDLE hCtlMINVEHICLES;
  static HANDLE hCtlMAX;
  static HANDLE hCtlMAXVEHICLES;
  static HANDLE hCtlILYES;
  static HANDLE hCtlILNO;
  static HANDLE hCtlSWYES;
  static HANDLE hCtlSWNO;
  static HANDLE hCtlDHYES;
  static HANDLE hCtlDHNO;
  static HANDLE hCtlDEADHEADALL;
  static HANDLE hCtlDEADHEADTHOSE;
  static HANDLE hCtlDEADHEADMINS;
  static HANDLE hCtlTEXT_MINUTES;
  static HANDLE hCtlIDREMOVE;
  static HANDLE hCtlIDPREVIEW;
  static HANDLE hCtlIDOPTIMAL;
  static HANDLE hCtlIDMANUAL;
  static HANDLE hCtlSTANDARD;
  static HANDLE hCtlDROPBACK;
  static HANDLE hCtlDEADHEADSTOUSE;
  static int    tabPos[TABSET] = {32};
  GenerateTripDef      GTResults;
  GetConnectionTimeDef GCTData;
  PARMSDef PARMS;
  BLOCKSDef  *pTRIPSChunk;
  LAYOVERDef *pLayover;
  float  distance;
  short  int wmId;
  short  int wmEvent;
  BOOL   bFound;
  BOOL   bEnable;
  BOOL   bAbort;
  char   routeName[ROUTES_NAME_LENGTH + 1];
  char   routeNumber[ROUTES_NUMBER_LENGTH + 1];
  char   serviceName[SERVICES_NAME_LENGTH + 1];
  long   fromRouteRecordID;
  long   fromServiceRecordID;
  long   lastBlock;
  long   minutes;
  long   percent;
  long   tempLong;
  long   minVehicles;
  long   maxVehicles;
  long   commentRecordID;
  long   position;
  long   flags;
  long   dhd;
  WORD   DlgWidthUnits;
  int adjustedTabPos[TABSET];
  int nI;
  int nJ;
  int nK;
  int nRc;
  int rcode2;
  int numRoutes;
  int numTrips;
  int maxTrips;
  int numComments;
  int numSelected;
  int fromRoutePosition;
  int fromServicePosition;
  int blockingType;
  int layoverType;

  long *pTRIPSrecordIDs = NULL;
  int  *pSelected = NULL;

  switch(Message)
  {
//
//  WM_INITDIALOG - Initialize the dialog
//
    case WM_INITDIALOG:
      pDI = (PDISPLAYINFO)lParam;
      if(pDI == NULL)
      {
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
        break;
      }
      m_numConnectionAlerts = 0;
//
//  Set up some control handles for later use
//
      hCtlALLROUTES = GetDlgItem(hWndDlg, ADDBLOCK_ALLROUTES);
      hCtlCC = GetDlgItem(hWndDlg, ADDBLOCK_CC);
      hCtlCOMMENTCODE = GetDlgItem(hWndDlg, ADDBLOCK_COMMENTCODE);
      hCtlORROUTE = GetDlgItem(hWndDlg, ADDBLOCK_ORROUTE);
      hCtlFROMROUTE = GetDlgItem(hWndDlg, ADDBLOCK_FROMROUTE);
      hCtlFROMSERVICE = GetDlgItem(hWndDlg, ADDBLOCK_FROMSERVICE);
      hCtlLISTBOXTITLE = GetDlgItem(hWndDlg, ADDBLOCK_LISTBOXTITLE);
      hCtlTRIPS = GetDlgItem(hWndDlg, ADDBLOCK_TRIPS);
      hCtlMIN = GetDlgItem(hWndDlg, ADDBLOCK_MIN);
      hCtlMINVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MINVEHICLES);
      hCtlMAX = GetDlgItem(hWndDlg, ADDBLOCK_MAX);
      hCtlMAXVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MAXVEHICLES);
      hCtlILYES = GetDlgItem(hWndDlg, ADDBLOCK_ILYES);
      hCtlILNO = GetDlgItem(hWndDlg, ADDBLOCK_ILNO);
      hCtlSWYES = GetDlgItem(hWndDlg, ADDBLOCK_SWYES);
      hCtlSWNO = GetDlgItem(hWndDlg, ADDBLOCK_SWNO);
      hCtlDHYES = GetDlgItem(hWndDlg, ADDBLOCK_DHYES);
      hCtlDHNO = GetDlgItem(hWndDlg, ADDBLOCK_DHNO);
      hCtlDEADHEADALL = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADALL);
      hCtlDEADHEADTHOSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADTHOSE);
      hCtlDEADHEADMINS = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADMINS);
      hCtlTEXT_MINUTES = GetDlgItem(hWndDlg, ADDBLOCK_TEXT_MINUTES);
      hCtlIDREMOVE = GetDlgItem(hWndDlg, IDREMOVE);
      hCtlIDPREVIEW = GetDlgItem(hWndDlg, IDPREVIEW);
      hCtlIDOPTIMAL = GetDlgItem(hWndDlg, IDOPTIMAL);
      hCtlIDMANUAL = GetDlgItem(hWndDlg, IDMANUAL);
      hCtlSTANDARD = GetDlgItem(hWndDlg, ADDBLOCK_STANDARD);
      hCtlDROPBACK = GetDlgItem(hWndDlg, ADDBLOCK_DROPBACK);
      hCtlDEADHEADSTOUSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADSTOUSE);
//
//  Set up the tab stops for ADDBLOCK_LISTBOXTITLE and ADDBLOCK_TRIPS
//
      DlgWidthUnits = LOWORD(GetDialogBaseUnits()) / 4;
      for(nJ = 0; nJ < TABSET; nJ++)
      {
        adjustedTabPos[nJ] = (DlgWidthUnits * tabPos[nJ] * 2);
      }
      SendMessage(hCtlLISTBOXTITLE, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos);
      LoadString(hInst, TEXT_019, tempString, TEMPSTRING_LENGTH);
      SendMessage(hCtlLISTBOXTITLE, LB_ADDSTRING, 0, (LONG)(LPSTR)tempString);
      SendMessage(hCtlTRIPS, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos);
//
//  Default to all routes and this service
//
      SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      if(SetUpServiceList(hWndDlg, ADDBLOCK_FROMSERVICE, pDI->fileInfo.serviceRecordID) == 0)
      {
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
        break;
      }
//
//  Set up the route listbox
//
      numRoutes = 0;
      SendMessage(hCtlFROMROUTE, LB_RESETCONTENT, (WPARAM)(WPARAM)0, (LPARAM)0);
      rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
      while(rcode2 == 0)
      {
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        strncpy(szarString, ROUTES.name, ROUTES_NAME_LENGTH);
        trim(szarString, ROUTES_NAME_LENGTH);
        strcat(tempString, " - ");
        strcat(tempString, szarString);
        nI = (int)SendMessage(hCtlFROMROUTE, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString);
        SendMessage(hCtlFROMROUTE, LB_SETITEMDATA, (WPARAM)nI, ROUTES.recordID);
        numRoutes++;
        rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
      }
      if(numRoutes == 0)
      {
        TMSError(hWndDlg, MB_ICONSTOP, ERROR_008, (HANDLE)NULL);
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL,0), (LPARAM)0);
        break;
      }
//
//  Comment codes combo box
//
     numComments = SetUpCommentList(hWndDlg, ADDBLOCK_COMMENTCODE);
      if(numComments == 0)
      {
        EnableWindow(hCtlCC, FALSE);
        EnableWindow(hCtlCOMMENTCODE, FALSE);
      }
//
//  Default to "Min" vechicle requirements, but with a blank field
//
      SendMessage(hCtlMIN, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlMINVEHICLES, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)"");
//
//  Default to allowing deadheading, service wraps, and interlining
//
      SendMessage(hCtlILYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlSWYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlDHYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlDEADHEADALL, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
//
//  Clear out edit controls associated with a spin control
//
      SendMessage(hCtlDEADHEADMINS, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)"");
//
//  Default to this table's blocking technique
//
      if(pDI->fileInfo.fileNumber == TMS_STANDARDBLOCKS)
      {
        SendMessage(hCtlSTANDARD, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
        EnableWindow(hCtlDROPBACK, FALSE);
      }
      else
      {
        SendMessage(hCtlDROPBACK, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
        EnableWindow(hCtlSTANDARD, FALSE);
      }
//
//  Set up the m_pPICKEDTRIPS structure
//
      if(m_pPICKEDTRIPS == NULL)
      {
        m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
        if(m_pPICKEDTRIPS == NULL)
        {
          AllocationError(__FILE__, __LINE__, FALSE);
          goto OptimalBlockCleanup;
        }
      }
//
//  Set up the "destination"
//
      flags = PLACEMENT_ROUTE | PLACEMENT_SERVICE;
      DisplayPlacement(hWndDlg, ADDBLOCK_DESTINATION, pDI, flags);
      break;
//
//  WM_CLOSE
//
    case WM_CLOSE:
      SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
      break;
//
//  WM_COMMAND
//
//  Note: The outbound and inbound direction buttons get
//         disabled when the route is set to "All routes"
//
    case WM_COMMAND:
      wmId = LOWORD(wParam);
      wmEvent = HIWORD(wParam);
      switch(wmId)
      {
//
//  ADDBLOCK_ALLROUTES radio button
//
        case ADDBLOCK_ALLROUTES:
          SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(FALSE), (LPARAM)(-1));
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0);
          break;
//
//  ADDBLOCK_CC radio button
//
        case ADDBLOCK_CC:
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
          break;
//
//  ADDBLOCK_ORROUTE radio button
//
        case ADDBLOCK_ORROUTE:
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0);
          nI = (int)SendMessage(hCtlFROMROUTE, LB_GETCURSEL, (WPARAM)0, (LPARAM)0);
          if(nI == CB_ERR)
          {
            nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            if(nJ == 0)
              break;
            for(nI = 0; nI < nJ; nI++)
            {
              tempLong = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
              if(tempLong == pDI->fileInfo.routeRecordID)
              {
                SendMessage(hCtlFROMROUTE, LB_SETCURSEL, (WPARAM)nI, (LPARAM)0);
                break;
              }
            }
          }
//
//  ADDBLOCK_FROMROUTE listbox
//
        case ADDBLOCK_FROMROUTE:
          switch(wmEvent)
          {
            case LBN_SELCHANGE:
              if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
              {
                SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)FALSE, (LPARAM)0);
                SendMessage(hCtlORROUTE, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
              }
              break;
          }
          break;
//
//  ADDBLOCK_LISTBOXTITLE
//
        case ADDBLOCK_LISTBOXTITLE:  // Title string
          SendMessage(hCtlLISTBOXTITLE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1));
          break;
//
//  ADDBLOCK_TRIPS
//
        case ADDBLOCK_TRIPS: // List box
          switch(wmEvent)
          {
            case LBN_SELCHANGE:
            case LBN_SELCANCEL:
              bEnable = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0) > 0;
              EnableWindow(hCtlIDREMOVE, bEnable);
              EnableWindow(hCtlIDPREVIEW, bEnable);
              break;
 
            case LBN_DBLCLK:
              SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDPREVIEW, 0), (LPARAM)0);
              EnableWindow(hCtlIDPREVIEW, TRUE);
              break;
          }
          break;
//
//  ADDBLOCK_MIN
//
        case ADDBLOCK_MIN:
          EnableWindow(hCtlMINVEHICLES, TRUE);
          EnableWindow(hCtlMAXVEHICLES, FALSE);
          break;
//
//  ADDBLOCK_MAX
//
        case ADDBLOCK_MAX:
          EnableWindow(hCtlMINVEHICLES, FALSE);
          EnableWindow(hCtlMAXVEHICLES, TRUE);
          break;
//
//  ADDBLOCK_DHYES / ADDBLOCK_DHNO
//
        case ADDBLOCK_DHYES:
        case ADDBLOCK_DHNO:
          bEnable = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          EnableWindow(hCtlDEADHEADALL, bEnable);
          EnableWindow(hCtlDEADHEADSTOUSE, bEnable);
          EnableWindow(hCtlDEADHEADTHOSE, bEnable);
          EnableWindow(hCtlDEADHEADMINS, bEnable);
          EnableWindow(hCtlTEXT_MINUTES, bEnable);
          break;
//
//  IDPREVIEW
//
        case IDPREVIEW: // Button text: "Preview"
          nI = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
          if(numSelected >= m_maxPICKEDTRIPS)
          {
            m_maxPICKEDTRIPS += (numSelected + 1);
            m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                  HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
            if(m_pPICKEDTRIPS == NULL)
            {
              AllocationError(__FILE__, __LINE__, TRUE);
              break;
            }
          }
          for(nI = 0; nI < numSelected; nI++)
          {
            position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)pSelected[nI], (LPARAM)0);
            fromRoutePosition = LOWORD(position);
            fromServicePosition = HIWORD(position);
            m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE,
                  LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
            m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE,
                  CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          }
          DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PREVIEWT),
                hWndDlg, (DLGPROC)PREVIEWTMsgProc, (LPARAM)numSelected);
          TMSHeapFree(pSelected);
          break;
//
//  IDADD
//
        case IDADD: // Button text: "&Add Trip(s)"
//
//  Get the service
//
          fromServicePosition =
                (int)SendMessage(hCtlFROMSERVICE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
          if(fromServicePosition == CB_ERR)
          {
            break;
          }
          fromServiceRecordID =
                SendMessage(hCtlFROMSERVICE, CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          SERVICESKey0.recordID = fromServiceRecordID;
          btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
          strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
          trim(serviceName, SERVICES_NAME_LENGTH);
//
//  Get the route(s)
//
//  All
//
          if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
          {
            SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(TRUE), (LPARAM)(-1));
          }
//
//  Those labelled...
//
          else if(SendMessage(hCtlCC, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
          {
             nK = (int)SendMessage(hCtlCOMMENTCODE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
             commentRecordID = (nK == CB_ERR ? NO_RECORD : 
                   SendMessage(hCtlCOMMENTCODE, CB_GETITEMDATA, (WPARAM)nK, (LPARAM)0));
            if(commentRecordID == NO_RECORD)
            {
              break;
            }
            nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            for(nI = 0; nI < nJ; nI++)
            {
              ROUTESKey0.recordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
              rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
              if(ROUTES.COMMENTSrecordID == commentRecordID)
              {
                SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)TRUE, (LPARAM)nI);
              }
            }
          }  
//
//  Got the selections - continue
//
          nI = (int)SendMessage(hCtlFROMROUTE, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlFROMROUTE, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
//
//  Add the results to the "to be blocked" list box
//  
          for(nI = 0; nI < numSelected; nI++)
          {
            fromRoutePosition = pSelected[nI];
            fromRouteRecordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
//
//  Before we go any further, let's see if we've got this one already
//
            position = MAKELONG(fromRoutePosition, fromServicePosition);
            nJ = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            for(bFound = FALSE, nK = 0; nK < nJ; nK++)
            {
              tempLong = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nK, (LPARAM)0);
              if(tempLong == position)
              {
                bFound = TRUE;
                break;
              }
            }
            if(bFound)
            {
              continue;
            }
//
//  Not found
//
            EnableWindow(hCtlIDOPTIMAL, TRUE);
            EnableWindow(hCtlIDMANUAL, TRUE);
//
//  Display it
//
            ROUTESKey0.recordID = fromRouteRecordID;
            btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
            strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(routeNumber, ROUTES_NUMBER_LENGTH);
            strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
            trim(routeName, ROUTES_NAME_LENGTH);
            strcpy(tempString, routeNumber);
            strcat(tempString, " - ");
            strcat(tempString, routeName);
            tempString[tabPos[0]] = '\0';
            strcat(tempString, "\t");
            strcat(tempString, serviceName);
            nK = (int)SendMessage(hCtlTRIPS, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString);
            SendMessage(hCtlTRIPS, LB_SETITEMDATA, (WPARAM)nK, (LPARAM)position);
          }
          SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1));
          TMSHeapFree(pSelected);
          break;
//
//  IDREMOVE
//
        case IDREMOVE: // Button text: "Remove"
          nI = (int)SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
//
//  Process the list from the back to the front
//
          for(nI = numSelected - 1; nI >= 0; nI--)
          {
            SendMessage(hCtlTRIPS, LB_DELETESTRING, (WPARAM)pSelected[nI], (LPARAM)0);
          }
          if(SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0) == 0)
          {
            EnableWindow(hCtlIDOPTIMAL, FALSE);
            EnableWindow(hCtlIDMANUAL, FALSE);
          }
          EnableWindow(hCtlIDREMOVE, FALSE);
          EnableWindow(hCtlIDPREVIEW, FALSE);
          TMSHeapFree(pSelected);
          break;
//
//  IDCANCEL
//
        case IDCANCEL:
          EndDialog(hWndDlg, FALSE);
          break;
//
//  IDHELP
//
        case IDHELP:
          WinHelp(hWndDlg, szarHelpFile, HELP_CONTEXT, The_Standard_Blocks_Table);
          break;
//
//  IDMANUAL and IDOPTIMAL
//
        case IDMANUAL:
        case IDOPTIMAL:
          m_bNetworkMode = FALSE;
//
//  Get the parameters
//
          PARMS.bStandard = SendMessage(hCtlSTANDARD, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bDropback = SendMessage(hCtlDROPBACK, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
//
//  Standard and Dropback are mutually exclusive on a manual block
//
          if(wmId == IDMANUAL)
          {
            if(PARMS.bStandard && PARMS.bDropback)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_134, hCtlSTANDARD);
              break;
            }
          }
//
//  At least one of Standard or Dropback must be chosen prior to pressing Optimal
//
          else
          {
            if(!PARMS.bStandard && !PARMS.bDropback)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_135, hCtlSTANDARD);
              break;
            }
          }
//
//  Get the rest of the parameters
//
          PARMS.bInterlining = SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bServiceWrap = SendMessage(hCtlSWYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bDeadheading = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          if(!PARMS.bDeadheading)
          {
            PARMS.bDeadheadAll = FALSE;
            PARMS.maxDeadheadTime = NO_TIME;
          }
          else
          {
            SendMessage(hCtlDEADHEADMINS, WM_GETTEXT,
                  (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
            if(strcmp(tempString, "") == 0)
            {
              PARMS.bDeadheadAll = TRUE;
              PARMS.maxDeadheadTime = NO_TIME;
            }
            else
            {
              PARMS.bDeadheadAll = FALSE;
              PARMS.maxDeadheadTime = atol(tempString) * 60;
            }
          }
//
//  Build the list of selected trips
//
          m_numPICKEDTRIPS = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
          if(m_numPICKEDTRIPS >= m_maxPICKEDTRIPS)
          {
            m_maxPICKEDTRIPS += (m_numPICKEDTRIPS + 1);
            m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                  HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
            if(m_pPICKEDTRIPS == NULL)
            {
              AllocationError(__FILE__, __LINE__, TRUE);
              break;
            }
          }
          for(nI = 0; nI < m_numPICKEDTRIPS; nI++)
          {
            position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
            fromRoutePosition = LOWORD(position);
            fromServicePosition = HIWORD(position);
            m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE,
                  LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
            m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE,
                  CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          }
//
//  Dropback blocking isn't permitted unless it's been "standard" blocked already
//
          if(PARMS.bDropback)
          {
            bAbort = FALSE;
            for(nI = 0; nI < m_numPICKEDTRIPS; nI++)
            {
              if(bAbort)
                break;
              for(nJ = 0; nJ < 2; nJ++)
              {
                if(bAbort)
                  break;
                ROUTESKey0.recordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
                btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                if(ROUTES.DIRECTIONSrecordID[nJ] == NO_RECORD)
                  continue;
                TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
                TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
                TRIPSKey1.directionIndex = nJ;
                TRIPSKey1.tripSequence = NO_TIME;
                rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
                while(rcode2 == 0 &&
                      TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID &&
                      TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID &&
                      TRIPS.directionIndex == nJ)
                {
                  if(TRIPS.standard.blockNumber == 0)
                  {
                    LoadString(hInst, TEXT_245, szFormatString, sizeof(szFormatString));
                    strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
                    trim(routeNumber, ROUTES_NUMBER_LENGTH);
                    strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
                    trim(routeName, ROUTES_NAME_LENGTH);
                    SERVICESKey0.recordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
                    btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                    strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
                    trim(serviceName, SERVICES_NAME_LENGTH);
                    sprintf(tempString, szFormatString, serviceName, routeNumber, routeName);
                    MessageBeep(MB_ICONSTOP);
                    MessageBox(hWndDlg, tempString, TMS, MB_OK);
                    bAbort = TRUE;
                    break;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
                }
              }
            }
            if(bAbort)
              break;
          }
//  
//  IDMANUAL - Go into MANBLOCK
//
          if(wmId == IDMANUAL)
          {
            pDI->otherData = (long)(&PARMS);
            nRc = BlockDialog(pDI);
            if(nRc)
            {
              EndDialog(hWndDlg, TRUE);
            }
            break;
          }
//
//  IDOPTIMAL
//
          for(blockingType = 0; blockingType < 2; blockingType++)
          {
            if(blockingType == 0)
            {
              if(!PARMS.bStandard)
              {
                continue;
              }
              StatusBarStart(hWndDlg, "Optimal Standard Blocking Status");
              pTRIPSChunk = &TRIPS.standard;
              pLayover = &StandardLayover;
              layoverType = TMS_STANDARDBLOCKS;
            }
            else
            {
              if(!PARMS.bDropback)
              {
                continue;
              }
              StatusBarStart(hWndDlg, "Optimal Dropback Blocking Status");
              pTRIPSChunk = &TRIPS.dropback;
              pLayover = &DropbackLayover;
              layoverType = TMS_DROPBACKBLOCKS;
            }
            StatusBar(-1L, -1L);
            StatusBarText("Initializing...");
//
//  Initialize the interlining option
//
            BLSetOptions(SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0));
//
//  Loop through numPICKEDTRIPS to determine what we're dealing with
//
            StatusBarText("Examining selected trips...");
            m_numConnectionAlerts = 0;
            maxTrips = 512;
            pTRIPSrecordIDs = (long *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(long) * maxTrips); 
            if(pTRIPSrecordIDs == NULL)
            {
              AllocationError(__FILE__, __LINE__, FALSE);
              goto OptimalBlockCleanup;
            }
            for(numTrips = 0, nI = 0; nI < m_numPICKEDTRIPS; nI++)
            {
              StatusBar((long)nI, (long)m_numPICKEDTRIPS);
              if(StatusBarAbort())
              {
                goto OptimalBlockCleanup;
              }
              m_bEstablishRUNTIMES = TRUE;
              TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
              TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
              TRIPSKey1.directionIndex = NO_RECORD;
              TRIPSKey1.tripSequence = NO_RECORD;
              rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
              while(rcode2 == 0 &&
                    (m_pPICKEDTRIPS[nI].ROUTESrecordID == NO_RECORD ||
                          TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID) &&
                    (m_pPICKEDTRIPS[nI].SERVICESrecordID == NO_RECORD ||
                          TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID))
              {
                if(pTRIPSChunk->blockNumber == 0)
                {
                  if(numTrips >= maxTrips)
                  {
                    maxTrips += 512;
                    pTRIPSrecordIDs = (long *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, pTRIPSrecordIDs, sizeof(long) * maxTrips); 
                    if(pTRIPSrecordIDs == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, TRUE);
                      goto OptimalBlockCleanup;
                    }
                  }
                  pTRIPSrecordIDs[numTrips++] = TRIPS.recordID;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
              }
            }
            if((m_numTripsForBlocker = numTrips) == 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_102, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  If m_numConnectionAlerts is non-zero, blow him off
//
            if(m_numConnectionAlerts != 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  Make sure that we're not going in with bad values for min & max layover
//
            if(pLayover->minimum.type == NO_RECORD ||
                  pLayover->maximum.type == NO_RECORD ||
                  (pLayover->maximum.type == 0 && pLayover->maximum.minutes == 0))
            {
              MessageBeep(MB_ICONSTOP);
              LoadString(hInst, ERROR_030, szarString, sizeof(szarString));
              MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP);
              nRc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_LAYOVER),
                    hWndDlg, (DLGPROC)LAYOVERMsgProc, (LPARAM)layoverType);
              if(!nRc)
                goto OptimalBlockCleanup;
            }
//
//  Generate trip data into TRIPINFO
//
            StatusBarText("Building trip data...");
            StatusBar(0L, 0L);
            BLInitNetwork();
            for(nI = 0; nI < numTrips; nI++)
            {
              StatusBar((long)nI, (long)numTrips);
              if(StatusBarAbort())
                goto OptimalBlockCleanup;
              TRIPSKey0.recordID = pTRIPSrecordIDs[nI];
              btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
              nJ = GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  If we've got a one-node trip, fool the blocker
//
              if(GTResults.firstNODESrecordID == GTResults.lastNODESrecordID &&
                    GTResults.firstNodeTime == GTResults.lastNodeTime)
              {
                GTResults.lastNodeTime++;
              }
              if(nJ != 0)
              {
                TRIPINFODef TRIPINFOrec;
                TRIPINFOrec.TRIPSrecordID = TRIPS.recordID;
                TRIPINFOrec.BUSTYPESrecordID = TRIPS.BUSTYPESrecordID;
                TRIPINFOrec.ROUTESrecordID = TRIPS.ROUTESrecordID;
//
//  If we're doing a dropback, and the standard block pulls out or in,
//  then replace the start/end node/time with the pullout/in gar/time.
//
//  Check pullouts
//
                if(PARMS.bStandard || TRIPS.standard.POGNODESrecordID == NO_RECORD)
                {
                  TRIPINFOrec.startNODESrecordID = GTResults.firstNODESrecordID;
                  TRIPINFOrec.startTime = GTResults.firstNodeTime;
                }
                else
                {
                  GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID;
                  GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
                  GCTData.timeOfDay = GTResults.firstNodeTime;
                  dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                  distance = (float)fabs((double)distance);
                  if(dhd == NO_TIME)
                    dhd = 0;
                  TRIPINFOrec.startNODESrecordID = TRIPS.standard.POGNODESrecordID;
                  TRIPINFOrec.startTime = GTResults.firstNodeTime - dhd;
                }
//
//  Check pullins
//
                if(PARMS.bStandard || TRIPS.standard.PIGNODESrecordID == NO_RECORD)
                {
                  TRIPINFOrec.endNODESrecordID = GTResults.lastNODESrecordID;
                  TRIPINFOrec.endTime = GTResults.lastNodeTime;
                }
                else
                {
                  GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
                  GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                  GCTData.timeOfDay = GTResults.lastNodeTime;
                  dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                  distance = (float)fabs((double)distance);
                  if(dhd == NO_TIME)
                    dhd = 0;
                  TRIPINFOrec.endNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                  TRIPINFOrec.endTime = GTResults.lastNodeTime + dhd;
                }
//
//  Figure out the minimum layover
//
                if(pTRIPSChunk->layoverMin != NO_TIME)
                  TRIPINFOrec.layoverMin = pTRIPSChunk->layoverMin;
                else
                {
                  minutes = pLayover->minimum.minutes  * 60;
                  percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->minimum.percent / 100;
                  if(pLayover->minimum.type == 0)
                    TRIPINFOrec.layoverMin = minutes;
                  else if(pLayover->minimum.type == 1)
                    TRIPINFOrec.layoverMin = percent;
                  else if(pLayover->minimum.type == 2)
                    TRIPINFOrec.layoverMin =
                          pLayover->minimum.lower ? min(minutes, percent) : max(minutes, percent);
                }
//
//  Figure out the maximum layover
//
                if(pTRIPSChunk->layoverMax != NO_TIME)
                  TRIPINFOrec.layoverMax = pTRIPSChunk->layoverMax;
                else
                {
                  minutes = pLayover->maximum.minutes * 60;
                  percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->maximum.percent / 100;
                  if(pLayover->maximum.type == 0)
                    TRIPINFOrec.layoverMax = minutes;
                  else if(pLayover->maximum.type == 1)
                    TRIPINFOrec.layoverMax = percent;
                  else if(pLayover->maximum.type == 2)
                    TRIPINFOrec.layoverMax =
                          pLayover->maximum.lower ? min(minutes, percent) : max(minutes, percent);
                }
//
//  And generate the trip arc
//
                BLGenerateTripArc( &TRIPINFOrec );
              }
            }
//
//  If m_numConnectionAlerts is non-zero, blow him off
//
            if(m_numConnectionAlerts != 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  Generate the wait arcs between the trips
//
            StatusBarText("Generating wait arcs...");
            StatusBar(-1L, -1L);
            BLGenerateWaitArcs(FALSE);
//
//  Generate deadhead and equivalence data into DEADHEADINFO
//
            rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
            numDeadheadsForBlocker = 0;
            while(rcode2 == 0)
            {
              if(StatusBarAbort())
                goto OptimalBlockCleanup;
              if(PARMS.bDeadheading)
              {
                if((CONNECTIONS.flags & CONNECTIONS_FLAG_DEADHEADTIME) &&
                      (PARMS.bDeadheadAll || CONNECTIONS.connectionTime <= PARMS.maxDeadheadTime))
                {
                  DEADHEADINFODef DEADHEADINFOrec;
                  DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay;
                  DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay;
                  DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
                  DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID;
                  DEADHEADINFOrec.flags = CONNECTIONS.flags;
                  DEADHEADINFOrec.deadheadTime = CONNECTIONS.connectionTime;
                  BLGenerateDeadheadArcs( &DEADHEADINFOrec );
                  numDeadheadsForBlocker++;
                }
              }
              if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT)
              {
                DEADHEADINFODef DEADHEADINFOrec;
                DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay;
                DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay;
                DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
                DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID;
                DEADHEADINFOrec.flags = CONNECTIONS.flags;
                DEADHEADINFOrec.deadheadTime = 0;
                BLGenerateDeadheadArcs( &DEADHEADINFOrec );
                numDeadheadsForBlocker++;
              }
              rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
            }
            if(StatusBarAbort())
              goto OptimalBlockCleanup;
//
//  Get the minimum and maximum number of vehicles parameters.
//  This only applies to Optimal, so it's done here rather than above.
//
            if(SendMessage(hCtlMIN, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
            {
              maxVehicles = NO_TIME;
              SendMessage(hCtlMINVEHICLES, WM_GETTEXT,
                    (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
              if(strcmp(tempString, "") == 0)
                minVehicles = NO_TIME;
              else
                minVehicles = atol(tempString);
            }
            else
            {
              minVehicles = NO_TIME;
              SendMessage(hCtlMAXVEHICLES, WM_GETTEXT,
                    (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
              if(strcmp(tempString, "") == 0)
                maxVehicles = NO_TIME;
              else
                maxVehicles = atol(tempString);
            }
//
//  Call the blocker
//
            m_pBLOCKSDATA = (BLOCKSDATADef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BLOCKSDATADef) * m_numTripsForBlocker); 
            if(m_pBLOCKSDATA == NULL)
            {
              AllocationError(__FILE__, __LINE__, FALSE);
              goto OptimalBlockCleanup;
            }
            StatusBarText("Optimal blocking in progress...");
            sblock(minVehicles, maxVehicles);
            if(StatusBarAbort())
            {
              goto OptimalBlockCleanup;
            }
//
//  Update the file with the results
//
            lastBlock = GetNewBlockNumber(pDI);
            StatusBarText("Blocking complete - writing results...");
            StatusBarEnableCancel(FALSE);
            for(nJ = 0; nJ < numTrips; nJ++)
            {
              StatusBar((long)nJ, (long)numTrips);
              TRIPSKey0.recordID = m_pBLOCKSDATA[nJ].TRIPSrecordID;
              if((rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0)) != 0)
              {
                MessageBeep(MB_ICONSTOP);
                LoadString(hInst, ERROR_015, szarString, sizeof(szarString));
                SetFocus(hCtlFROMROUTE);
                MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP);
                goto OptimalBlockCleanup;
              }
              GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
              pTRIPSChunk->blockNumber = m_pBLOCKSDATA[nJ].blockNumber + lastBlock;
              pTRIPSChunk->RGRPROUTESrecordID = pDI->fileInfo.routeRecordID;
              pTRIPSChunk->SGRPSERVICESrecordID = pDI->fileInfo.serviceRecordID;
              pTRIPSChunk->blockSequence = GTResults.firstNodeTime;
              btrieve(B_UPDATE, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            }

            OptimalBlockCleanup:
              BLCleanup();
              TMSHeapFree(m_pBLOCKSDATA);
              TMSHeapFree(pTRIPSrecordIDs);
              m_numTripsForBlocker = 0;
              StatusBarEnd();
          }  // blockingType

          EndDialog(hWndDlg, TRUE);
          break;
       }
     break;    //  End of WM_COMMAND

    default:
      return FALSE;
  }

  return TRUE;
} //  End of ADDBLOCKMsgProc
예제 #15
0
파일: Tmsrpt36.c 프로젝트: ems/TMS
BOOL FAR TMSRPT36(TMSRPTPassedDataDef *pPassedData)
{
  TMSRPT36PassedDataDef TMSRPT36PassedData;
  HANDLE hOutputFile;
  DWORD  dwBytesWritten;
  BOOL  bRC;
  BOOL  bKeepGoing;
  char  *daysOfTheWeek[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  char  outString[512];
  char  dummy[256];
  long  numTimechecks;
  long  timechecksRead;
  long  timeOfDay;
  long  index;
  int   year, month, day;
  int   dayOfWeek;
  int   rcode2;

  pPassedData->nReportNumber = 35;
  pPassedData->numDataFiles = 1;
  bRC = TMSRPT36Filter(&TMSRPT36PassedData);
  if(!bRC)
    return(FALSE);
//
//  Open the output file
//
  strcpy(tempString, szReportsTempFolder);
  strcat(tempString, "\\TMSRPT36.TXT");
  hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hOutputFile == INVALID_HANDLE_VALUE)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Get the number of records in the TIMECHECKS file
//
  rcode2 = btrieve(B_STAT, TMS_TIMECHECKS, &BSTAT, dummy, 0);
  if(rcode2 != 0 || BSTAT.numRecords == 0)
  {
    TMSError(NULL, MB_ICONSTOP, ERROR_313, (HANDLE)NULL);
    SendMessage(NULL, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
    goto deallocate;
  }
  numTimechecks = BSTAT.numRecords;
//
//  Start the status bar
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
//
//  Loop through the records
//
  bKeepGoing = TRUE;
  TIMECHECKSKey1.checkDate = TMSRPT36PassedData.fromDate;
  timechecksRead = 0;
  rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey1, 1);
  while(rcode2 == 0 &&
        TIMECHECKS.checkDate >= TMSRPT36PassedData.fromDate &&
        TIMECHECKS.checkDate <= TMSRPT36PassedData.toDate)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      break;
    }
    StatusBar(timechecksRead, numTimechecks);
//
//  Service
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLSERVICES ||
          TMSRPT36PassedData.SERVICESrecordID == TIMECHECKS.SERVICESrecordID))
      goto NextRecord;
//
//  Route
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLROUTES ||
          TMSRPT36PassedData.ROUTESrecordID == TIMECHECKS.ROUTESrecordID))
      goto NextRecord;
//
//  Direction
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_BOTHDIRECTIONS ||
          TMSRPT36PassedData.directionIndex == TIMECHECKS.directionIndex))
      goto NextRecord;
//
//  Timepoint
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLTIMEPOINTS ||
          TMSRPT36PassedData.NODESrecordID == TIMECHECKS.NODESrecordID))
      goto NextRecord;
//
//  Drivers
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLDRIVERS ||
          TMSRPT36PassedData.DRIVERSrecordID == TIMECHECKS.actualDRIVERSrecordID))
      goto NextRecord;
//
//  Exclusions
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_DONOTEXCLUDE ||
          TMSRPT36PassedData.excludedDRIVERSrecordID != TIMECHECKS.actualDRIVERSrecordID))
      goto NextRecord;
//
//  Bustypes
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLBUSTYPES ||
          TMSRPT36PassedData.BUSTYPESrecordID == TIMECHECKS.actualBUSTYPESrecordID))
      goto NextRecord;
//
//  Passenger Load
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLPASSENGERLOADS ||
          TMSRPT36PassedData.passengerLoadIndex == TIMECHECKS.passengerLoadIndex))
      goto NextRecord;
//
//  Road Supervisors
//
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLROADSUPERVISORS ||
          TMSRPT36PassedData.roadSupervisorIndex == TIMECHECKS.supervisorIndex))
      goto NextRecord;
//
//  Day of the week - moved here 'cause other, easier, conditions earlier.
//
    dayOfWeek = GetDayFromDate(TIMECHECKS.checkDate);
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLSERVICEDAYS ||
          TMSRPT36PassedData.dayNumber == dayOfWeek))
      goto NextRecord;
//
//  Time of day - moved here 'cause other, easier, conditions earlier.  
//  If he passes this test, he's Jake.
//
    timeOfDay = GetTimeAtNode(TIMECHECKS.TRIPSrecordID,
          TIMECHECKS.NODESrecordID, TIMECHECKS.nodePositionInTrip, (TRIPSDef *)NULL);
    if(!(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLDAY))
    {
      timeOfDay = GetTimeAtNode(TIMECHECKS.TRIPSrecordID,
            TIMECHECKS.NODESrecordID, TIMECHECKS.nodePositionInTrip, (TRIPSDef *)NULL);
      if(timeOfDay < TMSRPT36PassedData.timeOfDayFrom ||
            timeOfDay > TMSRPT36PassedData.timeOfDayTo)
        goto NextRecord;
    }
//
//  Passed the tests - construct the output record
//
//  Date
//
    GetYMD(TIMECHECKS.checkDate, &year, &month, &day);
    sprintf(outString, "%04d/%02d/%02d\t", year, month, day);
//
//  Service
//
    SERVICESKey0.recordID = TIMECHECKS.SERVICESrecordID;
    btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
    strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
    trim(szarString, SERVICES_NAME_LENGTH);
    strcat(outString, szarString);
    strcat(outString, "\t");
//
//  Day of week
//
    if(TMSRPT36PassedData.flags & TMSRPT36_FLAG_ALLSERVICEDAYS)
      dayOfWeek = GetDayFromDate(TIMECHECKS.checkDate);
    else
      dayOfWeek = TMSRPT36PassedData.dayNumber;
    strcat(outString, daysOfTheWeek[dayOfWeek - 1]);
    strcat(outString, "\t");
//
//  Scheduled time
//
    sprintf(szarString, "%ld\t", timeOfDay);
    strcat(outString, szarString);
//
//  Actual time
//
    sprintf(szarString, "%ld\t", TIMECHECKS.actualTime);
    strcat(outString, szarString);
//
//  Route
//
    ROUTESKey0.recordID = TIMECHECKS.ROUTESrecordID;
    btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
    strncpy(szarString, ROUTES.name, ROUTES_NAME_LENGTH);
    trim(szarString, ROUTES_NAME_LENGTH);
    strcat(outString, szarString);
    strcat(outString, "\t");
//
//  Timepoint
//
    NODESKey0.recordID = TIMECHECKS.NODESrecordID;
    btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
    strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
    trim(szarString, NODES_ABBRNAME_LENGTH);
    strcat(outString, szarString);
    strcat(outString, "\t");
//
//  Direction
//
    DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TIMECHECKS.directionIndex];
    btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
    strncpy(szarString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
    trim(szarString, DIRECTIONS_ABBRNAME_LENGTH);
    strcat(outString, szarString);
    strcat(outString, "\t");
//
//  Road Supervisor
//
    if(TIMECHECKS.supervisorIndex >= 0 && TIMECHECKS.supervisorIndex < MAXROADSUPERVISORS)
    {
      strcat(outString, m_RoadSupervisors[TIMECHECKS.supervisorIndex].szText);
    }
    strcat(outString, "\t");
//
//  Driver
//
    if(TIMECHECKS.actualDRIVERSrecordID != NO_RECORD)
    {
      DRIVERSKey0.recordID = TIMECHECKS.actualDRIVERSrecordID;
      btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
      strncpy(szarString, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH);
      trim(szarString, DRIVERS_LASTNAME_LENGTH);
      strcat(outString, szarString);
      strcat(outString, ", ");
      strncpy(szarString, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH);
      trim(szarString, DRIVERS_FIRSTNAME_LENGTH);
      strcat(outString, szarString);
    }
    strcat(outString, "\t");
//
//  Bustype
//
    if(TIMECHECKS.actualBUSTYPESrecordID != NO_RECORD)
    {
      BUSTYPESKey0.recordID = TIMECHECKS.actualBUSTYPESrecordID;
      btrieve(B_GETEQUAL, TMS_BUSTYPES, &BUSTYPES, &BUSTYPESKey0, 0);
      strncpy(szarString, BUSTYPES.name, BUSTYPES_NAME_LENGTH);
      trim(szarString, BUSTYPES_NAME_LENGTH);
      strcat(outString,szarString);
    }
    strcat(outString, "\t");
//
//  Passenger Load
//
    if(TIMECHECKS.passengerLoadIndex >= 0 && TIMECHECKS.passengerLoadIndex < MAXPASSENGERLOADS)
    {
      strcat(outString, m_PassengerLoads[TIMECHECKS.passengerLoadIndex].szText);
    }
    strcat(outString, "\t");
//
//  Weather
//
    index = (long)LOWORD(TIMECHECKS.weatherIndex);
    if(index >= 0 && index < MAXWEATHERCONDITIONS)
    {
      strcat(outString, m_WeatherConditions[index].szText);
    }
    strcat(outString, "\t");
//
//  Traffic
//
    index = (long)HIWORD(TIMECHECKS.weatherIndex);
    if(index >= 0 && index < MAXTRAFFICCONDITIONS)
    {
      strcat(outString, m_TrafficConditions[index].szText);
    }
    strcat(outString, "\t");
//
//  Other Comments
//
    if(TIMECHECKS.otherCommentsIndex >= 0 && TIMECHECKS.otherCommentsIndex < MAXOTHERCOMMENTS)
    {
      strcat(outString, m_OtherComments[TIMECHECKS.otherCommentsIndex].szText);
    }
    strcat(outString, "\r\n");
//
//  Write it out
//
    WriteFile(hOutputFile, (LPCVOID *)outString,
              strlen(outString), &dwBytesWritten, NULL);
//
//  Get the next TIMECHECKS record
//
    NextRecord:
      rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey1, 1);
    timechecksRead++;
  }  // while  (through TIMECHECKS)


//
//  Free allocated memory
//
  deallocate:
    StatusBarEnd();
    CloseHandle(hOutputFile);
    SetCursor(hCursorArrow);
    if(!bKeepGoing)
      return(FALSE);
//
//  All done
//
  return(TRUE);
}
예제 #16
0
void CSkinManager::RefreshProgressSkin()
{
	StatusBar()->Refresh();
}
예제 #17
0
파일: Tmsrpt40.c 프로젝트: ems/TMS
BOOL FAR TMSRPT40(TMSRPTPassedDataDef *pPassedData)
{
    REPORTPARMSDef  REPORTPARMS;
    TMSRPT40NODESDef NODESrecordIDs[TMSRPT40_MAXNODES];
    TMSRPT40TRIPSDef TRIPData[TMSRPT40_MAXNODES];
    HANDLE hOutputFile;
    HANDLE hOutputFileRaw;
    DWORD  dwBytesWritten;
    double distance;
    BOOL  bKeepGoing = FALSE;
    char  outputString[512];
    char  outputStringRaw[512];
    long  fromNODESrecordID;
    long  toNODESrecordID;
    long  arrivalTime;
    float longitude[2];
    float latitude[2];
    BOOL  bRC;
    BOOL  bFound;
    BOOL  bDoneTitle;
    char  fromNodeName[NODES_ABBRNAME_LENGTH * 2 + 1];
    char  toNodeName[NODES_ABBRNAME_LENGTH * 2 + 1];
    long  previousPATTERNNAMESrecordID;
    long  previousNODESrecordID;
    long  currentNodePositionInTrip;
    long  actualTime;
    int   nI;
    int   nJ;
    int   nK;
    int   nL;
    int   rcode2;
    int   seqNum;
    int   numConnections;
    int   numEntries;

//
//  Ok - let's go
//
    pPassedData->nReportNumber = 39;
    pPassedData->numDataFiles = 1;
//
//  See what he wants
//
    REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
    REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
    REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
    REPORTPARMS.COMMENTSrecordID = NO_RECORD;
    REPORTPARMS.pRouteList = NULL;
    REPORTPARMS.pServiceList = NULL;
    REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS;

    bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
                         hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
    if(!bRC)
    {
        return(FALSE);
    }
//
//  Check the list of routes and services
//
    if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
    {
        goto deallocate;
    }
//
//  Open the regular output file
//
    strcpy(tempString, szReportsTempFolder);
    strcat(tempString, "\\TMSRPT40.txt");
    hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
                             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hOutputFile == INVALID_HANDLE_VALUE)
    {
        LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
        sprintf(szarString, szFormatString, tempString);
        MessageBeep(MB_ICONSTOP);
        MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
        goto deallocate;
    }
    strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Open the raw output file
//
    strcpy(tempString, szReportsTempFolder);
    strcat(tempString, "\\TMSRPT40RAW.txt");
    hOutputFileRaw = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hOutputFileRaw == INVALID_HANDLE_VALUE)
    {
        LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
        sprintf(szarString, szFormatString, tempString);
        MessageBeep(MB_ICONSTOP);
        MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
        goto deallocate;
    }
//
//  Fire up the status bar
//
    LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
    StatusBarStart(hWndMain, tempString);
//
//  Build the list of node pairs (more or less nick'd from PICKCONN
//
    numConnections = 0;
    for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
    {
        if(StatusBarAbort())
        {
            bKeepGoing = FALSE;
            goto deallocate;
        }
        ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
        for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
            for(nK = 0; nK < 2; nK++)
            {
                if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
                    continue;
                PATTERNSKey2.ROUTESrecordID = REPORTPARMS.pRouteList[nI];
                PATTERNSKey2.SERVICESrecordID = REPORTPARMS.pServiceList[nJ];
                PATTERNSKey2.directionIndex = nK;
                PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
                PATTERNSKey2.nodeSequence = 0;
                rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
//
//  Set up unique from/to node combinations.  This section of code
//  assumes that ADDPATTERN has done its job and not permitted a
//  bus stop to be the first or last node in a pattern.
//
                if(rcode2 == 0 &&
                        PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] &&
                        PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] &&
                        PATTERNS.directionIndex == nK)
                {
                    fromNODESrecordID = PATTERNS.NODESrecordID;
                    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                    while(rcode2 == 0 &&
                            PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] &&
                            PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] &&
                            PATTERNS.directionIndex == nK)
                    {
                        if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                        {
                            toNODESrecordID = PATTERNS.NODESrecordID;
                            for(bFound = FALSE, nL = 0; nL < numConnections; nL++)
                            {
                                if(fromNODESrecordID == NODESrecordIDs[nL].from &&
                                        toNODESrecordID == NODESrecordIDs[nL].to)
                                {
                                    bFound = TRUE;
                                    break;
                                }
                            }
                            if(!bFound)
                            {
                                NODESrecordIDs[numConnections].from = fromNODESrecordID;
                                NODESrecordIDs[numConnections++].to = toNODESrecordID;
                                if(numConnections >= TMSRPT40_MAXNODES)
                                    break;
                            }
                            fromNODESrecordID = toNODESrecordID;
                        }
                        previousPATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
                        rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                        if(PATTERNS.PATTERNNAMESrecordID != previousPATTERNNAMESrecordID)
                        {
                            fromNODESrecordID = PATTERNS.NODESrecordID;
                            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                        }
                    }
                }
            }
        }
    }
//
//  Sort the connection pairs
//
    qsort((void *)NODESrecordIDs, numConnections, sizeof(TMSRPT40NODESDef), TMSRPT40sort_nodes);

//
//  Cycle through all the connection pairs
//
    seqNum = 1;
    for(nI = 0; nI < numConnections; nI++)
    {
        if(StatusBarAbort())
        {
            bKeepGoing = FALSE;
            goto deallocate;
        }
//
//  From node
//
        NODESKey0.recordID = NODESrecordIDs[nI].from;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        strncpy(fromNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
        trim(fromNodeName, NODES_ABBRNAME_LENGTH);
        longitude[0] = NODES.longitude;
        latitude[0] = NODES.latitude;
//
//  To node
//
        NODESKey0.recordID = NODESrecordIDs[nI].to;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        strncpy(toNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
        trim(toNodeName, NODES_ABBRNAME_LENGTH);
        longitude[1] = NODES.longitude;
        latitude[1] = NODES.latitude;
//
//  Display it
//
        sprintf(tempString, "%4s - %4s", fromNodeName, toNodeName);
        StatusBarText(tempString);
        StatusBar((long)(nI + 1), (long)numConnections);
//
//  First, dump out the connections table entries for this pair under
//  the following rules: a) the entry must be a running time, and b)
//  B->A connections will only be listed if the 2-way flag is in effect.
//
//
//  Possibly From-To and To-From
//
        bDoneTitle = FALSE;
        for(nJ = 0; nJ < 2; nJ++)
        {
            if(nJ == 0)
            {
                fromNODESrecordID = NODESrecordIDs[nI].from;
                toNODESrecordID = NODESrecordIDs[nI].to;
            }
            else
            {
                fromNODESrecordID = NODESrecordIDs[nI].to;
                toNODESrecordID = NODESrecordIDs[nI].from;
            }
            CONNECTIONSKey1.fromNODESrecordID = NODESrecordIDs[nI].from;
            CONNECTIONSKey1.toNODESrecordID = NODESrecordIDs[nI].to;
            CONNECTIONSKey1.fromTimeOfDay = NO_TIME;
            rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
            while(rcode2 == 0 &&
                    CONNECTIONS.fromNODESrecordID == fromNODESrecordID &&
                    CONNECTIONS.toNODESrecordID == toNODESrecordID)
            {
                if((nJ == 0 || (CONNECTIONS.flags & CONNECTIONS_FLAG_TWOWAY)) &&
                        (CONNECTIONS.flags & CONNECTIONS_FLAG_RUNNINGTIME))
                {
//
//  Sequence + Title String
//
                    if(!bDoneTitle)
                    {
                        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
                        strcat(outputString, "Data from the Connections Table:\"\r\n");
                        WriteFile(hOutputFile, (LPCVOID *)outputString,
                                  strlen(outputString), &dwBytesWritten, NULL);
                        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
                        strcat(outputString, "  From   To    Route  Service  Pattern    Route  Service  Pattern Min             U/M     Dist  Spd/Hr");
                        strcat(outputString, "\"\r\n");
                        WriteFile(hOutputFile, (LPCVOID *)outputString,
                                  strlen(outputString), &dwBytesWritten, NULL);
                        bDoneTitle = TRUE;
                    }
//
//  Sequence
//
                    sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
//
//  From and to node names
//
                    if(nJ == 0)
                        sprintf(tempString, "  %4s %4s ", fromNodeName, toNodeName);
                    else
                        sprintf(tempString, "  %4s %4s ", toNodeName, fromNodeName);
                    strcat(outputString, tempString);
//
//  From Route
//
                    if(CONNECTIONS.fromROUTESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        ROUTESKey0.recordID = CONNECTIONS.fromROUTESrecordID;
                        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                        strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  From Service
//
                    if(CONNECTIONS.fromSERVICESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        SERVICESKey0.recordID = CONNECTIONS.fromSERVICESrecordID;
                        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                        strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  From Pattern
//
                    if(CONNECTIONS.fromPATTERNNAMESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        PATTERNNAMESKey0.recordID = CONNECTIONS.fromPATTERNNAMESrecordID;
                        btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
                        strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Route
//
                    if(CONNECTIONS.toROUTESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        ROUTESKey0.recordID = CONNECTIONS.toROUTESrecordID;
                        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                        strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Service
//
                    if(CONNECTIONS.toSERVICESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        SERVICESKey0.recordID = CONNECTIONS.toSERVICESrecordID;
                        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                        strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Pattern
//
                    if(CONNECTIONS.toPATTERNNAMESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        PATTERNNAMESKey0.recordID = CONNECTIONS.toPATTERNNAMESrecordID;
                        btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
                        strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  Time
//
                    sprintf(tempString, "%3d ", CONNECTIONS.connectionTime / 60);
                    strcat(outputString, tempString);
//
//  Btwn
//
                    if(CONNECTIONS.fromTimeOfDay == NO_TIME)
                    {
                        strcpy(tempString, "      ");
                    }
                    else
                    {
                        sprintf(tempString, "%s ", Tchar(CONNECTIONS.fromTimeOfDay));
                    }
                    strcat(outputString, tempString);
//
//  And
//
                    if(CONNECTIONS.toTimeOfDay == NO_TIME)
                    {
                        strcpy(tempString, "      ");
                    }
                    else
                    {
                        sprintf(tempString, "%s ", Tchar(CONNECTIONS.toTimeOfDay));
                    }
                    strcat(outputString, tempString);
//
//  Distance type and distance
//
                    if(CONNECTIONS.distance == NO_RECORD || CONNECTIONS.distance == 0.0)
                    {
                        strcpy(szarString, "Map ");
                        distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]);
                    }
                    else
                    {
                        strcpy(szarString, "User");
                        distance = CONNECTIONS.distance;
                    }
                    sprintf(tempString, "%s %7.2f ", szarString, distance);
                    strcat(outputString, tempString);
//
//  Speed per hour
//
                    if(CONNECTIONS.connectionTime == 0)
                        strcpy(tempString, "-------");
                    else
                        sprintf(tempString, "%7.2f", distance / ((double)CONNECTIONS.connectionTime / 3600));
                    strcat(outputString, tempString);
//
//  Write it out
//
                    strcat(outputString, "\"\r\n");
                    WriteFile(hOutputFile, (LPCVOID *)outputString,
                              strlen(outputString), &dwBytesWritten, NULL);
                }  // if connection type == requested type to display
                rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
            }  // while
        }  //  nJ
//
//  If we didn't output a title, there wasn't anything
//
        if(!bDoneTitle)
            continue;
//
//  Now get the stuff from the timechecks table
//
//  Sequence + Title String
//
        sprintf(outputString, "%d\t%s\t%s\t\"\"\r\n", seqNum++, fromNodeName, toNodeName);
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
        strcat(outputString, "Data from the Timechecks Table:\"\r\n");
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
//
//  Look up the "to node" on the timechecks table
//
        numEntries = 0;
        TIMECHECKSKey4.NODESrecordID = NODESrecordIDs[nI].to;
        rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4);
        while(rcode2 == 0 &&
                TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].to)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
//
//  Get the trip
//
            TRIPSKey0.recordID = TIMECHECKS.TRIPSrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            if(rcode2 == 0)
            {
//
//  Get the pattern of the trip and find the "to node".
//
                previousNODESrecordID = NO_RECORD;
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                currentNodePositionInTrip = 0;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                while(rcode2 == 0 &&
                        PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                        PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                        PATTERNS.directionIndex == TRIPS.directionIndex &&
                        PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                    if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                    {
                        if(PATTERNS.NODESrecordID == TIMECHECKS.NODESrecordID)
                        {
                            if(currentNodePositionInTrip == TIMECHECKS.nodePositionInTrip)
                                break;
                            currentNodePositionInTrip++;
                        }
                        previousNODESrecordID = PATTERNS.NODESrecordID;
                    }
                    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                }
//
//  If we have a "from node" and "to node", save the trip and the actual time
//
                if(previousNODESrecordID == NODESrecordIDs[nI].from)
                {
                    TRIPData[numEntries].TRIPSrecordID = TRIPS.recordID;
                    TRIPData[numEntries].actualTimeOfDay = TIMECHECKS.actualTime;
                    TRIPData[numEntries].nodePositionInTrip = TIMECHECKS.nodePositionInTrip;
                    numEntries++;
                    if(numEntries >= TMSRPT40_MAXNODES)
                        break;
                }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4);
        }
//
//  Sort TRIPData based on actualTime and print out the title
//
        if(numEntries > 0)
        {
            qsort((void *)TRIPData, numEntries, sizeof(TMSRPT40TRIPSDef), TMSRPT40sort_trips);
            sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
            strcat(outputString, "  Trip#    Route  Service  Pattern    At Act    Dist  Spd/Hr\"\r\n");
            WriteFile(hOutputFile, (LPCVOID *)outputString,
                      strlen(outputString), &dwBytesWritten, NULL);
        }
//
//  Cycle through the saved entries
//
        for(nJ = 0; nJ < numEntries; nJ++)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
//
//  Get the trip and generate it
//
            TRIPSKey0.recordID = TRIPData[nJ].TRIPSrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            if(rcode2 != 0)
                continue;
            sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
            sprintf(outputStringRaw, "%s\t%s\t", fromNodeName, toNodeName);
//
//  Trip number
//
            sprintf(tempString, "  %5ld ", TRIPS.tripNumber);
            strcat(outputString, tempString);
//
//  Route
//
            ROUTESKey0.recordID = TRIPS.ROUTESrecordID;
            btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
            strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(szarString, ROUTES_NUMBER_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
            DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TRIPS.directionIndex];
            btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
            strncpy(szarString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
            trim(szarString, DIRECTIONS_ABBRNAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  Service
//
            SERVICESKey0.recordID = TRIPS.SERVICESrecordID;
            btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
            strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(szarString, SERVICES_NAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  Pattern
//
            PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID;
            btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
            strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
            trim(szarString, PATTERNNAMES_NAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  At time
//
            sprintf(tempString, "%s ", Tchar(TRIPData[nJ].actualTimeOfDay));
            strcat(outputString, tempString);
            sprintf(tempString, "%ld\t", TRIPData[nJ].actualTimeOfDay);
            strcat(outputStringRaw, tempString);
//
//  Actual running time
//
//  Pass 1 - find the companion normally (nodeposition = 0) or if a pair repeats
//
            actualTime = NO_TIME;
            TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
            while(rcode2 == 0)
            {
                if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from  &&
                        TIMECHECKS.nodePositionInTrip == TRIPData[nJ].nodePositionInTrip)
                {
                    actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime;
                    break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID)
                    break;
            }
//
//  Pass 2 - find the companion when you have the same start and end node
//
            if(actualTime == NO_TIME)
            {
                TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID;
                rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                while(rcode2 == 0)
                {
                    if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from)
                    {
                        actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime;
                        break;
                    }
                    rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                    if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID)
                        break;
                }
            }
            if(actualTime == NO_TIME)
            {
                strcpy(tempString, "    ");
                actualTime = 0;
            }
            else
            {
                sprintf(tempString, "%3d ", actualTime / 60);
            }
            strcat(outputString, tempString);
            arrivalTime = TRIPData[nJ].actualTimeOfDay + actualTime;
            sprintf(tempString, "%ld\r\n", arrivalTime);
            strcat(outputStringRaw, tempString);
//
//  Distance
//
            distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]);
            sprintf(tempString, "%7.2f ", distance);
            strcat(outputString, tempString);
//
//  Speed per hour
//
            if(actualTime == 0 || actualTime == NO_TIME)
                strcpy(tempString, "-------");
            else
                sprintf(tempString, "%7.2f", distance / ((double)actualTime / 3600));
            strcat(outputString, tempString);
//
//  Write it out
//
            strcat(outputString, "\"\r\n");
            WriteFile(hOutputFile, (LPCVOID *)outputString,
                      strlen(outputString), &dwBytesWritten, NULL);
            WriteFile(hOutputFileRaw, (LPCVOID *)outputStringRaw,
                      strlen(outputStringRaw), &dwBytesWritten, NULL);
        }
        sprintf(outputString, "%d\t%s\t%s\t\"  Total entries: %d\"\r\n",
                seqNum++, fromNodeName, toNodeName, numEntries);
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
    }  // nI
    bKeepGoing = TRUE;
//
//  Free allocated memory
//
deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    CloseHandle(hOutputFile);
    CloseHandle(hOutputFileRaw);
    StatusBarEnd();
    if(!bKeepGoing)
    {
        return(FALSE);
    }
//
//  All done
//
    return(TRUE);
}
예제 #18
0
파일: TMSRpt31.c 프로젝트: ems/TMS
BOOL FAR TMSRPT31(TMSRPTPassedDataDef *pPassedData)
{
  REPORTPARMSDef REPORTPARMS;
  HANDLE hOutputFile;
  double distance;
  double longitude;
  double prevLongitude;
  double latitude;
  double prevLatitude;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  char  routeNumber[ROUTES_NUMBER_LENGTH + 1];
  char  routeName[ROUTES_NAME_LENGTH + 1];
  char  serviceName[SERVICES_NAME_LENGTH + 1];
  char  directionName[DIRECTIONS_LONGNAME_LENGTH + 1];
  char  patternName[PATTERNNAMES_NAME_LENGTH + 1];
  char  nodeName[NODES_ABBRNAME_LENGTH + 1];
  char  intersection[NODES_INTERSECTION_LENGTH + 1];
  char  *ptr;
  BYTE  recordBody[512];
  long  statbarTotal;
  long  prevPattern;
  long  prevNode;
  int   nI;
  int   nJ;
  int   nK;
  int   rcode2;
  int   recordBodyLength;
  short int sequenceNumber;
  short int rowNumber;
  short int colNumber;
  short int previousRow;

  pPassedData->nReportNumber = 30;
  pPassedData->numDataFiles = 1;
//
//  See what he wants
//
  REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
  REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
  REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
  REPORTPARMS.COMMENTSrecordID = NO_RECORD;
  REPORTPARMS.pRouteList = NULL;
  REPORTPARMS.pServiceList = NULL;
  REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS;
  bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
        hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
  if(!bRC)
    return(FALSE);
//
//  Check the list of routes and services
//
  if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
    goto deallocate;
//
//  Open the output file
//
  strcpy(tempString, szDatabaseFileName);
  if((ptr = strrchr(tempString, '\\')) != NULL)
    *ptr = '\0';
  strcat(tempString, "\\TMSRPT31.XLS");
  hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hOutputFile == INVALID_HANDLE_VALUE)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Write out the header for the Excel file
//
  recordBody[0] = 0x02;
  recordBody[1] = 0x00;
  recordBody[2] = 0x10;
  recordBody[3] = 0x00;
  WriteExcel(EXCEL_BOF, hOutputFile, recordBody, 4);
//
//  Loop through the routes
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
  statbarTotal = REPORTPARMS.numRoutes * REPORTPARMS.numServices;
  rowNumber = 0;
  for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      goto deallocate;
    }
    ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
    rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
    if(rcode2 != 0)
      continue;
    strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(routeNumber, ROUTES_NUMBER_LENGTH);
    strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
    trim(routeName, ROUTES_NAME_LENGTH);
//
//  Loop through the services
//
    for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
    {
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
      SERVICESKey0.recordID = REPORTPARMS.pServiceList[nJ];
      rcode2 = btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      if(rcode2 != 0)
        continue;
      strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(serviceName, SERVICES_NAME_LENGTH);
      LoadString(hInst, TEXT_118, szFormatString, sizeof(szFormatString));
      strcpy(szarString, routeNumber);
      strcat(szarString, " - ");
      strcat(szarString, routeName);
      sprintf(tempString, szFormatString, szarString, serviceName);
      StatusBarText(tempString);
      StatusBar((long)(nI * REPORTPARMS.numServices + nJ), (long)statbarTotal);
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
//
//  Loop through the directions
//
      for(nK = 0; nK < 2; nK++)
      {
        if(StatusBarAbort())
        {
          bKeepGoing = FALSE;
          goto deallocate;
        }
        if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
          continue;
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nK];
        rcode2 = btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        if(rcode2 != 0)
          continue;
        strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
        trim(directionName, DIRECTIONS_LONGNAME_LENGTH);
//
//  Get the base pattern nodes
//
        PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
        PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
        PATTERNSKey2.directionIndex = nK;
        PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
        PATTERNSKey2.nodeSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        prevPattern = NO_RECORD;
        while(rcode2 == 0 &&
              PATTERNS.ROUTESrecordID == ROUTES.recordID &&
              PATTERNS.SERVICESrecordID == SERVICES.recordID &&
              PATTERNS.directionIndex == nK)
        {
//
//  Determine a change in pattern
//
          if(PATTERNS.PATTERNNAMESrecordID != prevPattern)
          {
            prevNode = NO_RECORD;
            prevPattern = PATTERNS.PATTERNNAMESrecordID;
            sequenceNumber = 1;
          }
//
//  Start outputting the data
//
//  Route number
//
          colNumber = 0;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, routeNumber, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Route name
//
          colNumber = 1;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, routeName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Service name
//
          colNumber = 2;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, serviceName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);

//  Direction name
//
          colNumber = 3;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, directionName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Pattern name
//
          PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID;
          btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
          strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
          trim(patternName, PATTERNNAMES_NAME_LENGTH);
          colNumber = 4;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, patternName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Sequence number
//
          colNumber = 5;
          recordBodyLength =
                SetRecordBodyForShortInteger(&rowNumber, &colNumber, &sequenceNumber, recordBody);
          WriteExcel(EXCEL_INTEGER, hOutputFile, recordBody, recordBodyLength);
          sequenceNumber++;
//
//  Node abbreviation
//
          NODESKey0.recordID = PATTERNS.NODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(nodeName, NODES_ABBRNAME_LENGTH);
          colNumber = 6;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, nodeName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Node intersection
//
          strncpy(intersection, NODES.intersection, NODES_INTERSECTION_LENGTH);
          trim(intersection, NODES_INTERSECTION_LENGTH);
          colNumber = 7;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, intersection, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Latitude
//
          latitude = NODES.latitude;
          colNumber = 8;
          recordBodyLength =
                SetRecordBodyForDouble(&rowNumber, &colNumber, &latitude, recordBody);
          WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
//
//  Longitude
//
          longitude = NODES.longitude;
          colNumber = 9;
          recordBodyLength =
                SetRecordBodyForDouble(&rowNumber, &colNumber, &longitude, recordBody);
          WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
//
//  Distance to next node
//

          if(prevNode != NO_RECORD)
          {
            distance = GreatCircleDistance(prevLongitude, prevLatitude, longitude, latitude);
            colNumber = 10;
            previousRow = rowNumber - 1;
            recordBodyLength =
                  SetRecordBodyForDouble(&previousRow, &colNumber, &distance, recordBody);
            WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
          }
          prevNode = NODES.recordID;
          prevLatitude = latitude;
          prevLongitude = longitude;
//
//  Bump up the row and get the next node in the BASE pattern
//
          rowNumber++;
          rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        }  // while
      }  // nK
    }  // nJ
  }  // nI
//
//  Write out the EOF marker for the Excel file
//
  WriteExcel(EXCEL_EOF, hOutputFile, NULL, NO_RECORD);
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    CloseHandle(hOutputFile);
    StatusBarEnd();
    if(!bKeepGoing)
    {
      return(FALSE);
    }
//
//  All done
//
//  Let him know
//
  strcpy(tempString, "TMSRPT31.xls was written to:\n");
  strcpy(szarString, szDatabaseFileName);
  if((ptr = strrchr(szarString, '\\')) != NULL)
  {
    *ptr = '\0';
  }
  strcat(tempString, szarString);
  MessageBox(hWndMain, tempString, TMS, MB_OK);
  return(TRUE);
}
예제 #19
0
파일: TMSRPT60.c 프로젝트: ems/TMS
//
//  Discipline Report
//
//  From QETXT.INI:
//
//    [TMSRPT60]
//    FILE=TMSRPT60.txt
//    FLN=0
//    TT=Tab
//    Charset=ANSI
//    DS=.
//    FIELD1=Date,VARCHAR,32,0,32,0,
//    FIELD2=Time,VARCHAR,32,0,32,0,
//    FIELD3=Sequence,NUMERIC,8,0,8,0,
//    FIELD4=Operator,VARCHAR,32,0,32,0,
//    FIELD5=Text,VARCHAR,256,0,256,0,
//
BOOL FAR TMSRPT60(TMSRPTPassedDataDef *pPassedData)
{
  DISCIPLINEFILTERSELECTIONSDef DisciplineSelections;
  HANDLE hOutputFile = NULL;
  DWORD  dwBytesWritten;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  char  outputString[512];
  char  szDriver[DRIVERS_LASTNAME_LENGTH + 2 + DRIVERS_FIRSTNAME_LENGTH + 1];
  long  year, month, day;
  long  DRIVERSrecordID;
  long  seq;
  long  category;
  long  type;
  long  action;
  int   rcode2;
  int   nI;

  pPassedData->nReportNumber = 59;
  pPassedData->numDataFiles = 1;
  DRIVERSrecordID = pPassedData->DRIVERSrecordID;
//
//  See what's to be filtered
//
  bRC = DisciplineFilter(&DisciplineSelections);

  if(bRC != IDOK)
  {
    goto deallocate;
  }
//
//  Open the output file
//
  strcpy(tempString, szReportsTempFolder);
  strcat(tempString, "\\TMSRPT60.txt");
  hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hOutputFile == INVALID_HANDLE_VALUE)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  StatusBarStart(hWndMain, "Processing selections...");
  StatusBar(-1L, -1L);
  bKeepGoing = TRUE;
//
//  Set up the driver
//
  DRIVERSKey0.recordID = DRIVERSrecordID;
  btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
  strncpy(tempString, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH);
  trim(tempString, DRIVERS_LASTNAME_LENGTH);
  strcpy(szDriver, tempString);
  strcat(szDriver, ", ");
  strncpy(tempString, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH);
  trim(tempString, DRIVERS_FIRSTNAME_LENGTH);
  strcat(szDriver, tempString);
//
//  Set up the flags for retrieval
//
  DISCIPLINEKey1.DRIVERSrecordID = DRIVERSrecordID;
  DISCIPLINEKey1.dateOfOffense = DisciplineSelections.fromDate;
  DISCIPLINEKey1.timeOfOffense = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_DISCIPLINE, &DISCIPLINE, &DISCIPLINEKey1, 1);
  seq = 0;
  while(rcode2 == 0 &&
        DISCIPLINE.DRIVERSrecordID == DRIVERSrecordID)
  {
    if(DISCIPLINE.dateOfOffense > DisciplineSelections.toDate)
    {
      break;
    }
    category = DISCIPLINE.violationCategory;
    type = DISCIPLINE.violationType;
    action = DISCIPLINE.actionTaken;
//
//  Category
//
    if(category != NO_RECORD)
    {
      GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
      sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
      strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
      strcat(outputString, "\t");
      sprintf(tempString, "%ld\t", seq++);
      strcat(outputString, tempString);
      strcat(outputString, szDriver);
      strcat(outputString, "\tCategory: ");
      strcat(outputString, m_ViolationCategories[category]);
      strcat(outputString, "\r\n");
      WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
    }
//
//  Type
//
    if(category != NO_RECORD && type != NO_RECORD)
    {
      GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
      sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
      strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
      strcat(outputString, "\t");
      sprintf(tempString, "%ld\t", seq++);
      strcat(outputString, tempString);
      strcat(outputString, szDriver);
      strcat(outputString, "\t    Type: ");
      strcat(outputString, m_Violations[category][type].text);
      strcat(outputString, "\r\n");
      WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
//
//  Action
//
      sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
      strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
      strcat(outputString, "\t");
      sprintf(tempString, "%ld\t", seq++);
      strcat(outputString, tempString);
      strcat(outputString, szDriver);
      strcat(outputString, "\t  Action: ");
      if(action == NO_RECORD)
      {
        strcat(outputString, " None taken.");
      }
      else
      {
        strcat(outputString, m_ViolationActions[action]);
      }
      strcat(outputString, "\r\n");
      WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
    }
//
//  Comments
//
    GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
    sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
    strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
    strcat(outputString, "\t");
    sprintf(tempString, "%ld\t", seq++);
    strcat(outputString, tempString);
    strcat(outputString, szDriver);
    strcat(outputString, "\t   Notes: ");
    strncpy(tempString, DISCIPLINE.comments, DISCIPLINE_COMMENTS_LENGTH);
    trim(tempString, DISCIPLINE_COMMENTS_LENGTH);
    for(nI = 0; nI < (int)strlen(tempString); nI++)
    {
      if(tempString[nI] == 13)
      {
        tempString[nI    ] = ' ';
        tempString[nI + 1] = ' ';
        break;
      }
    }
    strcat(outputString, tempString);
    strcat(outputString, "\r\n");
    WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
//
//  Suspended
//
    if(DISCIPLINE.suspensionDate > 0)
    {
//
//  Date, time, sequence, driver
//
      GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
      sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
      strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
      strcat(outputString, "\t");
      sprintf(tempString, "%ld\t", seq++);
      strcat(outputString, tempString);
      strcat(outputString, szDriver);
      strcat(outputString, "\t");
      GetYMD(DISCIPLINE.suspensionDate, &year, &month, &day);
      sprintf(tempString, "Suspension date: %02ld-%s-%04ld", day, szMonth[month - 1], year);
      strcat(outputString, tempString);
      strcat(outputString, "\r\n");
      WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
      sprintf(tempString, "Suspension duration: %5.2f", DISCIPLINE.suspensionDuration);
      GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
      sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
      strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
      strcat(outputString, "\t");
      sprintf(tempString, "%ld\t", seq++);
      strcat(outputString, tempString);
      strcat(outputString, szDriver);
      strcat(outputString, "\t");
      sprintf(tempString, "Suspension duration: %5.2f\r\n", DISCIPLINE.suspensionDuration);
      strcat(outputString, tempString);
      WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
    }
//
//  Dropoff date
//
    GetYMD(DISCIPLINE.dateOfOffense, &year, &month, &day);
    sprintf(outputString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
    strcat(outputString, Tchar(DISCIPLINE.timeOfOffense));
    strcat(outputString, "\t");
    sprintf(tempString, "%ld\t", seq++);
    strcat(outputString, tempString);
    strcat(outputString, szDriver);
    strcat(outputString, "\t Dropoff: ");
    GetYMD(DISCIPLINE.dropoffDate, &year, &month, &day);
    sprintf(tempString, "%02ld-%s-%04ld\t", day, szMonth[month - 1], year);
    strcat(outputString, tempString);
    strcat(outputString, "\r\n");
    WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL);
//
//  Get the next record
//
    rcode2 = btrieve(B_GETNEXT, TMS_DISCIPLINE, &DISCIPLINE, &DISCIPLINEKey1, 1);
  }
//
//  Free allocated memory
//
  deallocate:
    StatusBarEnd();
    if(hOutputFile != NULL)
    {
      CloseHandle(hOutputFile);
    }
    SetCursor(hCursorArrow);

  return(bKeepGoing);
}