📄 datamod.cpp
字号:
//---------------------------------------------------------------------------
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 + -