用vb.net和excel排生產計劃
—企業信息化探討之一
屠恩海(sunhai)
開發工具:microsoft visual studio .net 2003
操作系統:windows xp
企業信息化失敗原因探討
中國企業上線erp的成功率是不高的。這是為什么呢?
實用的erp系統有兩個特征:
1. 要求具有高度的定制性
2. 要能根據企業實際隨時修改erp系統
而現在企業的erp系統開發基本采用外包模式,開發人員雖然也可以深入公司各個部門,掌握各個方面信息,然后進行定制開發。但是開發人員畢竟不是企業實際從業人員,掌握信息的廣度、深度畢竟是有限的,因此,通常情況下,所開發的erp系統難以保證第一個特征:要求具有高度的定制性。
另一方面,企業的實際情況隨時都可能發生變化,erp系統也要隨時修改,才可能隨時滿足企業的需求。如果說一開始,erp系統是滿足企業需求的,那么一年以后呢?當然開發人員也可以跟蹤企業需求,隨時修改erp系統,但總歸是不太方便。
理想的企業信息化模式
個人認為,理想的企業信息化模式是這樣的:
1.企業信息化系統的開發應由企業內部人員進行,而不是外包
只有這樣,實用的erp系統所要求的兩個特征:要求具有高度的定制性; 要能根據企業實際隨時修改erp系統就很可能兩者都具備了。
2.企業信息化要從實際工作需要出發,逐步推進
公司實際從業人員(兼開發人員)從實際工作需要出發,開發出相應的信息化模塊、功能,再逐步完善。
現實中,許多企業開發的信息化系統功能很多,但又有多少人會用呢,最終是花架子而已。
就象筆者所在單位,說大不大,說小不小,但要一開始推行信息化管理,是不可能的。企業各部門人員素質不一,是不可能被普遍接受的。
要實現筆者所述理想的企業信息化模式,最大的困難是什么?
最大的困難是是人才難得,特定管理人員要同時具備兩種能力:管理能力和開發能力。這種人才并不是每個企業都能得到的。
筆者雖然談不上什么人才,但近幾年從事的卻是企業管理工作,并對信息化管理系統的開發亦略知一二。筆者就有可能親身實踐“理想的企業信息化模式”,并把有關經驗與大家分享。
公司實際情況分析
從2004年起,我主管公司的計劃工作,包括制定并下發產品生產計劃,自制件生產計劃,外協件采購計劃等。原來公司內一直用手寫的方式,由于公司產品的型號較多,如果我也是用手工填寫,計劃一多,整天忙于機械式的寫寫算算,做不了什么事情。所以我考慮用電腦代替部分機械性的工作,我就可以騰出精力抓其他方面事情了。電腦可以輔助、代替我做哪些機械性的工作呢?
比如,每一成品由零件組裝而成,零件分自制件和外協件。每一產品由哪些零件組成是固定的。每個月的生產計劃,都要分解成自制件生產計劃和外協件采購計劃,這個分解工作我決定交給電腦來完成。
程序開發模式分析
用什么開發工具,用什么開發模式來實現所要求的功能呢?公司內暫時只有我自己運用,要實現的功能也不多,在一開始并沒有必要用復雜的大型數據庫系統。,為方便信息共享,我決定用vb.net調用excel來實現功能模塊。
為什么用vb.net而不用c#,因為excel中有個vba,其語法和vb.net是近似的。而且,vb.net和c#的區別主要是語法,而非功能。
我現在只要求實現用程序自動安排《自制件生產計劃》,這個功能不用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,我的是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
以上代碼非常簡單,功能也很有限,但是很實用,以前都是用手工填寫并計算的,現在全部自動實現。本來要半小時的工作,現在可以在5分鐘內搞定。如果產品有變化,我可以隨時修改程序,使程序始終滿足企業需求。企業信息化就應該是這樣,從很小的功能開始。
也許老總一點不知道何為企業信息化,你可以展示給老總,看,以前要用半小時排計劃,現在5分鐘就解決,這也是屬于企業信息化。
昨天用了一個晚上時間寫了以上代碼,一個晚上只是一個晚上而已,以后可以省下多少時間?老總是經濟第一的,要他掏腰包聘專業開發人員,或外委軟件公司開發,總是要讓老總割血,也是不太可能的事。我是管理人員,本身也懂一點編程,信息化從自身工作開始,不用老總多花一分錢,反而可以提高工作效率。而且,原來公司里只有極少懂產品的人有排計劃的能力,現在用程序來實現,人人都會。
中國的企業信息化,要么華而不實,更多企業是根本不知并不用。我在公司內進行企業信息化探索受諸多因素限制。無論如何,我會將我的經驗與大家分享,大家共同來探索有中國特色的企業信息化之路。
,歡迎訪問網頁設計愛好者web開發。