进销存管理系统实战.docx
《进销存管理系统实战.docx》由会员分享,可在线阅读,更多相关《进销存管理系统实战.docx(4页珍藏版)》请在冰豆网上搜索。
进销存管理系统实战
进销存管理系统实战
?
序如今企业管理软件种类繁多,从最初的财务软件到进销存财务一体,到现在的ERP(企业资源计划)、CRM(客户资源管理)等,单从技术来说,它的基础还是以数据为中心的,各种分析报告、财务报表等无不源于实际业务中产生的记录,所以本文考虑从初学者的角度出发来讲解进销存的初步知识,希望读者能从中总结出经验来。
一个项目的实施首先要做好前期规划,这是必需的,也是非常重要的,如果这个没做好,那么修改代码将是一件非常麻烦、痛苦的事。
本例仅从技术的实现讲解,首先确定需要实现的功能,其次进行数据库的设计。
主要模块如下:
(1)初始化,也就是基本资料的录入,其中分为商品资料、供应商资料、客户、业务员、商品类别、员工档案、支付方式、库房资料
(2)进货管理,包括进货单录入以及查询功能(按时间、商品编号、商品名称、数量、业务员、供应商、支付方式等,应分为汇总及明细)(3)销售管理,基本同上,不同的是供应商改为客户即可(4)库存管理,包括即时库存明细(汇总)、查询、库存盘盈整(本文略)等。
(5)财务管理,包括销售收益、支出、销售额明细(汇总)、应收、应付、已付、应付、费用明细(汇总)等(6)其他,包括定单管理、预测分析、整理数据、备份数据等功能(略)(见数据库设计)本文内容依次为:
进货管理(frmjhgl)、销售管理(frmxsgl)、财务管理(frmcwgl)、查找商品(frmfindsp)、查询记录及打印模块(modprint)。
(如图一)尾:
怎么样,一个比较实用的进销存管理程序产生了。
限于篇幅,笔者只能刊登几个基础模块,当然这个程序及思路可能另大型软件公司的程序员不屑一顾,这就需要读者们自行根据实际来添加所需功能了。
数据库设计做这类程序其关键在于数据库的操作,下面列出本程序中的所用数据库的结构,以便大家阅读方便:
[表名]col1=依次为字段名、字段类型、长度等。
数据库内容:
[仓库]Col1=编号CharWidth10Col2=仓库名称CharWidth8Col3=所属类别CharWidth8Col4=备注CharWidth20[费用]Col1=编号CharWidth10Col2=日期DateCol3=摘要CharWidth40Col4=金额CurrencyCol5=付款方式CharWidth4Col6=备注CharWidth20[付款方式]Col1=编号CharWidth10Col2=付款方式CharWidth4Col3=备注CharWidth20[供应商]Col1=编号CharWidth10Col2=名称CharWidth20Col3=联系人CharWidth8Col4=电话CharWidth20Col5=传真CharWidth20Col6=邮政编码CharWidth12Col7=地址CharWidth50Col8=EmailCharWidth20Col9=网址CharWidth20Col10=税号CharWidth50Col11=帐号CharWidth50Col12=开户行CharWidth50Col13=备注CharWidth20[进货记录]Col1=商品编号CharWidth10Col2=商品名称CharWidth20Col3=单位CharWidth4Col4=存放仓库CharWidth8Col5=数量IntegerCol6=单价CurrencyCol7=金额CurrencyCol8=业务员CharWidth8Col9=进货单号CharWidth20Col10=日期DateCol11=供应商CharWidth30Col12=付款方式CharWidth10Col13=备注CharWidth20[客户]Col1=编号CharWidth10Col2=名称CharWidth20Col3=联系人CharWidth8Col4=电话CharWidth20Col5=传真CharWidth20Col6=邮政编码CharWidth12Col7=地址CharWidth50Col8=EmailCharWidth30Col9=网址CharWidth30Col10=税号CharWidth50Col11=帐号CharWidth50Col12=开户行CharWidth50Col13=信誉度CharWidth10Col14=备注CharWidth20[库存]Col1=商品编号CharWidth10Col2=商品名称CharWidth20Col3=单位CharWidth4Col4=数量IntegerCol5=仓库CharWidth8[类别]Col1=编号CharWidth10Col2=类别名称CharWidth20Col3=备注CharWidth20[商品]Col1=编号CharWidth10Col2=名称CharWidth20Col3=单位CharWidth4Col4=类别CharWidth8Col5=进货价CurrencyCol6=销售价CurrencyCol7=供应商CharWidth20Col8=备注CharWidth20[销售记录]Col1=商品编号CharWidth10Col2=商品名称CharWidth20Col3=单位CharWidth4Col4=存放仓库CharWidth8Col5=数量IntegerCol6=单价CurrencyCol7=金额CurrencyCol8=业务员CharWidth8Col9=出货单号CharWidth20Col10=日期DateCol11=客户CharWidth20Col12=付款方式CharWidth4Col13=备注CharWidth20[业务员]Col1=编号CharWidth10Col2=姓名CharWidth8Col3=所属部门CharWidth20Col4=个人电话CharWidth20Col5=家庭住址CharWidth20Col6=身份证号码CharWidth40Col7=备注CharWidth20[员工档案]Col1=编号CharWidth10Col2=姓名CharWidth8Col3=姓别CharWidth2Col4=所属部门CharWidth20Col5=工种CharWidth10Col6=上工时间CharWidth20Col7=身份证号码CharWidth40Col8=个人电话CharWidth20Col9=家庭住址CharWidth40Col10=EmailCharWidth20Col11=婚否BitCol12=生日DateCol13=爱好CharWidth10Col14=忠诚度CharWidth10Col15=备注CharWidth20一:
进货管理此模块的技术关键是在保存记录上,在为“销售记录”表中存数据时应同时向“库存记录”表添加,如果有此商品则在原有的基础上进行加法运算,否则添加新记录。
在销售管理中原理也是这样,不过如果库存里没有此类商品就不允许用户进行销售操作。
frmjhgl(进货管理)模块中所有控件的相关设置:
(1)TextBox:
本模块共用8个文本框,其Name属性分别为:
txtname(商品名称)、txtliang(数量)、txtdanjia(单价)、txtbianhao(商品编号)、txtjhdata(操作日期)、txtjine(金额)、txtjine(金额)、txtshuiq(税前金额)、txtshui(税率)datasource属性分别为:
data1,datafield为空。
另添加三个combobox控件(cmbcj、cmbywy、cmbjie),用来显示厂家、业务员及结算方式(即结、欠付等)
(2)四个command控件,name属性分别为:
cmdaddnew、cmdsave、cmdcancel、cmdquit。
caption属性分别为:
新单、保存、取消、退出代码:
DimzxhAsBoolean'判断用户输入数据是否为空PrivateSubaddywy()'为combobox控件添加内容DimdbAsDatabaseDimrsAsRecordsetSetdb=OpenDatabase&"")Setrs=("业务员")WhileNot("业务员名称").ValueWendSetrs=NothingSetdb=NothingEndSubPrivateSubaddcj()DimdbAsDatabaseDimrsAsRecordsetSetdb=OpenDatabase&"")Setrs=("厂家")WhileNot("厂家名称").ValueWendSetrs=NothingSetdb=NothingEndSubPrivateSubnotnull()If=""Thenzxh=TrueMsgBox"商品编号不能为空",vbInformation,"试图添加空记录"EndIfIf=""Thenzxh=TrueMsgBox"商品名称不能为空",vbInformation,"试图添加空记录"EndIfIf=""Thenzxh=TrueMsgBox"数量不能为空",vbInformation,"试图添加空记录"EndIfEndSubPrivateSubcmdaddnew_Click()=Date=True=True=FalseEndSubPrivateSubcmdcancel_Click()=True=False=FalseEndSubPrivateSubcmdsave_Click()Dimfield_value$,txtliang_value$Dimjhbh$,ccbh$,jhna$=True=False=FalseOnErrorGoToerrtxtliang_value=jhbh=jhna=CallnotnullIfzxh=TrueThenElse'执行=11?
'必须初始化绑定字段=""=""=""=""=""=""'向库存添加="即时库存"?
?
Whileccbh<>jhbhAndNotccbh="商品编号").ValueIfccbh=jhbhThenccbh="商品编号").ValueElseEndIfWendIfccbh=jhbhThenfield_value="数量").Value"数量").Value=field_value+txtliang_valueElse'添加新记录With.AddNew.Fields("商品编号").Value=jhbh.Fields("商品名称").Value=jhna.Fields("数量").Value=txtliang_value.UpdateEndWithEndIf'返回开单,重新绑定字段="进货记录"?
="商品名称"="数量"="单价"="商品编号"="操作日期"="金额"="厂家名称"="业务员名称"?
=0EndIfExitSuberr:
=0MsgBoxEndSubPrivateSubcmdquit_Click()UnloadMeEndSubPrivateSubForm_Load()WithData1.DatabaseName=&"".RecordSource="进货记录"EndWith'数据库""中表"进货记录"中的内容如下="商品名称"="数量"="单价"="商品编号"="操作日期"="金额"="厂家名称"="业务员名称"="支付方式"Calladdcj'添加厂家名称Calladdywy'添加业务员名称EndSubPrivateSubtxtdanjia_GotFocus()Withtxtdanjia.SelStart=0.SelLength=Len(.Text)EndWithEndSubPrivateSubtxtdanjia_KeyPress(KeyAsciiAsInteger)'只能输入数字If(KeyAscii<48OrKeyAscii>57)AndKeyAscii>=32_AndKeyAscii<>Asc(".")ThenKeyAscii=0BeepEndIfEndSubPrivateSubtxtliang_GotFocus()Withtxtliang.SelStart=0.SelLength=Len(.Text)EndWithEndSubPrivateSubtxtliang_KeyPress(KeyAsciiAsInteger)If(KeyAscii<48OrKeyAscii>57)AndKeyAscii>=32_AndKeyAscii<>Asc(".")ThenKeyAscii=0BeepEndSubPrivateSubtxtliang_LostFocus()OnErrorGoToerrIftxtdanjia<>""Andtxtliang<>""Then=txtdanjia*txtliangElseMsgBox"字段不能为空",vbExclamation,"Error"EndIfExitSuberr:
MsgBox"请确认数据的正确性",vbCritical,"错误"EndSubPrivateSubtxtshui_LostFocus()Dimshui'计算税额Iftxtjine<>""Andtxtshui<>""Thenshui=1-/100)=shui*txtjineEndIfEndSub二:
销售管理销售管理与进货管理模块中记录的操作大体一致,所不同的是库存的增减,还要添加两个功能:
查找商品(见frmfindsp)及检测库存量说明:
此处textbox控件:
txtspbh显示商品编号、txtstore显示当前库存量PrivateSubCmdfindsp_Click()'查找商品,代码请参考“查找商品”1EndSubPrivateSubCmdkc_Click()'检测库存量DimdbAsDatabaseDimrsAsRecordsetDimfieldspbh_valueSetdb=OpenDatabase&"")Setrs=("即时库存")Whiletxtspbh<>fieldspbh_valueAndNotfieldspbh_value=("商品编号").ValueIffieldspbh_value=txtspbhThenfieldspbh_value=("商品编号").ValueElse?
EndIfWendIffieldspbh_value=txtspbhThen=("数量").ValueElseMsgBox"库存中没有此类商品",vbInformation,"检测结果"EndIfSetrs=NothingSetdb=NothingEndSub三:
查找商品.在销售管理中查找某商品的信息(frmfindsp),不应让用户手工输入商品的信息.添加treeview控件,name属性为:
tv.添加textbox控件数组,name属性为:
text1(0)-text(6),用来分别显示商品编号、商品名称、单价(元)、单位、类别、质保期等必要的商品信息.参数解释如下:
relative,可选,node的索引或键值;relationship,node的相应位置关系;key,用item方法提取node的唯一字符串;text,node显示的字符串;image,图像索引(注:
本例没有图像索引);selectedimage,被选中时,与image控件相关联的图像索引。
relationship的值:
tvwfirst,0,第一个对象,该节点放在所有同级节点的前面;tvwlast,1,最后一个;tvwnext,2,(缺省)下一个,该节点放在relative命名的节点之后;tvwprevious,3,前一个,该节点放在relative命名的节点之前;tvwchild,4,子节点,为relative命名节点的子节点。
代码如下:
DimdbAsDatabase,rsAsRecordset,rs1AsRecordset,mynodeAsNode,newnodeAsNodePrivateSubCommand1_Click()'此过程与销售管理呼应,将编号、名称及单价传递给frmxsgl窗体中。
=Text1(0).Text=Text1
(1).Text=Text1
(2).TextUnloadMeEndSubPrivateSubForm_Load()'加载窗体后,根据商品表中的“类别”标记,将商品名称显示在treeview中,其它字段显示在textbox数组中,使用户能够清楚地查看需要出售的商品相关信息Dimmysql$,mysqlone$Setdb=OpenDatabase&"")mysql="select*from类别"Setrs=(mysql)Setmynode=,"root","商品分类")WhileNotSetnewnode="root",tvwChild,
(1).Value,
(1).Value)mysqlone="select*from商品where类别="&"'"&&"'"Setrs1=(mysqlone)WhileNotSetnewnode=tvwChild,rs1!
商品名称,rs1!
商品名称)WendWend("root").Expanded=TrueEndSubPrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)Setrs1=NothingSetrs=NothingSetdb=NothingEndSubPrivateSubtv_NodeClick(ByValNodeAsOnErrorGoToerrIf=0Thenmysql="select*from商品where商品名称="&"'"&&"'"Setrs=(mysql)Fori=0To-1IfTypeName(i).Value)<>""ThenText1(i).Text=(i).ValueEndIfNextEndIfExitSuberr:
MsgBoxEndSub?
四:
查询记录(图二)在进销存管理中,还应设有查询功能,包括进货、销售记录,现仅就查询进货记录为例,其它依此类推,还可进行更为复杂的查询。
添加控件:
data(data1)、msflexgrid(绑定至data1控件);txtfind(文本框控件,用来保存SQL语句,visible属性为false);三个combobox控件:
name属性分别为:
cmbfield、cmbcompare、cmbdata作用为:
欲查询的字段(如商品名称、进货时间等)、比较符号(>、<、=、like等);四个按钮控件,name属性分别为:
cmdjians(检索字段)、cmdfindnow(执行SQL语句)、cmdback(重画)cmdprint(打印记录集)代码如下:
PublicSubmakefind()'添加此过程主要是为了解决SQL语句中的引号问题txtfind=cmbfield&cmbcompareSelectCaseCase10'文本txtfind=txtfind&"'"&txtdata&"'"Case8'日期txtfind=txtfind&"#"&txtdata&"#"CaseElsetxtfind=txtfind&""&txtdataEndSelectEndSubPrivateSubcmbcompare_Click()makefindEndSubPrivateSubcmbfield_Click()makefindEndSubPrivateSubcmdfindnow_Click()If<>""Andcmbcompare<>""Andtxtdata<>""Then="select*from进货记录where"&""&EndIfEndSubPrivateSubcmdjinas_Click()Fori=0To-1Next=0=TrueEndSubPrivateSubCmdback_Click()="进货记录"EndSubPrivateSubForm_Load()=&""="进货记录"EndSubPrivateSubForm_Unload(CancelAsInteger)Set=NothingEndSubPrivateSubtxtdata_Change()makefindEndSubprivatesubcmdprint()PrnrecordAsRecordset)'请见打印模块modprintendsub五:
打印模块.新建一标准模块modprint,以便其它窗体可以共享其过程,此模块只适用于DAO,特此说明:
PublicSubPrnrecord(recRecordsetAsRecordset)OnErrorGoToerrDimLeftMarg