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 >
Wrap
Text File
|
1995-06-06
|
16KB
|
354 lines
//******************************************************************************
// *
//COPYRIGHT: Copyright (C) International Business Machines Corp., 1992,1994. *
// *
//DISCLAIMER OF WARRANTIES: *
// The following [enclosed] code is sample code created by IBM *
// Corporation. This sample code is not part of any standard IBM product *
// and is provided to you solely for the purpose of assisting you in the *
// development of your applications. The code is provided "AS IS", *
// without warranty of any kind. IBM shall not be liable for any damages *
// arising out of your use of the sample code, even if they have been *
// advised of the possibility of such damages. *
// *
//******************************************************************************
//******************************************************************************
// File Name: client.cpp *
// *
// Note: This file keeps the SOM program which directly uses the methods from *
// SOM IDL CLass Library to connect and disconnect a datastore in DB2/2 *
// and uses the generated methods to add, update, and retrieve. *
// *
//******************************************************************************
#include <iostream.h>
#include <iomanip.h>
#include "sdsmcon.xh" // For SOM IDL Datastore Class
#include "sdsexc.xh" // For SOM Exception Classes
#include "prclisti.xh" // For SOM IDL generated PriceList Class
#include "inventoi.xh" // For SOM IDL generated Inventory Class
#include "receivei.xh" // For SOM IDL generated Receivedorder Class
static int exceptionCheck(void); // Routine to check if an exception has occurred.
static int generatePriceList(); // Generate a price list
static int postingInventory(); // update the inventory data with received order
static int addReceivedOrder( // Add a received order to the database
short receivedNumberArg, // received order number
string prodNumberArg, // product number
long receivedQuantityArg, // recieved quantity
double totalCostArg, // total cost of the order
string receivedDateArg); // date of the received order
static int addNewItem( // add a new item to the inventory table
string prodNumberArg, // product number
string prodDescriptionArg, // product description
long onHandQuantityArg, // on hand quantity
double avarageCostArg, // average cost per unit
double listingPriceArg); // listing price per unit
//******************************************************************************
// Static variables *
//******************************************************************************
enum postedflagValue {NOT_POSTED, POSTED};
Environment *ev = somGetGlobalEnvironment();
DatastoreFactory *pidFactDS = DatastoreNewClass(0,0);
PriceListFactory *priceListFacPtr = PriceListNewClass(0,0);
ReceivedorderFactory *receivedOrderFacPtr = ReceivedorderNewClass(0,0);
InventoryFactory *inventoryFacPtr = InventoryNewClass(0,0);
void main() {
Datastore *dsm = pidFactDS->create_object(ev);
char *dstoreId;
double listPrice, aveCost, totalCost;
int rc;
// Establish connection to the datastore.
dsm->connect(ev,"BRCHTWO","USERID","PASSWORD");
rc = exceptionCheck();
if (rc == 0) {
// Generate a price list from the Price List object class.
cout << "The following is a price list before update:" << endl; endl;
rc = generatePriceList();
if (rc == 0) {
// Add new items to the inventory table.
rc = addNewItem("HDR0025","Hard Drive 250MD ID", 12, 200.00, 239.45);
rc += addNewItem("HDR0034","Hard Drive 340MD ID", 40, 220.00, 270.89);
rc += addNewItem("CPU486a","486SLC-33 TI CPU,AM", 50, 105.45, 139.99);
rc += addNewItem("CPUPTMa","Pentium 60/66 PCI25", 23, 350.85, 459.50);
// continue if adding new inventory items is OK.
if (rc == 0) {
// Add new records to the receivedorder table.
rc = addReceivedOrder(123,"HDR0025", 10, 1800.00, "01/01/1994");
rc += addReceivedOrder(124,"RAM4-72", 30, 6001.35, "03/01/1994");
rc += addReceivedOrder(125,"CPUPTMa", 5, 1904.75, "02/01/1994");
rc += addReceivedOrder(126,"MONAD14", 40, 1538.00, "04/01/1994");
// continue if adding new received orders is OK.
if (rc == 0) {
// The inventory has to be posted with the new received orders
rc = postingInventory();
if (rc == 0) {
// Commit transaction activities after successful posting
dsm->commit(ev);
rc = exceptionCheck();
if (rc == 0) {
cout << endl << endl;
cout << "The following is an updated price list:" << endl; endl;
// Generate an updated report after posting.
generatePriceList();
}
} else {
// Rollback transaction activities because of error in posting
dsm->rollback(ev);
}
} else {
// Rollback transaction activities because of error in adding receive orders
dsm->rollback(ev);
}
} else {
// Rollback transaction activities because of error in adding new items
dsm->rollback(ev);
}
}
// disconnect from the datastore.
dsm->disconnect(ev);
}
cout << endl;
if (rc == 0) {
cout << "Program completed successfully" << endl;
} else {
cout << "Error occured during program excution." << endl;
} /* endif */
}
//******************************************************************************
// Function Name: generatePriceList *
// Note : This member function generates a price list for the store. *
// The data printed in the list is a subset of the inventory *
// database. *
//******************************************************************************
int generatePriceList() {
PriceList *priceListPtr = priceListFacPtr->create_object(ev);
_IDL_SEQUENCE_PersistentObject itemList;
int rc;
itemList = priceListFacPtr->retrieveAll(ev);
rc = exceptionCheck();
if (rc != 0) {
cout << "Failed: Exception occurs..." << endl;
} else {
// loop until the end of the list.
cout << "Prod. ID Description Price " << endl;
cout << "======== ===================== ===== " << endl;
for (int j=0; j < sequenceLength(itemList); j++) {
priceListPtr = (PriceList *) sequenceElement(itemList,j);
cout << priceListPtr->_get_prodnumber(ev) << ' ';
cout << priceListPtr->_get_proddescription(ev) << " ";
cout << setiosflags(ios::fixed) <<
setprecision(2) << priceListPtr->_get_listingprice(ev) << endl;
}
}
delete priceListPtr;
return rc;
}
//******************************************************************************
// Function Name: postingInventory *
// Note: This member function updates the inventory table with the received *
// received order table. *
//******************************************************************************
int postingInventory() {
Receivedorder *receivedOrderPtr = receivedOrderFacPtr->create_object(ev);
Inventory *inventoryPtr = inventoryFacPtr->create_object(ev);
_IDL_SEQUENCE_PersistentObject itemList;
double newAveCost; // new average cost after update
double newListingPrice; // new listing price after update
long newQuantity; // new quantity after update
char selectArg[] = "postedflag = 0"; // selection condition
char * currentProdNumber;
int i, rc;
itemList = receivedOrderFacPtr->select(ev, selectArg);
rc = exceptionCheck();
if (rc != 0) {
cout << "Error: Exception occurs..." << endl;
} else {
for (i = 0, rc = 0; i < sequenceLength(itemList) && rc !=0; i ++) {
receivedOrderPtr = (Receivedorder *) sequenceElement(itemList,i);
currentProdNumber = receivedOrderPtr->_get_prodnumber(ev);
inventoryPtr->_set_prodnumber(ev,currentProdNumber);
inventoryPtr->retrieve(ev);
// calculate the new quantity, the new average cost, and new listing price
newQuantity = inventoryPtr->_get_onhandquantity(ev) +
receivedOrderPtr->_get_receivedquantity(ev);
newAveCost = (inventoryPtr->_get_averagecost(ev) * inventoryPtr->_get_onhandquantity(ev) +
receivedOrderPtr->_get_totalcost(ev)) / newQuantity;
newListingPrice = newAveCost * 1.5;
// update the row with the new data
inventoryPtr->_set_onhandquantity(ev, newQuantity);
inventoryPtr->_set_averagecost(ev, newAveCost);
inventoryPtr->_set_listingprice(ev, newListingPrice);
inventoryPtr->update(ev);
rc = exceptionCheck();
// reset the posted flag so that it will not be used again.
receivedOrderPtr->_set_postedflag(ev, POSTED);
receivedOrderPtr->update(ev);
rc = exceptionCheck();
}
} /* endif */
delete receivedOrderPtr;
delete inventoryPtr;
return rc;
}
//******************************************************************************
// Function: addReceivedOrder *
// Note: Whenever an order is received, a new entry is added to the received *
// order table *
//******************************************************************************
int addReceivedOrder(
short receivedNumberArg, //received order number
char * prodNumberArg, // product number
long receivedQuantityArg, // received order quantity
double totalCostArg, // total cost of this order
char * receivedDateArg) { // date of the received order
Receivedorder *receivedOrderPtr = receivedOrderFacPtr->create_object(ev);
int rc;
// Set the attributes
receivedOrderPtr->_set_postedflag (ev,NOT_POSTED);
receivedOrderPtr->_set_prodnumber (ev,prodNumberArg);
receivedOrderPtr->_set_receivednumber (ev,receivedNumberArg);
receivedOrderPtr->_set_receiveddate (ev,receivedDateArg);
receivedOrderPtr->_set_receivedquantity(ev,receivedQuantityArg);
receivedOrderPtr->_set_totalcost (ev,totalCostArg);
// add a new row to the table
receivedOrderPtr->add(ev);
// Check for exception and return a value accordingly.
rc =exceptionCheck();
delete receivedOrderPtr;
return rc;
}
//******************************************************************************
// Function: addNewItem *
// Note: This function add a new row to the inventory table *
//******************************************************************************
int addNewItem(
char * prodNumberArg, // product number
char * prodDescriptionArg, // product description
long onHandQuantityArg, // on hand quantity
double averageCostArg, // average cost per unit
double listingPriceArg) { // listing price per unit
Inventory *inventoryPtr = inventoryFacPtr->create_object(ev);
int rc;
// Set the attributes
inventoryPtr->_set_prodnumber (ev,prodNumberArg);
inventoryPtr->_set_proddescription (ev,prodDescriptionArg);
inventoryPtr->_set_onhandquantity (ev,onHandQuantityArg);
inventoryPtr->_set_averagecost (ev,averageCostArg);
inventoryPtr->_set_listingprice (ev,listingPriceArg);
// add a new row to the table
inventoryPtr->add(ev);
// Check for exception and return a value accordingly.
rc = exceptionCheck();
delete inventoryPtr;
return rc;
}
//******************************************************************************
// Function: exceptionCheck *
// Note: This function add a new row to the inventory table *
//******************************************************************************
int exceptionCheck(void) {
int rc = 0;
char *exId;
POFError *er;
switch (ev->_major) {
case SYSTEM_EXCEPTION:
cout << "system exception" << endl;
rc ++;
break;
case USER_EXCEPTION:
exId = somExceptionId(ev);
cout << "Exception ID: " << somExceptionId(ev) << endl;
if (strcmp(exId, ex_POFactory_POFError) == 0) {
POFactory_POFError *er;
er = (POFactory_POFError *) somExceptionValue(ev);
cout<< "error_Id: " << er->error_code << endl;
cout<< "sqlcode: " << er->sqlcode << endl;
} else if (strcmp(exId, ex_PersistentObject_POError) == 0) {
PersistentObject_POError *er;
er = (PersistentObject_POError *) somExceptionValue(ev);
cout<< "error_Id: " << er->error_code << endl;
cout<< "sqlcode: " << er->sqlcode << endl;
} else if (strcmp(exId, ex_DaxExcep_DisconnectError) == 0) {
DaxExcep_DisconnectError *er;
er = (DaxExcep_DisconnectError *) somExceptionValue(ev);
cout<< "Error Id: " << er->error_code << endl;
cout<< "Error number: " << er->error_number << endl;
} else if (strcmp(exId,ex_DaxExcep_DatastoreConnectionFailed) == 0) {
DaxExcep_DatastoreConnectionFailed *er;
er = (DaxExcep_DatastoreConnectionFailed *) somExceptionValue(ev);
cout<< "Error Id: " << er->error_code << endl;
cout<< "Error number: " << er->error_number << endl;
} else if (strcmp(exId, ex_DaxExcep_DatastoreTypeInvalid) == 0) {
DaxExcep_DatastoreTypeInvalid *er;
er = (DaxExcep_DatastoreTypeInvalid *) somExceptionValue(ev);
cout<< "Error Id: " << er->error_code << endl;
cout<< "Error number: " << er->error_number << endl;
} else if (strcmp(exId, ex_DaxExcep_DatastoreConnectionNotOpen) == 0) {
DaxExcep_DatastoreConnectionNotOpen *er;
er = (DaxExcep_DatastoreConnectionNotOpen *) somExceptionValue(ev);
cout<< "Error Id: " << er->error_code << endl;
cout<< "Error number: " << er->error_number << endl;
} else if (strcmp(exId, ex_DaxExcep_DatastoreAccessError) == 0) {
DaxExcep_DatastoreAccessError *er;
er = (DaxExcep_DatastoreAccessError *) somExceptionValue(ev);
cout<< "Error Id: " << er->error_code << endl;
cout<< "Error number: " << er->error_number << endl;
}
somExceptionFree(ev);
rc ++;
break;
case NO_EXCEPTION:
break;
}
return rc;
}