设为首页 加入收藏

TOP

21.4.8 存储订单数据
2013-10-07 12:46:24 来源: 作者: 【 】 浏览:74
Tags:21.4.8 存储 订单 数据

21.4.8  存储订单数据

我们不希望在新订单连一条Product Details记录也没有之前,就在Orders表中创建新记录。因此,需要某种方法将CCustomerView对象中累积的数据传递给CProductView对象。做这件事的简单方法是定义一个表示订单的新类。这个类只需要有对应所希望存储的各个数据值的数据成员即可。除了新订单中显然不应该有的发货日期字段以外,这些数据成员与对应COrderSet类中各个字段的数据成员相同。在项目中创建一个新的头文件Order.h,然后添加下面的代码:

  1. // Stores the data for a new order  
  2. #pragma once  
  3.  
  4. class COrder  
  5. {  
  6. public:  
  7. // Data members same as fields in COrderSet  
  8. long m_OrderID;  
  9. CString m_CustomerID;  
  10. long m_EmployeeID;  
  11. CTime m_OrderDate;  
  12. CTime m_RequiredDate;  
  13. long m_ShipVia;  
  14. double m_Freight;  
  15. CString m_ShipName;  
  16. CString m_ShipAddress;  
  17. CString m_ShipCity;  
  18. CString m_ShipRegion;  
  19. CString m_ShipPostalCode;  
  20. CString m_ShipCountry;  
  21.  
  22. // Default constructor  
  23. COrder():  
  24. m_OrderID(0), // Will be set by CCustomerView object  
  25. m_EmployeeID(1),    // Arbitrary employee ID assigned  
  26. m_ShipVia(3), // Arbitrary shipping company  
  27. m_CustomerID(_T("")), m_Freight(0.0), m_ShipName(_T("")),  
  28. m_ShipAddress(_T("")), m_ShipCity(_T("")), m_ShipRegion(_T("")),  
  29. m_ShipPostalCode(_T("")), m_ShipCountry(_T(""))  
  30. {  
  31. SYSTEMTIME Now;  
  32. GetLocalTime(&Now); // Get current time  
  33. m_OrderDate = m_RequiredDate = CTime(Now);  // Set time as today  
  34. }  
  35. }; 

通常,像上面这样使类的所有数据成员都成为public成员不是什么好习惯,但由于Class Wizard生成的记录集类都有public成员,那么在上面的类中使它们成为private成员也得不到多大的好处。

如果给CDBSimpleUpdateDoc类添加一个COrder类型的数据成员m_Order,就能使用该成员给CProductView对象传递订单数据。必须做的就是在Select Products按钮被按下时,使CCustomerView对象加载该数据成员,从而为CProductView对象的挑选做好准备。可以在CCustomerView类中像下面这样实现Select Products按钮的处理程序:

  1. void CCustomerView::OnSelectproducts()  
  2. {  
  3. // Get a pointer to the document  
  4. CDBSimpleUpdateDoc* pDoc =   
  5. static_cast<CDBSimpleUpdateDoc*>(GetDocument());  
  6.  
  7. // Set up order field values from CCustomerSet object  
  8. pDoc->m_Order.m_CustomerID = m_pSet->m_CustomerID;  
  9. pDoc->m_Order.m_ShipAddress = m_pSet->m_Address;  
  10. pDoc-> m_Order.m_ShipCity = m_pSet->m_City;  
  11. pDoc-> m_Order.m_ShipCountry = m_pSet->m_Country;  
  12. pDoc-> m_Order.m_ShipName = m_pSet->m_CompanyName;  
  13. pDoc-> m_Order.m_ShipPostalCode = m_pSet->m_PostalCode;  
  14. pDoc-> m_Order.m_ShipRegion = m_pSet->m_Region;  
  15.  
  16. // Set up order field values from CCustomerView dialog input  
  17. pDoc-> m_Order.m_OrderID = m_NewOrderID; // Generated new ID  
  18. pDoc-> m_Order.m_OrderDate = m_OrderDate;// From order date control  
  19. pDoc-> m_Order.m_RequiredDate = m_RequiredDate;  
  20.                                       // From required date control  
  21.  
  22. static_cast<CMainFrame*>(GetParentFrame())->SelectView(SELECT_PRODUCT);  

这部分代码很简单。只是在从记录集和记录视图对象向Order对象(是文档对象的成员)复制数值而已。

设置日期

CCustomerView对话框上的日期采集器控件有个小问题:对应这两个控件的m_OrderDate和m_RequiredDate变量此刻还没有初始化,因此相应控件一开始不会显示有意义的数值。我们希望最初显示当前日期,因此应该在最初创建视图对象时调用的OnInitialUpdate()成员的末尾,添加一些初始化这两个变量的代码:

  1. void CCustomerView::OnInitialUpdate()  
  2. {  
  3. BeginWaitCursor();  
  4. GetRecordset();  
  5. CRecordView::OnInitialUpdate();  
  6. if (m_pSet->IsOpen())  
  7. {  
  8. CString strTitle = m_pSet->m_pDatabase->GetDatabaseName();  
  9. CString strTable = m_pSet->GetTableName();  
  10. if(!strTable.IsEmpty())  
  11. strTitle += _T(":") + strTable;  
  12. GetDocument()->SetTitle(strTitle);  
  13. }  
  14. EndWaitCursor();  
  15.  
  16. // Initialize time values  
  17. SYSTEMTIME Now;  
  18. GetLocalTime(&Now); // Get current time  
  19. m_OrderDate = m_RequiredDate = CTime(Now);  // Set time as today  

就像在COrder类的构造函数中那样,在这里把两个CTime变量都设置成了当前时间。

现在,CCustomerView对象已经较为完整。该对象可以显示正确的日期,而且可以存储Orders表中某行内所有字段的值,因此下面来解决产品选择问题。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.1.1 添加选项卡控件 下一篇22.1.11 添加第二个对话框(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: