其实,再多表,也有其一定的规律,如我前面所述,
我将我的所有Form无非划为三种:TdlgBasic, TfrmBasic, TfrmRpt
这是在前台,
在后台数据库的表和视图及存储过程(反正就是前台需要调用的部份)取名一定要严格
按照命名规则(当然,在DELPHI那一边也是如此,毕竟,游戏的规则是大家自己定的)
如,采购方面的是:StockOrder, StockOrderD;StockReceive,StockReceiveD;StockReturn, StockReturnD;
销售方面类似地有:SaleOrder, SaleOrderD;SaleReceive,SaleReceiveD, SaleReturn, SaleReturnD;SaleCash, SaleCashD;
其他如斯;
这样,在你的TfrmBasic中就可以定义如下:
procedure TfrmBase.FormCreate(Sender: TObject);
begin
sFun := (Sender As TControl).Name;//模块功能名称, sFun是一个公共变量,其下属的子窗体都可以调用的.
BillName := Copy(sFun, 4, Length(sFun) - 3);//单据名称
end;
然后,在其子窗体显示时,
procedure TfrmBase.FormShow(Sender: TObject);
begin
M.Close;//窗体显示时,打开主明细表
M.Open;
M.Last;
OpenBill(M.FieldByName('ID').AsInteger);
end;
此时,过程OpenBill是这样实现不同的单据统一调用的:
procedure TfrmBase.OpenBill(ID: Integer);
begin
//打开指定单据ID的 明细
with D do
begin
Close;
Parameters[0].Value := ID;
Open;
end;//with D do
//打开 明细数量
if HasField(D, 'GoodsID') AND HasField(D, 'Quantity') then
begin//HasField函数是自定义的.
with DM.DQ do
begin
Close;
Parameters[1].Value := ID;
Parameters[2].Value := BillName + 'DQ';
Open;
end;//with DM.DQ do
end;//if Has DQ
end;
这样就根据单据窗体的Name来打开不同的单据了.
这样,不理它是什么样的单据,你要增加多少单据,通吃了,对不?