首页 > 编程 > .NET > 正文

用VB.NET和Excel排生产计划

2024-07-10 13:00:30
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.tuenhai.com/

   开发工具:microsoft visual studio .net 2003
   操作系统:windows xp

                 企业信息化失败原因探讨

  中国企业上线erp的成功率是不高的。这是为什么呢?
  实用的erp系统有两个特征:
    1. 要求具有高度的定制性
    2. 要能根据企业实际随时修改erp系统

  而现在企业的erp系统开发基本采用外包模式,开发人员虽然也可以深入公司各个部门,掌握各个方面信息,然后进行定制开发。但是开发人员毕竟不是企业实际从业人员,掌握信息的广度、深度毕竟是有限的,因此,通常情况下,所开发的erp系统难以保证第一个特征:要求具有高度的定制性。
  
   另一方面,企业的实际情况随时都可能发生变化,erp系统也要随时修改,才可能随时满足企业的需求。如果说一开始,erp系统是满足企业需求的,那么一年以后呢?当然开发人员也可以跟踪企业需求,随时修改erp系统,但总归是不太方便。

  
                  理想的企业信息化模式

  个人认为,理想的企业信息化模式是这样的:
    1.企业信息化系统的开发应由企业内部人员进行,而不是外包
    只有这样,实用的erp系统所要求的两个特征:要求具有高度的定制性; 要能根据企业实际随时修改erp系统就很可能两者都具备了。
    2.企业信息化要从实际工作需要出发,逐步推进
   公司实际从业人员(兼开发人员)从实际工作需要出发,开发出相应的信息化模块、功能,再逐步完善。
   现实中,许多企业开发的信息化系统功能很多,但又有多少人会用呢,最终是花架子而已。
  就象笔者所在单位,说大不大,说小不小,但要一开始推行信息化管理,是不可能的。企业各部门人员素质不一,是不可能被普遍接受的。

   要实现笔者所述理想的企业信息化模式,最大的困难是什么?
  最大的困难是是人才难得,特定管理人员要同时具备两种能力:管理能力和开发能力。这种人才并不是每个企业都能得到的。
   笔者虽然谈不上什么人才,但近几年从事的却是企业管理工作,并对信息化管理系统的开发亦略知一二。笔者就有可能亲身实践“理想的企业信息化模式”,并把有关经验与大家分享。

                  公司实际情况分析

  从2004年起,tuenhai主管公司的计划工作,包括制定并下发产品生产计划,自制件生产计划,外协件采购计划等。原来公司内一直用手写的方式,由于公司产品的型号较多,如果tuenhai也是用手工填写,计划一多,整天忙于机械式的写写算算,做不了什么事情。所以tuenhai考虑用电脑代替部分机械性的工作,tuenhai就可以腾出精力抓其他方面事情了。电脑可以辅助、代替tuenhai做哪些机械性的工作呢?
   比如,每一成品由零件组装而成,零件分自制件和外协件。每一产品由哪些零件组成是固定的。每个月的生产计划,都要分解成自制件生产计划和外协件采购计划,这个分解工作tuenhai决定交给电脑来完成。


                  程序开发模式分析   
                 
   用什么开发工具,用什么开发模式来实现所要求的功能呢?公司内暂时只有tuenhai自己运用,要实现的功能也不多,在一开始并没有必要用复杂的大型数据库系统。为方便信息共享,tuenhai决定用vb.net调用excel来实现功能模块。
   为什么用vb.net而不用c#,因为excel中有个vba,其语法和vb.net是近似的。而且,vb.net和c#的区别主要是语法,而非功能。
  tuenhai现在只要求实现用程序自动安排《自制件生产计划》,这个功能不用vb.net,单用vba也能轻易实现。但是,考虑到以后可能的功能扩充、升级,还是用vb.net。vb.net是面向一代的开发工具,功能强大,而且调用excel也很方便。
  不推荐用vb6,vb.net的入门及初级应用并不难,为何还要去用早期版本,而不用最新版本,掌握最新技术呢!  
  

               用vb.net和excel排生产计划

   软件构思是这样的:
  先在excel里定制好《自制件生产计划》的样表(模板),保存为自制件生产计划.xls,其中只有一个sheet:样表。在样表中设置好各种格式,填写好固定项。再新建一空白workbook,保存为2004年自制件生产计划.xls。
   新建一vb.net应用程序,命名为生产计划报表。在窗体上放很少几个控件,如:几个文本框,用来输入产品数量;checkbox用来先选择是正式生产计划还是增补生产计划;另外用二个文本框用来输入计划时间和计划编号。
  点击button,程序打开自制件生产计划.xls和2004年自制件生产计划.xls,把样表copy到2004年自制件生产计划.xls,并自动在目标sheet中填写各自制件需要生产的数量。
  
  下面是实现代码及详细注释。注意,要先添加com引用microsoft excel object library,tuenhai的是office 2003,引用microsoft excel 11.0 object library。

 

private sub produceplan()
  call killexcel() '调用杀死excel进程过程

  '以下代码判断用户填写信息是否完整,如不完整则提示信息并退出.
  if chkformal.checked = false and chksubjoin.checked = false then
    msgbox("是正式计划还是增补计划??", msgboxstyle.critical, "请先选择计划性质")
    exit sub
  end if
  if txtday.text = "2004年月" then
    msgbox("什么月份的生产计划???", msgboxstyle.critical, "请填写计划时间")
    exit sub
  end if
  if txt703.text = nothing or txt909.text = nothing or txt931.text = nothing or txt932.text = nothing  then
    msgbox("请填写计划台数!", msgboxstyle.critical, "计划台数填写不全")
    exit sub
  end if
  if chkformal.checked = true and chksubjoin.checked = true then
    msgbox("正式和增补两者只能选一!", msgboxstyle.critical, "请重新选择计划性质")
    exit sub
  end if

  '以下代码即是计算各自制件的数量,用中文来命名是免去代码注释
  dim 涂氟龙面板703 as integer = ctype(txt703.text, integer)
  dim 钛金面板909 as integer = ctype(txt909.text, integer)
  dim 油磨不锈钢面板931 as integer = ctype(txt931.text, integer)
  dim 油磨不锈钢面板932 as integer = ctype(txt932.text, integer)
  dim 底盘24 as integer = 涂氟龙面板703
  dim 底盘22 as integer = 钛金面板909
  dim 底盘41a as integer = 油磨不锈钢面板931
  dim 底盘41b as integer = 油磨不锈钢面板931
  dim 水盘25 as integer = 涂氟龙面板703
  dim 水盘24 as integer = 涂氟龙面板703
  dim 水盘22 as integer = 钛金面板909 * 2
  dim 中心支架2 as integer = 涂氟龙面板703 + 钛金面板909
  dim 长支架931 as integer = (油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  dim 支架931u as integer = 油磨不锈钢面板931 * 2
  dim 支架932u as integer = 油磨不锈钢面板932 * 2
  dim 磁头抱攀 as integer = (钛金面板909 + 油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  dim 电池抱攀 as integer = (涂氟龙面板703 + 钛金面板909 + 油磨不锈钢面板931 + 油磨不锈钢面板932) * 2
  dim 三通抱攀 as integer = 电池抱攀 / 2
  dim 炉头垫片 as integer = 电池抱攀 * 3

  '定义一个数组,方便在excel中循环写入数字,也可以放在excel的vba中实现
  dim allnum() as integer = _
  {涂氟龙面板703, 钛金面板909, 油磨不锈钢面板931, 油磨不锈钢面板932, _
  底盘24, 底盘22, 底盘41a, 底盘41b, _
  水盘25, 水盘24, 水盘22, _
  中心支架2, 长支架931, 支架931u, 支架932u, _
  磁头抱攀, 电池抱攀, 三通抱攀, 炉头垫片}

  dim excelapp as new excel.application
  dim excelbook as excel.workbook     '自制件生产计划.xls
  dim excelbook2004 as excel.workbook   '2004自制件生产计划.xls
  dim excelworksheet as excel.worksheet
  dim planproperty as string        '计划性质,是正式计划还是增补计划

  try '建议用try方式捕捉错误,处理错误

    excelbook = excelapp.workbooks.open(application.startuppath & "/自制件生产计划.xls")

    excelbook2004 = excelapp.workbooks.open(application.startuppath & "/2004年自制件生产计划.xls")
    excelworksheet = ctype(excelbook.worksheets("样表"), excel.worksheet)
    excelworksheet.copy(after:=excelbook2004.sheets("sheet1"))
    '把样表copy到<2004年自制件生产计划>workbook中sheet1的后面

    excelapp.visible = true '设置工作薄为可视

    if chkformal.checked = true then
      planproperty = "正式"
    elseif chksubjoin.checked = true then
      planproperty = "增补"
    end if

  with excelbook2004.activesheet '用with 简化代码
    .range("d1").value = txtday.text '计划时间
    .range("c2").value = "laoban公司" & txtday.text & planproperty & "采购计划" '计划依据
    .range("c25").value = now.date.today.toshortdatestring '这就是制表日期
    .range("f2").value = txtno.text '计划编号

  end with
  for i as integer = 0 to 18 '共19种自制件
    excelbook2004.activesheet.cells(4 + i, 4) = allnum(i)    '4+i是行号,第二个4是列号
  next '循环把各自制件数填入<2004年自制件生产计划>中的活动工作表相应位置

  catch ex as exception '捕捉错误,并回收资源,显示错误
    excelbook = nothing
    excelbook2004 = nothing
    excelworksheet = nothing
    excelapp = nothing
    gc.collect(0)
    msgbox(ex.tostring) '显示错误信息,以查找定位
  exit sub '出错就退出
  finally '这里的代码一定会被执行到
    excelbook = nothing
    excelbook2004 = nothing
    excelworksheet = nothing  
    excelapp = nothing
  gc.collect(0)
  end try
  msgbox("已排好自制件生产计划,请查看")

  excelbook = nothing
  excelbook2004 = nothing
  excelworksheet = nothing
  excelapp = nothing
  gc.collect(0)

end sub

 
  下面是杀死excel进程的过程:

private sub killexcel() '为进程避免冲突,在调用excel前先杀死现有excel进程.
  dim pprocess() as process
  pprocess = process.getprocesses()
  dim i as integer
  for i = 0 to pprocess.length() - 1
    if (pprocess(i).processname = "excel") then
    pprocess(i).kill() '关闭进程
    end if
  next
end sub

  更多内容在http://www.tuenhai.com/。

  以上代码非常简单,功能也很有限,但是很实用,以前都是用手工填写并计算的,现在全部自动实现。本来要半小时的工作,现在可以在5分钟内搞定。如果产品有变化,tuenhai可以随时修改程序,使程序始终满足企业需求。企业信息化就应该是这样,从很小的功能开始。
   也许老总一点不知道何为企业信息化,你可以展示给老总,看,以前要用半小时排计划,现在5分钟就解决,这也是属于企业信息化。
  昨天用了一个晚上时间写了以上代码,一个晚上只是一个晚上而已,以后可以省下多少时间?老总是经济第一的,要他掏腰包聘专业开发人员,或外委软件公司开发,总是要让老总割血,也是不太可能的事。tuenhai是管理人员,本身也懂一点编程,信息化从自身工作开始,不用老总多花一分钱,反而可以提高工作效率。而且,原来公司里只有极少懂产品的人有排计划的能力,现在用程序来实现,人人都会。
   中国的企业信息化,要么华而不实,更多企业是根本不知并不用。tuenhai在公司内进行企业信息化探索受诸多因素限制。无论如何,tuenhai会将tuenhai的经验与大家分享,大家共同来探索有中国特色的企业信息化之路。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表