2012年1月29日 星期日

用VB.NET和Excel排生產計劃

引用
--
 用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分鐘就解決,這也是屬於企業信息化。
  昨天用了一個晚上時間寫了以上代碼,一個晚上只是一個晚上而已,以後可以省下多少時間?老總是經濟第一的,要他掏腰包聘專業開發人員,或外委軟件公司開發,總是要讓老總割血,也是不太可能的事。我是管理人員,本身也懂一點編程,信息化從自身工作開始,不用老總多花一分錢,反而可以提高工作效率。而且,原來公司裡只有極少懂產品的人有排計劃的能力,現在用程序來實現,人人都會。
   中國的企業信息化,要麼華而不實,更多企業是根本不知並不用。我在公司內進行企業信息化探索受諸多因素限制。無論如何,我會將我的經驗與大家分享,大家共同來探索有中國特色的企業信息化之路。

沒有留言:

張貼留言