home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv8.zip / VACPP / IBMCPP / samples / DATABASE / STOCK / SOM / CLIENT.CPP < prev    next >
Text File  |  1995-06-06  |  16KB  |  354 lines

  1. //******************************************************************************
  2. //                                                                             *
  3. //COPYRIGHT: Copyright (C) International Business Machines Corp., 1992,1994.   *
  4. //                                                                             *
  5. //DISCLAIMER OF WARRANTIES:                                                    *
  6. //  The following [enclosed] code is sample code created by IBM                *
  7. //  Corporation.  This sample code is not part of any standard IBM product     *
  8. //  and is provided to you solely for the purpose of assisting you in the      *
  9. //  development of your applications.  The code is provided "AS IS",           *
  10. //  without warranty of any kind.  IBM shall not be liable for any damages     *
  11. //  arising out of your use of the sample code, even if they have been         *
  12. //  advised of the possibility of such damages.                                *
  13. //                                                                             *
  14. //******************************************************************************
  15. //******************************************************************************
  16. // File Name: client.cpp                                                       *
  17. //                                                                             *
  18. // Note: This file keeps the SOM program which directly uses the methods from  *
  19. //       SOM IDL CLass Library to connect and disconnect a datastore in DB2/2  *
  20. //       and uses the generated methods to add, update, and retrieve.          *
  21. //                                                                             *
  22. //******************************************************************************
  23. #include <iostream.h>
  24. #include <iomanip.h>
  25. #include "sdsmcon.xh"           // For SOM IDL Datastore Class
  26. #include "sdsexc.xh"            // For SOM Exception Classes
  27. #include "prclisti.xh"          // For SOM IDL generated PriceList Class
  28. #include "inventoi.xh"          // For SOM IDL generated Inventory Class
  29. #include "receivei.xh"          // For SOM IDL generated Receivedorder Class
  30.  
  31. static int exceptionCheck(void); // Routine to check if an exception has occurred.
  32. static int generatePriceList();  // Generate a price list
  33. static int postingInventory();  // update the inventory data with received order
  34.  
  35. static int addReceivedOrder(     // Add a received order to the database
  36.     short  receivedNumberArg,    // received order number
  37.     string prodNumberArg,        // product number
  38.     long    receivedQuantityArg, // recieved quantity
  39.     double  totalCostArg,        // total cost of the order
  40.     string receivedDateArg);     // date of the received order
  41.  
  42. static int addNewItem(           // add a new item to the inventory table
  43.     string prodNumberArg,        // product number
  44.     string prodDescriptionArg,   // product description
  45.     long    onHandQuantityArg,   // on hand quantity
  46.     double  avarageCostArg,      // average cost per unit
  47.     double  listingPriceArg);    // listing price per unit
  48.  
  49. //******************************************************************************
  50. // Static variables                                                            *
  51. //******************************************************************************
  52. enum postedflagValue {NOT_POSTED, POSTED};
  53. Environment                *ev                  = somGetGlobalEnvironment();
  54. DatastoreFactory           *pidFactDS           = DatastoreNewClass(0,0);
  55. PriceListFactory           *priceListFacPtr     = PriceListNewClass(0,0);
  56. ReceivedorderFactory       *receivedOrderFacPtr = ReceivedorderNewClass(0,0);
  57. InventoryFactory           *inventoryFacPtr     = InventoryNewClass(0,0);
  58.  
  59. void main() {
  60.   Datastore                  *dsm       = pidFactDS->create_object(ev);
  61.  
  62.   char *dstoreId;
  63.   double listPrice, aveCost, totalCost;
  64.   int rc;
  65.  
  66.   // Establish connection to the datastore.
  67.   dsm->connect(ev,"BRCHTWO","USERID","PASSWORD");
  68.   rc = exceptionCheck();
  69.   if (rc == 0) {
  70.  
  71.     // Generate a price list from the Price List object class.
  72.     cout << "The following is a price list before update:" << endl; endl;
  73.     rc = generatePriceList();
  74.     if (rc == 0) {
  75.  
  76.       // Add new items to the inventory table.
  77.       rc = addNewItem("HDR0025","Hard Drive 250MD ID", 12, 200.00, 239.45);
  78.       rc += addNewItem("HDR0034","Hard Drive 340MD ID", 40, 220.00, 270.89);
  79.       rc += addNewItem("CPU486a","486SLC-33 TI CPU,AM", 50, 105.45, 139.99);
  80.       rc += addNewItem("CPUPTMa","Pentium 60/66 PCI25", 23, 350.85, 459.50);
  81.  
  82.       // continue if adding new inventory items is OK.
  83.       if (rc == 0) {
  84.  
  85.         // Add new records to the receivedorder table.
  86.         rc = addReceivedOrder(123,"HDR0025", 10, 1800.00, "01/01/1994");
  87.         rc += addReceivedOrder(124,"RAM4-72", 30, 6001.35, "03/01/1994");
  88.         rc += addReceivedOrder(125,"CPUPTMa",  5, 1904.75, "02/01/1994");
  89.         rc += addReceivedOrder(126,"MONAD14", 40, 1538.00, "04/01/1994");
  90.  
  91.         // continue if adding new received orders is OK.
  92.         if (rc == 0) {
  93.  
  94.           // The inventory has to be posted with the new received orders
  95.           rc = postingInventory();
  96.           if (rc == 0) {
  97.  
  98.             // Commit transaction activities after successful posting
  99.             dsm->commit(ev);
  100.             rc = exceptionCheck();
  101.             if (rc == 0) {
  102.  
  103.               cout << endl << endl;
  104.               cout << "The following is an updated price list:" << endl; endl;
  105.  
  106.               // Generate an updated report after posting.
  107.               generatePriceList();
  108.  
  109.             }
  110.  
  111.           } else {
  112.  
  113.             // Rollback transaction activities because of error in posting
  114.             dsm->rollback(ev);
  115.           }
  116.  
  117.         } else {
  118.  
  119.           // Rollback transaction activities because of error in adding receive orders
  120.           dsm->rollback(ev);
  121.         }
  122.       } else {
  123.  
  124.         // Rollback transaction activities because of error in adding new items
  125.         dsm->rollback(ev);
  126.  
  127.       }
  128.     }
  129.  
  130.     // disconnect from the datastore.
  131.     dsm->disconnect(ev);
  132.   }
  133.  
  134.   cout << endl;
  135.   if (rc == 0) {
  136.      cout << "Program completed successfully" << endl;
  137.   } else {
  138.      cout << "Error occured during program excution." << endl;
  139.   } /* endif */
  140.  
  141. }
  142.  
  143. //******************************************************************************
  144. // Function Name: generatePriceList                                            *
  145. // Note : This member function generates a price list for the store.           *
  146. //        The data printed in the list is a subset of the inventory            *
  147. //        database.                                                            *
  148. //******************************************************************************
  149. int generatePriceList() {
  150.   PriceList                      *priceListPtr     = priceListFacPtr->create_object(ev);
  151.   _IDL_SEQUENCE_PersistentObject itemList;
  152.   int rc;
  153.  
  154.   itemList = priceListFacPtr->retrieveAll(ev);
  155.   rc = exceptionCheck();
  156.   if (rc != 0) {
  157.     cout << "Failed: Exception occurs..." << endl;
  158.   } else {
  159.     // loop until the end of the list.
  160.     cout << "Prod. ID   Description            Price " << endl;
  161.     cout << "========   =====================  ===== " << endl;
  162.     for (int j=0; j < sequenceLength(itemList); j++) {
  163.       priceListPtr = (PriceList *) sequenceElement(itemList,j);
  164.       cout << priceListPtr->_get_prodnumber(ev) << ' ';
  165.       cout << priceListPtr->_get_proddescription(ev) << "   ";
  166.       cout << setiosflags(ios::fixed) <<
  167.               setprecision(2) << priceListPtr->_get_listingprice(ev) << endl;
  168.     }
  169.   }
  170.  
  171.   delete priceListPtr;
  172.   return rc;
  173. }
  174.  
  175. //******************************************************************************
  176. // Function Name: postingInventory                                             *
  177. // Note: This member function updates the inventory table with the received    *
  178. //       received order table.                                                 *
  179. //******************************************************************************
  180. int postingInventory() {
  181.   Receivedorder              *receivedOrderPtr = receivedOrderFacPtr->create_object(ev);
  182.   Inventory                  *inventoryPtr     = inventoryFacPtr->create_object(ev);
  183.   _IDL_SEQUENCE_PersistentObject itemList;
  184.   double newAveCost;                      // new average cost after update
  185.   double newListingPrice;                 // new listing price after update
  186.   long   newQuantity;                     // new quantity after update
  187.   char   selectArg[] = "postedflag = 0";  // selection condition
  188.   char * currentProdNumber;
  189.   int i, rc;
  190.  
  191.   itemList = receivedOrderFacPtr->select(ev, selectArg);
  192.   rc = exceptionCheck();
  193.   if (rc != 0) {
  194.     cout << "Error: Exception occurs..." << endl;
  195.   } else {
  196.     for (i = 0, rc = 0; i < sequenceLength(itemList) && rc !=0; i ++) {
  197.       receivedOrderPtr = (Receivedorder *) sequenceElement(itemList,i);
  198.       currentProdNumber = receivedOrderPtr->_get_prodnumber(ev);
  199.       inventoryPtr->_set_prodnumber(ev,currentProdNumber);
  200.       inventoryPtr->retrieve(ev);
  201.  
  202.       // calculate the new quantity, the new average cost, and new listing price
  203.       newQuantity = inventoryPtr->_get_onhandquantity(ev) +
  204.                     receivedOrderPtr->_get_receivedquantity(ev);
  205.       newAveCost  = (inventoryPtr->_get_averagecost(ev) * inventoryPtr->_get_onhandquantity(ev) +
  206.                     receivedOrderPtr->_get_totalcost(ev)) / newQuantity;
  207.       newListingPrice = newAveCost * 1.5;
  208.  
  209.       // update the row with the new data
  210.       inventoryPtr->_set_onhandquantity(ev, newQuantity);
  211.       inventoryPtr->_set_averagecost(ev, newAveCost);
  212.       inventoryPtr->_set_listingprice(ev, newListingPrice);
  213.       inventoryPtr->update(ev);
  214.       rc = exceptionCheck();
  215.  
  216.       // reset the posted flag so that it will not be used again.
  217.       receivedOrderPtr->_set_postedflag(ev, POSTED);
  218.       receivedOrderPtr->update(ev);
  219.       rc = exceptionCheck();
  220.     }
  221.   } /* endif */
  222.  
  223.   delete receivedOrderPtr;
  224.   delete inventoryPtr;
  225.   return rc;
  226.  
  227. }
  228.  
  229. //******************************************************************************
  230. // Function: addReceivedOrder                                                  *
  231. // Note: Whenever an order is received, a new entry is added to the received   *
  232. //       order table                                                           *
  233. //******************************************************************************
  234. int addReceivedOrder(
  235.        short   receivedNumberArg,     //received order number
  236.        char *  prodNumberArg,         // product number
  237.        long    receivedQuantityArg,   // received order quantity
  238.        double  totalCostArg,          // total cost of this order
  239.        char *  receivedDateArg) {     // date of the received order
  240.  
  241.   Receivedorder              *receivedOrderPtr = receivedOrderFacPtr->create_object(ev);
  242.   int rc;
  243.   // Set the attributes
  244.   receivedOrderPtr->_set_postedflag      (ev,NOT_POSTED);
  245.   receivedOrderPtr->_set_prodnumber      (ev,prodNumberArg);
  246.   receivedOrderPtr->_set_receivednumber  (ev,receivedNumberArg);
  247.   receivedOrderPtr->_set_receiveddate    (ev,receivedDateArg);
  248.   receivedOrderPtr->_set_receivedquantity(ev,receivedQuantityArg);
  249.   receivedOrderPtr->_set_totalcost       (ev,totalCostArg);
  250.  
  251.   // add a new row to the table
  252.   receivedOrderPtr->add(ev);
  253.  
  254.   // Check for exception and return a value accordingly.
  255.   rc =exceptionCheck();
  256.  
  257.   delete receivedOrderPtr;
  258.   return rc;
  259. }
  260.  
  261. //******************************************************************************
  262. // Function: addNewItem                                                        *
  263. // Note: This function add a new row to the inventory table                    *
  264. //******************************************************************************
  265. int addNewItem(
  266.        char * prodNumberArg,       // product number
  267.        char * prodDescriptionArg,  // product description
  268.        long   onHandQuantityArg,   // on hand quantity
  269.        double averageCostArg,      // average cost per unit
  270.        double listingPriceArg) {   // listing price per unit
  271.  
  272.   Inventory                  *inventoryPtr     = inventoryFacPtr->create_object(ev);
  273.   int rc;
  274.  
  275.   // Set the attributes
  276.   inventoryPtr->_set_prodnumber      (ev,prodNumberArg);
  277.   inventoryPtr->_set_proddescription (ev,prodDescriptionArg);
  278.   inventoryPtr->_set_onhandquantity  (ev,onHandQuantityArg);
  279.   inventoryPtr->_set_averagecost     (ev,averageCostArg);
  280.   inventoryPtr->_set_listingprice    (ev,listingPriceArg);
  281.  
  282.   // add a new row to the table
  283.   inventoryPtr->add(ev);
  284.  
  285.   // Check for exception and return a value accordingly.
  286.   rc = exceptionCheck();
  287.  
  288.   delete inventoryPtr;
  289.   return rc;
  290. }
  291.  
  292. //******************************************************************************
  293. // Function: exceptionCheck                                                    *
  294. // Note: This function add a new row to the inventory table                    *
  295. //******************************************************************************
  296. int exceptionCheck(void) {
  297.    int rc = 0;
  298.    char *exId;
  299.    POFError *er;
  300.  
  301.    switch (ev->_major) {
  302.    case SYSTEM_EXCEPTION:
  303.       cout << "system exception" << endl;
  304.       rc ++;
  305.       break;
  306.    case USER_EXCEPTION:
  307.       exId = somExceptionId(ev);
  308.       cout << "Exception ID: " << somExceptionId(ev) << endl;
  309.       if (strcmp(exId, ex_POFactory_POFError) == 0) {
  310.         POFactory_POFError *er;
  311.         er = (POFactory_POFError *) somExceptionValue(ev);
  312.         cout<< "error_Id: " << er->error_code << endl;
  313.         cout<< "sqlcode:  " << er->sqlcode << endl;
  314.       } else if (strcmp(exId, ex_PersistentObject_POError) == 0) {
  315.         PersistentObject_POError *er;
  316.         er = (PersistentObject_POError *) somExceptionValue(ev);
  317.         cout<< "error_Id: " << er->error_code << endl;
  318.         cout<< "sqlcode:  " << er->sqlcode << endl;
  319.       } else if (strcmp(exId, ex_DaxExcep_DisconnectError) == 0) {
  320.         DaxExcep_DisconnectError *er;
  321.         er = (DaxExcep_DisconnectError *) somExceptionValue(ev);
  322.         cout<< "Error Id: " << er->error_code << endl;
  323.         cout<< "Error number: " << er->error_number << endl;
  324.       } else if (strcmp(exId,ex_DaxExcep_DatastoreConnectionFailed) == 0) {
  325.         DaxExcep_DatastoreConnectionFailed *er;
  326.         er = (DaxExcep_DatastoreConnectionFailed *) somExceptionValue(ev);
  327.         cout<< "Error Id: " << er->error_code << endl;
  328.         cout<< "Error number: " << er->error_number << endl;
  329.       } else if (strcmp(exId, ex_DaxExcep_DatastoreTypeInvalid) == 0) {
  330.         DaxExcep_DatastoreTypeInvalid *er;
  331.         er = (DaxExcep_DatastoreTypeInvalid *) somExceptionValue(ev);
  332.         cout<< "Error Id: " << er->error_code << endl;
  333.         cout<< "Error number: " << er->error_number << endl;
  334.       } else if (strcmp(exId, ex_DaxExcep_DatastoreConnectionNotOpen) == 0) {
  335.         DaxExcep_DatastoreConnectionNotOpen *er;
  336.         er = (DaxExcep_DatastoreConnectionNotOpen *) somExceptionValue(ev);
  337.         cout<< "Error Id: " << er->error_code << endl;
  338.         cout<< "Error number: " << er->error_number << endl;
  339.       } else if (strcmp(exId, ex_DaxExcep_DatastoreAccessError) == 0) {
  340.         DaxExcep_DatastoreAccessError *er;
  341.         er = (DaxExcep_DatastoreAccessError *) somExceptionValue(ev);
  342.         cout<< "Error Id: " << er->error_code << endl;
  343.         cout<< "Error number: " << er->error_number << endl;
  344.       }
  345.       somExceptionFree(ev);
  346.       rc ++;
  347.       break;
  348.    case NO_EXCEPTION:
  349.       break;
  350.    }
  351.    return rc;
  352. }
  353.  
  354.