⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datamod.cpp

📁 《C Builder 5程序设计——数据库应用实务篇》程序源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersBeforeDelete(TDataSet *DataSet)
{
  if (!Confirm("Delete order and line items?"))
    Abort();
  else
    DeleteItems();
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersBeforeInsert(TDataSet *DataSet)
{
  if (Orders->State==dsEdit||Orders->State==dsInsert||Orders->State==dsSetKey)
    if (Confirm("An order is being processed.  Save changes and start a new one?"))
      Orders->Post();
    else
      Abort();
  FItemNo = 1;
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersBeforeOpen(TDataSet *DataSet)
{
  CustByComp->Open();
  CustByOrd->Open();
  Cust->Open();
  Emps->Open();
  Items->Open();
}
//---------------------------------------------------------------------------
// Calculate the order's tax totals and amount due
void __fastcall TMastData::OrdersCalcFields(TDataSet *DataSet)
{
  OrdersTaxTotal->Value = OrdersItemsTotal->Value * (OrdersTaxRate->Value / 100);
  OrdersAmountDue->Value = OrdersItemsTotal->Value + OrdersTaxTotal->Value +
                           OrdersFreight->Value - OrdersAmountPaid->Value;
}
//---------------------------------------------------------------------------
// Inititializes the record values as a result of an Orders.Insert.
void __fastcall TMastData::OrdersNewRecord(TDataSet *DataSet)
{
// Get the Next Order Value from the NextOrd Table

    NextOrd->Open();
    try
    {
      NextOrd->Edit();
      OrdersOrderNo->Value = NextOrdNewKey->Value;
      NextOrdNewKey->Value = NextOrdNewKey->Value + 1;
      NextOrd->Post();
      NextOrd->Close();
    } catch(...)
      {
        NextOrd->Close();
      }
  OrdersSaleDate->Value      = Date();
  OrdersShipVIA->Value       = "UPS";
  OrdersTerms->Value         = "net 30";
  OrdersPaymentMethod->Value = "Check";
  OrdersItemsTotal->Value    = 0;
  OrdersTaxRate->Value       = 0;
  OrdersFreight->Value       = 0;
  OrdersAmountPaid->Value    = 0;
}
//---------------------------------------------------------------------------
void __fastcall TMastData::ItemsAfterDelete(TDataSet *DataSet)
{
  UpdateTotals();
}
//---------------------------------------------------------------------------

//  Reduce/increase Parts table's OnOrder field
void TMastData::UpdateParts(double PartNo, long Qty)
{
  if ((PartNo > 0) && (Qty != 0))
  try
  {
    Set<TLocateOption,0,1> flags;
    if (!Parts->Locate("PartNo", PartNo, flags))
     Abort();
    Parts->Edit();
    PartsOnOrder->Value = PartsOnOrder->Value + Qty;
    Parts->Post();
  }
  catch(Exception& E)
  {
     char msg[250];
     sprintf(msg,"Error updating parts table for PartNo: %d", PartNo);
      ShowMessage(msg);
  }
}

// Maintain next available item number
void __fastcall TMastData::ItemsAfterPost(TDataSet *DataSet)
{
  ++FItemNo;
  UpdateTotals();
  if (!((PrevPartNo == ItemsPartNo->Value) && (PrevQty == ItemsQty->Value)))
  {
   // Reduce previous Part#'s OnOrder field by previous Qty
    UpdateParts(PrevPartNo, -PrevQty);
   // Increase new Part#'s OnOrder field by previous Qty
    UpdateParts(ItemsPartNo->Value, ItemsQty->Value);
  }

}
//---------------------------------------------------------------------------
//  When a change to the detail table affects a field in the master, always make
//  sure the master (orders) table is in edit or insert mode before allowing the
//  detail table to be modified.
void __fastcall TMastData::EnsureOrdersEdit(TDataSet *DataSet)
{
  Orders->Edit();
}
//---------------------------------------------------------------------------
// Remember previous PartNo and Qty for updating Parts.OnOrder after post.
//  When a change to the detail table affects a field in the master, always make
//  sure the master table is in edit or insert mode before allowing the
//  detail table to be modified.
void __fastcall TMastData::ItemsBeforeEdit(TDataSet *DataSet)
{
  Orders->Edit();
  PrevPartNo = ItemsPartNo->Value;
  PrevQty = ItemsQty->Value;
}
//---------------------------------------------------------------------------
// Make sure the Parts table opens before the Items table, since there are
//  lookups which depend on it.
void __fastcall TMastData::ItemsBeforeOpen(TDataSet *DataSet)
{
  Parts->Open();
}
//---------------------------------------------------------------------------
// Complete the item's key by initializing its NextItemNo field
void __fastcall TMastData::ItemsBeforePost(TDataSet *DataSet)
{
  ItemsItemNo->Value = FItemNo;
}
//---------------------------------------------------------------------------
// Lookup PartNo info for the item; calculate its extended price
void __fastcall TMastData::ItemsCalcFields(TDataSet *DataSet)
{
  ItemsExtPrice->Value = ItemsQty->Value *
    ItemsSellPrice->Value * (100 - ItemsDiscount->Value) / 100;
}
//---------------------------------------------------------------------------
// New item. Zero the "prev" buckets, initialize the key
void __fastcall TMastData::ItemsNewRecord(TDataSet *DataSet)
{
  PrevPartNo = 0;
  PrevQty = 0;
  ItemsOrderNo->Value = OrdersOrderNo->Value;
  ItemsQty->Value = 1;
  ItemsDiscount->Value = 0;
}
//---------------------------------------------------------------------------
// Concatenate last name + first name for the order's SoldBy DBLookupCombo
void __fastcall TMastData::EmpsCalcFields(TDataSet *DataSet)
{
  char buf[250];
  sprintf(buf,"%s, %s",EmpsLastName->Value.c_str(), EmpsFirstName->Value.c_str());
  EmpsFullName->Value = buf;
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersCustNoChange(TField *Sender)
{
  OrdersShipToContact->Value = "";
  OrdersShipToPhone->Value = "";
  OrdersShipToAddr1->Value = "";
  OrdersShipToAddr2->Value = "";
  OrdersShipToCity->Value  = "";
  OrdersShipToState->Value = "";
  OrdersShipToZip->Value = "";
  OrdersShipToCountry->Value = "";
  OrdersTaxRate->Value = Cust->Lookup("CustNo", OrdersCustNo->Value, "TaxRate");
}
//---------------------------------------------------------------------------

void __fastcall TMastData::CustBeforeOpen(TDataSet *DataSet)
{
  OrdByCust->Open();
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdByCustCalcFields(TDataSet *DataSet)
{
  OrdByCustAmountDue->Value = OrdByCustItemsTotal->Value +
    OrdByCustItemsTotal->Value * OrdByCustTaxRate->Value / 100 +
    OrdByCustFreight->Value - OrdByCustAmountPaid->Value;
}
//---------------------------------------------------------------------------
void __fastcall TMastData::CustBeforePost(TDataSet *DataSet)
{
  if (Cust->State == dsInsert)
  {
     NextCust->Open();
     try
     {
       NextCust->Edit();
       CustCustNo->Value = NextCustNewCust->Value;
       NextCustNewCust->Value = NextCustNewCust->Value + 1;
       NextCust->Post();
       NextCust->Close();
     }
     catch(...)
     {
       NextCust->Close();
     }
  }
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersAfterDelete(TDataSet *DataSet)
{
  Database->ApplyUpdates(OPENARRAY(TDBDataSet*, (Cust, Parts, Items, Orders)));
}
//---------------------------------------------------------------------------
void __fastcall TMastData::OrdersBeforeEdit(TDataSet *DataSet)
{
  LastItemQuery->Close();
  LastItemQuery->Open();
  //SQL servers return Null for some aggregates if no items are present
  if (LastItemQuery->Fields->Fields[0]->IsNull)
    FItemNo = 1;
  else
    FItemNo = LastItemQuery->Fields->Fields[0]->AsInteger + 1;
}
//---------------------------------------------------------------------------
#pragma warn -stv
void __fastcall TMastData::EditUpdateError(TDataSet *DataSet, EDatabaseError *E,
	TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
{
  Variant Key;
const char *  UpdErrMsg = "%s.\nDiscard the edits to %S %S and continue updating?";
char msgbuf[250];
  if (UpdateKind == ukDelete)
    Key = DataSet->Fields->Fields[0]->OldValue;
  else
    Key = DataSet->Fields->Fields[0]->NewValue;
  sprintf(msgbuf,UpdErrMsg,E->Message, DataSet->Fields->Fields[0]->DisplayLabel, Key);
  if (Confirm(msgbuf))
       UpdateAction = uaSkip;
  else
    UpdateAction = uaAbort;
}
#pragma warn .stv
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -