⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changefidlg.cpp

📁 使用Visual C++ .NET实现简单了一个票务管理系统
💻 CPP
字号:
// ChangeFiDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TicketOffice.h"
#include "ChangeFiDlg.h"
#include ".\changefidlg.h"


// CChangeFiDlg 对话框

IMPLEMENT_DYNAMIC(CChangeFiDlg, CDialog)
CChangeFiDlg::CChangeFiDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CChangeFiDlg::IDD, pParent)
	, m_UseString(_T(""))
	, m_Fi(_T(""))
	, m_DateString(_T(""))
{
	m_pFI = NULL;
	m_pTime = NULL;
}

CChangeFiDlg::~CChangeFiDlg()
{
}

void CChangeFiDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_FIINFOLIST, m_FiInfo);
	DDX_Control(pDX, IDC_DATETIMEPICKER1, m_Date);
	DDX_Control(pDX, IDC_COMBO1, m_SltType);
	DDX_Text(pDX, IDC_EDIT1, m_UseString);
	DDX_Text(pDX, IDC_EDIT2, m_Fi);
	DDX_Text(pDX, IDC_EDIT3, m_DateString);
	DDX_Control(pDX, IDC_BUTTON3, m_kChangeBt);
}


BEGIN_MESSAGE_MAP(CChangeFiDlg, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_BN_CLICKED(IDOK, OnBnClickedOk)
	ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()


// CChangeFiDlg 消息处理程序
// 设置航班号和时间
void CChangeFiDlg::LockValue( CString &fi, COleDateTime &t )
{
	m_pFI = &fi;
	m_pTime = &t;
	m_CurSltTime = t;
}

BOOL CChangeFiDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_FiInfo.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP );
	m_FiInfo.InsertColumn(0,"航班号",LVCFMT_LEFT,50);
	m_FiInfo.InsertColumn(1,"日期",LVCFMT_CENTER,80);
	m_FiInfo.InsertColumn(2,"始发城市",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(3,"目的城市",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(4,"起飞机场",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(5,"降落机场",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(6,"起飞时间",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(7,"降落时间",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(8,"机尾号",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(9,"最大人数",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(10,"实际人数",LVCFMT_LEFT,61);
	m_FiInfo.InsertColumn(11,"距离",LVCFMT_LEFT,61);

	m_SltType.AddString("目的地");
	m_SltType.AddString("航班号");
	m_SltType.AddString("起飞地");
	m_SltType.SetCurSel(0);

	if( m_pFI != NULL && m_pTime != NULL )
	{
		m_Fi = *m_pFI;
		m_DateString.Format("%d-%02d-%02d",m_CurSltTime.GetYear(),m_CurSltTime.GetMonth(),m_CurSltTime.GetDay());
		UpdateData(false);
	}
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CChangeFiDlg::OnBnClickedButton1()
{
	if( UpdateData() == false )
		return;
	CString sql,temp;
	COleDateTime t;
	m_Date.GetTime(t);
	m_CurSltTime = t;
	temp.Format("DateSerial(%d,%d,%d)",t.GetYear(),t.GetMonth(),t.GetDay() );
	sql.Format("SELECT * FROM FlightIDInfo WHERE (Date = %s)",temp);

	if( m_UseString != "" )
	{
		temp = "";
		switch( m_SltType.GetCurSel() )
		{
		case 0:
			temp.Format("(LandingPlace LIKE '%%%s%%')", m_UseString);
			break;
		case 1:
			temp.Format("(FlightID LIKE '%%%s%%')", m_UseString);
			break;
		case 2:
			temp.Format("(TakeoffPlace LIKE '%%%s%%')", m_UseString);
			break;
		default:
			break;
		}
		if( temp != "" )
		{
			sql = sql + " AND " + temp;
		}
	}
	LoadInfo( sql );
}
// 读入航班计划,写入List
bool CChangeFiDlg::LoadInfo(CString sql)
{
	if( sql == "" )
		return false;

	_ConnectionPtr pConnection;
	_RecordsetPtr pRecordset;

	try
	{
		HRESULT hr;

		// 创建Connection对象
		hr = pConnection.CreateInstance("ADODB.Connection");
		if( SUCCEEDED( hr ) )
		{
			// 连接数据库
			hr = pConnection->Open(m_pDlg->m_DBData.Linkbuf.GetBuffer(),
				m_pDlg->m_DBData.UserName.GetBuffer(),m_pDlg->m_DBData.PassWord.GetBuffer(),
				adModeUnknown);
		}
		else
		{
			MessageBox("创建数据库连接失败","失败",MB_OK);
			return false;
		}
	}
	catch( ... )
	{
		MessageBox( "连接数据库失败","失败",MB_OK);
		return false;
	}

	try
	{
		// 生成Recordset实例
		pRecordset.CreateInstance("ADODB.Recordset");

		pRecordset->Open( sql.GetBuffer(),
			_variant_t((IDispatch*)pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
	}
	catch( _com_error * e )
	{
		pConnection->Close();
		MessageBox( e->ErrorMessage(),"异常",MB_OK );
		return false;
	}

	m_FiInfo.DeleteAllItems();

	_variant_t value;
	COleDateTime t;
	CString temp;
	try
	{
		if( !pRecordset->BOF )
			pRecordset->MoveFirst();
		int i = -1;
		while( !pRecordset->adoEOF )
		{
			i++;
			value = pRecordset->GetCollect("FlightID");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.InsertItem( i, temp, 0 );

			value = pRecordset->GetCollect("Date");
			if( value.vt != VT_NULL )
			{
				t = value.date;
				temp.Format("%d-%02d-%02d",t.GetYear(),t.GetMonth(),t.GetDay());
			}
			else
				temp = "";
			m_FiInfo.SetItemText( i, 1, temp );
			value = pRecordset->GetCollect("TakeoffPlace");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.SetItemText( i, 2, temp );
			value = pRecordset->GetCollect("LandingPlace");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.SetItemText( i, 3, temp );
			value = pRecordset->GetCollect("TakeoffAir");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.SetItemText( i, 4, temp );
			value = pRecordset->GetCollect("LandingAir");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.SetItemText( i, 5, temp );
			value = pRecordset->GetCollect("TakeoffTime");
			if( value.vt != VT_NULL )
			{
				t = value.date;
				temp.Format("%02d:%02d",t.GetHour(),t.GetMinute());
			}
			else
				temp = "";
			m_FiInfo.SetItemText( i, 6, temp );
			value = pRecordset->GetCollect("LandingTime");
			if( value.vt != VT_NULL )
			{
				t = value.date;
				temp.Format("%02d:%02d",t.GetHour(),t.GetMinute());
			}
			else
				temp = "";
			m_FiInfo.SetItemText( i, 7, temp );

			value = pRecordset->GetCollect("Plane");
			if( value.vt != VT_NULL )
				temp = value.bstrVal;
			else
				temp = "";
			m_FiInfo.SetItemText( i, 8, temp );
			value = pRecordset->GetCollect("MaxPassengerNum");
			if( value.vt != VT_NULL )
				temp.Format("%d",value.lVal);
			else
				temp = "0";
			m_FiInfo.SetItemText( i, 9, temp );
			value = pRecordset->GetCollect("PassengerNum");
			if( value.vt != VT_NULL )
				temp.Format("%d",value.lVal);
			else
				temp = "0";
			m_FiInfo.SetItemText( i, 10, temp );
			value = pRecordset->GetCollect("Distance");
			if( value.vt != VT_NULL )
				temp.Format("%d",value.lVal);
			else
				temp = "0";
			m_FiInfo.SetItemText( i, 11, temp );

			pRecordset->MoveNext();
		}
	}
	catch(...)
	{
		MessageBox("读取记录异常","异常",MB_OK );
		pRecordset->Close();
		pConnection->Close();
		return false;
	}

	try
	{
		pRecordset->Close();
		pConnection->Close();
	}
	catch( _com_error * e )
	{
		MessageBox(e->ErrorMessage(),"失败",MB_OK );
	}
	return true;
}
// 变更航班
void CChangeFiDlg::OnBnClickedButton3()
{
	int k = GetCurSltCount();
	if( k == -1 )
	{
		MessageBox("必须选择航班");
		return;
	}
	m_Fi = m_FiInfo.GetItemText( k, 0 );
	// 变更机票预定数量
	if( ChangeTicketNum( m_Fi, m_CurSltTime, 1 ) )
	{
		m_DateString.Format("%d-%02d-%02d",m_CurSltTime.GetYear(),m_CurSltTime.GetMonth(),m_CurSltTime.GetDay());
		UpdateData(false);
		MessageBox( "航班已变更" );
		OnBnClickedButton1();
		// 防止多次修改
		m_kChangeBt.EnableWindow(false);
	}
	else
	{
		MessageBox("订票失败");
		UpdateData(true);
	}
}
void CChangeFiDlg::OnBnClickedOk()
{
	// 变更机票预定数量
	ChangeTicketNum( *m_pFI, *m_pTime, -1 );
	*m_pFI = m_Fi;
	*m_pTime = m_CurSltTime;
	OnOK();
}
void CChangeFiDlg::OnBnClickedCancel()
{
	// 变更机票预定数量
	ChangeTicketNum( m_Fi, m_CurSltTime, -1 );
	OnCancel();
}

// 得到当前选择项
int CChangeFiDlg::GetCurSltCount()
{
	// 是否有选中项
	if(m_FiInfo.GetSelectedCount() <= 0)
		return -1;

	for(int i =0;i<m_FiInfo.GetItemCount();i++ )
	{
		if(m_FiInfo.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)//选中状态。。
		{
			return i;
		}
	}

	return -1;  // 没有找到选中项
}
// 更改指定航班的机票数量
bool CChangeFiDlg::ChangeTicketNum( CString fi, COleDateTime date, int num )
{
	_ConnectionPtr pConnection;
	_RecordsetPtr pRecordset;

	try
	{
		HRESULT hr;

		// 创建Connection对象
		hr = pConnection.CreateInstance("ADODB.Connection");
		if( SUCCEEDED( hr ) )
		{
			// 连接数据库
			hr = pConnection->Open(m_pDlg->m_DBData.Linkbuf.GetBuffer(),
				m_pDlg->m_DBData.UserName.GetBuffer(),m_pDlg->m_DBData.PassWord.GetBuffer(),
				adModeUnknown);
		}
		else
		{
			MessageBox("创建数据库连接失败","失败",MB_OK);
			return false;
		}
	}
	catch( ... )
	{
		MessageBox( "连接数据库失败","失败",MB_OK);
		return false;
	}

	CString temp;
	CString sql;
	try
	{
		// 生成Recordset实例
		pRecordset.CreateInstance("ADODB.Recordset");
		temp.Format("DateSerial(%d,%d,%d)",date.GetYear(),date.GetMonth(),date.GetDay() );

		sql.Format("SELECT * FROM FlightIDInfo WHERE (Date = %s) AND (FlightID='%s')",temp,fi);
		pRecordset->Open( sql.GetBuffer(),
			_variant_t((IDispatch*)pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
	}
	catch( _com_error * e )
	{
		pConnection->Close();
		MessageBox( e->ErrorMessage(),"异常",MB_OK );
		return false;
	}
	if( !pRecordset->adoEOF )
	{
		_variant_t value;
		long max = 0;
		long cursum = 0;
		try
		{
			value = pRecordset->GetCollect("MaxPassengerNum");
			if( value.vt != VT_NULL )
				max = value.lVal;
			else
				max = 0;
			value = pRecordset->GetCollect("PassengerNum");
			if( value.vt != VT_NULL )
				cursum = value.lVal;
			else
				cursum = 0;

			cursum += num;
			if( cursum > max )
			{
				MessageBox("机票已经售完","票已售完");
				pRecordset->Close();
				pConnection->Close();
				return false;
			}
			if( cursum < 0 )
			{
				MessageBox("没有人订过机票");
				pRecordset->Close();
				pConnection->Close();
				return true;
			}
			pRecordset->Update();
			pRecordset->PutCollect( "PassengerNum", _variant_t(cursum) );
			pRecordset->Update();
		}
		catch(...)
		{
			MessageBox("读取记录异常","异常",MB_OK );
			pRecordset->Close();
			pConnection->Close();
			return false;
		}
	}

	try
	{
		pRecordset->Close();
		pConnection->Close();
	}
	catch( _com_error * e )
	{
		MessageBox(e->ErrorMessage(),"失败",MB_OK );
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -