financeoutcomedlg.cpp

来自「这是一个学生信息管理系统」· C++ 代码 · 共 871 行 · 第 1/2 页

CPP
871
字号
// FinanceOutcomeDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "SMS.h"
#include "FinanceOutcomeDlg.h"


// CFinanceOutcomeDlg 对话框

IMPLEMENT_DYNAMIC(CFinanceOutcomeDlg, CDialog)

CFinanceOutcomeDlg::CFinanceOutcomeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFinanceOutcomeDlg::IDD, pParent)
	, m_iOutcomeAmount(0)
	, m_pSet(&theApp.m_db )
	, m_pCashSet(&theApp.m_db )
{
	//显示窗口颜色
	m_backcolor=m_RGB_BkColor;
	m_brush.CreateSolidBrush(m_backcolor);
	m_bItemClick=false;
}

CFinanceOutcomeDlg::~CFinanceOutcomeDlg()
{
}

void CFinanceOutcomeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_OUTCOME_AMOUNT_STATIC, m_iOutcomeAmount);
	DDX_Control(pDX, IDC_FINANCE_OUTCOME_LIST, m_cOutcomeListCtrl);
	DDX_Control(pDX, IDC_FINANCE_OUTCOME_DELETE_BT, m_cDeleteBt);
	DDX_Control(pDX, IDC_FINANCE_OUTCOME_UPDATE_BT, m_cUpdateBt);
	DDX_Control(pDX, IDC_FINANCE_OUTCOME_PRINT_BT, m_cPrintBt);
}


BEGIN_MESSAGE_MAP(CFinanceOutcomeDlg, CDialog)
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_ALL_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeAllBt)
	ON_BN_CLICKED(IDC_OUTCOME_KIND_BT, &CFinanceOutcomeDlg::OnBnClickedOutcomeKindBt)
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_ADD_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeAddBt)
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_UPDATE_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeUpdateBt)
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_DELETE_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeDeleteBt)
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_SEARCH_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeSearchBt)
	ON_WM_QUERYDRAGICON()//打印
	ON_BN_CLICKED(IDC_FINANCE_OUTCOME_PRINT_BT, &CFinanceOutcomeDlg::OnBnClickedFinanceOutcomePrintBt)
	ON_WM_CTLCOLOR()
	ON_NOTIFY(HDN_ITEMCLICK, 0, &CFinanceOutcomeDlg::OnHdnItemclickFinanceOutcomeList)
	ON_WM_CLOSE()
	ON_WM_CONTEXTMENU()
	ON_WM_TIMER()
	ON_COMMAND(ID_OUTCOME_ALL, &CFinanceOutcomeDlg::OnOutcomeAll)
	ON_COMMAND(ID_OUTCOME_KIND, &CFinanceOutcomeDlg::OnOutcomeKind)
	ON_COMMAND(ID_OUTCOME_ADD, &CFinanceOutcomeDlg::OnOutcomeAdd)
	ON_COMMAND(ID_OUTCOME_UPDATE, &CFinanceOutcomeDlg::OnOutcomeUpdate)
	ON_COMMAND(ID_OUTCOME_DELETE, &CFinanceOutcomeDlg::OnOutcomeDelete)
	ON_COMMAND(ID_OUTCOME_SEARCH, &CFinanceOutcomeDlg::OnOutcomeSearch)
	ON_COMMAND(ID_OUTCOME_PRINT, &CFinanceOutcomeDlg::OnOutcomePrint)
    ON_UPDATE_COMMAND_UI(ID_OUTCOME_UPDATE, &CFinanceOutcomeDlg::OnUpdateOutcomeUpdate )
	ON_UPDATE_COMMAND_UI(ID_OUTCOME_DELETE, &CFinanceOutcomeDlg::OnUpdateOutcomeDelete )
	ON_UPDATE_COMMAND_UI(ID_OUTCOME_PRINT, &CFinanceOutcomeDlg::OnUpdateOutcomePrint )
    ON_WM_INITMENUPOPUP()
END_MESSAGE_MAP()


// CFinanceOutcomeDlg 消息处理程序
void CFinanceOutcomeDlg::ViewAll()
{
	BeginWaitCursor();
	CString s;
	int Length;
	m_cOutcomeListCtrl.DeleteAllItems ();
	if(m_pSet.IsOpen ())
		m_pSet.Close ();
	m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Outcome order by oDate");
	m_pSet.m_strFilter .Empty ();
	int count;
	count=m_pSet.GetRecordCount ();
	if(count==0)//如果该数据表为空,则不用显示
	{
		EndWaitCursor();
		m_pSet.Close ();
		return ;
	}
	m_pSet.MoveFirst ();
	int i=0; 
	while (!m_pSet.IsEOF ())
	{
		m_cOutcomeListCtrl.InsertItem(i,(CString)m_pSet.m_oName ,0);
		m_cOutcomeListCtrl.SetItemText (i,1,(CString)m_pSet.m_oSource  );
		m_cOutcomeListCtrl.SetItemText (i,2, (CString)m_pSet.m_oKind);
		s.Format (L"%f",m_pSet.m_oAmount );
		Length=s.GetLength ();
		s.Delete (Length-4,4);
	    m_cOutcomeListCtrl.SetItemText (i,3,s );
		m_cOutcomeListCtrl.SetItemText (i,4,FormatDate(m_pSet.m_oDate  ));
		m_cOutcomeListCtrl.SetItemText (i,5,(CString)m_pSet.m_oRemark  );
        s.Format (L"%d",m_pSet.m_oId );
		m_cOutcomeListCtrl.SetItemText (i,6,s);
        i++;
		m_pSet.MoveNext ();
	}
	m_pSet.Close ();
	//现在在右边显示个数
	m_iOutcomeAmount=i;
	s.Format (L"%d",m_iOutcomeAmount);
	SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
    EndWaitCursor();
}
void CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeAllBt()
{
	// TODO: 在此添加控件通知处理程序代码
	ViewAll();
}

void CFinanceOutcomeDlg::Kind()
{
	CString s;
	int Length;
	int i=0;
    CFinanceOutcomeKindDlg dlg;
	if(dlg.DoModal ()==IDOK)
	{
		BeginWaitCursor();
		m_cOutcomeListCtrl.DeleteAllItems ();
	    if(m_pSet.IsOpen ())
		    m_pSet.Close ();
	    CString str;
	    str="Select * from Outcome where oKind='";
	    str+=dlg.m_sKind ;
	    str+="' order by oDate";
	    m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,str);	    
		m_pSet.m_strFilter .Empty ();
	    m_pSet.Requery ();
	    if(m_pSet.IsEOF ())
	    {
	        m_iOutcomeAmount=i;
	        s.Format (L"%d",m_iOutcomeAmount);
	        SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
		    MessageBox(L"\n不存在这样的记录!\n",L"提示",MB_ICONEXCLAMATION);
		    m_pSet.Close ();
			EndWaitCursor();
		    return ;
	    }
	    else
	    {
	        if(m_pSet.GetRecordCount ()==0)
		    {
				m_iOutcomeAmount=i;
				s.Format (L"%d",m_iOutcomeAmount);
				SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
				MessageBox(L"\n不存在这样的记录!\n",L"提示",MB_ICONEXCLAMATION);
			    m_pSet.Close ();
				EndWaitCursor();
			    return ;
		    }
		    m_pSet.MoveFirst ();
	        while (!m_pSet.IsEOF ())
	        {  
				m_cOutcomeListCtrl.InsertItem(i,(CString)m_pSet.m_oName ,0);
				m_cOutcomeListCtrl.SetItemText (i,1,(CString)m_pSet.m_oSource  );
				m_cOutcomeListCtrl.SetItemText (i,2, (CString)m_pSet.m_oKind);
				s.Format (L"%f",m_pSet.m_oAmount );
				Length=s.GetLength ();
				s.Delete (Length-4,4);
			    m_cOutcomeListCtrl.SetItemText (i,3,s );
				m_cOutcomeListCtrl.SetItemText (i,4,FormatDate(m_pSet.m_oDate  ));
				m_cOutcomeListCtrl.SetItemText (i,5,(CString)m_pSet.m_oRemark  );
			    s.Format (L"%d",m_pSet.m_oId );
				m_cOutcomeListCtrl.SetItemText (i,6,s);     
				m_pSet.MoveNext ();
				i++;
	        }
	        m_pSet.Close ();
	       if(i==0)
	       {
				m_iOutcomeAmount=i;
				s.Format (L"%d",m_iOutcomeAmount);
				SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
				MessageBox(L"\n不存在这样的记录!\n",L"提示",MB_ICONEXCLAMATION);
				m_pSet.Close ();
				EndWaitCursor();
				return ;
			}
	        //现在在右边显示个数
	        m_iOutcomeAmount=i;
	        s.Format (L"%d",m_iOutcomeAmount);
	        SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
		}
		EndWaitCursor();
	}
}
void CFinanceOutcomeDlg::OnBnClickedOutcomeKindBt()
{
	// TODO: 在此添加控件通知处理程序代码
    Kind();
}

void CFinanceOutcomeDlg::Add ()
{
	CString s;
	int Length;
	CFinanceOutcomeAddDlg dlg;
	if(dlg.DoModal ()==IDOK)
	{
		if(!theApp.m_db.CanTransact ())
		{
			//虽然不支持事务处理的数据库很少,但是我强硬地不允许这种情况出现
			MessageBox(L"\n系统不支持事务处理,添加不成功!\n",L"错误", MB_ICONSTOP);
			return ;                                    
		}
		theApp.m_db.BeginTrans ();//开始事务处理
		TRY
		{
			//先保存支出表
	        m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Outcome order by oDate");
		    m_pSet.m_strFilter.Empty ();
			m_pSet.AddNew ();
			m_pSet.m_oName=dlg.m_sName;
			m_pSet.m_oSource =dlg.m_sSource ;
			m_pSet.m_oKind =dlg.m_sKind ;
			m_pSet.m_oAmount =dlg.m_dAmount ;
			m_pSet.m_oDate =dlg.m_tDate ;
			m_pSet.m_oRemark =dlg.m_sRemark ;
			m_pSet.Update ();
			m_pSet.MoveLast ();
		    m_pSet.Close ();
			//再保存现金信息,默认从现金流出
			double MoneyLast;
			if(m_pCashSet.IsOpen ())
				m_pCashSet.Close ();
			m_pCashSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Cash order by cDate ASC");
			m_pCashSet.m_strFilter .Empty ();
			if(m_pCashSet.GetRecordCount ()==0)
				MoneyLast=0;
			else
			{
				m_pCashSet.MoveLast ();
				MoneyLast=m_pCashSet.m_cAmount ;
			}
			MoneyLast-=dlg.m_dAmount ;
			m_pCashSet.AddNew ();
			m_pCashSet.m_cAmount =MoneyLast;
			m_pCashSet.m_cDate =CTime::GetCurrentTime();
			m_pCashSet.Update();
			m_pCashSet.MoveLast ();
			m_pCashSet.Close ();
            theApp.m_db.CommitTrans ();//添加成功了
		}
		CATCH_ALL(e)
		{
			theApp.m_db.Rollback ();
		    MessageBox(L"\n事务处理出错,添加失败!\n",L"错误", MB_ICONSTOP);
			return;
	    }
	    END_CATCH_ALL
		//添加成功了,就要在列表中显示出来
		m_cOutcomeListCtrl.InsertItem(0,(CString)dlg.m_sName ,0);
		m_cOutcomeListCtrl.SetItemText (0,1,(CString)dlg.m_sSource  );
		m_cOutcomeListCtrl.SetItemText (0,2, (CString)dlg.m_sKind );
		s.Format (L"%f",dlg.m_dAmount );
		Length=s.GetLength ();
		s.Delete (Length-4,4);
	    m_cOutcomeListCtrl.SetItemText (0,3,s );
		m_cOutcomeListCtrl.SetItemText (0,4,FormatDate(dlg.m_tDate ));
		m_cOutcomeListCtrl.SetItemText (0,5,(CString)dlg.m_sRemark );
	    s.Format (L"%d",m_pSet.m_oId );
		m_cOutcomeListCtrl.SetItemText (0,6,s);     
		//然后再在个数中加一,显示给用户
		m_iOutcomeAmount++;
		s.Format (L"%d",m_iOutcomeAmount);
		SetDlgItemText(IDC_OUTCOME_AMOUNT_STATIC,s);//显示
	}
}
void CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeAddBt()
{
	// TODO: 在此添加控件通知处理程序代码
	if(MessageBox(L"\n为了让您的财务清楚,建议进入支出向导进行登记,否则进入默认处理。\n按确定进入支出向导,按取消进入默认处理。\n",L"新增支出",MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2)==IDCANCEL)
		Add();
	else
	{
		//直接转移到收入向导
		COutcomeWizardDlg1 dlg;
		dlg.DoModal ();
	}
}

void CFinanceOutcomeDlg::Update ()
{
	CString s;
	int Length;
	POSITION pos = m_cOutcomeListCtrl.GetFirstSelectedItemPosition();
    if (pos == NULL)
	{
		MessageBox(L"你没有选择要修改的支出\n请在列表中选择要修改的支出!",L"提示",MB_ICONEXCLAMATION);
		return ;//没有选择表项则不用做下面的事情
	}
    else
    {
		if(!theApp.m_db.CanTransact ())
		{
			//虽然不支持事务处理的数据库很少,但是我强硬地不允许这种情况出现
			MessageBox(L"\n系统不支持事务处理,修改不成功!\n",L"错误", MB_ICONSTOP);
			return ;                                    
		}
	    int nItem = m_cOutcomeListCtrl.GetNextSelectedItem(pos);//列表中的项目序号也即数据库中的编号
		//下面获取该表项的数据,用于在修改对话框中显示
		int Id=_ttol(m_cOutcomeListCtrl.GetItemText (nItem,6));
		if(m_pSet.IsOpen ())
			m_pSet.Close ();
		m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Outcome order by oDate");
		m_pSet.m_strFilter .Empty ();
		m_pSet.MoveFirst ();
		while(!m_pSet.IsEOF ())
		{
			if(m_pSet.m_oId ==Id)//说明找到了相应的那个字段
			{
				m_iFinanceOutcome_Id=m_pSet.m_oId ;
				m_sFinanceOutcome_Name=m_pSet.m_oName  ;
				m_sFinanceOutcome_Source=m_pSet.m_oSource ;
				m_sFinanceOutcome_Kind=m_pSet.m_oKind ;
				m_dFinanceOutcome_Amount=m_pSet.m_oAmount ;
				m_tFinanceOutcome_Date=m_pSet.m_oDate ;
				m_sFinanceOutcome_Remark=m_pSet.m_oRemark ;
				break;
			}
			m_pSet.MoveNext ();
		}
		m_pSet.Close ();//记得要关闭!
		//下面弹出修改对话框,初始化数据由上面部分提供
		CFinanceOutcomeUpdateDlg dlg;
		if(dlg.DoModal ()!=IDOK)
		{
			return ;//万一用户没有输入正确信息,则退出,不给修改
		}
		theApp.m_db.BeginTrans ();//开始事务处理
		TRY
		{
	        m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Outcome order by oDate");
		    m_pSet.m_strFilter.Empty ();
			m_pSet.MoveFirst ();//刚开始移动到第一个位置
			while(!m_pSet.IsEOF ())
			{
				if(m_pSet.m_oId ==m_iFinanceOutcome_Id)
				{
					m_pSet.Edit ();
					m_pSet.m_oName=dlg.m_sName;
					m_pSet.m_oSource =dlg.m_sSource ;
					m_pSet.m_oKind =dlg.m_sKind ;
					m_pSet.m_oAmount =dlg.m_dAmount ;
					m_pSet.m_oDate =dlg.m_tDate ;
					m_pSet.m_oRemark =dlg.m_sRemark ;
			        m_pSet.Update ();
			        m_pSet.Requery ();
					m_pSet.MoveNext ();
					break;
				}
				m_pSet.MoveNext ();
			}
        m_pSet.Close ();
		//下面修改现金的信息
		double MoneyLast;
		if(m_pCashSet.IsOpen ())
			m_pCashSet.Close ();
		m_pCashSet.Open (AFX_DB_USE_DEFAULT_TYPE,L"Select * from Cash order by cDate ASC");
		m_pCashSet.m_strFilter .Empty ();
		if(m_pCashSet.GetRecordCount ()==0)
			MoneyLast=0;
		else
		{
			m_pCashSet.MoveLast ();
			MoneyLast=m_pCashSet.m_cAmount ;
		}
		MoneyLast-=dlg.m_dAmount-m_dFinanceOutcome_Amount ;
		m_pCashSet.AddNew ();
		m_pCashSet.m_cAmount =MoneyLast;
		m_pCashSet.m_cDate =CTime::GetCurrentTime();
		m_pCashSet.Update();
		m_pCashSet.MoveLast ();
		m_pCashSet.Close ();
        theApp.m_db.CommitTrans ();//修改成功了
		}
		CATCH_ALL(e)
		{
			theApp.m_db.Rollback ();
		    MessageBox(L"\n事务处理出错,修改失败!\n",L"错误", MB_ICONSTOP);
			return;
	    }
	    END_CATCH_ALL
		//修改成功了,就要把新的在列表中显示出来,同时去掉旧的
		//先去掉旧的
		m_cOutcomeListCtrl.DeleteItem (nItem);
		//再添加新的
		m_cOutcomeListCtrl.InsertItem(nItem,(CString)dlg.m_sName ,0);
		m_cOutcomeListCtrl.SetItemText (nItem,1,(CString)dlg.m_sSource  );
		m_cOutcomeListCtrl.SetItemText (nItem,2, (CString)dlg.m_sKind );
		s.Format (L"%f",dlg.m_dAmount );
		Length=s.GetLength ();
		s.Delete (Length-4,4);
	    m_cOutcomeListCtrl.SetItemText (nItem,3,s );
		m_cOutcomeListCtrl.SetItemText (nItem,4,FormatDate(dlg.m_tDate ));
		m_cOutcomeListCtrl.SetItemText (nItem,5,(CString)dlg.m_sRemark );
	    s.Format (L"%d",m_iFinanceOutcome_Id );
		m_cOutcomeListCtrl.SetItemText (nItem,6,s);     
	}
}
void CFinanceOutcomeDlg::OnBnClickedFinanceOutcomeUpdateBt()
{
	// TODO: 在此添加控件通知处理程序代码
    Update();
}

void CFinanceOutcomeDlg::Delete ()
{
	POSITION pos = m_cOutcomeListCtrl.GetFirstSelectedItemPosition();
    if (pos == NULL)
	{
		MessageBox(L"\n你没有选中任何一个支出,不可以删除!\n",L"提示",MB_ICONEXCLAMATION);
	}
    else
   {
	   if(MessageBox(L"\n此操作将永久删除该项,确定吗?\n",L"删除提醒",MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2)==IDCANCEL)

		   return ;
	   while (pos)
      {
		  int nItem = m_cOutcomeListCtrl.GetNextSelectedItem(pos);
		  CString str;
		  str="Select * from Outcome order by oDate";
	      m_pSet.Open (AFX_DB_USE_DEFAULT_TYPE,str);
		  //获取该单词
		  int m_iId;
		  m_iId=_ttol(m_cOutcomeListCtrl.GetItemText (nItem,6));
		  m_pSet.m_strFilter.Empty ();

⌨️ 快捷键说明

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