Files

3048 lines
82 KiB
C++
Raw Permalink Blame History

// sp.cpp : Defines the class behaviors for the application.
//
//memory leak debugging help
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
//_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//#define _CRTDBG_MAP_ALLOC
//=====================
#include "stdafx.h"
#include "sp.h"
#include "afxpriv.h"
#include "MainFrm.h"
#include "spDoc.h"
#include "spView.h"
#include "logindlg.h"
#include "nullform.h"
#include "UserPrefsDlg.h"
#include "rpts.h"
#include "dbutils.h"
#include "srch.h"
#include "stat.h"
#include "snr.h"
#include "LoanersDlg.h"
#include "ArasClientRequests.h"
#include "zonesdlg.h"
#include "clientsdlg.h"
#include "GroupsDlg.h"
#include "UsersDlg.h"
#include "simplewodlg.h"
#include "nonclientsdlg.h"
#include "projectsdlg.h"
#include "modelsdlg.h"
#include "mailreaderdlg.h"
#include "UnitsDlg.h"
#include "PartsDlg.h"
#include "dlgtasks.h"
#include "contactdlg.h"
#include "WOHeaderDlg.h"
#include "WOTypesDlg.h"
#include "RatesDlg.h"
#include "RptSetDlg.h"
#include "PMCheckDlg.h"
#include "TED.H" //<---for displaying info while developing
#include "schedulefrm.h"
#include "SchedGrps.h"
#include "DlgSchedMarkers.h"
#include "probstatdlg.h"
#include "ayasysinfo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSpApp
BEGIN_MESSAGE_MAP(CSpApp, CWinApp)
//{{AFX_MSG_MAP(CSpApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_VIEW_WORKORDERS, OnViewWorkorders)
ON_COMMAND(ID_EXIT, OnExit)
ON_COMMAND(ID_OPTIONS_REPORTS, OnOptionsReports)
ON_COMMAND(ID_OPTIONS_EDIT_CLIENTS, OnOptionsEditClients)
ON_COMMAND(ID_OPTIONS_EDIT_ZONES, OnOptionsEditZones)
ON_COMMAND(ID_OPTIONS_EDIT_USERS, OnOptionsEditUsers)
ON_COMMAND(ID_OPTIONS_EDIT_TASKS, OnOptionsEditTasks)
ON_COMMAND(ID_OPTIONS_EDIT_UNITS, OnOptionsEditUnits)
ON_COMMAND(ID_OPTIONS_EDIT_UNITMODELS, OnOptionsEditUnitmodels)
ON_COMMAND(ID_OPTIONS_EDIT_PARTS, OnOptionsEditParts)
ON_COMMAND(ID_OPTIONS_EDIT_PROJECTS, OnOptionsEditProjects)
ON_COMMAND(ID_TOOLS_SECURITY, OnToolsSecurity)
ON_COMMAND(ID_OPTIONS_EDIT_ADDRESSBOOK_COURIERSSHIPPERS, OnOptionsEditAddressbookCouriersshippers)
ON_COMMAND(ID_VIEW_MAIL, OnViewMail)
ON_COMMAND(ID_OPTIONS_EDIT_RATES, OnOptionsEditRates)
ON_COMMAND(ID_OPTIONS_EDIT_ADDRESSBOOK_MANUFACTURERSSUPPLIERS, OnOptionsEditAddressbookManufacturerssuppliers)
ON_COMMAND(ID_OPTIONS_EDIT_ADDRESSBOOK_RESELLERSCOMPETITORS, OnOptionsEditAddressbookResellerscompetitors)
ON_COMMAND(ID_OPTIONS_EDIT_ADDRESSBOOK_SUBCONTRACTORS, OnOptionsEditAddressbookSubcontractors)
ON_COMMAND(ID_OPTIONS_EDIT_WORKORDERTYPES, OnOptionsEditWorkordertypes)
ON_COMMAND(ID_HELP_EMAILTECHSUPPORT, OnHelpEmailtechsupport)
ON_COMMAND(ID_HELP_SUGGESTIONS, OnHelpSuggestions)
ON_COMMAND(ID_HELP_VISITOURWEBSITE, OnHelpVisitourwebsite)
ON_COMMAND(ID_SEARCH, OnSearch)
ON_COMMAND(ID_VIEW_DATABASE, OnViewDatabase)
ON_COMMAND(ID_VIEW_SHIPPINGRECEIVING, OnViewShippingreceiving)
ON_COMMAND(ID_FILE_LOANERSRENTALS, OnFileLoanersrentals)
ON_COMMAND(ID_FILE_PMCHECK, OnFilePmcheck)
ON_COMMAND(ID_REPORTS, OnReports)
ON_COMMAND(ID_OPTIONS_USER, OnOptionsUser)
ON_COMMAND(ID_VISUAL_SCHEDULE, OnVisualSchedule)
ON_COMMAND(ID_HELP_PURCHASE, OnHelpPurchase)
ON_COMMAND(ID_OPTIONS_EDIT_SCHEDGRPS, OnOptionsEditSchedgrps)
ON_COMMAND(ID_OPTIONS_EDIT_SCHEDMARKERS, OnOptionsEditSchedmarkers)
ON_COMMAND(ID_VIEW_ARAS_SERVICE_REQUESTS, OnViewArasServiceRequests)
ON_COMMAND(ID_CONTEXT_HELP, DoHelp)
ON_COMMAND(ID_HELP_MANUAL, OnHelpManual)
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
ON_COMMAND(ID_NC_ADDRESS, OnNcAddress)
ON_COMMAND(ID_NC_ADDRESS2, OnNcAddress2)
ON_COMMAND(ID_NC_ADDRESS3, OnNcAddress3)
ON_COMMAND(ID_NC_ADDRESS4, OnNcAddress4)
ON_COMMAND(ID_ACCELERATOR_CLIENTS, OnAcceleratorClients)
ON_COMMAND(ID_ACCELERATOR_CATEGORIES, OnAcceleratorCategories)
ON_COMMAND(ID_ACCELERATOR_EXIT, OnAcceleratorExit)
ON_COMMAND(ID_ACCELERATOR_MODELS, OnAcceleratorModels)
ON_COMMAND(ID_ACCELERATOR_PARTS, OnAcceleratorParts)
ON_COMMAND(ID_ACCELERATOR_PROJECTS, OnAcceleratorProjects)
ON_COMMAND(ID_ACCELERATOR_RATES, OnAcceleratorRates)
ON_COMMAND(ID_ACCELERATOR_SCHEDULE_GROUPS, OnAcceleratorScheduleGroups)
ON_COMMAND(ID_ACCELERATOR_SCHEDULE_MARKERS, OnAcceleratorScheduleMarkers)
ON_COMMAND(ID_ACCELERATOR_TASKS, OnAcceleratorTasks)
ON_COMMAND(ID_ACCELERATOR_UNITS, OnAcceleratorUnits)
ON_COMMAND(ID_ACCELERATOR_ZONES, OnAcceleratorZones)
ON_COMMAND(ID_ACCELERATOR_STATUS, OnAcceleratorStatus)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSpApp construction
CSpApp::CSpApp()
: m_bDefShowHGridOnMainScreen(false)
{
// Place all significant initialization in InitInstance
m_lusrID=0;
m_lRegLicCount=-1;//ANYTHING
m_strRegCompany="";
m_bTech=false;
m_lDefNewWOStatus=0;
m_lDefClosedWOStatus=0;
m_lDefReOpenWOStatus=0;
m_bUseTransactions=false;
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CSpApp object
CSpApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CSpApp initialization
BOOL CSpApp::InitInstance()
{
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_SCHEDULEFRM_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(CScheduleFrm)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_NULLFORM_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(CNullForm)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_SNR_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(CSnR)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_DBUTILS_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(CDBUtils)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_SRCH_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(SRCH)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_STAT_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(STAT)); // view class
AddDocTemplate(pNewDocTemplate);
}
{ // BLOCK: doc template registration
// Register the document template. Document templates serve
// as the connection between documents, frame windows and views.
// Attach this form to another document or frame window by changing
// the document or frame class in the constructor below.
CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
IDR_RPTS_TMPL,
RUNTIME_CLASS(CSpDoc), // document class
RUNTIME_CLASS(CMainFrame), // frame class
RUNTIME_CLASS(RPTS)); // view class
AddDocTemplate(pNewDocTemplate);
}
AfxInitRichEdit( );
AfxOleInit();
AfxEnableControlContainer();
// initialise the RDC object variables to NULL
m_Report = NULL;
pSections = NULL;
pSection = NULL;
pRepObjects = NULL;
pRepObject = NULL;
pApplication = NULL;
InitializeRDC();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
//#ifdef _AFXDLL
// Enable3dControls(); // Call this when using MFC in a shared DLL
//#else
// Enable3dControlsStatic(); // Call this when linking to MFC statically
//#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
//SetRegistryKey(_T("Ground Zero Tech-Works"));
//LoadStdProfileSettings(0); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSpDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CSpView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo,dummy;
//ParseCommandLine(cmdInfo);
//added 07/26/2001 for hyperlinks
hcHand=LoadCursor(IDC_GZHAND);
if(!VerifyData()) return false;
CLoginDlg d;
if(d.DoModal()==IDCANCEL)
{
//rsPool->Empty();
//delete rsPool;
return false;
}
//added 08/03/2001 to stop errors
//just before an update
rsPool->SupressErrors(true);
//DISPLAY STARTUP SCREEN....
m_pDlgStartUp=new CDlgStartUp;
m_pDlgStartUp->Create(IDD_DLGSTARTUP);
m_pDlgStartUp->ShowWindow(SW_SHOW);
m_pDlgStartUp->m_pc.SetPos(0);
m_pDlgStartUp->UpdateWindow();
m_nCmdShow=SW_HIDE;
// Dispatch commands specified on the command line
if (!ProcessShellCommand(dummy))//<-causing flicker
return FALSE;
//ProcessShellCommand(dummy);//<-causing flicker
//m_pMainWnd->ShowWindow(SW_HIDE);//SW_SHOWMAXIMIZED);
/*** Begin modification of default InitInstance ***/
m_nCurView = 0; // Save index of the currently active view class
// Keep array of views as member of WinApp
CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView();
m_pViews[0] = pActiveView; //default view
m_pDlgStartUp->m_pc.SetPos(1);
m_pDlgStartUp->UpdateWindow();
m_pViews[1] = (CView*) new RPTS;
m_pDlgStartUp->m_pc.SetPos(2);
m_pDlgStartUp->UpdateWindow();
m_pViews[2] = (CView*) new STAT;
m_pDlgStartUp->m_pc.SetPos(3);
m_pDlgStartUp->UpdateWindow();
m_pViews[3] = (CView*) new SRCH;
m_pDlgStartUp->m_pc.SetPos(4);
m_pDlgStartUp->UpdateWindow();
m_pViews[4] = (CView*) new CDBUtils;
m_pDlgStartUp->m_pc.SetPos(5);
m_pDlgStartUp->UpdateWindow();
m_pViews[5] = (CView*) new CSnR;
m_pDlgStartUp->m_pc.SetPos(6);
m_pDlgStartUp->UpdateWindow();
m_pViews[6] = (CView*) new CNullForm;
m_pDlgStartUp->m_pc.SetPos(7);
m_pDlgStartUp->UpdateWindow();
m_pViews[7] = (CView*) new CScheduleFrm;
//and 3 and 4 and 5 and 6 etc etc etc
m_pDlgStartUp->m_pc.SetPos(8);
m_pDlgStartUp->UpdateWindow();
CDocument* pCurrentDoc =
((CFrameWnd*) m_pMainWnd)->GetActiveDocument();
// Initialize a CCreateContext to point to the active document.
// With this context, the new view is added to the document
// when the view is created in CView::OnCreate().
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext.m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;
//default window size, gets resized later.
CRect rect(0, 0, 0, 0);
m_pDlgStartUp->m_pc.SetPos(9);
m_pDlgStartUp->UpdateWindow();
//iterate through each additional form,
//making sure to start at 1 to exclude the default view
//which has all the initialization done automatically.
for ( int nView=1; nView<NUMVIEWS; nView++ )
{
// Create the new views. In this example, the view persists for
// the life of the application. The application automatically
// deletes the view when the application is closed.
#ifdef _WTF_
strWTF.Format("**************\r\nArea 43.1 Creating view number:%i\r\n************",nView);
AfxMessageBox(strWTF);
#endif
m_pViews[nView]->Create(NULL, NULL,
(AFX_WS_DEFAULT_VIEW & ~WS_VISIBLE),
rect, m_pMainWnd,
AFX_IDW_PANE_FIRST + nView, &newContext);
//initialize each *extra* view
m_pViews[nView]->OnInitialUpdate();
m_pDlgStartUp->m_pc.SetPos(9+nView);
m_pDlgStartUp->UpdateWindow();
}
/*** End modification of default InitInstance ***/
// The one and only window has been initialized, so show and update it.
m_pMainWnd->UpdateWindow();
if(VerifyDatabaseVersion()==false)
{
//added 08/03/2001 to stop errors
//just before an update
rsPool->SupressErrors(false);
//CLOSE STARTUP WINDOW
m_pDlgStartUp->DestroyWindow();
m_bBadDatabaseVersion=true;
SwitchView(4);
}
else
{
//added 08/03/2001 to stop errors
//just before an update
rsPool->SupressErrors(false);
m_bBadDatabaseVersion=false;
SwitchView(4);
if(Allowed(RSTAT,true)!=0)
SwitchView(2);
else
SwitchView(6);
m_pDlgStartUp->m_pc.SetPos(18);
m_pDlgStartUp->UpdateWindow();
}
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
//CLOSE STARTUP WINDOW
m_pDlgStartUp->DestroyWindow();
Test();
return TRUE;
}
CView* CSpApp::SwitchView( UINT nIndex )
{
ASSERT( nIndex >=0 && nIndex < NUMVIEWS );
int nSecure;
CView* pNewView = m_pViews[nIndex];
CView* pActiveView =
((CFrameWnd*) m_pMainWnd)->GetActiveView();
if ( !pActiveView ) // No currently active view
return NULL;
if ( pNewView == pActiveView ) // Already there
return pActiveView;
switch(nIndex) {
case 1:
nSecure=Allowed(RREPORTS,true);
if(nSecure==0 || nSecure==2)
{
SecurityWarning();
return pActiveView;
}
break;
case 3://search
if(Allowed(RSEARCH,false)==0)
{
SecurityWarning();
return pActiveView;
}
break;
case 4:
//v1.9.3.0 commented out as the menu security handles this now
//and it was preventing the bootscan from being called when a user
//logs in that doesn't have rights to the dbutils screen so
//PM processing was not getting done in some cases.
//if(Allowed(RDBUTIL,false)==0)
//{
// //SecurityWarning();
// return pActiveView;
//}
break;
case 5:
if(Allowed(RSNR,false)==0)
{
SecurityWarning();
return pActiveView;
}
break;
case 6:
if(Allowed(RSCHEDULE,false)==0)
{
SecurityWarning();
return pActiveView;
}
break;
}
ProcessActiveViewClose();
m_nCurView = nIndex; // Store the new current view's index
// exchange view window ID's so RecalcLayout() works
UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
::SetWindowLong(pActiveView->m_hWnd, GWL_ID,
::GetWindowLong(pNewView->m_hWnd, GWL_ID));
::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
// Display and update the new current view - hide the old one
pActiveView->ShowWindow(SW_HIDE);
pNewView->ShowWindow(SW_SHOW);
((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
((CFrameWnd*) m_pMainWnd)->RecalcLayout();
ProcessActiveViewOpen();
pNewView->Invalidate();
return pActiveView;
}
bool CSpApp::ProcessActiveViewClose()
{
CView* pActiveView =
((CFrameWnd*) m_pMainWnd)->GetActiveView();
if ( !pActiveView )
return TRUE; // No active view TO save data from, so count as success
//check for each kind of view
if ( pActiveView->IsKindOf( RUNTIME_CLASS(STAT) ) )
{
((STAT*)pActiveView)->DeActivate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(RPTS) ) )
{
((RPTS*)pActiveView)->DeActivate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CSnR) ) )
{
((CSnR*)pActiveView)->DeActivate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(SRCH) ) )
{
((SRCH*)pActiveView)->DeActivate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CDBUtils) ) )
{
((CDBUtils*)pActiveView)->DeActivate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CScheduleFrm) ) )
{
((CScheduleFrm*)pActiveView)->DeActivate();
}
//ETC ETC ETC
return true;
}
bool CSpApp::ProcessActiveViewOpen()
{
CView* pActiveView =
((CFrameWnd*) m_pMainWnd)->GetActiveView();
if ( !pActiveView )
return TRUE; // No active view TO save data from, so count as success
if ( pActiveView->IsKindOf( RUNTIME_CLASS(STAT) ) )
{
((STAT*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(RPTS) ) )
{
((RPTS*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CSnR) ) )
{
((CSnR*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(SRCH) ) )
{
((SRCH*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CDBUtils) ) )
{
((CDBUtils*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CSpView) ) )
{
((CSpView*)pActiveView)->Activate();
}
else if ( pActiveView->IsKindOf( RUNTIME_CLASS(CScheduleFrm) ) )
{
((CScheduleFrm*)pActiveView)->Activate();
}
//ETC ETC ETC
return true;
}
void CSpApp::SetMainCaption(CString pCaption)
{
((CFrameWnd*) m_pMainWnd)->SetWindowText(pCaption);
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
#include "modulver.h"
#include "label.h"
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
CSpApp* m_pApp;
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
CStatic m_lblBuild;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
virtual BOOL OnInitDialog();
afx_msg void OnBtnsupportinfo();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
CLabel m_lblEmail;
CLabel m_lblWebSite;
afx_msg void OnStnClickedLblEmailSupport();
afx_msg void OnStnClickedLblSupportSite();
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
DDX_Control(pDX, IDC_LBLBUILD, m_lblBuild);
//}}AFX_DATA_MAP
m_pApp = (CSpApp*)AfxGetApp();
DDX_Control(pDX, IDC_LBL_EMAIL_SUPPORT, m_lblEmail);
DDX_Control(pDX, IDC_LBL_SUPPORT_SITE, m_lblWebSite);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_BN_CLICKED(IDC_BTNSUPPORTINFO, OnBtnsupportinfo)
//}}AFX_MSG_MAP
ON_STN_CLICKED(IDC_LBL_EMAIL_SUPPORT, OnStnClickedLblEmailSupport)
ON_STN_CLICKED(IDC_LBL_SUPPORT_SITE, OnStnClickedLblSupportSite)
END_MESSAGE_MAP()
// App command to run the dialog
void CSpApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CSpApp message handlers
#include "RPTS.h"
#include "STAT.h"
#include "SRCH.h"
#include "DBUtils.h"
#include "SnR.h"
#include "NullForm.h"
#include "ScheduleFrm.h"
#include "afxwin.h"
/*
m_pViews[0] = pActiveView; //default view
m_pViews[1] = (CView*) new RPTS;
m_pViews[2] = (CView*) new STAT;
m_pViews[3] = (CView*) new SRCH;
m_pViews[4] = (CView*) new CDBUtils;
*/
//Print builtin report using user settings if found
void CSpApp::PrintCMReportRDC(CString VirtReportName,_RecordsetPtr m_pRecordSet)
{
CString strLocalError;
CWaitCursor cw;
//Get printer and report settings
GZRset* rs;
rs=rsPool->GetRS("CSpApp::PrintCMReportRDC");
cryp=new GZK;
CString strErr;
CString m_strPORT;
CString m_strDEVICE;
CString m_strDRIVER;
long lPaperOrientation;
long lPaperSize;
long lPaperSource;
long lDuplexType;
_variant_t vtCopies;
vtCopies=(long)1;
CString q,msg,ReportName,str1,str2,strReportVersion;
long lData;
bool Preview,UseDefaults,defaultprinter,bData;
UseDefaults=false;
short copies=1;
//FIND master report name
q.Format("SELECT rptsmaster.filename FROM rptsmaster "
"WHERE (((rptsmaster.virtualname)=\"%s\"));",VirtReportName);
rs->QueryReadOnly(q);
ASSERT(!rs->IsEmpty());
rs->FetchField("filename",&str1);
ReportName=ReportDirectory() + str1;
cw.Restore();
q.Format("SELECT rptsusers.* FROM rptsusers "
"WHERE (((rptsusers.virtualname)=\"%s\") AND "
"((rptsusers.user)=%u));",VirtReportName,m_lusrID);
rs->QueryReadOnly(q);
if(rs->IsEmpty())
{
//DEFAULTS TO USE IF NO USER RECORD
UseDefaults=true;
defaultprinter=true;
Preview=true;
copies=1;
}
else
{
rs->FetchField("defaultprtr",&bData);
if(bData)
defaultprinter=true;
else
{
defaultprinter=false;
//PRINTER SETTINGS
rs->FetchField("porient",&lPaperOrientation);
rs->FetchField("psize",&lPaperSize);
rs->FetchField("psource",&lPaperSource);
rs->FetchField("pduplex",&lDuplexType);
rs->FetchField("port",&m_strPORT);
rs->FetchField("device",&m_strDEVICE);
rs->FetchField("driver",&m_strDRIVER);
}
//CUSTOM REPORT
rs->FetchField("filename",&str1);
if(str1!="na")
ReportName=str1;//already = master default ARRRR!
//COPIES
rs->FetchField("copies",&lData);
vtCopies=lData;
//PREVIEW
rs->FetchField("preview",&bData);
Preview=bData;
}
cw.Restore();
//Output or preview the report
VARIANT vtFalse;
VariantInit(&vtFalse);
vtFalse.vt=VT_BOOL;
vtFalse.boolVal=FALSE;
VARIANT vtTrue;
VariantInit(&vtTrue);
vtTrue.vt=VT_BOOL;
vtTrue.boolVal=TRUE;
//preview report selected
try{//start of try block for reporting (Crystal rdc) stuff
cw.Restore();
strLocalError.Format("open report %s",ReportName);
m_Report = pApplication->OpenReport(_bstr_t(ReportName));
strLocalError="set the data source";
cw.Restore();
m_Report->Database->Tables->GetItem(1)->SetDataSource(_variant_t((IDispatch *)m_pRecordSet,true));
//Set the OLE object (logo) source
/*ISectionsPtr Sections;
ISectionPtr Section;
IReportObjectsPtr Objects;
Sections=m_Report->Sections();
Section=Sections->GetItem(0);
Objects=Section->ReportObjects();*/
//set custom report settings if any
if(defaultprinter==false)
{
cw.Restore();
strLocalError="Set custom printer settings";
if(!m_strDEVICE.IsEmpty())//not the default printer?
m_Report->SelectPrinter(_bstr_t(m_strDRIVER),_bstr_t(m_strDEVICE),_bstr_t(m_strPORT));
m_Report->PutPaperOrientation((CRPaperOrientation)lPaperOrientation);
m_Report->PutPaperSize((CRPaperSize)lPaperSize);
m_Report->PutPaperSource((CRPaperSource)lPaperSource);
m_Report->PutPrinterDuplex((CRPrinterDuplexType)lDuplexType);
}
if(Preview)
{
cw.Restore();
strLocalError="preview the report onscreen";
CReportViewerDlg d;
d.m_Report=m_Report;
if(d.DoModal()==-1)
{
strLocalError="Preview the report onscreen";
}
}
else
m_Report->PrintOut(vtFalse,vtCopies);
}//end try block for report (Crystal rdc) stuff
catch(_com_error& e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("*************************************************\n");
TRACE("Exception thrown for classes generated by #import\n");
TRACE("\tCode = %081x\n", e.Error);
TRACE("\tCode Meaning = %s\n", e.ErrorMessage());
TRACE("\tSource = %s\n", (LPCTSTR) bstrSource);
TRACE("Description = %s\n", (LPCTSTR) bstrDescription);
TRACE("*************************************************\n");
strErr.Format(
"Printing error: AyaNova asked the Crystal Reports RDC printing engine\r\n"
"to print your report, but the RDC returned the following error instead:\r\n\r\n"
"Code = %x\r\n"
"Code Meaning = %s\r\n"
"Source = %s\r\n"
"Description = %s\r\n\r\n"
"This error came at the point where AyaNova had just asked the RDC to\r\n"
"%s.\r\n\r\n\r\n"
"See the \"Errors and problems printing\" page on our web site at:\r\n"
"http://www.ayanova.com/faq_technical.htm\r\n"
"to resolve this problem.\r\n\r\n"
"(It is recommended that you copy this error message and save it to a text file\r\n"
"in case you need to send this error message to AyaNova technical support.)\r\n",
e.Error,e.ErrorMessage(),(LPCTSTR) bstrSource,(LPCTSTR) bstrDescription,strLocalError);
ShowStuff(strErr);
//HandleComError(e,strLocalError);
}
}
//
////Print builtin report using user settings if found
//void CSpApp::PrintCMReport(CString VirtReportName,_RecordsetPtr m_pRecordSet)
//{
// PrintCMReportRDC(VirtReportName,m_pRecordSet);
// return;
// //TODO Verify printer before selecting!!!!
// //rs=new GZRset("Error: Report settings screen ");
// //rs->SetConnect(strConnectString);
// //m_pRecordSet->GetActiveConnection();
// GZRset* rs;
// rs=rsPool->GetRS("CSpApp::PrintCMReport");
// cryp=new GZK;
//
// CString m_strDEVMODE;
// CString m_strPORT;
// CString m_strDEVICE;
// CString m_strDRIVER;
// long m_lDevModeSize;
// short pJob;
// int bResult;
// int nEngineVer=0,nDllVer=0;
// CString q,msg,ReportName,str1,str2,strReportVersion;
// long lData;
// bool Preview,UseDefaults,defaultprinter,bData;
// UseDefaults=false;
// short copies=1;
// LPDEVMODE dm;
// dm=new DEVMODE;
// //FIND master report name
// q.Format("SELECT rptsmaster.filename FROM rptsmaster "
// "WHERE (((rptsmaster.virtualname)=\"%s\"));",VirtReportName);
// rs->QueryReadOnly(q);
// ASSERT(!rs->IsEmpty());
// rs->FetchField("filename",&str1);
// ReportName=ReportDirectory() + str1;
//
// q.Format("SELECT rptsusers.* FROM rptsusers "
// "WHERE (((rptsusers.virtualname)=\"%s\") AND "
// "((rptsusers.user)=%u));",VirtReportName,m_lusrID);
// rs->QueryReadOnly(q);
// if(rs->IsEmpty())
// {
// //DEFAULTS TO USE IF NO USER RECORD
// UseDefaults=true;
// defaultprinter=true;
// Preview=true;
// copies=1;
//
// }
// else//<<~~~~~~~~~~~~~~~~~~~~BUG BUG BUG
// //if user has printer set to default why is this
// //executing?? And later asserting...
// {
// rs->FetchField("defaultprtr",&bData);
// if(bData)
// defaultprinter=true;
// else
// {
// defaultprinter=false;
// //PRINTER SETTINGS
// rs->FetchField("devmode",&m_strDEVMODE);
// rs->FetchField("port",&m_strPORT);
// rs->FetchField("device",&m_strDEVICE);
// rs->FetchField("driver",&m_strDRIVER);
// rs->FetchField("devmodesize",&m_lDevModeSize);
// int x=(int)m_lDevModeSize;
// //Decode DEVMODE
//
//
// char* dc;
// dc=new char[x];
// cryp->DecodeB64(&m_strDEVMODE,dc);
// memcpy(dm,dc,x);
// delete dc;
// }
//
// //CUSTOM REPORT
// rs->FetchField("filename",&str1);
// if(str1!="na")
// ReportName=str1;//already = master default ARRRR!
//
//
// //COPIES
// rs->FetchField("copies",&lData);
// copies=(short)lData;
//
//
// //PREVIEW
// rs->FetchField("preview",&bData);
// Preview=bData;
// }
//
//
//
//
// // Open report engine and report.
// if (! PEOpenEngine())
// ::MessageBox(0, "Failed to open report engine.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// pJob = PEOpenPrintJob(ReportName);
//
// if (! pJob)
// {
// msg.Format("Failed to open report:%s",ReportName);
// ::MessageBox(0, msg, "Error", MB_OK | MB_ICONEXCLAMATION);
// }
//
// // Set ADO object as datasource of the report.
// PETablePrivateInfo privateInfo;
// memset(&privateInfo, 0, sizeof(PETablePrivateInfo));
// privateInfo.StructSize = sizeof(PETablePrivateInfo);
// privateInfo.nBytes = sizeof(IDispatch FAR *);
// privateInfo.tag = 3;
// _variant_t idsp;
// idsp = static_cast < IUnknown*>(m_pRecordSet);
// privateInfo.dataPtr= (BYTE FAR *)&idsp.punkVal;
// //*******************************
// /* SUB REPORT INFO
// 'Begin Method 2:
// 'Quick method for setting private data. This method steps through the Object model in 'one 'line instead of creating and setting separate objects to reach the desired method. 'Make sure the Subreport name is known when using OpenSubreport method.
//
// Call crpReport.Database.Tables.Item(1).SetPrivateData(3, ADOrs1)
// Set crpSubreport = crpReport.OpenSubreport("Subreport1")
// Call crpSubreport.Database.Tables.Item(1).SetPrivateData(3, ADOrs2)
//
// 'End Method 2:
//
// 'Preview the Report.
// crpReport.Preview
//
// End Sub
//
//
//
// */
// bResult = PESetNthTablePrivateInfo(pJob, 0, &privateInfo);
// if (!bResult)
// ::MessageBox(0, "PESetNthTablePrivateInfo failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
// //Custom printer?
// if(defaultprinter!=true)
// {
// PESelectPrinter(pJob,m_strDRIVER, m_strDEVICE,m_strPORT,dm);
// }
//
//
//
// //Added 1.7.2.0
// //Validate report and engine
// PEReportSummaryInfo si;
// PEGetReportSummaryInfo(pJob,&si);
//
// //validate the report version is ok
// strReportVersion=si.subject;
// if(!strReportVersion.IsEmpty() && strReportVersion.Find('.')!=-1)
// {
// if(CompareVersions(strReportVersion,m_strThisVersion)==0)
// {
// msg.Format(
// "Warning: The report you are about to print:\r\n"
// "%s\r\n"
// "is designed for AyaNova version %s\r\n"
// "You are running AyaNova version %s \r\n\r\n"
// "There may be a problem printing this report.\r\n"
// "Ensure you have the correct copy of\r\n"
// "the report file to match this version of AyaNova \r\n\r\n"
// "If you need further assistance, copy this message and email it to \r\n"
// "AyaNova technical support department: support@ayanova.com",
// ReportName,strReportVersion, m_strThisVersion);
// ShowStuff(msg);
//
// }
//
// }
//
// //Validate the engine version is new enough
// nEngineVer=PEGetVersion(PE_GV_ENGINE);
// if(nEngineVer==0) nEngineVer=1793;//because it may not exist on non development system
//
// nDllVer=PEGetVersion(PE_GV_DLL);
// if(nDllVer==0) nDllVer=1793;//because it may not exist on non development system
// //1793
// if(nEngineVer < 1793 || nDllVer < 1793)
// {
// msg.Format(
// "Warning: Your crystal reports printing engine seems to be\r\n"
// "an older version than was provided with AyaNova.\r\n\r\n"
// "This could result in printing problems\r\n"
// "The version just started on this computer is:\r\n"
// "Engine:%i, Dll:%i\r\n"
// "Both should be version 1793 or newer\r\n"
// "Contact technical support with this message",nEngineVer,nDllVer);
// ShowStuff(msg);
// }
//
//
//
//
//
// //PREVIEW
// if(Preview)
// {
//
// bResult = PEOutputToWindow(pJob, "AyaNova - report", 50, 50, 550, 500, WS_MAXIMIZE | WS_SYSMENU,0);
// if (!bResult)
// ::MessageBox(0, "PEOutputToWindow failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
// //TEST CODE
//#ifdef _DEBUG
//
//
//
//#endif
//
//
//
// //TEST CODE
//
//
//
// //defaults for print preview window
// PEWindowOptions pwo;
// pwo.StructSize = PE_SIZEOF_WINDOW_OPTIONS;
// pwo.canDrillDown=PE_UNCHANGED;
// pwo.hasCancelButton=PE_UNCHANGED;
// pwo.hasCloseButton=TRUE;//PE_UNCHANGED;
// pwo.hasExportButton=PE_UNCHANGED;
// pwo.hasGroupTree=TRUE;//PE_UNCHANGED;
// pwo.hasNavigationControls=PE_UNCHANGED;
// pwo.hasPrintButton=PE_UNCHANGED;
// pwo.hasPrintSetupButton=TRUE;
// pwo.hasProgressControls=PE_UNCHANGED;
// pwo.hasRefreshButton=PE_UNCHANGED;
// pwo.hasSearchButton=TRUE;//PE_UNCHANGED;
// pwo.hasZoomControl=PE_UNCHANGED;
// pwo.showDocumentTips=PE_UNCHANGED;
// pwo.showToolbarTips=TRUE;//PE_UNCHANGED;
//
// bResult = PESetWindowOptions(pJob,&pwo);
// if (!bResult)
// ::MessageBox(0, "PESetWindowOptions failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
//
//
// }
// else
// {//JUST PRINT DIRECTLY
//
// bResult = PEOutputToPrinter(pJob,copies);
// if (!bResult)
// ::MessageBox(0, "PEOutputToPrinter failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// }
// bResult = PEStartPrintJob(pJob, TRUE);
// if (!bResult)
// ::MessageBox(0, "Failed to start print job.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// PEClosePrintJob(pJob);
//
// delete dm;
//
// //delete rs;
// rsPool->ReleaseRS(&rs->m_nID);
// delete cryp;
//
//
//}
//*************************** NEW SUB REPORT PRINTING OPTION ************************************
//Print builtin report using user settings if found
void CSpApp::PrintSubCMReportRDC(CString VirtReportName, _RecordsetPtr m_pRecordSet,
CString strSubName, _RecordsetPtr m_pSubRecordSet)
{
CString strLocalError;
CWaitCursor cw;
//Get printer and report settings
GZRset* rs;
rs=rsPool->GetRS("CSpApp::PrintCMReportRDC");
cryp=new GZK;
CString strErr;
CString m_strPORT;
CString m_strDEVICE;
CString m_strDRIVER;
long lPaperOrientation;
long lPaperSize;
long lPaperSource;
long lDuplexType;
_variant_t vtCopies;
vtCopies=(long)1;
CString q,msg,ReportName,str1,str2,strReportVersion;
long lData;
bool Preview,UseDefaults,defaultprinter,bData;
UseDefaults=false;
short copies=1;
//FIND master report name
q.Format("SELECT rptsmaster.filename FROM rptsmaster "
"WHERE (((rptsmaster.virtualname)=\"%s\"));",VirtReportName);
rs->QueryReadOnly(q);
ASSERT(!rs->IsEmpty());
rs->FetchField("filename",&str1);
ReportName=ReportDirectory() + str1;
q.Format("SELECT rptsusers.* FROM rptsusers "
"WHERE (((rptsusers.virtualname)=\"%s\") AND "
"((rptsusers.user)=%u));",VirtReportName,m_lusrID);
rs->QueryReadOnly(q);
if(rs->IsEmpty())
{
//DEFAULTS TO USE IF NO USER RECORD
UseDefaults=true;
defaultprinter=true;
Preview=true;
copies=1;
}
else
{
rs->FetchField("defaultprtr",&bData);
if(bData)
defaultprinter=true;
else
{
defaultprinter=false;
//PRINTER SETTINGS
rs->FetchField("porient",&lPaperOrientation);
rs->FetchField("psize",&lPaperSize);
rs->FetchField("psource",&lPaperSource);
rs->FetchField("pduplex",&lDuplexType);
rs->FetchField("port",&m_strPORT);
rs->FetchField("device",&m_strDEVICE);
rs->FetchField("driver",&m_strDRIVER);
}
//CUSTOM REPORT
rs->FetchField("filename",&str1);
if(str1!="na")
ReportName=str1;//already = master default ARRRR!
//COPIES
rs->FetchField("copies",&lData);
vtCopies=lData;
//PREVIEW
rs->FetchField("preview",&bData);
Preview=bData;
}
//Output or preview the report
VARIANT vtFalse;
VariantInit(&vtFalse);
vtFalse.vt=VT_BOOL;
vtFalse.boolVal=FALSE;
VARIANT vtTrue;
VariantInit(&vtTrue);
vtTrue.vt=VT_BOOL;
vtTrue.boolVal=TRUE;
//preview report selected
try{//start of try block for reporting (Crystal rdc) stuff
strLocalError.Format("open report %s",ReportName);
m_Report = pApplication->OpenReport(_bstr_t(ReportName));
m_SubReport = m_Report->OpenSubreport(_bstr_t(strSubName));
strLocalError="set the Main report data source";
m_Report->Database->Tables->GetItem(1)->SetDataSource(_variant_t((IDispatch *)m_pRecordSet,true));
strLocalError="set the SUB report data source";
m_SubReport->Database->Tables->GetItem(1)->SetDataSource(_variant_t((IDispatch *)m_pSubRecordSet,true));
//set custom report settings if any
if(defaultprinter==false)
{
if(!m_strDEVICE.IsEmpty())//not the default printer?
m_Report->SelectPrinter(_bstr_t(m_strDRIVER),_bstr_t(m_strDEVICE),_bstr_t(m_strPORT));
m_Report->PutPaperOrientation((CRPaperOrientation)lPaperOrientation);
m_Report->PutPaperSize((CRPaperSize)lPaperSize);
m_Report->PutPaperSource((CRPaperSource)lPaperSource);
m_Report->PutPrinterDuplex((CRPrinterDuplexType)lDuplexType);
}
if(Preview)
{
strLocalError="preview the report onscreen";
CReportViewerDlg d;
d.m_Report=m_Report;
if(d.DoModal()==-1)
{
strLocalError="Error during preview the report onscreen";
}
}
else
m_Report->PrintOut(vtFalse,vtCopies);
}//end try block for report (Crystal rdc) stuff
catch(_com_error& e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("*************************************************\n");
TRACE("Exception thrown for classes generated by #import\n");
TRACE("\tCode = %081x\n", e.Error);
TRACE("\tCode Meaning = %s\n", e.ErrorMessage());
TRACE("\tSource = %s\n", (LPCTSTR) bstrSource);
TRACE("Description = %s\n", (LPCTSTR) bstrDescription);
TRACE("*************************************************\n");
strErr.Format(
"Error: AyaNova asked the Crystal Reports RDC printing engine\r\n"
"to print your report, but the RDC returned the following error instead:\r\n\r\n"
"Code = %x\r\n"
"Code Meaning = %s\r\n"
"Source = %s\r\n"
"Description = %s\r\n\r\n"
"This error came at the point where AyaNova had just asked the RDC to\r\n"
"%s.\r\n\r\n\r\n"
"See the \"Errors and problems printing\" page on our web site at:\r\n"
"http://www.ayanova.com/faq_technical.htm\r\n"
"to resolve this problem.\r\n\r\n"
"(It is recommended that you copy this error message and save it to a text file\r\n"
"in case you need to send this error message to AyaNova technical support.)\r\n",
e.Error,e.ErrorMessage(),(LPCTSTR) bstrSource,(LPCTSTR) bstrDescription,strLocalError);
ShowStuff(strErr);
//HandleComError(e,strLocalError);
}
}
//***************** END OF NEW SUB REPORT PRINTING OPTION **********************************
//print cm report with sub report test function
//temporary only to test proof of concept
//Print builtin report using user settings if found
//void CSpApp::PrintSubCMReport(CString VirtReportName, _RecordsetPtr m_pRecordSet, CString strSubName,
// _RecordsetPtr m_pSubRecordSet)
//{
//
// PrintSubCMReportRDC(VirtReportName, m_pRecordSet, strSubName, m_pSubRecordSet);
// return;
//
// //TODO Verify printer before selecting!!!!
// //rs=new GZRset("Error: Report settings screen ");
// //rs->SetConnect(strConnectString);
// //m_pRecordSet->GetActiveConnection();
// GZRset* rs;
// rs=rsPool->GetRS("CSpApp::PrintCMReport");
// cryp=new GZK;
//
// CString m_strDEVMODE;
// CString m_strPORT;
// CString m_strDEVICE;
// CString m_strDRIVER;
// long m_lDevModeSize;
// short pJob;
// short pSubReport;
// int bResult;
// int nEngineVer=0,nDllVer=0;
// CString q,msg,SubReportName,ReportName,str1,str2,strReportVersion;
// long lData;
// bool Preview,UseDefaults,defaultprinter,bData;
// UseDefaults=false;
// short copies=1;
// LPDEVMODE dm;
// dm=new DEVMODE;
// //FIND master report name
// q.Format("SELECT rptsmaster.filename FROM rptsmaster "
// "WHERE (((rptsmaster.virtualname)=\"%s\"));",VirtReportName);
// rs->QueryReadOnly(q);
// ASSERT(!rs->IsEmpty());
// rs->FetchField("filename",&str1);
// ReportName=ReportDirectory() + str1;
//
//
// q.Format("SELECT rptsusers.* FROM rptsusers "
// "WHERE (((rptsusers.virtualname)=\"%s\") AND "
// "((rptsusers.user)=%u));",VirtReportName,m_lusrID);
// rs->QueryReadOnly(q);
// if(rs->IsEmpty())
// {
// //DEFAULTS TO USE IF NO USER RECORD
// UseDefaults=true;
// defaultprinter=true;
// Preview=true;
// copies=1;
//
// }
// else
// {
// rs->FetchField("defaultprtr",&bData);
// if(bData)
// defaultprinter=true;
// else
// {
// defaultprinter=false;
// //PRINTER SETTINGS
// rs->FetchField("devmode",&m_strDEVMODE);
// rs->FetchField("port",&m_strPORT);
// rs->FetchField("device",&m_strDEVICE);
// rs->FetchField("driver",&m_strDRIVER);
// rs->FetchField("devmodesize",&m_lDevModeSize);
// int x=(int)m_lDevModeSize;
// //Decode DEVMODE
//
//
// char* dc;
// dc=new char[x];
// cryp->DecodeB64(&m_strDEVMODE,dc);
// memcpy(dm,dc,x);
// delete dc;
// }
//
// //CUSTOM REPORT
// rs->FetchField("filename",&str1);
// if(str1!="na")
// ReportName=str1;//already = master default ARRRR!
//
//
// //COPIES
// rs->FetchField("copies",&lData);
// copies=(short)lData;
//
//
// //PREVIEW
// rs->FetchField("preview",&bData);
// Preview=bData;
// }
//
//
//
//
// // Open report engine and report.
// if (! PEOpenEngine())
// ::MessageBox(0, "Failed to open report engine.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// pJob = PEOpenPrintJob(ReportName);
//
// if (! pJob)
// {
// msg.Format("Failed to open report:%s",ReportName);
// ::MessageBox(0, msg, "Error", MB_OK | MB_ICONEXCLAMATION);
// }
//
// // Set ADO object as datasource of the report.
// PETablePrivateInfo privateInfo;
// memset(&privateInfo, 0, sizeof(PETablePrivateInfo));
// privateInfo.StructSize = sizeof(PETablePrivateInfo);
// privateInfo.nBytes = sizeof(IDispatch FAR *);
// privateInfo.tag = 3;
// _variant_t idsp;
// idsp = static_cast < IUnknown*>(m_pRecordSet);
// privateInfo.dataPtr= (BYTE FAR *)&idsp.punkVal;
//
// bResult = PESetNthTablePrivateInfo(pJob, 0, &privateInfo);
// if (!bResult)
// ::MessageBox(0, "PESetNthTablePrivateInfo failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
// //*******************************
// /* SUB REPORT INFO
// 'Begin Method 2:
// 'Quick method for setting private data. This method steps through the Object model
// in 'one 'line instead of creating and setting separate objects to reach the desired method.
// 'Make sure the Subreport name is known when using OpenSubreport method.
//
// Call crpReport.Database.Tables.Item(1).SetPrivateData(3, ADOrs1)
// Set crpSubreport = crpReport.OpenSubreport("Subreport1")
// Call crpSubreport.Database.Tables.Item(1).SetPrivateData(3, ADOrs2)
//
// 'End Method 2:
//
// 'Preview the Report.
// crpReport.Preview
//
// End Sub
//
//
//
// */
// PETablePrivateInfo SubprivateInfo;
// memset(&SubprivateInfo, 0, sizeof(PETablePrivateInfo));
// SubprivateInfo.StructSize = sizeof(PETablePrivateInfo);
// SubprivateInfo.nBytes = sizeof(IDispatch FAR *);
// SubprivateInfo.tag = 3;
// _variant_t subidsp;
// subidsp = static_cast < IUnknown*>(m_pSubRecordSet);
// SubprivateInfo.dataPtr= (BYTE FAR *)&subidsp.punkVal;
//
// SubReportName=ReportDirectory()+strSubName;
// pSubReport=PEOpenSubreport(pJob,strSubName);
//
// bResult = PESetNthTablePrivateInfo(pSubReport, 0, &SubprivateInfo);
// if (!bResult)
// ::MessageBox(0, "PESetNthTablePrivateInfo failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
// //END OF SUBREPORT CODE
// //*******************************************************************************************************
//
// //Custom printer?
// if(defaultprinter!=true)
// {
// PESelectPrinter(pJob,m_strDRIVER, m_strDEVICE,m_strPORT,dm);
// }
//
//
//
// //Added 1.7.2.0
// //Validate report and engine
// PEReportSummaryInfo si;
// PEGetReportSummaryInfo(pJob,&si);
//
// //validate the report version is ok
// strReportVersion=si.subject;
// if(!strReportVersion.IsEmpty() && strReportVersion.Find('.')!=-1)
// {
// if(CompareVersions(strReportVersion,m_strThisVersion)==0)
// {
// msg.Format(
// "Warning: The report you are about to print:\r\n"
// "%s\r\n"
// "is designed for AyaNova version %s\r\n"
// "You are running AyaNova version %s \r\n\r\n"
// "There may be a problem printing this report.\r\n"
// "Ensure you have the correct copy of\r\n"
// "the report file to match this version of AyaNova \r\n\r\n"
// "If you need further assistance, copy this message and email it to \r\n"
// "AyaNova technical support department: support@ayanova.com",
// ReportName,strReportVersion, m_strThisVersion);
// ShowStuff(msg);
//
// }
//
// }
//
// //Validate the engine version is new enough
// nEngineVer=PEGetVersion(PE_GV_ENGINE);
// if(nEngineVer==0) nEngineVer=1793;//because it may not exist on non development system
//
// nDllVer=PEGetVersion(PE_GV_DLL);
// if(nDllVer==0) nDllVer=1793;//because it may not exist on non development system
// //1793
// if(nEngineVer < 1793 || nDllVer < 1793)
// {
// msg.Format(
// "Warning: Your crystal reports printing engine seems to be\r\n"
// "an older version than was provided with AyaNova.\r\n\r\n"
// "This could result in printing problems\r\n"
// "The version just started on this computer is:\r\n"
// "Engine:%i, Dll:%i\r\n"
// "Both should be version 1793 or newer\r\n"
// "Contact technical support with this message",nEngineVer,nDllVer);
// ShowStuff(msg);
// }
//
//
//
//
//
// //PREVIEW
// if(Preview)
// {
//
// bResult = PEOutputToWindow(pJob, "AyaNova - report", 50, 50, 550, 500, WS_MAXIMIZE | WS_SYSMENU,0);
// if (!bResult)
// ::MessageBox(0, "PEOutputToWindow failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
// //TEST CODE
//#ifdef _DEBUG
//
//
//
//#endif
//
//
//
// //TEST CODE
//
//
//
// //defaults for print preview window
// PEWindowOptions pwo;
// pwo.StructSize = PE_SIZEOF_WINDOW_OPTIONS;
// pwo.canDrillDown=PE_UNCHANGED;
// pwo.hasCancelButton=PE_UNCHANGED;
// pwo.hasCloseButton=TRUE;//PE_UNCHANGED;
// pwo.hasExportButton=PE_UNCHANGED;
// pwo.hasGroupTree=TRUE;//PE_UNCHANGED;
// pwo.hasNavigationControls=PE_UNCHANGED;
// pwo.hasPrintButton=PE_UNCHANGED;
// pwo.hasPrintSetupButton=TRUE;
// pwo.hasProgressControls=PE_UNCHANGED;
// pwo.hasRefreshButton=PE_UNCHANGED;
// pwo.hasSearchButton=TRUE;//PE_UNCHANGED;
// pwo.hasZoomControl=PE_UNCHANGED;
// pwo.showDocumentTips=PE_UNCHANGED;
// pwo.showToolbarTips=TRUE;//PE_UNCHANGED;
//
// bResult = PESetWindowOptions(pJob,&pwo);
// if (!bResult)
// ::MessageBox(0, "PESetWindowOptions failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
//
//
//
// }
// else
// {//JUST PRINT DIRECTLY
//
// bResult = PEOutputToPrinter(pJob,copies);
// if (!bResult)
// ::MessageBox(0, "PEOutputToPrinter failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// }
// bResult = PEStartPrintJob(pJob, TRUE);
// if (!bResult)
// ::MessageBox(0, "Failed to start print job.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// PEClosePrintJob(pJob);
//
// delete dm;
//
// //delete rs;
// rsPool->ReleaseRS(&rs->m_nID);
// delete cryp;
//
//
//}
////**************************END OF TEST NEW PRINT REPORT **********
////*****************************************************************
//
//
////**************************************
//void CSpApp::PrintReport(CString ReportName,_RecordsetPtr m_pRecordSet)
//{
//
//
// // call document report function
// short pJob;
// int bResult;
// CString msg;
// // Open report engine and report.
// if (! PEOpenEngine())
// ::MessageBox(0, "Failed to open report engine.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// pJob = PEOpenPrintJob(ReportName);
//
// if (! pJob)
// {
// msg.Format("Failed to open report:%s",ReportName);
// ::MessageBox(0, msg, "Error", MB_OK | MB_ICONEXCLAMATION);
// }
//
// // Set ADO object as datasource of the report.
// PETablePrivateInfo privateInfo;
// memset(&privateInfo, 0, sizeof(PETablePrivateInfo));
// privateInfo.StructSize = sizeof(PETablePrivateInfo);
// privateInfo.nBytes = sizeof(IDispatch FAR *);
// privateInfo.tag = 3;
// _variant_t idsp;
// idsp = static_cast < IUnknown*>(m_pRecordSet);
// privateInfo.dataPtr= (BYTE FAR *)&idsp.punkVal;
// //*******************************
//
// bResult = PESetNthTablePrivateInfo(pJob, 0, &privateInfo);
// if (!bResult)
// ::MessageBox(0, "PESetNthTablePrivateInfo failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// // Preview report.
// // pass this->hWnd for the last parameter to place the window inside another window
// // use the WM_SIZE or WM_PAINT message to resize crystal when its parent window changes in size
// CPrintDialog dlg(TRUE);
// LPDEVMODE dm;
// if(dlg.DoModal()==TRUE)
// {
// //LPDEVMODE devmode = dlg.GetDevMode()
// dm=dlg.GetDevMode();
// PESelectPrinter(pJob,(LPCTSTR) dlg.GetDriverName(), (LPCTSTR) dlg.GetDeviceName(),(LPCTSTR) dlg.GetPortName(),dm);
// }
//
// bResult = PEOutputToWindow(pJob, "AyaNova - report", 50, 50, 550, 500, WS_MAXIMIZE | WS_SYSMENU,0);
// if (!bResult)
// ::MessageBox(0, "PEOutputToWindow failed.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// bResult = PEStartPrintJob(pJob, TRUE);
// if (!bResult)
// ::MessageBox(0, "Failed to start print job.", "Error", MB_OK | MB_ICONEXCLAMATION);
//
// PEClosePrintJob(pJob);
//
//
//
//}
//**************************************
//create a .ttx file for reporting
void CSpApp::CreateTTX(CString ReportName,_RecordsetPtr m_pRecordSet, bool bSilent)
{
ReportName= ReportDirectory() + ReportName;
//Recordset pointer fixup declarations:
_variant_t idsp;//holder for pointer to recordset
//get the pointer for the recordset in required format
idsp = static_cast < IUnknown*>(m_pRecordSet);
//DLL calling declarations:
typedef BOOL FAR (WINAPI *FDPROC)(BYTE FAR *lpUnk,LPCSTR fileName, BOOL bOverWriteExistingFile);
HINSTANCE hinstLib;
FDPROC ProcCreateTTX;
BOOL fFreeResult;
// Get a handle to the DLL module.
hinstLib = LoadLibrary("p2smon.dll");
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcCreateTTX = (FDPROC) GetProcAddress(hinstLib, "CreateFieldDefFile");
// If the function address is valid, call the function.
if (ProcCreateTTX != NULL)
(ProcCreateTTX) ((BYTE FAR *)&idsp.punkVal,ReportName,TRUE);
else
AfxMessageBox("Error procuring CreateFieldDefFile function address");
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
//indicate success
if(!bSilent)
{
ReportName=ReportName + " - DONE";
AfxMessageBox(ReportName);
}
}
else
AfxMessageBox("Error loading p2smon.dll");
}
////**************************************
////create a .ttx file and skeleton report, optionally launch report designer
//void CSpApp::CreateTTXandReport(CString ReportName,CString DefName,_RecordsetPtr m_pRecordSet)
//{
// ReportName=ReportDirectory() + ReportName;
// DefName=ReportDirectory() + DefName;
//
// //Recordset pointer fixup declarations:
// _variant_t idsp;//holder for pointer to recordset
// //get the pointer for the recordset in required format
// idsp = static_cast < IUnknown*>(m_pRecordSet);
//
// //DLL calling declarations:
// typedef BOOL FAR (WINAPI *FDPROC)(BYTE FAR *lpUnk,LPCSTR ReportFile,LPCSTR FieldDefFile, BOOL bOverWriteExistingFile, BOOL LaunchDesigner);
// HINSTANCE hinstLib;
// FDPROC ProcCreateTTX;
// BOOL fFreeResult;
//
// // Get a handle to the DLL module.
// hinstLib = LoadLibrary("p2smon.dll");
// // If the handle is valid, try to get the function address.
// if (hinstLib != NULL)
// {
// ProcCreateTTX = (FDPROC) GetProcAddress(hinstLib, "CreateReportOnRuntimeDS");
//
// // If the function address is valid, call the function.
// if (ProcCreateTTX != NULL)
// (ProcCreateTTX) ((BYTE FAR *)&idsp.punkVal,ReportName,DefName,TRUE,TRUE);
// else///m_pApp->CreateTTXandReport("c:\\test.ttx","C:\\test.rpt",rs->RecordSetPointer(),TRUE);
// AfxMessageBox("Error procuring CreateFieldDefFile function address");
//
// AfxMessageBox(ReportName);
// // Free the DLL module.
// fFreeResult = FreeLibrary(hinstLib);
//
//
// }
// else
// AfxMessageBox("Error loading p2smon.dll");
//
//}
////Get printer settings from user
//void CSpApp::PrintSetup()
//{
//
// CPrintDialog dlg(TRUE);
// if(dlg.DoModal()==TRUE)
// {
//
//
// (LPCTSTR) dlg.GetDeviceName(),
// (LPCTSTR) dlg.GetPortName(),
// (LPCTSTR) dlg.GetDriverName();
// dlg.m_pd;
//
//
//
//
//
//
// }
//
//}
//Return the report directory path with terminating slash
CString CSpApp::ReportDirectory()
{
return m_strDBPATH;
}
void CSpApp::OnViewWorkorders()
{
SwitchView(2);//status screen
}
void CSpApp::OnAcceleratorExit()
{OnExit();}
void CSpApp::OnExit()
{
ProcessActiveViewClose();
//delete m_pViews[0];// = pActiveView; //default view
//delete m_pViews[1];// = (CView*) new RPTS;
//delete m_pViews[2];// = (CView*) new STAT;
//delete m_pViews[3];// = (CView*) new SRCH;
//delete m_pViews[4];// = (CView*) new CDBUtils;
//delete m_pViews[5];// = (CView*) new CSnR;
//delete m_pViews[6];
//delete m_pViews[7];
m_pViews[0]->DestroyWindow();// = pActiveView; //default view
m_pViews[1]->DestroyWindow();// = (CView*) new RPTS;
m_pViews[2]->DestroyWindow();// = (CView*) new STAT;
m_pViews[3]->DestroyWindow();// = (CView*) new SRCH;
m_pViews[4]->DestroyWindow();// = (CView*) new CDBUtils;
m_pViews[5]->DestroyWindow();// = (CView*) new CSnR;
m_pViews[6]->DestroyWindow();
m_pViews[7]->DestroyWindow();//CScheduleFrm
rsPool->Empty();
delete rsPool;
((CFrameWnd*) m_pMainWnd)->PostMessage(WM_QUIT);
//PostMessage(WM_QUIT);
}
//User report settings
void CSpApp::OnOptionsReports()
{
CRptSetDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorClients()
{OnOptionsEditClients();}
void CSpApp::OnOptionsEditClients()
{
CClientsDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorZones()
{OnOptionsEditZones();}
void CSpApp::OnOptionsEditZones()
{
CZonesDlg zd;
zd.DoModal();
}
void CSpApp::OnOptionsEditUsers()
{
CUsersDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorTasks()
{OnOptionsEditTasks();}
void CSpApp::OnOptionsEditTasks()
{
CDlgTasks d;
d.DoModal();
}
void CSpApp::OnAcceleratorUnits()
{OnOptionsEditUnits();}
void CSpApp::OnOptionsEditUnits()
{
CUnitsDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorModels()
{OnOptionsEditUnitmodels();}
void CSpApp::OnOptionsEditUnitmodels()
{
CModelsDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorParts()
{OnOptionsEditParts();}
void CSpApp::OnOptionsEditParts()
{
CPartsDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorProjects()
{OnOptionsEditProjects(); }
void CSpApp::OnOptionsEditProjects()
{
CProjectsDlg d;
//d.SetPassbackString(&str);
d.DoModal();
}
void CSpApp::OnAcceleratorStatus()
{
CProbStatDlg d;
d.DoModal();
}
void CSpApp::OnToolsSecurity()
{
CGroupsDlg d;
d.DoModal();
}
void CSpApp::OnViewMail()
{
CMailReaderDlg d;
d.DoModal();
}
void CSpApp::OnAcceleratorRates()
{OnOptionsEditRates(); }
void CSpApp::OnOptionsEditRates()
{
CRatesDlg d;
d.DoModal();
}
//ALT F3
void CSpApp::OnNcAddress3()
{OpenNonClientAddressBook(3);}
void CSpApp::OnOptionsEditAddressbookManufacturerssuppliers()
{OpenNonClientAddressBook(3);}
//ALT F2
void CSpApp::OnNcAddress2()
{OpenNonClientAddressBook(2);}
void CSpApp::OnOptionsEditAddressbookCouriersshippers()
{OpenNonClientAddressBook(2);}
//ALT F4
void CSpApp::OnNcAddress4()
{OpenNonClientAddressBook(5);}
void CSpApp::OnOptionsEditAddressbookResellerscompetitors()
{OpenNonClientAddressBook(5);}
//ALT F1 accelerator
void CSpApp::OnNcAddress()
{OpenNonClientAddressBook(1);}
void CSpApp::OnOptionsEditAddressbookSubcontractors()
{OpenNonClientAddressBook(1);
}
void CSpApp::OnAcceleratorCategories()
{OnOptionsEditWorkordertypes();}
void CSpApp::OnOptionsEditWorkordertypes()
{
CWOTypesDlg d;
d.DoModal();
}
//Schedule groups
void CSpApp::OnAcceleratorScheduleGroups()
{OnOptionsEditSchedgrps();}
void CSpApp::OnOptionsEditSchedgrps()
{
CSchedGrps d;
d.DoModal();
}
//time off days and flags
void CSpApp::OnAcceleratorScheduleMarkers()
{OnOptionsEditSchedmarkers();}
void CSpApp::OnOptionsEditSchedmarkers()
{
CDlgSchedMarkers d;
d.DoModal();
}
void CSpApp::OpenNonClientAddressBook(long ltype)
{
CNonClientsDlg d;
d.SetType(&ltype);
d.DoModal();
}
void CSpApp::OnHelpEmailtechsupport()
{
AfxMessageBox("Please include your registered company name as it appears \r\n"
"on the main program screen or indicate if you are evaluating for our records.\r\n\r\n"
"Please be as specific as possible when mailing tech support.\r\n"
"If you have received an error message, include the exact message\r\n"
"and what part of the program you were in when you received it.\r\n");
ShellExecute(NULL,"open","mailto:support@ayanova.com",NULL,NULL,SW_SHOWNORMAL);
}
void CSpApp::OnHelpSuggestions()
{
if(AfxMessageBox("We welcome all suggestions, many features in our software \r\n"
"are suggested by our users. \r\n\r\n"
"Would you like to make a suggestion now?\r\n(requires internet connection)",MB_YESNO)==IDYES)
ShellExecute(NULL,"open","http://www.ayanova.com/feedback.aspx",NULL,NULL,SW_SHOWNORMAL);
}
void CSpApp::OnHelpManual()
{
if(AfxMessageBox(
"View or download the complete AyaNova manual from our website. \r\n"
"The manual contains a full reference to all areas of the program \r\n"
"As well as tutorials, tips and tricks and answers to common questions\r\n\r\n"
"Visit the manual page on our website now?\r\n(requires internet connection)",MB_YESNO)==IDYES)
ShellExecute(NULL,"open","http://www.ayanova.com/manual.htm",NULL,NULL,SW_SHOWNORMAL);
else
AfxMessageBox("The manual can be found at www.ayanova.com");
}
void CSpApp::OnHelpVisitourwebsite()
{ShellExecute(NULL,"open","http://www.ayanova.com",NULL,NULL,SW_SHOWNORMAL);}
void CSpApp::OnHelpPurchase()
{ShellExecute(NULL,"open","http://www.ayanova.com/purchase.htm",NULL,NULL,SW_SHOWNORMAL);}
void CSpApp::OnHelpLicense()
{ShellExecute(NULL,"open","license.txt",NULL,NULL,SW_SHOWNORMAL);}
//management reports
void CSpApp::OnReports()
{SwitchView(1);}
void CSpApp::OnSearch()
{SwitchView(3);}
void CSpApp::OnVisualSchedule()
{SwitchView(7);}
void CSpApp::OnViewDatabase()
{SwitchView(4); }
void CSpApp::OnViewShippingreceiving()
{SwitchView(5);}
void CSpApp::OnFileLoanersrentals()
{
CLoanersDlg d;
d.DoModal();
}
void CSpApp::OnViewArasServiceRequests()
{
CArasClientRequests d;
d.DoModal();
}
void CSpApp::OnFilePmcheck()
{
CPMCheckDlg d;
d.DoModal();
}
void CSpApp::ShowStuff(CString strStuff)
{
CTED d;
d.m_strText=strStuff;
d.DoModal();
}
bool CSpApp::VerifyData()
{
bool bUseSQLServer=false;
CString StartIn,temp,folder,strDeadConnectString,strDeadQuery;
CFileStatus cfs;
GZK k;
//CFile::GetStatus("scdata.sc",cfs);
//---------changed 11/27/00
if(!CFile::GetStatus(SCDATAFILE,cfs))
{
folder=cfs.m_szFullName;
folder.Replace(SCDATAFILE,"");
#ifdef AYQB
temp.Format("Cannot locate data file %s in the current folder\r\n%s\r\n\r\n"
"Note: If you have not run the AyaNova QuickBooks Interface trial edition\r\n"
"program yet, then you should do so before running this special\r\n"
"edition of AyaNova as the QuickBooks interface needs to create a special\r\n"
"copy of your AyaNova database for use with this program.\r\n\r\n"
"Otherwise...\r\n\r\n"
"You should be running this program from the directory\r\n"
"where your %s file is located, or preferrably\r\n"
"you should set the StartIn property of the icon/shortcut\r\n"
"you use to run this program to point to the location where your\r\n"
"%s file is located.",SCDATAFILE,folder,SCDATAFILE,SCDATAFILE);
#else
temp.Format("Cannot locate data file %s in the current folder\r\n%s\r\n\r\n"
"You should be running this program from the directory\r\n"
"where your %s file is located, or preferrably\r\n"
"you should set the StartIn property of the icon/shortcut\r\n"
"you use to run this program to point to the location where your\r\n"
"%s file is located.",SCDATAFILE,folder,SCDATAFILE,SCDATAFILE);
#endif
AfxMessageBox(temp);
return false;
}
//-------------------------
StartIn.Format("%s",cfs.m_szFullName);
#ifdef _DEBUG
//StartIn="F:\\data\\data\\scdata.sc";
#endif
if( StartIn.IsEmpty())
{
AfxMessageBox("Cannot locate data file\r\nHave you set your StartIn Icon property correctly?");
return false;
}
else
{
StartIn=StartIn.Left(StartIn.GetLength()-sizeof(SCDATAFILE));//ADDRESS.GZ0 trim 11 characters leave path
m_strDBPATH=StartIn;
#ifdef AYQB
//encrypted database password=
// {F0F35532-9DDB-4b58-A3D6-57C0F0971B74}
//ALTER DATABASE PASSWORD NewPassword OldPassword
//ALTER DATABASE PASSWORD administrator NULL
//Standard connection string Jet OLEDB:Database Password=abraxis;
strConnectString.Format("%s%s\\%s;Jet OLEDB:Database Password=%s;Mode = Share Exclusive;",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
m_strDBPATH,SCDATAFILE,k.InLineDecrypt("wStSBeWasHK+XthZOWuHpw"/*1abraxis9*/));
#else
//Standard connection string
strConnectString.Format("%s%s\\%s;",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
m_strDBPATH,SCDATAFILE);
#endif
//************************
//SQL SERVER TEST STUFF, REM OUT FOR PRODUCTION
/*
strConnectString.Format("DSN=ayanova;UID=sa;PWD=;");
bUseSQLServer=true;
*/
//**********************************************
//Exclusive mode connect string
temp.Format("%s%s\\%s;Mode = Share Exclusive;","Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
m_strDBPATH,SCDATAFILE);
strConnectStringExclusive=temp;
//"DEAD" connection string
strDeadConnectString.Format("%s%s%s;",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=",
m_strDBPATH,"\\empty.sc");
//Query used to open "dead" database
strDeadQuery="SELECT nulltable.* FROM nulltable;";
//used by CSpApp::ReportDirectory()
m_strDBPATH=m_strDBPATH+"\\";
//******************************************
//RECORDSET POOL OBJECT SETUP
rsPool= new CGZRsetPool;
rsPool->m_bSQLServer=bUseSQLServer;
rsPool->m_strDBPATH=m_strDBPATH;
//***********************************************
rsPool->strConnectString=strConnectString;
rsPool->m_strLiveConnectString=strConnectString;
rsPool->m_strLiveConnectStringExclusive=strConnectStringExclusive;
rsPool->m_strDeadConnectString=strDeadConnectString;
rsPool->m_strCloseQuery=strDeadQuery;
rsPool->StartConnection();
}
return true;
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString str;
CModuleVersion ver;
if(ver.GetFileVersionInfo(_T("sc.exe")))
{
// display file version from VS_FIXEDFILEINFO struct
#ifdef AYQB
str.Format("AyaNova<EFBFBD> CE QBI\n*** For use with QB trial interface only ***\nProgram build: QBI%d.%d.%d.%d Database version: %s\n"
"Copyright (C) 1999-2004 Ground Zero Tech-Works Inc.",
HIWORD(ver.dwFileVersionMS), LOWORD(ver.dwFileVersionMS),
HIWORD(ver.dwFileVersionLS), LOWORD(ver.dwFileVersionLS),m_pApp->m_strDataVersion.Right(3));
#else
str.Format("AyaNova<EFBFBD> CE\nProgram build: %d.%d.%d.%d Database version: %s\n"
"Copyright (C) 1999-2004 Ground Zero Tech-Works Inc.",
HIWORD(ver.dwFileVersionMS), LOWORD(ver.dwFileVersionMS),
HIWORD(ver.dwFileVersionLS), LOWORD(ver.dwFileVersionLS),m_pApp->m_strDataVersion);
#endif
m_lblBuild.SetWindowText(str);
}
//make a EMAIL "hyperlink"
m_lblEmail.SetTextColor(RGB(0,0,255));
m_lblEmail.SetFontUnderline(TRUE);
m_lblEmail.SetLink(TRUE);
m_lblEmail.SetLinkCursor(m_pApp->hcHand);
m_lblEmail.SetLinkURL("mailto:support@ayanova.com");
//make a website "hyperlink"
m_lblWebSite.SetTextColor(RGB(0,0,255));
m_lblWebSite.SetFontUnderline(TRUE);
m_lblWebSite.SetLink(TRUE);
m_lblWebSite.SetLinkCursor(m_pApp->hcHand);
m_lblWebSite.SetLinkURL("http://www.ayanova.com");
SetWindowText("About AyaNova CE...");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//takes an int referring to the security item
//in question and returns one of three ints
//0=not allowed , 1=full, 2=read only
//bRefresh true= refresh from database
int CSpApp::Allowed(int right, bool bRefresh)
{
//****************************************************
//SECURITY RIGHTS
/*
#define NUMRIGHTS 26
#define RIGHTS_WORKORDERSTAT 0 //workorder status screen
#define RIGHTS_WORKORDER 1 //workorder entry screen
#define RIGHTS_SHIPPING 2 // shipping and receiving
#define RIGHTS_MAIL 3 //use the mail system (no read only here)
#define RIGHTS_DBASEUTILS 4 // use the database utilities
#define RIGHTS_SECURITYGROUPS 5 // rights to create edit GROUPS
#define RIGHTS_SEARCH 6 // access to the search screen
#define RIGHTS_REPORTS 7 // access to the reporting screen not workorder printing
#define RIGHTS_PRINTING 8 //able to change printing setup
#define RIGHTS_CLIENTS 9 //CLIENTS SCREEN
#define RIGHTS_RATES 10 //RATES SCREEN
#define RIGHTS_ZONES 11
#define RIGHTS_UNITS 12
#define RIGHTS_MODELS 13
#define RIGHTS_PARTS 14
#define RIGHTS_TASKS 15
#define RIGHTS_PROJECTS 16
#define RIGHTS_WOTYPES 17 //BLAH
#define RIGHTS_ADDRESSBOOKS 18 //MODIFY ADDRESS BOOKS
#define RIGHTS_USERS 19 //RIGHT TO EDIT USERS AND PLACE IN GROUPS
#define RIGHTS_PM 20 //preventative maintenance screen
#define RIGHTS_LOANERS 21 //loaner equipment screen
#define RIGHTS_SCHEDULE 22//scheduling screen
#define RIGHTS_SCHED_GROUPS 23//schedule groups screen
#define RIGHTS_SCHED_MARKERS 24//schedule groups screen
#define RIGHTS_USERPREFS 25//user preferences
*/
//**********************************************************
CString q,temp;
int x;
if(bRefresh)
{
GZRset* rs;
rs=rsPool->GetRS("Error at:CSpApp::Allowed");
cryp=new GZK;
q.Format("SELECT groups.b "
"FROM groups "
"WHERE (((groups.id)=%u));",m_lGroupID);
rs->QueryReadOnly(q);
if(rs->IsEmpty())
{
AfxMessageBox("Invalid Group ID");
rsPool->ReleaseRS(&rs->m_nID);
return 0;//no access
}
rs->FetchField("b",&temp);
#ifdef AYQB
temp="WFCLnNJiFR9P1a46lrBX89S4dB96+B4Ng7gw2oaG/tg";
#endif
//GZRset* rs;
//rs=rsPool->GetRS("Error at:CSpApp::Allowed");
rsPool->ReleaseRS(&rs->m_nID);
cryp->GZDecrypt(&temp,false);
m_strRights=temp.Right(NUMRIGHTS);
delete cryp;
}
x = atoi(m_strRights.Mid(right,1));
return x;
}
//************************************************************************************
//display the secure area warning
void CSpApp::SecurityWarning()
{
GZK c;
c.gzMsgBox("SIzZ2ShI1lZ/mf3i5I1/FnG9/ctr1CdaVR1spykMOwd6tM1VEiw6JcRXw5qHVAqYA+9tUbcP"
"INOYB6AsYO4vPo9Pg4zZJihTd79GmmDMHuIalcb/HXxYaZO3dS0Bz+rc",999);
}
void CSpApp::OnOptionsUser()
{
CUserPrefsDlg d;
d.DoModal();
}
void CSpApp::DoHelp()
{
//AfxMessageBox("HELP");
}
void CSpApp::WinHelp(DWORD dwData, UINT nCmd)
{
int nIDNUM;
//AfxMessageBox("WINHELP");
if(dwData==0x20080)//mainframe, means form has focus not dialog
{
//select which help topic to show for this form
switch(m_nCurView) {
case 1:
nIDNUM=IDD_RPTS_FORM;
break;
case 2:
nIDNUM=IDD_STAT_FORM;
break;
case 3://search
nIDNUM=IDD_SRCH_FORM;
break;
case 4:
nIDNUM=IDD_DBUTILS_FORM;
break;
case 5:
nIDNUM=IDD_SNR_FORM;
break;
case 7://visual schedule
nIDNUM=IDD_SCHEDULEFRM_FORM;
break;
}
CWinApp::WinHelp (0x00020000 + nIDNUM,HELP_CONTEXT);//HELP_CONTEXTPOPUP);
}
else
CWinApp::WinHelp(dwData, nCmd);
//if zero then topic not found, should show generic
}
//Verify that the database matches this build
//return true if it does or false if it doesn't
//used in InitInstance in this class near the end
//Added July 18th 2001 - verify program version
//if this running program is older than database says
//then exit immediately to prevent problems
bool CSpApp::VerifyDatabaseVersion()
{
CString q,strThisVersion,strTargetVersion;
//rs->Initialize("Error at:CSpApp::VerifyDatabaseVersion");
GZRset* rs;
rs=rsPool->GetRS("CSpApp::VerifyDatabaseVersion");
//verify that this program version is not too old
rs->QueryReadOnly("SELECT defaults.min_exe FROM defaults;");
if(!rs->IsEmpty())
{
//GET the db version in the database defaults table
rs->FetchField("min_exe",&strTargetVersion);
//compare with allowed version, newer versions of the program are ok,
//older ones are not.
//*********************************************
//*********************************************
//*********************************************
//SET THE APPLICATION VERSION NUMBER HERE:
m_strThisVersion="1.9.4.0";
//*********************************************
//*********************************************
//*********************************************
if(CompareVersions(m_strThisVersion,strTargetVersion)==0)//older?
{
rsPool->ReleaseRS(&rs->m_nID);
q.Format(
"Problem: This version of AyaNova is too old to work with the AyaNova\r\n"
"database you have just accessed.\r\n\r\n"
"This is AyaNova version %s\r\n"
"Only version %s or newer can be used with this AyaNova database.\r\n\r\n"
"This usually happens when a network of computers running AyaNova is upgraded\r\n"
"or being upgraded to the latest version but this computer has not been upgraded yet.\r\n\r\n"
"AyaNova will now close to protect your data.",m_strThisVersion,strTargetVersion);
AfxMessageBox(q);
::PostQuitMessage(0);
return true;
}
}
rs->QueryReadOnly("SELECT defaults.versioninfo FROM defaults;");
if(rs->IsEmpty())
{
AfxMessageBox("Can't validate database version, contact tech support.");
rsPool->ReleaseRS(&rs->m_nID);
return true;//no access
}
//GET the db version in the database defaults table
rs->FetchField("versioninfo",&m_strDBVersion);
rsPool->ReleaseRS(&rs->m_nID);
//*********************************************
//*********************************************
//*********************************************
//*********************************************
//*********************************************
//*********************************************
#ifdef AYQB
//SET THE VERSION NUMBER HERE:
//CURRENTDBVERSION defined in dbutils
if(m_strDBVersion!="9169" && m_strDBVersion!="9168" && m_strDBVersion!="9170" && m_strDBVersion!="9171")//<<<Required version number here
{
AfxMessageBox(
"The AyaNova QBI database just opened is not compatible with this version\r\n"
"of this AyaNova QBI trial program. This program will now close.");
::PostQuitMessage(0);
return true;
}
#else
//SET THE VERSION NUMBER HERE:
//CURRENTDBVERSION defined in dbutils
if(m_strDBVersion!="171")//<<<Required version number here
{
if(AfxMessageBox("Your database is out of date.\r\n\r\n"
"When you click on OK AyaNova will update your database to match this program version.\r\n"
"Make *certain* all other users are out of the program before proceeding.\r\n"
"If you do not ensure all other users are out, your database could become damaged!\r\n\r\n"
"Click OK to proceed or click Cancel to exit immediately without updating",MB_OKCANCEL)
==IDOK)
return false;
else
{
::PostQuitMessage(0);
return true;
}
}
#endif
return true;
//*********************************************
//*********************************************
//*********************************************
//*********************************************
//*********************************************
//*********************************************
}
void CSpApp::Delay(int nSeconds)
{
COleDateTime dtStart,dtEnd;
COleDateTimeSpan dtSpan;
dtStart=COleDateTime::GetCurrentTime();
do {
//PeekAndPump();
dtEnd=COleDateTime::GetCurrentTime();
dtSpan=dtEnd-dtStart;
}while(nSeconds > (int)dtSpan.GetTotalSeconds());
}
BOOL CSpApp::PeekAndPump()
{
static MSG msg;
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return FALSE;
}
}
return TRUE;
}
//compare this version to target version
//if this version is older return 0
//if equal return 1
//if this version is newer return 2
//if there is an error return -1
int CSpApp::CompareVersions(CString strThisVersion, CString strTargetVersion)
{
bool bDone=false;
CString strDigit;
int nThisVersionDigit, nTargetVersionDigit;
int nThisVersionStart=0,nThisVersionStop=0;
int nTargetVersionStart=0,nTargetVersionStop=0;
int nThisVersionLength=0,nTargetVersionLength=0;
int nRetValue=-1;//assume error unless otherwise
//prequalify
nTargetVersionLength=strTargetVersion.GetLength();
nThisVersionLength=strThisVersion.GetLength();
if(strThisVersion.GetLength()<2 || strThisVersion.Find('.')==-1)
return -1;
if(strTargetVersion.GetLength()<2 || strTargetVersion.Find('.')==-1)
return -1;
//check digits one by one starting at the left
//compare each pair
while(!bDone)
{
//Get This version digit
nThisVersionStop = strThisVersion.Find('.',nThisVersionStart);
if(nThisVersionStop==-1)//end of string
{
strDigit=strThisVersion.Mid(nThisVersionStart,strThisVersion.GetLength()-nThisVersionStart);
nThisVersionDigit=atoi(strThisVersion.Mid(nThisVersionStart,strThisVersion.GetLength()-nThisVersionStart));
bDone=true;
}
else//it's before the end of string
{
nThisVersionDigit=atoi(strThisVersion.Mid(nThisVersionStart,(nThisVersionStop-nThisVersionStart)));
strDigit=strThisVersion.Mid(nThisVersionStart,(nThisVersionStop-nThisVersionStart));
}
nThisVersionStart=nThisVersionStop+1;
//Get target version digit
nTargetVersionStop = strTargetVersion.Find('.',nTargetVersionStart);
if(nTargetVersionStop==-1)//end of string
{
nTargetVersionDigit=atoi(strTargetVersion.Mid(nTargetVersionStart,strTargetVersion.GetLength()-nTargetVersionStart));
bDone=true;
}
else//it's before the end of string
nTargetVersionDigit=atoi(strTargetVersion.Mid(nTargetVersionStart,(nTargetVersionStop-nTargetVersionStart)));
nTargetVersionStart=nTargetVersionStop+1;
//Newer?
if(nThisVersionDigit>nTargetVersionDigit)
{
nRetValue=2;//newer
bDone=true;//no need to go any further
}
//Older?
if(nThisVersionDigit < nTargetVersionDigit)
{
nRetValue=0;//Older
bDone=true;//no need to go any further
}
//Equal? No problem, just set retvalue to equal and keep going
if(nThisVersionDigit == nTargetVersionDigit)
nRetValue=1;
}
return nRetValue;
}
void CAboutDlg::OnBtnsupportinfo()
{
CString strUserInfo,strMsg,strDBInfo, strSysInfo,strProgramRanFrom, strProgFiles, strDBFiles, strTemp;
CString strLogoFile,strLogoIsSample,strBMPAssociatedWith, strAssocAppName;
char ch[1000];
COleDateTime dtData=COleDateTime::GetCurrentTime();
//v1.9.4.4 load version string that is used throughout program
//this will be up to date when a release is made.
CString strVersion;
strVersion.LoadString(AFX_IDS_APP_TITLE);
CWaitCursor cw;
GetModuleFileName(NULL,ch,295);
strProgramRanFrom=ch;
//Get standard user info and company reg data
strUserInfo.Format(
"USER DATA\r\n"
"Company: %s\r\n"
"Current user: %s\r\n"
"Program path: %s\r\n"
"DB Path: %s\r\n"
"DB Version: %s\r\n"
"Program version: %s",
m_pApp->m_strRegCompany,
m_pApp->m_strCurrentUserName,
strProgramRanFrom,
m_pApp->m_strDBPATH,
m_pApp->m_strDBVersion,
strVersion);
//Get all the regular info
CAyaSysInfo si;
strSysInfo=si.GetAllInfo();
//Get files in directories
strTemp=strProgramRanFrom.Left(strProgramRanFrom.ReverseFind('\\'));
strTemp+="\\*.*";
strProgFiles=si.GetFilesInfo(strTemp);
strTemp.Format("%s*.*",m_pApp->m_strDBPATH);
strDBFiles=si.GetFilesInfo(strTemp);
//Get the logo.bmp file properties
strLogoIsSample="--";
strTemp=si.GetFilesInfo("C:\\Program Files\\AyaNova\\logo.bmp");
strTemp.Replace("<Files in: C:\\Program Files\\AyaNova>\r\n","");
//File found?
if(strTemp.Find("not found") == -1 )
{
if(strTemp.Find("crc: 982881d3")!=-1)
strLogoIsSample="logo is SAMPLE (\"your logo here\")";
else
strLogoIsSample="Logo is custom";
//Get the bmp file association
FindExecutable(_T("logo.bmp"),_T("C:\\Program Files\\AyaNova\\"),ch);
strBMPAssociatedWith.Format("%s",ch);
//add plain text of what this is
//default value if not paint or picture viewer
strAssocAppName=" *** UNKNOWN PROGRAM, NOT TESTED OR APPROVED ***";
//check if associated with Windows XP etc picture viewer which is OK
if(strBMPAssociatedWith.Find(_T("shimgvw.dll")) !=-1)
strAssocAppName=" (Microsoft Picture Viewer - tested ok)";
if(strBMPAssociatedWith.Find(_T("mspaint.exe")) !=-1)
strAssocAppName=" (Microsoft Paint)";
strBMPAssociatedWith+=strAssocAppName;
}
strTemp.TrimRight("\r\n");
strLogoFile.Format(
"LOGO FILE INFORMATION (c:\\Program Files\\AyaNova\\logo.bmp)\r\n"
"File details :%s\r\n"
"Is it sample? :%s\r\n"
"BMP opens with : %s\r\n"
,strTemp,strLogoIsSample,strBMPAssociatedWith);
//Get the database info
m_pApp->rsPool->GetDBProps();
strDBInfo.Format(
"DATABASE DRIVER INFORMATION\r\n"
"ADO Version : %s\r\n"
"DBMS Name : %s\r\n"
"DBMS Version : %s\r\n"
"OLE DB Version : %s\r\n"
"Provider Name : %s\r\n"
"Provider Version : %s\r\n",
m_pApp->rsPool->m_strADOVersion,
m_pApp->rsPool->m_strDBMSName,
m_pApp->rsPool->m_strDBMSVersion,
m_pApp->rsPool->m_strOLEDbVersion,
m_pApp->rsPool->m_strProviderName,
m_pApp->rsPool->m_strProviderVersion);
strTemp.Format("AyaNova CE support data compiled: %s\r\n------------------------------------------------------------------------------\r\n",dtData.Format("%b.%d.%Y %H:%M:%S"));
strMsg = strTemp + strUserInfo + "\r\n\r\n" + strSysInfo + "\r\n\r\n" + strDBInfo + "\r\n\r\n" + strLogoFile
+"\r\n\r\n" + "FILE INFORMATION\r\n"
+ "Files in program folder:\r\n" + strProgFiles + "\r\nFiles in database folder:\r\n" + strDBFiles;
m_pApp->ShowStuff(strMsg);
}
void CAboutDlg::OnStnClickedLblEmailSupport()
{
// TODO: Add your control notification handler code here
}
void CAboutDlg::OnStnClickedLblSupportSite()
{
// TODO: Add your control notification handler code here
}
bool CSpApp::InitializeRDC(void)
{
try {
// Create instance of Application object
pApplication.CreateInstance("CrystalRuntime.Application.9");
return true;
}
catch(_com_error& e)
{
CString strErr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
TRACE("*************************************************\n");
TRACE("Exception thrown for classes generated by #import\n");
TRACE("\tCode = %081x\n", e.Error);
TRACE("\tCode Meaning = %s\n", e.ErrorMessage());
TRACE("\tSource = %s\n", (LPCTSTR) bstrSource);
TRACE("Description = %s\n", (LPCTSTR) bstrDescription);
TRACE("*************************************************\n");
strErr.Format(
"Error: Unable to initialize Crystal Reports RDC printing engine\r\n"
"AyaNova will be unable to print.\r\n\r\n"
"See the \"Errors and problems printing\" page on our web site at:\r\n"
"http://www.ayanova.com/faq_technical.htm\r\n"
"to resolve this problem.\r\n\r\n"
"Full error is:\r\n\r\n"
"Code = %x\r\n"
"Code Meaning = %s\r\n"
"Source = %s\r\n"
"Description = %s\r\n\r\n"
"This error came at the point where AyaNova had just attempted to intialize the RDC (craxdrt9.dll)\r\n"
,e.Error,e.ErrorMessage(),(LPCTSTR) bstrSource,(LPCTSTR) bstrDescription);
ShowStuff(strErr);
//HandleComError(e,strLocalError);
}
if(pApplication==NULL)
AfxMessageBox("Error: Unable to initialize Crystal Reports RDC printing engine\r\n"
"AyaNova will be unable to print.");
return false;
}
void CSpApp::Test(void)
{
CString ReportName= ReportDirectory() + "temp.ttx";
//_RecordsetPtr m_pRecordSet
GZRset* rs;
rs=rsPool->GetRS("Error at:CSpApp::Test()");
rs->QueryReadOnly("SELECT rates.* FROM rates;");
//Recordset pointer fixup declarations:
_variant_t idsp;//holder for pointer to recordset
//get the pointer for the recordset in required format
idsp = static_cast < IUnknown*>(rs->RecordSetPointer());
//DLL calling declarations:
typedef BOOL FAR (WINAPI *FDPROC)(BYTE FAR *lpUnk,LPCSTR fileName, BOOL bOverWriteExistingFile);
HINSTANCE hinstLib;
FDPROC ProcCreateTTX;
BOOL fFreeResult;
// Get a handle to the DLL module.
hinstLib = LoadLibrary("p2smon.dll");
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcCreateTTX = (FDPROC) GetProcAddress(hinstLib, "CreateFieldDefFile");
//// If the function address is valid, call the function.
if (ProcCreateTTX != NULL)
(ProcCreateTTX) ((BYTE FAR *)&idsp.punkVal,ReportName,TRUE);
else
AfxMessageBox("Error procuring CreateFieldDefFile function address");
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
////indicate success
//if(!bSilent)
//{
// ReportName=ReportName + " - DONE";
// AfxMessageBox(ReportName);
//}
}
else
AfxMessageBox("Error loading p2smon.dll");
rsPool->ReleaseRS(&rs->m_nID);
}