?? dlgmodify.cpp
字號:
// DlgModify.cpp : implementation file
//
#include "stdafx.h"
#include "ShoolCard.h"
#include "DlgModify.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "Card.h"
#include "Config.h"
#include "Global.h"
#include "DlgModifyFee.h"
//全局變量
extern CConfig gConfig;
extern CDatabase gDatabase;
/////////////////////////////////////////////////////////////////////////////
// CDlgModify dialog
CDlgModify::CDlgModify(CWnd* pParent /*=NULL*/)
: CDialog(CDlgModify::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgModify)
m_CardId = _T("");
m_Time = 0;
//}}AFX_DATA_INIT
}
void CDlgModify::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgModify)
DDX_Control(pDX, IDC_LIST1, m_ListControl);
DDX_Control(pDX, IDC_MSCOMM1, m_ComPort);
DDX_Text(pDX, IDC_EDIT_CARDID, m_CardId);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_Time);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgModify, CDialog)
//{{AFX_MSG_MAP(CDlgModify)
ON_WM_SHOWWINDOW()
ON_WM_TIMER()
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER1, OnDatetimechangeDatetimepicker1)
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
ON_BN_CLICKED(IDC_BUTTON_MODIFY, OnButtonModify)
ON_WM_CLOSE()
ON_NOTIFY(DTN_CLOSEUP, IDC_DATETIMEPICKER1, OnCloseupDatetimepicker1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgModify message handlers
void CDlgModify::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
//
m_Card.m_pDatabase = &gDatabase;
m_CardUse.m_pDatabase = &gDatabase;
//打開串口
if (!m_ComPort.GetPortOpen())
{
try
{
short int nComPort = CGlobal::ComStrToInt(gConfig.Port);
m_ComPort.SetCommPort(nComPort);
CString strSetting = gConfig.Speed + ','
+gConfig.CheckBit.GetAt(0) + ','
+gConfig.DataBit + ','
+gConfig.StopBit;
m_ComPort.SetSettings(strSetting);
m_ComPort.SetPortOpen(true);
}
catch(CException ee)
{
MessageBox("串口不能打開,請檢查串口的配置!");
return;
}
}
//設置時間消息
m_Timer = SetTimer(1000,1000,0);
//設置timepicker 的當前時間
m_Time = CTime::GetCurrentTime();
UpdateData(VAR2CON);//
//初始化listview的表頭
InitListView();
//初始化其他數據
OnCloseupDatetimepicker1(NULL,NULL);
}
void CDlgModify::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CByteArray mByteAry;
CByteArray mIn;
//構造上位機報文
mByteAry.SetSize(5);
mByteAry.SetAt(0,0x0f);
mByteAry.SetAt(1,0xf0);
mByteAry.SetAt(2,0x5);
mByteAry.SetAt(3,0x1);
mByteAry.SetAt(4,CGlobal::CalCheck(&mByteAry,0,3));
//發讀第一區的命令
m_ComPort.SetOutput(COleVariant(mByteAry));
//等待讀卡機的應答信息
Sleep(60);
//讀串口信息
if (m_ComPort.GetInBufferCount() != 13)
{
//下位機不應答,表示沒有卡放入
m_CardId = "00001";
//更新界面
CWnd *pWnd = GetDlgItem(IDC_EDIT_CARDID);
pWnd->SetWindowText(m_CardId);
return;
}
//將下位機報文接受到緩沖區
mIn.SetSize(13);
COleVariant olearray = m_ComPort.GetInput();
for(int i=0;i<13;i++)
mIn.SetAt(i,((unsigned char *)olearray.parray->pvData)[i]);
//檢查校驗位
if(!CGlobal::IsArrayValid(&mIn)) return;
//從應答的報文中解析卡號
CString strCardId = "";
strCardId += (char)mIn.GetAt(4);
strCardId += (char)mIn.GetAt(5);
strCardId += (char)mIn.GetAt(6);
strCardId += (char)mIn.GetAt(7);
strCardId += (char)mIn.GetAt(8);
////在用戶界面中顯示卡號
CWnd *pWnd = GetDlgItem(IDC_EDIT_CARDID);
pWnd->SetWindowText(strCardId);
pWnd->SetFocus();
//調用基類處理函數
CDialog::OnTimer(nIDEvent);
}
void CDlgModify::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
//*pResult = 0;
}
void CDlgModify::OnButtonDelete()
{
// TODO: Add your control notification handler code here
UpdateData(CON2VAR);
//調試使用
ASSERT(m_CardUse.IsOpen());
//獲取用戶選擇的卡使用記錄
int nIndex = m_ListControl.GetNextItem(-1, LVNI_SELECTED);
if (nIndex < 0)
{
MessageBox("請選擇要刪除的消費記錄!");
return;
}
//m_CardUse.m_pDatabase = &gDatabase;
gDatabase.BeginTrans();
m_CardUse.MoveFirst();
m_CardUse.Move(nIndex);
//保存數據
double mMoney = m_CardUse.m_money;
m_CardUse.Delete();
//m_Card.m_pDatabase = &gDatabase;
m_Card.m_strFilter = "card_id = '" + m_CardId + "'";
if(m_Card.IsOpen()) m_Card.Close();
//重新獲卡的取信息
m_Card.Open();
ASSERT(m_Card.GetRecordCount() == 1);
m_Card.Edit();
//將多余的消費金額重新寫入卡
m_Card.m_money = m_Card.m_money + mMoney;
m_Card.Update();
//同步數據庫中的金額和卡中的金額
if(this->WriteMoney(m_Card.m_money) < 0 )
{
MessageBox("讀寫卡錯誤,數據修改失敗!");
gDatabase.Rollback();
//用后臺數據更新前臺界面
OnCloseupDatetimepicker1(NULL,NULL);
return;
}
//提交事務
gDatabase.CommitTrans();
MessageBox("錯誤修改操作成功!");
//用后臺數據更新前臺界面
OnCloseupDatetimepicker1(NULL,NULL);
}
void CDlgModify::OnButtonModify()
{
UpdateData(CON2VAR);
//調試使用
ASSERT(m_CardUse.IsOpen());
//獲取用戶選擇的卡使用記錄
int nIndex = m_ListControl.GetNextItem(-1, LVNI_SELECTED);
if (nIndex < 0)
{
MessageBox("請選擇要刪除的消費記錄!");
return;
}
m_CardUse.MoveFirst();
m_CardUse.Move(nIndex);
//保存數據
double mMoney = m_CardUse.m_money;
//顯示修改費用窗體
CDlgModifyFee dlg;
dlg.m_ErrorMoney = mMoney;
dlg.m_RealMoney = 0.0;
//更新修改費用窗體界面
//dlg.UpdateData(VAR2CON);
if(dlg.DoModal() == IDCANCEL) return;
//dlg.UpdateData(CON2VAR);
//m_CardUse.m_pDatabase = &gDatabase;
gDatabase.BeginTrans();
m_CardUse.Edit();
m_CardUse.m_money = dlg.m_RealMoney;
m_CardUse.Update();
m_Card.m_strFilter = "card_id = '" + m_CardId + "'";
//m_CardUse.m_pDatabase = &gDatabase;
if(m_Card.IsOpen()) m_Card.Close();
//重新獲卡的取信息
m_Card.Open();
ASSERT(m_Card.GetRecordCount() == 1);
m_Card.Edit();
//將多余的消費金額重新寫入卡
m_Card.m_money = m_Card.m_money + dlg.m_ErrorMoney - dlg.m_RealMoney;
m_Card.Update();
//同步數據庫中的金額和卡中的金額
if(this->WriteMoney(m_Card.m_money) < 0 )
{
MessageBox("讀寫卡錯誤,數據修改失??!");
gDatabase.Rollback();
//用后臺數據更新前臺界面
OnCloseupDatetimepicker1(NULL,NULL);
return;
}
//提交事務
gDatabase.CommitTrans();
MessageBox("錯誤修改操作成功!");
//用后臺數據更新前臺界面
OnCloseupDatetimepicker1(NULL,NULL);
}
void CDlgModify::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(m_Timer) KillTimer(m_Timer);
if(m_ComPort.GetPortOpen()) m_ComPort.SetPortOpen(false);
if(m_CardUse.IsOpen()) m_CardUse.Close();
CDialog::OnClose();
}
void CDlgModify::OnCloseupDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UpdateData(CON2VAR);
CString str;
str.Format("%d-%d-%d",m_Time.GetYear(),m_Time.GetMonth(),m_Time.GetDay());
m_CardUse.m_strFilter = "use_date >= '" + str + "'";
CTime tmpTime(m_Time.GetYear(),
m_Time.GetMonth(),
m_Time.GetDay()+1,0,0,0);
str.Format("%d-%d-%d",tmpTime.GetYear(),tmpTime.GetMonth(),tmpTime.GetDay());
m_CardUse.m_strFilter = m_CardUse.m_strFilter + " " + "and use_date < '" + str + "'";
m_CardUse.m_strFilter = m_CardUse.m_strFilter + " " + " and card_id = '" + m_CardId + "'";
if(m_CardUse.IsOpen()) m_CardUse.Close();
if(!m_CardUse.Open())
{
MessageBox("數據表不能打開!");
return;
}
//用后臺數據更新前臺界面
FillListView();
ConfigButtons();
//*pResult = 0;
}
void CDlgModify::FillListView()
{
ASSERT(m_CardUse.IsOpen());
//清除原來的數據
m_ListControl.DeleteAllItems();
if(m_CardUse.GetRecordCount() <= 0) return;
int nRow = 0;
m_CardUse.MoveFirst();
while(!m_CardUse.IsEOF())
{
m_ListControl.InsertItem(nRow,"");
m_ListControl.SetItemText(nRow,0,m_CardUse.m_card_id);
CString str;
str.Format("%f",m_CardUse.m_money);
m_ListControl.SetItemText(nRow,1,str);
str.Format("%d-%d-%d"
,m_CardUse.m_use_date.GetYear()
,m_CardUse.m_use_date.GetMonth()
,m_CardUse.m_use_date.GetDay());
m_ListControl.SetItemText(nRow,2,str);
//移動數據庫游標
nRow++;
m_CardUse.MoveNext();
}
}
void CDlgModify::InitListView()
{
m_ListControl.InsertColumn(0,"卡號");
m_ListControl.InsertColumn(1,"消費金額");
m_ListControl.InsertColumn(2,"消費日期");
m_ListControl.SetColumnWidth(0,100);
m_ListControl.SetColumnWidth(1,150);
m_ListControl.SetColumnWidth(2,150);
}
void CDlgModify::ConfigButtons()
{
//?m_ListControl.Get
if(m_CardUse.GetRecordCount() < 1)
{
CWnd *pWnd = GetDlgItem(IDC_BUTTON_DELETE);
pWnd->EnableWindow(false);
pWnd = GetDlgItem(IDC_BUTTON_MODIFY);
ASSERT(pWnd != NULL);
pWnd->EnableWindow(false);
}
else
{
CWnd *pWnd = GetDlgItem(IDC_BUTTON_DELETE);
pWnd->EnableWindow(true);
pWnd = GetDlgItem(IDC_BUTTON_MODIFY);
ASSERT(pWnd != NULL);
pWnd->EnableWindow(true);
}
}
short int CDlgModify::WriteMoney(float AMoney)
{
//for debug
return 1;
//======================串口操作==================
CByteArray mByteAry;
CByteArray mIn;
//構造上位機報文
mByteAry.SetSize(13);
mByteAry.SetAt(0,0x0f);
mByteAry.SetAt(1,0xf0);
mByteAry.SetAt(2,0x03);//寫命令
mByteAry.SetAt(3,0x03);//第3區
char chMoney[6];
//轉換為整數
int nMoney = AMoney * 100;
//取出每一位
for(int i=0 ;i<6 ;i++)
{
chMoney[i] = nMoney % 10;
nMoney = nMoney /10;
}
//卡中的金額數據寫入
mByteAry.SetAt(4,CGlobal::Encrypt(chMoney[0]));
mByteAry.SetAt(5,CGlobal::Encrypt(chMoney[1]));
mByteAry.SetAt(6,CGlobal::Encrypt(chMoney[2]));
mByteAry.SetAt(7,CGlobal::Encrypt(chMoney[3]));
mByteAry.SetAt(8,CGlobal::Encrypt(chMoney[4]));
mByteAry.SetAt(9,CGlobal::Encrypt(chMoney[5]));
mByteAry.SetAt(10,CGlobal::CalMoneyCheck(&mByteAry,4,9));
mByteAry.SetAt(11,0xff);//數據區以FF結尾
//計算報文的校驗位
mByteAry.SetAt(12,CGlobal::CalCheck(&mByteAry,0,12));
//發讀第一區的命令
m_ComPort.SetOutput(COleVariant(mByteAry));
//等待讀卡機的應答信息
Sleep(60);
//讀串口信息
if (m_ComPort.GetInBufferCount() != 6)
{
return -2;
}
//將下位機報文接受到緩沖區
mIn.SetSize(13);
COleVariant olearray = m_ComPort.GetInput();
for(i=0;i<13;i++)
mIn.SetAt(i,((unsigned char *)olearray.parray->pvData)[i]);
//檢查校驗位
if(!CGlobal::IsArrayValid(&mIn) || (mIn.GetAt(4) != 0x0f))
return -3;
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -