home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 February / PCWK0296.iso / po7_win / object10 / empedvw.cpp < prev    next >
C/C++ Source or Header  |  1994-11-13  |  9KB  |  324 lines

  1. // empedvw.cpp : implementation of the CEmpedtView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "empedt.h"
  6.  
  7. #include "empeddoc.h"
  8. #include "empedvw.h"
  9.  
  10. // symbols for Oracle class library
  11. #ifndef ORACL_ORACLE
  12. #include "oracl.h"
  13. #endif
  14.  
  15. // symbols for connection dialog
  16. #ifndef LOGDLG_ORACLE
  17. #include "logdlg.h"
  18. #endif
  19.  
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char BASED_CODE THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CEmpedtView
  27.  
  28. IMPLEMENT_DYNCREATE(CEmpedtView, CFormView)
  29.  
  30. BEGIN_MESSAGE_MAP(CEmpedtView, CFormView)
  31.     //{{AFX_MSG_MAP(CEmpedtView)
  32.     ON_BN_CLICKED(IDC_FIRST, OnFirst)
  33.     ON_BN_CLICKED(IDC_LAST, OnLast)
  34.     ON_BN_CLICKED(IDC_NEXT, OnNext)
  35.     ON_BN_CLICKED(IDC_PREV, OnPrev)
  36.     ON_BN_CLICKED(IDC_ADDNEW, OnAddnew)
  37.     ON_BN_CLICKED(IDC_DUPLICATE, OnDuplicate)
  38.     ON_BN_CLICKED(IDC_DELETE, OnDelete)
  39.     ON_BN_CLICKED(IDC_CONNECT, OnConnect)
  40.     //}}AFX_MSG_MAP
  41. END_MESSAGE_MAP()
  42.  
  43. /////////////////////////////////////////////////////////////////////////////
  44. // CEmpedtView construction/destruction
  45.  
  46. CEmpedtView::CEmpedtView()
  47.     : CFormView(CEmpedtView::IDD)
  48. {
  49.     //{{AFX_DATA_INIT(CEmpedtView)
  50.         // NOTE: the ClassWizard will add member initialization here
  51.     //}}AFX_DATA_INIT
  52.     // TODO: add construction code here
  53. }
  54.  
  55. CEmpedtView::~CEmpedtView()
  56. {
  57. }
  58.  
  59. void CEmpedtView::DoDataExchange(CDataExchange* pDX)
  60. {
  61.     CFormView::DoDataExchange(pDX);
  62.     //{{AFX_DATA_MAP(CEmpedtView)
  63.         // NOTE: the ClassWizard will add DDX and DDV calls here
  64.     //}}AFX_DATA_MAP
  65. }
  66.  
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CEmpedtView diagnostics
  69.  
  70. #ifdef _DEBUG
  71. void CEmpedtView::AssertValid() const
  72. {
  73.     CFormView::AssertValid();
  74. }
  75.  
  76. void CEmpedtView::Dump(CDumpContext& dc) const
  77. {
  78.     CFormView::Dump(dc);
  79. }
  80.  
  81. CEmpedtDoc* CEmpedtView::GetDocument() // non-debug version is inline
  82. {
  83.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEmpedtDoc)));
  84.     return (CEmpedtDoc*)m_pDocument;
  85. }
  86. #endif //_DEBUG
  87.  
  88. /////////////////////////////////////////////////////////////////////////////
  89. // CEmpedtView message handlers
  90.  
  91. void CEmpedtView::OnFirst()
  92. {
  93.     if (m_empblock.MoveFirst() != OSUCCESS)
  94.         HandleError();    
  95. }
  96.  
  97. void CEmpedtView::OnLast()
  98. {
  99.     if (m_empblock.MoveLast() != OSUCCESS)
  100.         HandleError();    
  101. }
  102.  
  103. void CEmpedtView::OnNext()
  104. {
  105.     if (m_empblock.MoveNext() != OSUCCESS)
  106.         HandleError();    
  107. }
  108.  
  109. void CEmpedtView::OnPrev()
  110. {
  111.     if (m_empblock.MovePrev() != OSUCCESS)
  112.         HandleError();    
  113. }
  114.  
  115. void CEmpedtView::OnAddnew()
  116. {
  117.     if (m_empblock.AddNewRecord() != OSUCCESS)
  118.         HandleError();
  119. }
  120.  
  121. void CEmpedtView::OnDuplicate()
  122. {
  123.     if (m_empblock.DuplicateRecord() != OSUCCESS)
  124.         HandleError();
  125. }
  126.  
  127. void CEmpedtView::OnDelete()
  128. {
  129.     if (m_empblock.DeleteRecord() != OSUCCESS)
  130.         HandleError();
  131. }
  132.  
  133. void CEmpedtView::OnConnect()
  134. {
  135.     // get the default session
  136.     OSession defsess(0);
  137.     
  138.     if (!defsess.IsOpen())
  139.     { // couldn't get default session?  Class library isn't working
  140.         AfxMessageBox("Can't start Oracle class library");
  141.         return;
  142.     }
  143.     
  144.     // get an ODatabase object via the connection dialog
  145.     logdlg connd;
  146.     
  147.     // get a database object
  148.     ODatabase odb = connd.GetLogin(ODATABASE_PARTIAL_INSERT | ODATABASE_EDIT_NOWAIT);
  149.     if (!odb.IsOpen())
  150.     { // didn't get a connection - user must have cancelled
  151.         return;
  152.     }
  153.     
  154.     // we have a valid connection
  155.     
  156.     // enable all the dynaset buttons
  157.     GetDlgItem(IDC_FIRST)->EnableWindow(TRUE);
  158.     GetDlgItem(IDC_PREV)->EnableWindow(TRUE);
  159.     GetDlgItem(IDC_NEXT)->EnableWindow(TRUE);
  160.     GetDlgItem(IDC_LAST)->EnableWindow(TRUE);
  161.     GetDlgItem(IDC_ADDNEW)->EnableWindow(TRUE);
  162.     GetDlgItem(IDC_DUPLICATE)->EnableWindow(TRUE);
  163.     GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);
  164.     
  165.     // disable the connection button
  166.     GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
  167.     
  168.     
  169.     // now set up the bound edit controls
  170.     
  171.     // bind each control to the binder object
  172.     //   when we do this we specify which OBinder the control is bound to
  173.     //   (which implies what dynaset - what records) and the field the
  174.     //   control is bound to.
  175.     m_ename.BindToBinder(&m_empblock, "ename");
  176.     m_empno.BindToBinder(&m_empblock, "empno");
  177.     m_sal.BindToBinder(&m_empblock, "sal");
  178.     m_comm.BindToBinder(&m_empblock, "comm");
  179.     m_job.BindToBinder(&m_empblock, "job");
  180.     m_mgr.BindToBinder(&m_empblock, "mgr");
  181.     m_hiredate.BindToBinder(&m_empblock, "hiredate");
  182.     m_deptno.BindToBinder(&m_empblock, "deptno");
  183.     
  184.     // and we need to tell each bound control what widget it is attached to
  185.     m_ename.BindToControl(this, IDC_ENAME);
  186.     m_empno.BindToControl(this, IDC_EMPNO);
  187.     m_sal.BindToControl(this, IDC_SAL);
  188.     m_comm.BindToControl(this, IDC_COMM);
  189.     m_job.BindToControl(this, IDC_JOB);
  190.     m_mgr.BindToControl(this, IDC_MANAGER);
  191.     m_hiredate.BindToControl(this, IDC_HIREDATE);
  192.     m_deptno.BindToControl(this, IDC_DEPTNO);
  193.     
  194.     // hand a context to the empno edit control
  195.     m_empno.GiveContext((void *) this);
  196.     
  197.     // and start up the managed dynaset
  198.     oresult ores;
  199.     ores = m_empblock.Open(odb, "select * from emp order by empno");
  200.     
  201.     // check for error
  202.     if (ores != OSUCCESS)
  203.     { // we couldn't open the dynaset
  204.         const char *msg;
  205.         if (defsess.ServerErrorNumber() != 0)
  206.         { // we have a server error - tell the user that
  207.             msg = defsess.GetServerErrorText();
  208.         }
  209.         else
  210.         { // no server error - the class library isn't working correctly
  211.             msg = "Class library error when opening dynaset.";
  212.         }
  213.         
  214.         // give the user a message
  215.         AfxMessageBox(msg);
  216.     } 
  217.     
  218.     return;
  219. }
  220.  
  221. void CEmpedtView::HandleError(void)
  222. {
  223.     // there has been an error in an OBinder operation
  224.     //     inform the user
  225.     const char *msg; // message for user
  226.     
  227.     // most likely there is a server error
  228.     
  229.     // get the session
  230.     OSession errsess = m_empblock.GetDatabase().GetSession(); 
  231.     
  232.     // get the server error
  233.     long serr = errsess.ServerErrorNumber();
  234.     if (serr != 0)
  235.     {
  236.         msg = errsess.GetServerErrorText();
  237.     }
  238.     else
  239.     { // not a server error.  the class library detected a problem
  240.         // get the class library error
  241.         long cerr = m_empblock.GetDynaset().ErrorNumber();
  242.         
  243.         if (cerr == OERROR_TEMPFILE || cerr == OERROR_NOBUFMEM || cerr == OERROR_MEMORY)
  244.             msg = "Out of system resources.";
  245.         else if (cerr == OERROR_NOUPDATES)
  246.             msg = "No updates allowed on this table.";
  247.         else
  248.         { // some other error
  249.             msg = "Internal operation error.";
  250.         }
  251.     }
  252.     
  253.     // tell the user
  254.     AfxMessageBox(msg);
  255.     
  256.     return;
  257. }
  258.  
  259. //////////////////////////////////////// OBoundEmpnoEdit ///////////////////////////
  260.  
  261. // routine that is called when a new record is added
  262.  
  263. oresult OBoundEmpnoEdit::PostAdd(void)
  264. {
  265.     // get the current maximum employee id
  266.     ODynaset iddyn(GetDatabase(), "select max(empno) from emp");
  267.     int maxempno;
  268.     iddyn.GetFieldValue(0, &maxempno);
  269.     
  270.     // set the value of the field to the maximum + 1
  271.     // note that we can pass SetValue an integer expression because it expects
  272.     //   an OValue and OValue has an integer constructor
  273.     SetValue(maxempno+1);
  274.     
  275.     // finish up by calling parent's PostAdd method
  276.     return(OBoundEdit::PostAdd());
  277. }
  278.  
  279. // stash the context we're handed
  280. //   note that we're not doing any memory management on the context
  281. void OBoundEmpnoEdit::GiveContext(void *ctxp)
  282. {
  283.     m_ctxp = ctxp;
  284. }
  285.  
  286. //////////////////////////////////////// OBinderEmp ///////////////////////////
  287.  
  288. void OBinderEmp::OnChangedError(void)
  289. {
  290.     // call the parent class routine
  291.     OBinder::OnChangedError();
  292.     
  293.     // there is an error while processing a change message
  294.     const char *msg;
  295.     
  296.     // get the error
  297.     //  NOTE: this won't work if OBinder::OnChangedError wasn't called first!
  298.     long serr; // server error
  299.     long cerr; // class library error
  300.     if (!GetChangedError(&serr, &cerr))
  301.         return;  // there wasn't really an error
  302.     
  303.     // if there is a server error, that is the problem
  304.     if (serr != 0)
  305.         msg = GetDatabase().GetSession().GetServerErrorText();
  306.     else
  307.     { // no server error?  The class library detected a problem
  308.         // the most likely is that the database data has been changed
  309.         //     since we got our copy of the data
  310.         if (cerr == OERROR_DATACHANGE)
  311.             msg = "The data has changed in the database.";
  312.         else
  313.         { // some general error in the class library
  314.           // may be out of memory, out of temp file space, some bug somewhere,...
  315.             msg = "Internal error.";
  316.         }
  317.     }
  318.     
  319.     // tell the user
  320.     AfxMessageBox(msg);
  321.  
  322.     return;         
  323. }
  324.