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

📄 accountview.cpp

📁 visual c++数据库开发基础与应用的源代码
💻 CPP
字号:
// AccountView.cpp : implementation file
//

#include "stdafx.h"
#include "FinanceMIS.h"
#include "AccountView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAccountView

IMPLEMENT_DYNCREATE(CAccountView, CFormView)

CAccountView::CAccountView()
	: CFormView(CAccountView::IDD)
{
	//{{AFX_DATA_INIT(CAccountView)
	m_strBank = _T("");
	m_dtAcc = COleDateTime::GetCurrentTime();
	m_dtExch = COleDateTime::GetCurrentTime();
	m_dbACMoney = 0.0;
	m_strACNum = _T("");
	m_strCard = _T("");
	m_strDescrip = _T("");
	m_strName = _T("");
	m_nType = -1;
	m_dbExMoney = 0.0;
	//}}AFX_DATA_INIT
	m_dbCurrMoney = 0;
}

CAccountView::~CAccountView()
{
}

void CAccountView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAccountView)
	DDX_Control(pDX, IDC_LIST_EXCH, m_listExch);
	DDX_Control(pDX, IDC_LIST_ACC, m_listAcc);
	DDX_CBString(pDX, IDC_COMBO_BANK, m_strBank);
	DDX_DateTimeCtrl(pDX, IDC_DT_ACC, m_dtAcc);
	DDX_DateTimeCtrl(pDX, IDC_DT_EXCH, m_dtExch);
	DDX_Text(pDX, IDC_EDIT_AC_MONEY, m_dbACMoney);
	DDX_Text(pDX, IDC_EDIT_ACCNUM, m_strACNum);
	DDX_Text(pDX, IDC_EDIT_CARD, m_strCard);
	DDX_Text(pDX, IDC_EDIT_DESCRIP, m_strDescrip);
	DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
	DDX_Radio(pDX, IDC_RADIO1, m_nType);
	DDX_Text(pDX, IDC_EDIT_EX_MONEY, m_dbExMoney);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAccountView, CFormView)
	//{{AFX_MSG_MAP(CAccountView)
	ON_BN_CLICKED(IDC_BTN_ACC_ADD, OnBtnAccAdd)
	ON_BN_CLICKED(IDC_BTN_ACC_DEL, OnBtnAccDel)
	ON_BN_CLICKED(IDC_BTN_EXCH_ADD, OnBtnExchAdd)
	ON_BN_CLICKED(IDC_BTN_EXCH_DEL, OnBtnExchDel)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ACC, OnItemchangedListAcc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAccountView diagnostics

#ifdef _DEBUG
void CAccountView::AssertValid() const
{
	CFormView::AssertValid();
}

void CAccountView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// CAccountView message handlers

void CAccountView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	//初始化列表框控件
	InitControl();
	//加载数据到列表框控件中
	InitCtrlData();
}

void CAccountView::InitControl()
{
	//设置列表框控件扩展风格
	DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |
		LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT;
	m_listAcc.SetExtendedStyle(dwExStyle);
	m_listExch.SetExtendedStyle(dwExStyle);
	//初始化账户信息列表框控件
	m_listAcc.InsertColumn(0,"账号",LVCFMT_CENTER,100);
	m_listAcc.InsertColumn(1,"户名",LVCFMT_CENTER,80);
	m_listAcc.InsertColumn(2,"关联卡号",LVCFMT_CENTER,100);
	m_listAcc.InsertColumn(3,"开户银行",LVCFMT_CENTER,100);
	m_listAcc.InsertColumn(4,"开户日期",LVCFMT_CENTER,120);
	m_listAcc.InsertColumn(5,"余额",LVCFMT_CENTER,100);
	m_listAcc.InsertColumn(6,"说明",LVCFMT_CENTER,120);
	//初始化交易信息列表框控件
	m_listExch.InsertColumn(0,"交易ID",LVCFMT_CENTER,60);
	m_listExch.InsertColumn(1,"交易日期",LVCFMT_CENTER,100);
	m_listExch.InsertColumn(2,"存款或取款",LVCFMT_CENTER,80);
	m_listExch.InsertColumn(3,"金额",LVCFMT_CENTER,100);
}

void CAccountView::InsertAcCtrlItem(CString item0,CString item1,CString item2, CString item3,CString item4,CString item5,CString item6)
{
	//获取当前的纪录条数.
	int nIndex = m_listAcc.GetItemCount();
	LV_ITEM lvItem;
	lvItem.mask = LVIF_TEXT ;	
	lvItem.iItem = nIndex;				//行数
	lvItem.iSubItem = 0;
	lvItem.pszText = (char*)(LPCTSTR)item0;		//第一列
	//在最后一行插入记录值.
	m_listAcc.InsertItem(&lvItem);	
	//设置该行的其他列的值.
	m_listAcc.SetItemText(nIndex,1,item1);	
	m_listAcc.SetItemText(nIndex,2,item2);	
	m_listAcc.SetItemText(nIndex,3,item3);	
	m_listAcc.SetItemText(nIndex,4,item4);	
	m_listAcc.SetItemText(nIndex,5,item5);	
	m_listAcc.SetItemText(nIndex,6,item6);	
	//修改当前选择的行
	m_nCurrIndex = nIndex;	
}

void CAccountView::InsertExCtrlItem(CString item0,CString item1,CString item2,CString item3)
{
	//获取当前的纪录条数.
	int nIndex = m_listExch.GetItemCount();
	LV_ITEM lvItem;
	lvItem.mask = LVIF_TEXT ;	
	lvItem.iItem = nIndex;				//行数
	lvItem.iSubItem = 0;
	lvItem.pszText = (char*)(LPCTSTR)item0;		//第一列
	//在最后一行插入记录值.
	m_listExch.InsertItem(&lvItem);	
	//设置该行的其他列的值.
	m_listExch.SetItemText(nIndex,1,item1);	
	m_listExch.SetItemText(nIndex,2,item2);	
	m_listExch.SetItemText(nIndex,3,item3);
}

void CAccountView::OnBtnAccAdd() 
{
	// TODO: Add your control notification handler code here
	if(!g_adoDB.IsOpen()){
		AfxMessageBox("数据库未打开");
		return;
	}
	if(!UpdateData())
		return;
	if(m_strBank.IsEmpty()){
		AfxMessageBox("请选择开户的银行名称");
		return;
	}
	//插入新的账户信息
	CString strDT = m_dtAcc.Format("%Y-%m-%d");
	CString sql ;
	sql.Format("Insert into account_info_tab(acc_num,"
		"name,card_num,bank,opendate,balance,description)"
		" VALUES("
		"'%s','%s','%s','%s','%s',%.2f,'%s')",
		m_strACNum,m_strName,m_strCard,m_strBank,strDT,m_dbACMoney,m_strDescrip);
	g_adoDB.Execute(sql);	
	//向账户列表框控件中插入信息
	InsertAcCtrlItem(m_strACNum,m_strName,m_strCard,
		m_strBank,strDT,float2Str(m_dbACMoney),m_strDescrip);	
}

void CAccountView::OnBtnAccDel() 
{
	if(!g_adoDB.IsOpen()){
		AfxMessageBox("数据库未打开");
		return;
	}
	int nItem = m_listAcc.GetNextItem(-1, LVNI_SELECTED);
	if(nItem == -1){
		AfxMessageBox("没有选定要删除的账户信息");
		return;
	}
	//获取选择的账户名称.
	CString strACNum = m_listAcc.GetItemText(nItem,0);	
	CString sql;
	//删除该账户下的所有交易记录
	sql.Format("delete from exchange_info_tab where acc_num = '%s'",strACNum);
	g_adoDB.Execute(sql);
	m_listExch.DeleteAllItems();	
	//删除选择的账户信息
	sql.Format("delete from account_info_tab where acc_num = '%s'",strACNum);
	g_adoDB.Execute(sql);
	//删除账户列表框控件中选择的账户信息
	m_listAcc.DeleteItem(nItem);
	//删除交易信息列表框控件中的数据
	m_listExch.DeleteAllItems();
}

void CAccountView::InitCtrlData()
{
	if(!g_adoDB.IsOpen())
		return;
	m_listAcc.DeleteAllItems();
	CDStrs acFields;
	//获取所有的账户信息表的数据
	g_adoDB.ExecuteQuery("Select * from account_info_tab",acFields);
	for(int i = 0 ; i < acFields.size() ; i++)
	{
		CStrs strs = acFields[i]; 
		InsertAcCtrlItem(strs[0],strs[1],strs[2],strs[3],
			strs[4].Left(10),strs[5],strs[6]);
		//更新当前账户和账户总额
		m_strCurrAcc = strs[0];
		m_dbCurrMoney = atof(strs[5]);
	}
	//更新账户的交易信息
	RefreshExchData(m_strCurrAcc);
}

void CAccountView::RefreshExchData(CString currAcc)
{
	m_listExch.DeleteAllItems();
	CDStrs exFields;
	//获取该账户的所有交易信息
	CString sql;
	sql.Format("Select * from exchange_info_tab where acc_num = '%s'",m_strCurrAcc);
	g_adoDB.ExecuteQuery(sql,exFields);
	for(int i = 0 ; i < exFields.size() ; i++)
	{
		CStrs strs = exFields[i]; 
		//插入交易信息列表框控件中
		InsertExCtrlItem(strs[0],strs[2].Left(10),strs[3]=="0"?"存款":"取款",strs[4]);
	}
}

void CAccountView::OnBtnExchAdd() 
{
	// TODO: Add your control notification handler code here
	if(!g_adoDB.IsOpen()){
		AfxMessageBox("数据库未打开");
		return;
	}
	if(!UpdateData())
		return;
	CString strID ;
	//获取最大的收支信息ID
	g_adoDB.ExecuteQueryValue("Select max(ex_id) "
		"from exchange_info_tab",strID);
	int newID = atoi(strID)+1;
	//插入新的交易信息
	CString strDT = m_dtExch.Format("%Y-%m-%d");
	CString sql ;
	sql.Format("Insert into exchange_info_tab(ex_id,acc_num,"
		"ex_date,ex_type,money)"
		" VALUES("
		"%d,'%s','%s',%d,%.2f)",
		newID,m_strCurrAcc,strDT,m_nType,m_dbExMoney);
	g_adoDB.Execute(sql);	
	InsertExCtrlItem(Int2Str(newID),strDT,m_nType==0?"存款":"取款",
		float2Str(m_dbExMoney));
	//如果是取款
	if(m_nType)  //总额减少
		m_dbCurrMoney -= m_dbExMoney;
	else  //否则,存取总额增加
		m_dbCurrMoney += m_dbExMoney;
	//更新账户列表框控件中显示的余额信息
	m_listAcc.SetItemText(m_nCurrIndex,5,float2Str(m_dbCurrMoney));
	//更新数据库中该账户的余额信息
	sql.Format("update account_info_tab set balance = %.2f "
		" where acc_num = '%s'",m_dbCurrMoney,m_strCurrAcc);
	g_adoDB.Execute(sql);
}

void CAccountView::OnBtnExchDel() 
{
	if(!g_adoDB.IsOpen()){
		AfxMessageBox("数据库未打开");
		return;
	}
	int nItem = m_listExch.GetNextItem(-1, LVNI_SELECTED);
	if(nItem == -1){
		AfxMessageBox("没有选定要删除的交易信息");
		return;
	}
	//获取选择的交易ID.
	int id = atoi(m_listExch.GetItemText(nItem,0));	
	m_dbExMoney = atof(m_listExch.GetItemText(nItem,3));	
	//获取删除的交易类型
	CString typeSel = m_listExch.GetItemText(nItem,2);
	CString sql;
	//删除选择的所有交易记录
	sql.Format("delete from exchange_info_tab where ex_id = %d",id);
	g_adoDB.Execute(sql);
	//删除交易列表框控件中选择的交易信息
	m_listExch.DeleteItem(nItem);
	//恢复余额信息
	int type = typeSel == "存款"?0:1;
	if(type)  //恢复减少的总额
		m_dbCurrMoney += m_dbExMoney;
	else  //否则,恢复增加的总额
		m_dbCurrMoney -= m_dbExMoney;
	//更新账户列表框控件中显示的余额信息
	m_listAcc.SetItemText(m_nCurrIndex,5,float2Str(m_dbCurrMoney));
	//更新数据库中该账户的余额信息
	sql.Format("update account_info_tab set balance = %.2f "
		" where acc_num = '%s'",m_dbCurrMoney,m_strCurrAcc);
	g_adoDB.Execute(sql);
}

void CAccountView::OnDraw(CDC* pDC) 
{
	//加载数据到列表框控件中
	InitCtrlData();	
}


void CAccountView::OnItemchangedListAcc(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	int nItem = m_listAcc.GetNextItem(-1, LVNI_SELECTED);
	if(nItem != -1){
		//更新当前选择账户所在的行
		m_nCurrIndex = nItem;
		//更新当前选择的账户名称
		m_strCurrAcc = m_listAcc.GetItemText(nItem,0);
		//更新当前选择账户的余额
		m_dbCurrMoney = atof(m_listAcc.GetItemText(nItem,5));
		//刷新当前选择账户的所有交易信息
		RefreshExchData(m_strCurrAcc);
	}				
	*pResult = 0;
}

⌨️ 快捷键说明

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