ClassDlg.cpp
上传用户:sztwq510
上传日期:2013-06-26
资源大小:4045k
文件大小:14k
源码类别:

酒店行业

开发平台:

Java

  1. // ClassDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyPos.h"
  5. #include "ClassDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CClassDlg dialog
  13. extern CMyPosApp theApp;
  14. CClassDlg::CClassDlg(CWnd* pParent /*=NULL*/)
  15. : CDialog(CClassDlg::IDD, pParent)
  16. {
  17. //{{AFX_DATA_INIT(CClassDlg)
  18. m_classname = _T("");
  19. m_radiodiscount = -1;
  20. m_tempid = 0;
  21. //}}AFX_DATA_INIT
  22. }
  23. void CClassDlg::DoDataExchange(CDataExchange* pDX)
  24. {
  25. CDialog::DoDataExchange(pDX);
  26. //{{AFX_DATA_MAP(CClassDlg)
  27. DDX_Control(pDX, IDC_RADIO1_DISCOUNT, m_oRadiodiscount);
  28. DDX_Control(pDX, IDC_EDIT_CLASSNAME, m_oClassname);
  29. DDX_Control(pDX, IDC_TREE_CLASS, m_oTreeclass);
  30. DDX_Text(pDX, IDC_EDIT_CLASSNAME, m_classname);
  31. DDX_Radio(pDX, IDC_RADIO1_DISCOUNT, m_radiodiscount);
  32. DDX_Text(pDX, IDC_TEMPID, m_tempid);
  33. //}}AFX_DATA_MAP
  34. }
  35. BEGIN_MESSAGE_MAP(CClassDlg, CDialog)
  36. //{{AFX_MSG_MAP(CClassDlg)
  37. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_CLASS, OnSelchangedTreeClass)
  38. ON_BN_CLICKED(IDC_BUTTON_ADDSAME, OnButtonAddsame)
  39. ON_BN_CLICKED(IDC_BUTTON_ADDSUB, OnButtonAddsub)
  40. ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
  41. ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CClassDlg message handlers
  46. void CClassDlg::OnSelchangedTreeClass(NMHDR* pNMHDR, LRESULT* pResult) 
  47. {
  48. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  49. CString sql;
  50. CString curtext;
  51. _RecordsetPtr m_pRecordset; //Must define it in function!!!
  52. HTREEITEM hCurItem;
  53. hCurItem=m_oTreeclass.GetSelectedItem ();//Get Current item and its sub items.
  54. curtext=m_oTreeclass.GetItemText(hCurItem);//Read current item text into edit control.
  55. m_classname=curtext;
  56. sql="SELECT * FROM MATERIELCLASS where NAME='"+curtext+"'";
  57. try
  58. {
  59. m_tempid=0;
  60. m_pRecordset.CreateInstance("ADODB.Recordset");
  61. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
  62. if(!m_pRecordset->adoEOF)
  63. {
  64. m_tempid=(long)(m_pRecordset->GetCollect("ID"));
  65. Curpar=VariantToCString(m_pRecordset->GetCollect("PARENT"));
  66. if((float)(m_pRecordset->GetCollect("DISCOUNT"))==0)
  67. m_radiodiscount=0;
  68. if((float)(m_pRecordset->GetCollect("DISCOUNT"))==1)
  69. m_radiodiscount=1;
  70. }
  71. m_pRecordset->Close();
  72. }
  73. catch(_com_error e)///捕捉异常
  74. {
  75.  CString errormessage;
  76.  MessageBox("读取单选按钮出错!",m_classname);
  77. }
  78. UpdateData(false);
  79. *pResult = 0;
  80. }
  81. void CClassDlg::AddSubTree(CString ParTree, HTREEITEM hPartItem)
  82. {
  83. HTREEITEM hCurrent;
  84. CString sql;
  85. CString curID;
  86. _RecordsetPtr m_pTRecordset; //Must define it in function!!!Becourse this is a RECURSION function.
  87. sql="SELECT * FROM MATERIELCLASS where PARENT='";
  88. sql=sql+ParTree+"'";//The 1st time Partree="1".
  89. try
  90. {
  91. m_pTRecordset.CreateInstance("ADODB.Recordset");
  92. m_pTRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
  93. m_pTRecordset->MoveFirst();
  94. if(!m_pTRecordset->adoEOF)
  95. {
  96. while(!m_pTRecordset->adoEOF)
  97. {
  98. hCurrent = m_oTreeclass.InsertItem((LPCTSTR)(_bstr_t)(m_pTRecordset->GetCollect("NAME")), hPartItem, NULL);//Insert an item into current parent.
  99. curID=VariantToCString(m_pTRecordset->GetCollect("ID"));
  100. if (TreeSumRecordCount(curID)>0)
  101. AddSubTree(VariantToCString(m_pTRecordset->GetCollect("ID")),hCurrent);//Recursion.
  102. if (!m_pTRecordset->adoEOF)
  103. m_pTRecordset->MoveNext();
  104. }
  105. }
  106. m_pTRecordset->Close();
  107. }
  108. catch(_com_error e)///捕捉异常
  109. {
  110.  CString errormessage;
  111.  MessageBox("读取类别子树出错!",ParTree);
  112. }
  113. }
  114. void CClassDlg::AddTree()
  115. {
  116. TVINSERTSTRUCT tvInsert;
  117. HTREEITEM hParent;
  118. _RecordsetPtr m_pTRecordset; //Must define it in function!!!Becourse this is a RECURSION function.
  119. CString sroot,sql;
  120. tvInsert.hParent = NULL;
  121. tvInsert.hInsertAfter = NULL;
  122. tvInsert.item.mask = TVIF_TEXT;
  123. sql="SELECT * FROM MATERIELCLASS where ID=1";
  124. try
  125. {
  126. m_pTRecordset.CreateInstance("ADODB.Recordset");
  127. m_pTRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
  128. if(!m_pTRecordset->adoEOF)
  129. sroot=(LPTSTR)(_bstr_t)m_pTRecordset->GetCollect("NAME");//Insert an item into current parent.
  130. m_pTRecordset->Close();
  131. }
  132. catch(_com_error e)///捕捉异常
  133. {
  134. CString errormessage;
  135. errormessage.Format("读取类别树出错:%s",e.ErrorMessage());
  136. AfxMessageBox(errormessage);
  137. }
  138. // tvInsert.item.pszText = _T("root");
  139. if(sroot!="")
  140. {
  141. // tvInsert.item.pszText =_T("");//User this line to give the tree a sum root.
  142. hParent = m_oTreeclass.InsertItem(&tvInsert);//HTREEITEM of root.
  143. // AddSubTree("1",hParent);//Here strChildTree just must not equal "root",can be anyother string.
  144. AddSubTree("RootClass",hParent);//Here strChildTree just must not equal "root",can be anyother string.
  145. }
  146. m_oTreeclass.Expand(hParent,TVE_EXPAND);
  147. }
  148. int CClassDlg::TreeSumRecordCount(CString strFieldValue)
  149. {
  150. int Sum=0;
  151. CString sql;
  152. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  153. sql="SELECT * FROM MATERIELCLASS where PARENT ='";
  154. sql=sql+strFieldValue+"'";
  155. try
  156. {
  157. m_pRecordset.CreateInstance("ADODB.Recordset");
  158. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
  159. if(!m_pRecordset->BOF)//If current record is not the first record.
  160. {
  161. m_pRecordset->MoveFirst ();
  162. while(!m_pRecordset->adoEOF)
  163. {
  164. Sum+=1;
  165. m_pRecordset->MoveNext ();
  166. }
  167. }
  168. m_pRecordset->Close();
  169. }
  170. catch(_com_error e)///捕捉异常
  171. {
  172. CString stemp;
  173. stemp.Format("计算类别总数出错:%s",e.ErrorMessage());
  174. AfxMessageBox(stemp);
  175. }
  176. return Sum;
  177. }
  178. CString CClassDlg::VariantToCString(VARIANT var)
  179. {
  180. CString strValue;
  181. _variant_t var_t;
  182. _bstr_t bst_t;
  183. time_t cur_time;
  184. CTime time_value;
  185. COleCurrency var_currency;
  186. switch(var.vt)
  187. {
  188. case VT_EMPTY:strValue=_T("");break;
  189. case VT_UI1:strValue.Format ("%d",var.bVal);break;
  190. case VT_I2:strValue.Format ("%d",var.iVal );break;
  191. case VT_I4:strValue.Format ("%d",var.lVal);break;
  192. case VT_R4:strValue.Format ("%f",var.fltVal);break;
  193. case VT_R8:strValue.Format ("%f",var.dblVal);break;
  194. case VT_CY:
  195. var_currency=var;
  196. strValue=var_currency.Format(0);
  197. break;
  198. case VT_BSTR:
  199. var_t=var;
  200. bst_t=var_t;
  201. strValue.Format ("%s",(const char*)bst_t);
  202. break;
  203. case VT_NULL:strValue=_T("");break;
  204. case VT_DATE:
  205. cur_time=var.date;
  206. time_value=cur_time;
  207. strValue=time_value.Format("%A,%B%d,%Y");
  208. break;
  209. case VT_BOOL:strValue.Format ("%d",var.boolVal );break;
  210. default:strValue=_T("");break;
  211. }
  212. return strValue;
  213. }
  214. BOOL CClassDlg::OnInitDialog() 
  215. {
  216. CDialog::OnInitDialog();
  217. AddTree();
  218. return TRUE;  // return TRUE unless you set the focus to a control
  219.               // EXCEPTION: OCX Property Pages should return FALSE
  220. }
  221. void CClassDlg::OnButtonAddsame() 
  222. {
  223. CString sql;
  224. CString newclassname,Newpar,snewid;
  225. long lNewID;//Get new record id.
  226. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  227. hParentItem=m_oTreeclass.GetParentItem(m_oTreeclass.GetSelectedItem ());//Get parent item handle.
  228. lNewID=GenNewID();//Call the "GenNewID" function to get a new ID.
  229. snewid.Format("%d",lNewID);
  230. Newpar=Curpar;
  231. newclassname.Format("新类别%d",lNewID);
  232. try
  233. {
  234. _variant_t RecordsAffected;
  235. sql="Insert into MATERIELCLASS (ID,NAME,DISCOUNT,PARENT) VALUES ('"+snewid+"','"+newclassname+"','0','"+Newpar+"')";
  236. if(lNewID==1)
  237. sql="Insert into MATERIELCLASS (ID,NAME,DISCOUNT,PARENT) VALUES (1,'"+newclassname+"','0','RootClass')";
  238. theApp.m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdText);
  239. }
  240. catch(_com_error e)///捕捉异常
  241. {
  242. CString errormessage;
  243. errormessage.Format("增加同级分类出错:%s",e.ErrorMessage());
  244. AfxMessageBox(errormessage);
  245. }
  246. m_oClassname.SetWindowText(newclassname);
  247. m_oTreeclass.InsertItem((LPCTSTR)(_bstr_t)(newclassname), hParentItem, NULL);//Insert an item into current parent.
  248. }
  249. void CClassDlg::OnButtonAddsub() 
  250. {
  251. CString sql;
  252. CString newclassname,Newpar,snewid;
  253. long lNewID;
  254. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  255. hCurrentItem=m_oTreeclass.GetSelectedItem ();//Get current item handle as sub's parent.
  256. lNewID=GenNewID();
  257. snewid.Format("%d",lNewID);
  258. Newpar.Format("%d",m_tempid);
  259. newclassname.Format("新类别%d",lNewID);
  260. try
  261. {
  262. _variant_t RecordsAffected;
  263. sql="Insert into MATERIELCLASS (ID,NAME,DISCOUNT,PARENT) VALUES ('"+snewid+"','"+newclassname+"','0','"+Newpar+"')";
  264. if(lNewID==1)
  265. sql="Insert into MATERIELCLASS (ID,NAME,DISCOUNT,PARENT) VALUES (1,'"+newclassname+"','0','RootClass')";
  266. theApp.m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdText);
  267. }
  268. catch(_com_error e)///捕捉异常
  269. {
  270. CString errormessage;
  271. errormessage.Format("增加下级分类出错:%s",e.ErrorMessage());
  272. AfxMessageBox(errormessage);
  273. }
  274. m_oClassname.SetWindowText(newclassname);
  275. m_oTreeclass.InsertItem((LPCTSTR)(_bstr_t)(newclassname), hCurrentItem, NULL);//Insert an item into current parent.
  276. }
  277. void CClassDlg::OnButtonDel() 
  278. {
  279. CString sql,curID;
  280. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  281. HTREEITEM hCurItem;
  282. hCurItem=m_oTreeclass.GetSelectedItem ();//Get Current item and its sub items.
  283. sql="SELECT * FROM MATERIELCLASS where NAME ='";
  284. sql=sql+m_classname+"'";
  285. if(AfxMessageBox("确定删除此类别吗?",MB_YESNO)==IDYES)
  286. {
  287. try
  288. {
  289. m_pRecordset.CreateInstance("ADODB.Recordset");
  290. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
  291. if(!m_pRecordset->BOF)//If current record is not the first record.
  292. {
  293. curID=VariantToCString(m_pRecordset->GetCollect("ID"));
  294. if(atol(curID)==1)
  295. {
  296. MessageBox("不能删除ID为1的类别!",m_classname);
  297. return;
  298. }
  299. if (TreeSumRecordCount(curID)==0)
  300. {
  301. if(CountMateriel(curID)>0)
  302. MessageBox("此类别下已有商品,不能删除!");
  303. else
  304. {
  305. m_pRecordset->Delete(adAffectCurrent);///删除当前记录
  306. m_oTreeclass.DeleteItem(hCurItem);
  307. }
  308. }
  309. if (TreeSumRecordCount(curID)>0)
  310. MessageBox("不能删除结点类别!",m_classname);
  311. }
  312. m_pRecordset->Update();
  313. m_pRecordset->Close();
  314. }
  315. catch(_com_error e)///捕捉异常
  316. {
  317. CString errormessage;
  318. MessageBox("删除类别出错!",m_classname);
  319. }
  320. }
  321. }
  322. void CClassDlg::OnButtonSave() 
  323. {
  324. CString sql,parent,name,sdiscount;//,stempid
  325. long discount;
  326. UpdateData();
  327. //检查数据完整性
  328. if(m_classname.IsEmpty())
  329. {
  330. AfxMessageBox("类别名称不能为空!");
  331. return;
  332. }
  333. m_oClassname.GetWindowText(name);//Get the current text in edit.
  334. if(bRepeat(name)==TRUE)
  335. {
  336. AfxMessageBox("类别名称重复!请重新输入!");
  337. return;
  338. }
  339. if(AfxMessageBox("确定要保存修改吗?",MB_YESNO)==IDYES)
  340. {
  341. int nDiscount=GetCheckedRadioButton(IDC_RADIO1_DISCOUNT,IDC_RADIO2_DISCOUNT); 
  342. switch(nDiscount)//Get if it is discount.
  343. {
  344. case IDC_RADIO1_DISCOUNT:
  345. discount=0;
  346. break;
  347. case IDC_RADIO2_DISCOUNT:
  348. discount=1;
  349. break;
  350. default:
  351. break;
  352. }
  353. sdiscount.Format("%d",discount);
  354. // stempid.Format("%d",m_tempid);
  355. try
  356. {
  357. _variant_t RecordsAffected;
  358. // sql="Update MATERIELCLASS set NAME='"+name+"',DISCOUNT='"+sdiscount+"' where ID='"+stempid+"'";
  359. sql.Format("Update MATERIELCLASS set NAME='%s',DISCOUNT=%d where ID=%d",name,discount,m_tempid);//Must add''!!!
  360. theApp.m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdText);
  361. hCurrentItem=m_oTreeclass.GetSelectedItem ();//Get current item handle as sub's parent.
  362. m_oTreeclass.SetItemText(hCurrentItem,(LPCTSTR)(_bstr_t)(name));
  363. }
  364. catch(_com_error e)///捕捉异常
  365. {
  366. CString stemp;
  367. stemp.Format("修改类别出错:%s",e.ErrorMessage());//
  368. AfxMessageBox(stemp);
  369. return;
  370. }
  371. }
  372. }
  373. BOOL CClassDlg::bRepeat(CString strFieldValue)
  374. {
  375. CString sql;
  376. BOOL br;
  377. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  378. sql="SELECT * FROM MATERIELCLASS WHERE NAME='";
  379. sql=sql+strFieldValue+"'";
  380. try
  381. m_pRecordset.CreateInstance("ADODB.Recordset");
  382. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  383. if(m_pRecordset->adoEOF)
  384. br=FALSE;
  385. if(!m_pRecordset->adoEOF)
  386. br=TRUE;
  387. m_pRecordset->Close();
  388. }
  389. catch(_com_error e)///捕捉异常
  390. {
  391. CString stemp;
  392. stemp.Format("查找类别名称出错:%s",e.ErrorMessage());
  393. AfxMessageBox(stemp);
  394. }
  395. return br;
  396. }
  397. int CClassDlg::GenNewID()
  398. {
  399. CString sql;
  400. int NewID;
  401. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  402. sql="SELECT Max(ID) FROM MATERIELCLASS";
  403. try
  404. m_pRecordset.CreateInstance("ADODB.Recordset");
  405. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  406. _variant_t vIndex = (long)0;//How to get field value in only 1 record and 1 field condition.
  407. _variant_t vtemp = m_pRecordset->GetCollect(vIndex);
  408. if(vtemp.lVal>0) 
  409. NewID =(long)(m_pRecordset->GetCollect(vIndex))+1;///取得第一个字段的值(MAX ID)加1后放入id变量.
  410. else
  411. NewID=1;
  412. m_pRecordset->Close();
  413. }
  414. catch(_com_error e)///捕捉异常
  415. {
  416. CString stemp;
  417. stemp.Format("获取类别ID最大值出错:%s",e.ErrorMessage());
  418. AfxMessageBox(stemp);
  419. }
  420. return NewID;
  421. }
  422. int CClassDlg::CountMateriel(CString sclassid)
  423. {
  424. CString sql;
  425. int ncount;
  426. _RecordsetPtr m_pRecordset; //Must define it in function!!!!
  427. sql="SELECT count(*) as XXX FROM MATERIEL where classid="+sclassid+"";
  428. try
  429. m_pRecordset.CreateInstance("ADODB.Recordset");
  430. m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  431. ncount =(long)m_pRecordset->GetCollect("XXX");
  432. m_pRecordset->Close();
  433. }
  434. catch(_com_error e)///捕捉异常
  435. {
  436. CString stemp;
  437. stemp.Format("计算类别下商品数量出错:%s",e.ErrorMessage());
  438. AfxMessageBox(stemp);
  439. }
  440. return ncount;
  441. }