还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
进销存管理系统实战 序 如今企业管理软件种类繁多,从最初的财务软件到进销存财务一体,到现在的ERP(企业资源计划)、CRM(客户资源管理)等,单从技术来说,它的基础还是以数据为中心的,各种分析报告、财务报表等无不源于实际业务中产生的记录,所以本文考虑从初学者的角度出发来讲解进销存的初步知识,希望读者能从中总结出经验来 一个项目的实施首先要做好前期规划,这是必需的,也是非常重要的,如果这个没做好,那么修改代码将是一件非常麻烦、痛苦的事本例仅从技术的实现讲解,首先确定需要实现的功能,其次进行数据库的设计 主要模块如下
(1)初始化,也就是基本资料的录入,其中分为商品资料、供应商资料、客户、业务员、商品类别、 员工档案、支付方式、库房资料
(2)进货管理,包括进货单录入以及查询功能(按时间、商品编号、商品名称、数量、业务员、 供应商、支付方式等,应分为汇总及明细)
(3)销售管理,基本同上,不同的是供应商改为客户即可
(4)库存管理,包括即时库存明细(汇总)、查询、库存盘盈整(本文略)等
(5)财务管理,包括销售收益、支出、销售额明细(汇总)、应收、应付、已付、应付、费用明细(汇总)等
(6)其他包括定单管理、预测分析、整理数据、备份数据等功能(略) (见数据库设计) 本文内容依次为进货管理frmjhgl、销售管理frmxsgl、财务管理frm__gl、查找商品frmfindsp、 查询记录及打印模块modprint(如图一) 尾怎么样,一个比较实用的进销存管理程序产生了限于篇幅,笔者只能刊登几个基础模块,当然这个程序及思路可能另大型软件公司的程序员不屑一顾,这就需要读者们自行根据实际来添加所需功能了 数据库设计 做这类程序其关键在于数据库的操作,下面列出本程序中的所用数据库的结构,以便大家阅读方便 [表名] col1=依次为字段名、字段类型、长度等 数据库内容 [仓库] Col1=编号CharWidth10 Col2=仓库名称CharWidth8 Col3=所属类别CharWidth8 Col4=备注CharWidth20 [费用] Col1=编号CharWidth10 Col2=日期Date Col3=摘要CharWidth40 Col4=金额Currency Col5=付款方式CharWidth4 Col6=备注CharWidth20 [付款方式] Col1=编号CharWidth10 Col2=付款方式CharWidth4 Col3=备注CharWidth20 [供应商] Col1=编号CharWidth10 Col2=名称CharWidth20 Col3=__人CharWidth8 Col4=__CharWidth20 Col5=传真CharWidth20 Col6=____CharWidth12 Col7=地址CharWidth50 Col8=E__ilCharWidth20 Col9=网址CharWidth20 Col10=税号CharWidth50 Col11=帐号CharWidth50 Col12=开户行CharWidth50 Col13=备注CharWidth20 [进货记录] Col1=商品编号CharWidth10 Col2=商品名称CharWidth20 Col3=单位CharWidth4 Col4=存放仓库CharWidth8 Col5=数量Integer Col6=单价Currency Col7=金额Currency Col8=业务员CharWidth8 Col9=进货单号CharWidth20 Col10=日期Date Col11=供应商CharWidth30 Col12=付款方式CharWidth10 Col13=备注CharWidth20 [客户] Col1=编号CharWidth10 Col2=名称CharWidth20 Col3=__人CharWidth8 Col4=__CharWidth20 Col5=传真CharWidth20 Col6=____CharWidth12 Col7=地址CharWidth50 Col8=E__ilCharWidth30 Col9=网址CharWidth30 Col10=税号CharWidth50 Col11=帐号CharWidth50 Col12=开户行CharWidth50 Col13=信誉度CharWidth10 Col14=备注CharWidth20 [库存] Col1=商品编号CharWidth10 Col2=商品名称CharWidth20 Col3=单位CharWidth4 Col4=数量Integer Col5=仓库CharWidth8 [类别] Col1=编号CharWidth10 Col2=类别名称CharWidth20 Col3=备注CharWidth20 [商品] Col1=编号CharWidth10 Col2=名称CharWidth20 Col3=单位CharWidth4 Col4=类别CharWidth8 Col5=进货价Currency Col6=销售价Currency Col7=供应商CharWidth20 Col8=备注CharWidth20 [销售记录] Col1=商品编号CharWidth10 Col2=商品名称CharWidth20 Col3=单位CharWidth4 Col4=存放仓库CharWidth8 Col5=数量Integer Col6=单价Currency Col7=金额Currency Col8=业务员CharWidth8 Col9=出货单号CharWidth20 Col10=日期Date Col11=客户CharWidth20 Col12=付款方式CharWidth4 Col13=备注CharWidth20 [业务员] Col1=编号CharWidth10 Col2=姓名CharWidth8 Col3=所属部门CharWidth20 Col4=个人__CharWidth20 Col5=家庭住址CharWidth20 Col6=___号码CharWidth40 Col7=备注CharWidth20 [员工档案] Col1=编号CharWidth10 Col2=姓名CharWidth8 Col3=姓别CharWidth2 Col4=所属部门CharWidth20 Col5=工种CharWidth10 Col6=上工时间CharWidth20 Col7=___号码CharWidth40 Col8=个人__CharWidth20 Col9=家庭住址CharWidth40 Col10=E__ilCharWidth20 Col11=婚否Bit Col12=生日Date Col13=爱好CharWidth10 Col14=忠诚度CharWidth10 Col15=备注CharWidth20 一进货管理 此模块的技术关键是在保存记录上,在为“销售记录”表中存数据时应同时向“库存记录”表添加,如果有此商品则在原有的基础上进行加法运算,否则添加新记录在销售管理中原理也是这样,不过如果库存里没有此类商品就不允许用户进行销售操作 frmjhgl进货管理模块中所有控件的相关设置 1TextBox:本模块共用8个文本框,其Name属性分别为 ___name(商品名称)、___liang(数量)、___danjia(单价)、___bianhao(商品编号)、___jhdata(操作日期)、______e(金额)、______e(金额)、___shuiq(税前金额)、___shui(税率) datasour__属性分别为:data1datafield为空 另添加三个combobox控件cmbcj、cmbywy、cm__ie用来显示厂家、业务员及结算方式(即结、欠付等) 2四个com__nd控件name属性分别为cmdaddnew、cmds__e、cmdcan__l、cmdquitcaption属性分别为新单、保存、取消、退出 代码 DimzxhAsBoolean判断用户输入数据是否为空 PrivateSubaddywy为combobox控件添加内容 DimdbAsDatabase DimrsAsRecordset Setdb=OpenDatabaseApp.Pathjxc.mdb Setrs=db.OpenRecordset业务员 WhileNotrs.EOF cmbywy.AddItemrs.Fields业务员名称.Value rs.MoveNext Wend rs.Close Setrs=Nothing db.Close Setdb=Nothing EndSub PrivateSubaddcj DimdbAsDatabase DimrsAsRecordset Setdb=OpenDatabaseApp.Pathjxc.mdb Setrs=db.OpenRecordset厂家 WhileNotrs.EOF cmbcj.AddItemrs.Fields厂家名称.Value rs.MoveNext Wend rs.Close Setrs=Nothing db.Close Setdb=Nothing EndSub PrivateSubnotnull If___bianhao.Text=Then zxh=True MsgBox商品编号不能为空vbInfor__tion试图添加空记录 EndIf If___name.Text=Then zxh=True MsgBox商品名称不能为空vbInfor__tion试图添加空记录 EndIf If___liang.Text=Then zxh=True MsgBox数量不能为空vbInfor__tion试图添加空记录 EndIf EndSub PrivateSubcmdaddnew_Click Data
1.Recordset.AddNew ___jhdata.Text=Date cmds__e.Enabled=True cmdcan__l.Enabled=True cmdaddnew.Enabled=False EndSub PrivateSubcmdcan__l_Click Data
1.Recordset.Can__lUpdate cmdaddnew.Enabled=True cmds__e.Enabled=False cmdcan__l.Enabled=False EndSub PrivateSubcmds__e_Click Dimfield_value$___liang_value$ Dimjhbh$ccbh$jhna$ cmdaddnew.Enabled=True cmds__e.Enabled=False cmdcan__l.Enabled=False OnErrorGoToerr ___liang_value=___liang.Text jhbh=___bianhao.Text jhna=___name.Text Callnotnull Ifzxh=TrueThen Data
1.Recordset.Can__lUpdate Else执行 Me.MousePointer=11 Data
1.Recordset.Update 必须初始化绑定字段 ___danjia.datafield= ___jhdata.datafield= ______e.datafield= cmbcj.datafield= cmbywy.datafield= cm__ie.datafield= 向库存添加 Data
1.RecordSour__=即时库存 Data
1.Refresh Data
1.Recordset.MoveFirst WhileccbhjhbhAndNotData
1.Recordset.EOF ccbh=Data
1.Recordset.Fields商品编号.Value Ifccbh=jhbhThen ccbh=Data
1.Recordset.Fields商品编号.Value Else Data
1.Recordset.MoveNext EndIf Wend Ifccbh=jhbhThen Data
1.Recordset.Edit field_value=Data
1.Recordset.Fields数量.Value Data
1.Recordset.Fields数量.Value=field_value+___liang_value Data
1.Recordset.Update Else添加新记录 WithData
1.Recordset .AddNew .Fields商品编号.Value=jhbh .Fields商品名称.Value=jhna .Fields数量.Value=___liang_value .Update vs.Refresh EndWith EndIf 返回开单重新绑定字段 Data
1.RecordSour__=进货记录 Data
1.Refresh ___name.datafield=商品名称 ___liang.datafield=数量 ___danjia.datafield=单价 ___bianhao.datafield=商品编号 ___jhdata.datafield=操作日期 ______e.datafield=金额 cmbcj.datafield=厂家名称 cmbywy.datafield=业务员名称 Data
1.Recordset.MoveLast Me.MousePointer=0 EndIf ExitSub err: Me.MousePointer=0 MsgBoxerr.Description EndSub PrivateSubcmdquit_Click UnloadMe EndSub PrivateSubForm_Load WithData1 .DatabaseName=App.Pathjxc.mdb .RecordSour__=进货记录 EndWith 数据库jxc.mdb中表进货记录中的内容如下 ___name.datafield=商品名称 ___liang.datafield=数量 ___danjia.datafield=单价 ___bianhao.datafield=商品编号 ___jhdata.datafield=操作日期 ______e.datafield=金额 cmbcj.datafield=厂家名称 cmbywy.datafield=业务员名称 cm__ie.datafield=支付方式 Calladdcj 添加厂家名称 Calladdywy 添加业务员名称 EndSub PrivateSub___danjia_GotFocus With___danjia .SelStart=0 .SelLength=Len.Text EndWith EndSub PrivateSub___danjia_KeyPressKeyAsciiAsInteger 只能输入数字 IfKeyAscii48OrKeyAscii57AndKeyAscii=32_ AndKeyAsciiAsc.Then KeyAscii=0 Beep EndIf EndSub PrivateSub___liang_GotFocus With___liang .SelStart=0 .SelLength=Len.Text EndWith EndSub PrivateSub___liang_KeyPressKeyAsciiAsInteger IfKeyAscii48OrKeyAscii57AndKeyAscii=32_ AndKeyAsciiAsc.Then KeyAscii=0 Beep EndSub PrivateSub___liang_LostFocus OnErrorGoToerr If___danjiaAnd___liangThen ______e.Text=___danjia*___liang Else MsgBox字段不能为空vbExcla__tionError EndIf ExitSub err: MsgBox请确认数据的正确性vbCritical错误 EndSub PrivateSub___shui_LostFocus Dimshui计算税额 If______eAnd___shuiThen shui=1-___shui.Text/100 ___shuiq.Text=shui*______e EndIf EndSub 二销售管理 销售管理与进货管理模块中记录的操作大体一致,所不同的是库存的增减,还要添加两个功能查找商品见frmfindsp及检测库存量 说明此处textbox控件___spbh显示商品编号、___store显示当前库存量 PrivateSubCmdfindsp_Click 查找商品,代码请参考“查找商品” frmfindsp.Show1 EndSub PrivateSubCmdkc_Click 检测库存量 DimdbAsDatabase DimrsAsRecordset Dimfieldspbh_value Setdb=OpenDatabaseApp.Pathjxc.mdb Setrs=db.OpenRecordset即时库存 While___spbhfieldspbh_valueAndNotrs.EOF fieldspbh_value=rs.Fields商品编号.Value Iffieldspbh_value=___spbhThen fieldspbh_value=rs.Fields商品编号.Value Else rs.MoveNext EndIf Wend Iffieldspbh_value=___spbhThen ___store.Text=rs.Fields数量.Value Else MsgBox库存中没有此类商品vbInfor__tion检测结果 EndIf rs.Close Setrs=Nothing db.Close Setdb=Nothing EndSub 三查找商品 .在销售管理中查找某商品的信息frmfindsp,不应让用户手工输入商品的信息 .添加treeview控件,name属性为tv .添加textbox控件数组,name属性为text10-text6用来分别显示商品编号、商品名称、单价(元)、单位、类别、质保期等必要的商品信息 .treeview.nodes.addrelativerelationshipkeytexti__geselectedi__ge参数解释如下 relative可选,node的索引或键值; relationshipnode的相应位置关系; key用item方法提取node的唯一字符串; text,node显示的字符串; i__ge图像索引(注本例没有图像索引); selectedi__ge被选中时,与i__ge控件相关联的图像索引 relationship的值 tvwfirst0第一个对象,该节点放在所有同级节点的前面; tvwlast1最后一个; tvwnext2(缺省)下一个,该节点放在relative命名的节点之后; tvwprevious3前一个,该节点放在relative命名的节点之前; tvwchild4子节点,为relative命名节点的子节点 代码如下 DimdbAsDatabasersAsRecordsetrs1AsRecordsetmynodeAsNodenewnodeAsNode PrivateSubCom__nd1_Click此过程与销售管理呼应,将编号、名称及单价传递给frmxsgl窗体中 frmxsgl.___spbh.Text=Text
10.Text frmxsgl.___spname.Text=Text
11.Text frmxsgl.___danjia.Text=Text
12.Text UnloadMe EndSub PrivateSubForm_Load 加载窗体后,根据商品表中的“类别”标记,将商品名称显示在treeview中,其它字段显示在textbox数组中,使用户能够清楚地查看需要出售的商品相关信息 Dimmysql$mysqlone$ Setdb=OpenDatabaseApp.Pathjxc.mdb mysql=select*from类别 Setrs=db.OpenRecordsetmysql Setmynode=tv.Nodes.Addroot商品分类 WhileNotrs.EOF Setnewnode=tv.Nodes.AddroottvwChildrs.Fields
1.Valuers.Fields
1.Value mysqlone=select*from商品where类别=newnode.Text Setrs1=db.OpenRecordsetmysqlone WhileNotrs
1.EOF Setnewnode=tv.Nodes.Addrs.Fields
1.ValuetvwChildrs1!商品名称rs1!商品名称 rs
1.MoveNext Wend rs.MoveNext Wend tv.Nodesroot.Expanded=True EndSub PrivateSubForm_QueryUnloadCan__lAsIntegerUnloadModeAsInteger rs
1.Close Setrs1=Nothing rs.Close Setrs=Nothing db.Close Setdb=Nothing EndSub PrivateSubtv_NodeClickByValNodeAsMSComctlLib.Node OnErrorGoToerr IfNode.Children=0Then mysql=select*from商品where商品名称=Node.Text Setrs=db.OpenRecordsetmysql Fori=0Tors.Fields.Count-1 IfTypeNamers.Fieldsi.ValueThen Text1i.Text=rs.Fieldsi.Value EndIf Next EndIf ExitSub err: MsgBoxerr.Description EndSub 四查询记录(图二) 在进销存管理中,还应设有查询功能,包括进货、销售记录,现仅就查询进货记录为例其它依此类推,还可进行更为复杂的查询 添加控件 datadata
1、msflexgrid绑定至data1控件; ___find(文本框控件,用来保存SQL语句visible属性为false); 三个combobox控件name属性分别为:cmbfield、cmbcompare、cmbdata 作用为欲查询的字段(如商品名称、进货时间等)、比较符号(、、=、like等); 四个按钮控件,name属性分别为:cmdjians(检索字段)、cmdfindnow(执行SQL语句)、cmdback(重画)cmdprint(打印记录集) 代码如下 PublicSub__kefind 添加此过程主要是为了解决SQL语句中的引号问题 ___find=cmbfieldcmbcompare SelectCaseData
1.Recordset.Fieldscmbfield.Text.Type Case10文本 ___find=___find___data Case8日期 ___find=___find#___data# CaseElse ___find=___find___data EndSelect EndSub PrivateSubcmbcompare_Click __kefind EndSub PrivateSubcmbfield_Click __kefind EndSub PrivateSubcmdfindnow_Click Ifcmbfield.TextAndcmbcompareAnd___dataThen Data
1.RecordSour__=select*from进货记录where___find.Text Data
1.Refresh EndIf EndSub PrivateSubcmd___as_Click cmbfield.Clear Fori=0ToData
1.Recordset.Fields.Count-1 cmbfield.AddItemData
1.Recordset.Fieldsi.Name Next cmbfield.ListIndex=0 cmbcompare.Enabled=True EndSub PrivateSubCmdback_Click Data
1.RecordSour__=进货记录 Data
1.Refresh EndSub PrivateSubForm_Load Data
1.DatabaseName=App.Pathjxc.mdb Data
1.RecordSour__=进货记录 EndSub PrivateSubForm_UnloadCan__lAsInteger Data
1.Database.Close SetData
1.Recordset=Nothing EndSub PrivateSub___data_Change __kefind EndSub privatesubcmdprint Prnrecorddata
1.recordsetAsRecordset 请见打印模块modprint endsub 五打印模块 .新建一标准模块modprint,以便其它窗体可以共享其过程此模块只适用于DAO特此说明 PublicSubPrnrecordrecRecordsetAsRecordset OnErrorGoToerr DimLeft__rginAsInteger DimHeadTopPositionAsInteger DimFieldNumAsInteger DimPageCounterAsInteger DimMyRecordsetAsRecordset ConstFooterTopPosition=24 SetMyRecordset=recRecordset PageCounter=1 Printer.ScaleMode=vb__ntimeters Left__rgin=
1.5 HeadTopPosition=2 Printer.ScaleLeft=-Left__rgin Printer.ScaleTop=-HeadTopPosition Printer.Font.Name=TimesNewRo__n Printer.Font.Size=12 Printer.Print打印记录 Printer.Print IfMyRecordset.EOFAndMyRecordset.BOFThen MsgBox记录为空!vbCritical+vbOKOnly打印错误,请核实后继续 ExitSub EndIf MyRecordset.MoveFirst DoUntilPrinter.CurrentYFooterTopPosition ForFieldNum=0ToMyRecordset.Fields.Count-1 Printer.PrintMyRecordset.FieldsFieldNum.Name:_ MyRecordset.FieldsFieldNum.Value IfPrinter.CurrentYFooterTopPositionThen Printer.CurrentX=8 Printer.PrintPage:PageCounter Printer.NewPage PageCounter=PageCounter+1 EndIf NextFieldNum MyRecordset.MoveNext IfMyRecordset.EOFThenExitDo Printer.Print Loop Printer.CurrentX=8 Printer.CurrentY=FooterTopPosition Printer.Print页:PageCounter Printer.EndDoc ExitSub err: MsgBoxerr.Description err.Clear EndSub 六财务管理(如图三) 我们根据统计出来的进货和销售记录可以进行简单的财务处理如在窗体上画三个DATA控件、MSFLEXGRID控件并依次进行绑定,用来显示一些基本数据读者可以根据实际需要自行添加功能,当然前提是你精通SQL语句了 Data
1.DatabaseName=App.Pathjxc.mdb Data
1.RecordSour__=selectcount商品名称as交易次数sum金额as进货金额min金额as最小金额__x金额as最大金额from进货记录 Data
1.Refresh Data
2.DatabaseName=App.Pathjxc.mdb Data
2.RecordSour__=selectcount商品名称as交易次数sum金额as销售金额min金额as最小金额__x金额as最大金额from销售记录 Data
2.Refresh Data
3.DatabaseName=App.Pathjxc.mdb Data
3.RecordSour__=selectsum金额as应收from销售记录where支付方式=欠付 Data
3.Refresh Data
3.RecordSour__=selectsum金额as应收from进货记录where支付方式=欠付 Data
3.Refresh Data
3.RecordSour__=selectsum数量as总量from库存记录 Data
3.Refresh。