本系统是本人前后花了差不多一年的时间开发的一套模仿速达3000的进销存系统,几经修改完善,现在已经比较稳定了。具体的功能不多介绍了,如果你有意向的话,请下载我的系统安装。开发这套系统时,我是报着一腔热血,带着年轻的冲劲和不知天高地厚,希望能凭借自己的技术实现创业梦想。可以说当初我对软件追求的执着狂,是常人难以想象和相比的。我开发这套通用进销存系统时,几乎每天都是熬夜,经常到晚上1、2点,白天还要上班。后来产品开发发完毕,才逐渐的明白,光靠技术是不够的,还需要有市场推广能力,对于一穷二白的我来说,根本没这资金和实力去推广。以前一直觉得速达的系统做的很不错,很看不起其他几个软件厂商如小聪、精诚、顺和达等,觉得它们的系统做的很烂,所以很不服气,就这样诞生了我的这个长胜商务管理系统。这开发期间,所付出的艰辛,花费的心血,是常人很难以想象的。由于长期的熬夜,现在得了脊椎炎,年纪轻轻就腰疼了唉,体质也下降了。所以感觉很疲惫,正是由于过度的冲劲,导致现在想转行,不想搞软件了。我很希望有有实力的公司继续我的梦想,我一次性转让我的源码,然后我希望能靠这笔资金能开个小店,安安稳稳的过日子就行了。下载地址:www.wisen.cn,咨询QQ:67906994,手机:13631528153。本系统不仅是一套非常专业化的进销存管理系统,更是一套非常良好的系统框架,系统代码高度重用,具有非常高的技术价值。如果您觉得我的系统写的不错,您开价,我最后将转让给出价最高者,有诚意者建议见面当面谈,非诚者勿扰!我想本系统只转让一家,不卖多家,因为我希望你来完成我没法完成的事业,所以价格会比较高,我也希望能以此来实现我转行开店的期望。
解决方案 »
- delphi 中如何从数据库中读取数据自生成TreeView,只有两个字段,数据库结构如下。急急!!
- 用过Delphi2005的请进来指点一二?
- TParameters 参数传递如何生成
- 在delphi中如何获取所有已运行程序的名称和该程序的窗口标题
- 提问:在FormCreate,formshow 时可不可以中途退出程序
- 帮我找回丢失的菜单!
- 编译安装remobjects 源码版的时候提示
- 请问DBGrid有自动加总栏位值,并显示在最后一行的功能吗
- 关于ADOQuery的查询语句,在线等待!
- 大家好~
- 如何锁定鼠标?(100分相赠,立刻结帐)
- 关于intraweb中iwdbgrid数据单击事件的问题?
二、通用查询窗体,有相当的实用价值,很大程度上都参考了速达的设计。三、整个系统的设计上和实现效果都参考了速达3000系列的设计,应该说基本上包括了进销存业务的各个功能模块,具有比较高的参考价值,如果您是做管理软件这行的,应该对速达3000系列的产品会比较了解。
unit OtherReceive;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Provider, DBClient, Menus, ADODB, DB,
Buttons, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Mask, DBCtrls, Grids,
DBGrids, DBGridEh, DBCtrlsEh, DBLookupEh,
AccountDBGridEh, SQLManager, MasterDetailEditDBBase;type
TOtherReceiveForm = class(TBaseDBMasterDetailEditForm)
Label_ReceiveType: TLabel;
Label_BillCode: TLabel;
DBEdit_BillCode: TDBEditEh;
DataSetHCode: TWideStringField;
DataSetHBillCode: TWideStringField;
DataSetHBillDate: TDateTimeField;
DataSetHNote: TWideStringField;
Panel_Title: TPanel;
Label_Code: TLabel;
Label_BillDate: TLabel;
DBDateTimeEdit_BillDate: TDBDateTimeEditEh;
DBEdit_Code: TDBEditEh;
DataSetDProductCode: TWideStringField;
DataSetDProductPrice: TBCDField;
DataSetDProductQuantity: TFloatField;
DataSetDSumAmount: TCurrencyField;
DataSetDProductName: TWideStringField;
DataSetDProductUnit: TWideStringField;
Label_WareHouse: TLabel;
DataSetHWareHouseCode: TWideStringField;
DataSetHWareHouseName: TWideStringField;
DataSetHCreater: TWideStringField;
DataSetHCreaterName: TWideStringField;
Label_Creater: TLabel;
DBText_Creater: TDBText;
Label_Employee: TLabel;
DBEdit_EmployeeName: TDBEditEh;
DataSetHEmployeeCode: TWideStringField;
DataSetHEmployeeName: TWideStringField;
DataSetHReceiveTypeCode: TWideStringField;
DataSetHReceiveTypeName: TStringField;
DBLookupCombobox_ReceiveTypeName: TDBLookupComboboxEh;
DBLookupCombobox_WareHouseName: TDBLookupComboboxEh;
procedure DataSetHNewRecord(DataSet: TDataSet);
procedure DBGridDColumns1EditButtonClick(Sender: TObject;
var Handled: Boolean);
procedure DataSetDBeforePost(DataSet: TDataSet);
procedure DataSetDCalcFields(DataSet: TDataSet);
procedure FormDestroy(Sender: TObject);
procedure BitBtn_SaveClick(Sender: TObject);
procedure DataSetDNewRecord(DataSet: TDataSet);
procedure DBEdit_EmployeeNameEditButtons0Click(Sender: TObject;
var Handled: Boolean);
procedure BitBtn_ListClick(Sender: TObject);
private
{ Private declarations }
protected
procedure InitDataSetInfo;override;
public
{ Public declarations }
class procedure Execute(const aKeyFieldValue:String='');
end;var
OtherReceiveForm : TOtherReceiveForm;
implementationuses Global, ReferenceDataModule, ReferProduct,
ReferEmployee, OtherReceiveListByReceiveType;{$R *.dfm}{ TOtherReceiveForm }class procedure TOtherReceiveForm.Execute(const aKeyFieldValue: String);
begin
If Not Assigned(OtherReceiveForm) then
OtherReceiveForm:=TOtherReceiveForm.Create(Application);
OtherReceiveForm.fLocateKeyFieldValue:=aKeyFieldValue;
OtherReceiveForm.Show;
end;procedure TOtherReceiveForm.InitDataSetInfo;
begin
DetailForeignKeyFieldName:='MasterCode';
SerialCode:='I01';
SQLManager.TableName:='TOtherReceiveH';
SQLManager.KeyFieldName:='Code';
SQLManager.FieldNameList.Add('Code');
SQLManager.FieldNameList.Add('BillDate');
SQLManager.FieldNameList.Add('ReceiveTypeCode');
SQLManager.FieldNameList.Add('BillCode');
SQLManager.FieldNameList.Add('WareHouseCode');
SQLManager.FieldNameList.Add('EmployeeCode');
SQLManager.FieldNameList.Add('Creater');
SQLManager.FieldNameList.Add('Note');
DetailSQLManager.TableName:='TOtherReceiveD';
DetailSQLManager.KeyFieldName:='ItemCode';
DetailSQLManager.FieldNameList.Add('MasterCode');
DetailSQLManager.FieldNameList.Add('ItemCode');
DetailSQLManager.FieldNameList.Add('ProductCode');
DetailSQLManager.FieldNameList.Add('ProductQuantity');
DetailSQLManager.FieldNameList.Add('ProductPrice');
inherited;
end;procedure TOtherReceiveForm.DataSetHNewRecord(DataSet: TDataSet);
begin
inherited;
DataSetH.FieldByName('BillDate').AsDateTime:=gSysManager.ServerDate;
DataSetH.FieldByName('Creater').AsString:=gUser.UserCode;
end;procedure TOtherReceiveForm.DBGridDColumns1EditButtonClick(Sender: TObject;
var Handled: Boolean);
begin
inherited;
gSysManager.GetForeignFieldValue(ReferProductForm,TReferProductForm,DataSetD,'ProductCode',
DBGridD.InplaceEditor,EditState,'Stopped=0');
end;procedure TOtherReceiveForm.DataSetDBeforePost(DataSet: TDataSet);
begin
inherited;
If DataSetD.FieldByName('ProductCode').AsString='' then
Begin
gSysManager.MessageInfo('货品编号不能为空!');
Abort;
Exit;
end;
If DataSetD.FieldByName('ProductQuantity').IsNull then
Begin
gSysManager.MessageInfo('货品数量不能为空!');
Abort;
Exit;
end;
If DataSetD.FieldByName('ProductQuantity').AsFloat=0 then
Begin
gSysManager.MessageInfo('货品数量不能等于0!');
Abort;
Exit;
end;
If DataSetD.FieldByName('ProductQuantity').AsFloat<0 then
Begin
gSysManager.MessageInfo('货品数量必须大于0!');
Abort;
Exit;
end;
If DataSetD.FieldByName('ProductPrice').IsNull then
Begin
gSysManager.MessageInfo('货品单价不能为空!');
Abort;
Exit;
end;
If DataSetD.FieldByName('ProductPrice').AsFloat<0 then
Begin
gSysManager.MessageInfo('货品单价必须大于等于0!');
Abort;
Exit;
end;
end;procedure TOtherReceiveForm.DataSetDCalcFields(DataSet: TDataSet);
begin
inherited;
DataSetD.FieldByName('SumAmount').AsFloat:=
DataSetD.FieldByName('ProductQuantity').AsFloat*DataSetD.FieldByName('ProductPrice').AsFloat;
end;procedure TOtherReceiveForm.FormDestroy(Sender: TObject);
begin
inherited;
OtherReceiveForm:=nil;
end;procedure TOtherReceiveForm.BitBtn_SaveClick(Sender: TObject);
begin
if (DataSetH.FieldByName('BillDate').AsDateTime<=gPriorSettleDate) then
begin
gSysManager.MessageInfo('单据日期不能在当前业务期间之前!');
DBDateTimeEdit_BillDate.SetFocus;
Exit;
end;
If DataSetH.FieldByName('ReceiveTypeCode').AsString='' then
begin
gSysManager.MessageInfo('收货类型不能为空!');
DBLookupCombobox_ReceiveTypeName.SetFocus;
Exit;
end;
if DataSetH.FieldByName('WareHouseCode').AsString='' then
begin
gSysManager.MessageInfo('请输入收货仓库!');
DBLookupCombobox_WareHouseName.SetFocus;
Exit;
end;
if DataSetD.IsEmpty then
begin
gSysManager.MessageInfo('单据明细没数据,不能保存!');
Exit;
end;
inherited;
end;procedure TOtherReceiveForm.DataSetDNewRecord(DataSet: TDataSet);
begin
inherited;
DataSetD.FieldByName('ProductQuantity').AsFloat:=1;
end;procedure TOtherReceiveForm.DBEdit_EmployeeNameEditButtons0Click(
Sender: TObject; var Handled: Boolean);
begin
inherited;
gSysManager.GetForeignFieldValue(ReferEmployeeForm,TReferEmployeeForm,DataSetH,'EmployeeCode',DBEdit_EmployeeName,EditState);
end;procedure TOtherReceiveForm.BitBtn_ListClick(Sender: TObject);
begin
inherited;
TOtherReceiveListByReceiveTypeForm.Execute;
end;end.
看了楼主贴的代码,和我臆测的差不多。做个很简单的假设,我从你的 TOtherReceiveForm 派生一个窗体。你的代码已经写死了,我需要重新定义逻辑该怎么办?我肯定得了解你这个父窗口的行为,否则肯定死。这只是很简单的一个问题,其他复杂的问题更是要追朔到根,甚至需要完全重写。这个代码怎么重用?对于一个稍微复杂一点的问题,比如这个软件,按照你的这种方式进行代码重用,肯定不能依照顺序逻辑进行继承,在基类中就需要考虑到后继发生的问题,需要很多的虚函数。而且一旦定稿后,如果你的企业逻辑一改变,嘿嘿,相应的重新定义基类吧。说了这么多,就是一个结论,完全不可能重用。重用应该是根本不需要修改已有的代码,而且也不需要了解实现的细节。像楼主的这种写法,如果需要重用,不了解库结构,不了解代码是完全不行的,除非不对这些代码进行重用。这也是我说的还是别提什么“更是一套非常良好的系统框架,系统代码高度重用,具有非常高的技术价值”。
If DataSetD.FieldByName('ProductCode').AsString='' then
Begin
gSysManager.MessageInfo('货品编号不能为空!');
Abort;
Exit;
end;
...Abort之后帶個Exit有作用么?