![]() |
XML-Based Applications: |
|
Introduction to Serialization |
|
||
|
XML has become a platform of choice to create data-based applications. For example, if may employees are working on the same application they share, you can create a common form they would use to create their work orders and save them to a common repository. You can make this possible for almost any type of application. We will apply this concept to our Georgetown Cleaning Services, which is an application used by a dry cleaning store. In this application, a form will be presented to the user who, after processing an order, will click the Save button. The order will be saved to a common file. Eventually, all orders would be saved there and a user will be able to review all orders from that common file.
|
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Women Suit Dress Regular Skirt Skirt With Hook Men's Suit 2Pc Men's Suit 3Pc Sweaters Silk Shirt Tie Coat Jacket Swede |
private: System::Void dtpTimeLeft_ValueChanged(System::Object * sender, System::EventArgs * e)
{
DateTime dateLeft = this->dtpDateLeft->Value;
DateTime timeLeft = this->dtpTimeLeft->Value;
DateTime time9AM = DateTime(timeLeft.Year, timeLeft.Month, timeLeft.Day, 9, 0, 0);
// If the customer leaves clothes before 9AM...
if( timeLeft <= time9AM )
{
// ... then they should be ready the same day after 5PM
this->dtpDateExpected->Value = dateLeft;
this->dtpTimeExpected->Value = DateTime(dateLeft.Year, dateLeft.Month, dateLeft.Day, 17, 0, 0);
}
else
{
// If the clothese were left after 9AM, they will be availablethe following morning at 8AM
this->dtpDateExpected->Value = DateTime(dateLeft.Year, dateLeft.Month, dateLeft.Day + 1);
this->dtpTimeExpected->Value = DateTime(dateLeft.Year, dateLeft.Month, dateLeft.Day + 1, 8, 0, 0);
}
}
|
void CalculateTotal(void)
{
double unitPriceShirts, unitPricePants, unitPriceItem1,
unitPriceItem2, unitPriceItem3, unitPriceItem4;
double subTotalShirts, subTotalPants, subTotalItem1,
subTotalItem2, subTotalItem3, subTotalItem4;
int qtyShirts = 1, qtyPants = 1, qtyItem1 = 1,
qtyItem2 = 1, qtyItem3 = 1, qtyItem4 = 4;
double cleaningTotal, taxRate, taxAmount, netPrice;
// Retrieve the unit price of this item
// Just in case the user types an invalid value, we are using a try...catch
try {
unitPriceShirts = this->txtShirtsUnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price of shirts is not valid"
S"\nPlease try again");
}
// Retrieve the number of this item
// Just in case the user types an invalid value, we are using a try...catch
try {
qtyShirts = this->txtShirtsQuantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the number of shirts is not valid"
S"\nPlease try again");
}
try {
unitPricePants = this->txtPantsUnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price of pants is not valid"
S"\nPlease try again");
}
try {
qtyPants = this->txtPantsQuantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the number of pants is not valid"
S"\nPlease try again");
}
try {
unitPriceItem1 = this->txtItem1UnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price is not valid"
S"\nPlease try again");
}
try {
qtyItem1 = this->txtItem1Quantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered is not valid"
S"\nPlease try again");
}
try {
unitPriceItem2 = this->txtItem2UnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price is not valid"
S"\nPlease try again");
}
try {
qtyItem2 = this->txtItem2Quantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered is not valid"
S"\nPlease try again");
}
try {
unitPriceItem3 = this->txtItem3UnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price is not valid"
S"\nPlease try again");
}
try {
qtyItem3 = this->txtItem3Quantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered is not valid"
S"\nPlease try again");
}
try {
unitPriceItem4 = this->txtItem4UnitPrice->Text->ToDouble(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered for the price is not valid"
S"\nPlease try again");
}
try {
qtyItem4 = this->txtItem4Quantity->Text->ToInt16(0);
}
catch(FormatException *)
{
MessageBox::Show(S"The value you entered is not valid"
S"\nPlease try again");
}
// Calculate the sub-total for this item
subTotalShirts = qtyShirts * unitPriceShirts;
subTotalPants = qtyPants * unitPricePants;
subTotalItem1 = qtyItem1 * unitPriceItem1;
subTotalItem2 = qtyItem2 * unitPriceItem2;
subTotalItem3 = qtyItem3 * unitPriceItem3;
subTotalItem4 = qtyItem4 * unitPriceItem4;
// Calculate the total based on sub-totals
cleaningTotal = subTotalShirts + subTotalPants + subTotalItem1 +
subTotalItem2 + subTotalItem3 + subTotalItem4;
taxRate = this->txtTaxRate->Text->ToDouble(0);
// Calculate the amount owed for the taxes
taxAmount = cleaningTotal * taxRate / 100;
// Add the tax amount to the total order
netPrice = cleaningTotal + taxAmount;
// Display the sub-total in the corresponding text box
this->txtShirtsSubTotal->Text = subTotalShirts.ToString(S"F");
this->txtPantsSubTotal->Text = subTotalPants.ToString("F");
this->txtItem1SubTotal->Text = subTotalItem1.ToString("F");
this->txtItem2SubTotal->Text = subTotalItem2.ToString("F");
this->txtItem3SubTotal->Text = subTotalItem3.ToString("F");
this->txtItem4SubTotal->Text = subTotalItem4.ToString("F");
this->txtCleaningTotal->Text = cleaningTotal.ToString(S"F");
this->txtTaxAmount->Text = taxAmount.ToString(S"F");
this->txtNetPrice->Text = netPrice.ToString(S"F");
}
|
System::Void txtShirtsQuantity_Leave(System::Object * sender, System::EventArgs * e)
{
CalculateTotal();
}
|
System::Void txtPantsQuantity_Leave(System::Object * sender, System::EventArgs * e)
{
CalculateTotal();
}
|
System::Void txtItem1Quantity_Leave(System::Object * sender, System::EventArgs * e)
{
if( !this->cboItem1->Text->Equals(S"None") )
CalculateTotal();
else
MessageBox::Show(S"Make sure you select an item in the combo box");
}
|
System::Void txtItem2Quantity_Leave(System::Object * sender, System::EventArgs * e)
{
if( !this->cboItem2->Text->Equals(S"None") )
CalculateTotal();
else
MessageBox::Show(S"Make sure you select an item in the combo box");
}
|
System::Void txtItem3Quantity_Leave(System::Object * sender, System::EventArgs * e)
{
if( !this->cboItem3->Text->Equals(S"None") )
CalculateTotal();
else
MessageBox::Show(S"Make sure you select an item in the combo box");
}
|
System::Void txtItem4Quantity_Leave(System::Object * sender, System::EventArgs * e)
{
if( !this->cboItem4->Text->Equals(S"None") )
CalculateTotal();
else
MessageBox::Show(S"Make sure you select an item in the combo box");
}
|
System::Void txtTaxRate_Leave(System::Object * sender, System::EventArgs * e)
{
CalculateTotal();
}
|
System::Void btnClose_Click(System::Object * sender, System::EventArgs * e)
{
Close();
}
|
System::Void btnReset_Click(System::Object * sender, System::EventArgs * e)
{
// Reset the controls
this->txtCustomerName->Text = S"";
this->txtCustomerPhone->Text = S"";
this->txtShirtsUnitPrice->Text = S"1.25";
this->txtShirtsQuantity->Text = S"0";
this->txtShirtsSubTotal->Text = S"0.00";
this->txtPantsUnitPrice->Text = S"1.95";
this->txtPantsQuantity->Text = S"0";
this->txtPantsSubTotal->Text = S"0.00";
this->cboItem1->Text = S"None";
this->txtItem1UnitPrice->Text = S"0.00";
this->txtItem1Quantity->Text = S"0";
this->txtItem1SubTotal->Text = S"0.00";
this->cboItem2->Text = S"None";
this->txtItem2UnitPrice->Text = S"0.00";
this->txtItem2Quantity->Text = S"0";
this->txtItem2SubTotal->Text = S"0.00";
this->cboItem3->Text = S"None";
this->txtItem3UnitPrice->Text = S"0.00";
this->txtItem3Quantity->Text = S"0";
this->txtItem3SubTotal->Text = S"0.00";
this->cboItem4->Text = S"None";
this->txtItem4UnitPrice->Text = S"0.00";
this->txtItem4Quantity->Text = S"0";
this->txtItem4SubTotal->Text = S"0.00";
this->txtCleaningTotal->Text = S"0.00";
this->txtTaxRate->Text = S"5.75";
this->txtTaxAmount->Text = S"0.00";
this->txtNetPrice->Text = S"0.00";
this->txtCustomerName->Focus();
}
|
System::Void btnSave_Click(System::Object * sender, System::EventArgs * e)
{
// This is the name of the file that holds or will hold the cleaning orders
String *strFilename = S"CleaningOrders.xml";
XmlDocument *xmlDoc = new XmlDocument;
// Find out if the file exists already
// If it doesn't, then create it
if( !File::Exists(strFilename) )
{
xmlDoc->LoadXml(S"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
S"<CleaningOrders></CleaningOrders>");
xmlDoc->Save(strFilename);
}
// Open the XML file
xmlDoc->Load(strFilename);
// The count variable will allow us to either create
// a receipt number or increment the current receipt number
static int count = 1;
// Locate the CleaningOrder element that holds an individual entry
XmlNodeList *lstOrders = xmlDoc->GetElementsByTagName(S"CleaningOrder");
// If a cleaning order exists already, then increment its number
// Warning: this code assumes that the cleaning orders are not deleted
if( lstOrders->Count > 0 )
count = lstOrders->Count + 1;
// Create a cleaning order element
XmlElement *elmXML = xmlDoc->CreateElement("CleaningOrder");
// Add a receipt number as an attribute of the order
elmXML->SetAttribute(S"ReceiptNumber", count.ToString());
// Create the child elements of a cleaning order
String *strNewCleaning = String::Concat(
S"<CustomerName>", this->txtCustomerName->Text, S"</CustomerName>",
S"<CustomerPhone>", this->txtCustomerPhone->Text, S"</CustomerPhone>",
S"<DateLeft>",
this->dtpDateLeft->Value.ToString(S"D", DateTimeFormatInfo::InvariantInfo),
S"</DateLeft>",
S"<TimeLeft>",
this->dtpTimeLeft->Value.ToString(S"t", DateTimeFormatInfo::InvariantInfo),
S"</TimeLeft>",
S"<DateExpected>",
this->dtpDateExpected->Value.ToString(S"D", DateTimeFormatInfo::InvariantInfo),
S"</DateExpected>",
S"<TimeExpected>",
this->dtpTimeExpected->Value.ToString(S"t", DateTimeFormatInfo::InvariantInfo),
S"</TimeExpected>",
S"<ShirtsUnitPrice>", this->txtShirtsUnitPrice->Text, S"</ShirtsUnitPrice>",
S"<ShirtsQuantity>", this->txtShirtsUnitPrice->Text, S"</ShirtsQuantity>",
S"<ShirtsSubTotal>", this->txtShirtsSubTotal->Text, S"</ShirtsSubTotal>",
S"<PantsUnitPrice>", this->txtShirtsUnitPrice->Text, S"</PantsUnitPrice>",
S"<PantsQuantity>", this->txtPantsQuantity->Text, S"</PantsQuantity>",
S"<PantsSubTotal>", this->txtPantsSubTotal->Text, S"</PantsSubTotal>",
S"<Item1>", this->cboItem1->Text, S"</Item1>",
S"<Item1UnitPrice>", this->txtItem1UnitPrice->Text, S"</Item1UnitPrice>",
S"<Item1Quantity>", this->txtItem1Quantity->Text, S"</Item1Quantity>",
S"<Item1SubTotal>", this->txtItem1SubTotal->Text, S"</Item1SubTotal>",
S"<Item2>", this->cboItem2->Text, S"</Item2>",
S"<Item2UnitPrice>", this->txtItem2UnitPrice->Text, S"</Item2UnitPrice>",
S"<Item2Quantity>", this->txtItem2Quantity->Text, S"</Item2Quantity>",
S"<Item2SubTotal>", this->txtItem2SubTotal->Text, S"</Item2SubTotal>",
S"<Item3>", this->cboItem3->Text, S"</Item3>",
S"<Item3UnitPrice>", this->txtItem3UnitPrice->Text, S"</Item3UnitPrice>",
S"<Item3Quantity>", this->txtItem3Quantity->Text, S"</Item3Quantity>",
S"<Item3SubTotal>", this->txtItem3SubTotal->Text, S"</Item3SubTotal>",
S"<Item4>", this->cboItem4->Text, S"</Item4>",
S"<Item4UnitPrice>", this->txtItem4UnitPrice->Text, S"</Item4UnitPrice>",
S"<Item4Quantity>", this->txtItem4Quantity->Text, S"</Item4Quantity>",
S"<Item4SubTotal>", this->txtItem4SubTotal->Text, S"</Item4SubTotal>",
S"<CleaningTotal>", this->txtCleaningTotal->Text, S"</CleaningTotal>",
S"<TaxRate>", this->txtTaxRate->Text, S"</TaxRate>",
S"<TaxAmount>", this->txtTaxAmount->Text, S"</TaxAmount>",
S"<NetPrice>", this->txtNetPrice->Text, S"</NetPrice>");
elmXML->InnerXml = strNewCleaning;
// Add the new cleaning order to the file
xmlDoc->DocumentElement->AppendChild(elmXML);
// Save the file
xmlDoc->Save(strFilename);
// In case the user will add a new cleaning order,
// increment the receipt number
count++;
// Reset the form in case the user wants
// to add a new cleaning order
this->btnReset_Click(sender, e);
}
|
![]() |
![]() |
![]() |
System::Void btnOpen_Click(System::Object * sender, System::EventArgs * e)
{
String *strFilename = S"CleaningOrders.xml";
XmlDocument *xmlDoc = new XmlDocument;
// If the XML file cannot be found, let the user know and give up
if( !File::Exists(strFilename) )
{
MessageBox::Show(S"No cleaning order exists or the file cannot be found");
return;
}
// In case the file exists, open it
xmlDoc->Load(strFilename);
// Get a list of the elements whose values are CleaningOrder
XmlNodeList *lstOrders = xmlDoc->GetElementsByTagName(S"CleaningOrder");
// Check each cleaning order
for(int i = 0; i < lstOrders->Count; i++)
{
// If you find a cleaning order with the receipt number
if( lstOrders->ItemOf[i]->Attributes->ItemOf[S"ReceiptNumber"]->Value->Equals(this->txtReceiptNumber->Text) )
{
// Once you find that cleaning order, get the value of each node and display
// them in the form
this->txtCustomerName->Text = lstOrders->ItemOf[i]->Item[S"CustomerName"]->InnerText;
this->txtCustomerPhone->Text = lstOrders->ItemOf[i]->Item[S"CustomerPhone"]->InnerText;
this->dtpDateLeft->Value = Convert::ToDateTime(lstOrders->ItemOf[i]->Item[S"DateLeft"]->InnerText);
this->dtpTimeLeft->Value = Convert::ToDateTime(lstOrders->ItemOf[i]->Item[S"TimeLeft"]->InnerText);
this->dtpDateExpected->Value = Convert::ToDateTime(lstOrders->ItemOf[i]->Item[S"DateExpected"]->InnerText);
this->dtpTimeExpected->Value = Convert::ToDateTime(lstOrders->ItemOf[i]->Item[S"TimeExpected"]->InnerText);(S"t");
this->txtShirtsUnitPrice->Text = lstOrders->ItemOf[i]->Item[S"ShirtsUnitPrice"]->InnerText;
this->txtShirtsQuantity->Text = lstOrders->ItemOf[i]->Item[S"ShirtsQuantity"]->InnerText;
this->txtShirtsSubTotal->Text = lstOrders->ItemOf[i]->Item[S"ShirtsSubTotal"]->InnerText;
this->txtPantsUnitPrice->Text = lstOrders->ItemOf[i]->Item[S"PantsUnitPrice"]->InnerText;
this->txtPantsQuantity->Text = lstOrders->ItemOf[i]->Item[S"PantsQuantity"]->InnerText;
this->txtPantsSubTotal->Text = lstOrders->ItemOf[i]->Item[S"PantsSubTotal"]->InnerText;
this->cboItem1->Text = lstOrders->ItemOf[i]->Item[S"Item1"]->InnerText;
this->txtItem1UnitPrice->Text = lstOrders->ItemOf[i]->Item[S"Item1UnitPrice"]->InnerText;
this->txtItem1Quantity->Text = lstOrders->ItemOf[i]->Item[S"Item1Quantity"]->InnerText;
this->txtItem1SubTotal->Text = lstOrders->ItemOf[i]->Item[S"Item1SubTotal"]->InnerText;
this->cboItem2->Text = lstOrders->ItemOf[i]->Item[S"Item2"]->InnerText;
this->txtItem2UnitPrice->Text = lstOrders->ItemOf[i]->Item[S"Item2UnitPrice"]->InnerText;
this->txtItem2Quantity->Text = lstOrders->ItemOf[i]->Item[S"Item2Quantity"]->InnerText;
this->txtItem2SubTotal->Text = lstOrders->ItemOf[i]->Item[S"Item2SubTotal"]->InnerText;
this->cboItem3->Text = lstOrders->ItemOf[i]->Item[S"Item3"]->InnerText;
this->txtItem3UnitPrice->Text = lstOrders->ItemOf[i]->Item[S"Item3UnitPrice"]->InnerText;
this->txtItem3Quantity->Text = lstOrders->ItemOf[i]->Item[S"Item3Quantity"]->InnerText;
this->txtItem3SubTotal->Text = lstOrders->ItemOf[i]->Item[S"Item3SubTotal"]->InnerText;
this->cboItem4->Text = lstOrders->ItemOf[i]->Item[S"Item4"]->InnerText;
this->txtItem4UnitPrice->Text = lstOrders->ItemOf[i]->Item[S"Item4UnitPrice"]->InnerText;
this->txtItem4Quantity->Text = lstOrders->ItemOf[i]->Item[S"Item4Quantity"]->InnerText;
this->txtItem4SubTotal->Text = lstOrders->ItemOf[i]->Item[S"Item4SubTotal"]->InnerText;
this->txtCleaningTotal->Text = lstOrders->ItemOf[i]->Item[S"CleaningTotal"]->InnerText;
this->txtTaxRate->Text = lstOrders->ItemOf[i]->Item[S"TaxRate"]->InnerText;
this->txtTaxAmount->Text = lstOrders->ItemOf[i]->Item[S"TaxAmount"]->InnerText;
this->txtNetPrice->Text = lstOrders->ItemOf[i]->Item[S"NetPrice"]->InnerText;
}
}
}
|
|
|
||
| Home | Copyright © 2004-2005 FunctionX, Inc. | |
|
|
||