軟體開發(軟件開發)

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

室內設計、裝潢、窗簾報價估算軟體

網智數位主要提供套裝及客製化的軟體系統解決方案,針對室內設計師、木工、裝潢業產業,量身訂做客製化的軟體,達成客製化、智慧化及網路化的商用軟體。

商用軟體-客製化設計

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

IOT 物聯網-系統開發

根據客戶實際狀況,結合雲端與載具進行客製化物聯網IOT導入與軟體開發

雲端VPS虛擬主機租用

我們的雲端VPS虛擬主機是採用雲端(虛擬化)技術所開發之全新雲端伺服器服務,可以選擇多種作業系統(Windows、Linux等),客戶可載入自訂的應用環境,執行自己所要提供的網路服務,我們的雲端服務可為您的網站提供最完美的解決方案。

ERP軟體客製化導入

ERP軟體客製化導入,室內設計、營造業、裝潢、木作工程、系統櫃工程、會計系統,全面提升公司管理營運效率。

搜尋引擎最佳化SEO

搜尋引擎最佳化(SEO)不僅能提高網站在搜尋結果的排名,更能帶來大量對我們產品或服務真正有需求的訪客。SEO 最棒的特質之一就是不像廣告一樣亂槍打鳥而導致用戶的反感,反而更能提升點閱率跟成交率喔。

服務宗旨

網智數位主要提供套裝及客製化的軟體系統解決方案,專為客戶量身訂做客製化的軟體,達成客製化、智慧化及網路化的管理功能。

我們的成立宗旨就是要以最猛的IT技術讓這個世界更Smart,在我們貫徹我們裡想的同時,我們希望可以把我們所開發的系統帶給台灣的中小企業,除了要推薦好的東西之外,我們也希望做點改變,所以我們的第一目標就是要使用最好用的系統再加上您寶貴的創意,不僅僅可以節省你大量的荷包,還可以有一個像樣的網站。我們可以幫你做的有

企業管理
  • 策略管理
  • 目標管理
  • 行銷管理
  • 財會管理
  • ERP導入
  • 企業流程自訂
資訊管理
  • 網站架設
  • 虛擬化/雲端架設
  • 主機代管
  • 私有雲建制與導入
軟體開發
  • UML設計
  • 版本控管
  • 企業軟體開發
  • APP開發
  • 網頁設計
資訊安全
  • 網頁弱點掃描
  • 主機弱點掃描
  • 木馬檢測
  • 資安鑑識
  • 設計網路架構
  • 資安監控
行銷
  • 關鍵字SEO
  • 社群網路行銷
  • 部落格行銷
  • FaceBook 粉絲團
其他
  • 協助企業申請Google Email
好玩工具開發

講出你的創意吧!沒有甚麼是資訊辦不到的

2018年4月20日 星期五

ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)

      今天下午Allen我跑到新店拜訪一個從事30幾年的服裝製衣廠,該客戶使用某國內的知名套裝軟體多年,但客戶在需求討論一直說庫存不準確、生產工序流程無法符合該公司的營運管理面,所以他們使用管理系統跑出了的財務報表、生產報表等等,事實上大家都知道無法信賴,甚至客戶提出一個明顯例子,就是現有套裝軟體跑出的產品生產成本過度高估,導致於他們業務進行報價時,產生價格嚴重高估,跟其他競爭廠商產生巨大落差,而報價完全失去競爭力,因而損失了龐大的訂單,故內部一直有個聲音,想要找量身定做的ERP客製化軟體,所以找上我。





















      不是這套知名的套裝軟體不好,事實上我一直也很欣賞這國內的套裝軟體,但畢竟套裝軟體就是大眾市場所推出的管理系統,不可能可以根據某產業、甚至某特定公司進行修改流程、表單欄位,套裝軟體事實上它適合初期創業得中小型企業、店面,快速導入資訊化系統,好處就是非常便宜,不需要再等待程式研發過程,就可以有現成的軟體可以用,但一切的開始到最後就是您必須去完全適應遷就軟體功能與流程,而公司經營一段時間後,漸漸有了自己的企業文化、流程、獨特優勢、管理流程,就會發現跟套裝軟體格格不入越來越明顯,內部就會產生我們需要一個屬於自己量身定做的ERP系統。

       在導入一個新的軟體管理系統(進銷存、ERP、CRM、SCM等等),事實上是需要耐心與時間的,因為管理系統是需要深入客戶的流程、管理思維,而不斷的討論再討論,所以需要雙方(企業使用端與軟體開發商)都需付出極大的腦力、時間、體力與耐心,創造出一個對客戶有用的管理系統。
        但評估導入一個全新的軟體系統時,事實上需要時間、人力、預算,那麼這邊我也簡單描述,導入管理系統的效益評估成敗問題,在做不做投資效益分析問題上業界有很不同的看法,有人認為ERP項目主要追求的是長期效益,為企業奠定一個競爭優勢的基礎,不能要求立竿見影,當然也有人認為投資回報很難計算出來,不能用投資回報來考核ERP的成敗。
         

        效益是在深化應用中逐漸體現出來的,“上線”時還見不到效益的情況確實存在。很多項目可能要等若干年後才能收回投資,因此投資回收期會有長短,無非是收益多少和回收期長短的問題。任何一項投資項目必須做可行性研究,而投資效益分析是可行性研究報告的重要內容之一,是立項決策前必須做的一項不可缺少的重要工作,如果投資長期見不到效益,誰也不會做這種打水漂式的賠本買賣。
         投資效益分析首先要確定投入的資金數額,在資金投入方面,通常要考慮以下各項,但不一定每個ERP項目都樣樣需要,要根據企業的具體情況。為了避免疏漏,這裡列舉了所有可能的支出,供參考。
        *調查問卷、接待、差旅費用;
        *諮詢、教育訓練等售前服務費用;
        (以上兩項應列入ERP項目開支,不要分攤到行政辦公費用中。)
        *ERP產品費用(軟體使用許可費、資料費、雲端的租賃費用);
        *電腦、終端機、印表機、伺服器、各種網路通訊設施、條碼成套設施、數據採集器等各種硬體費用;
        *新建機房、添加的辦公費(如電腦桌椅、文件櫃)的費用;
        *導入顧問、售後服務費用;
        *監理服務費用;
        *二次開發和使用者授權費用
        *日常維護費用(耗材、網路通訊費用、工資等);
        *升級費用及每年需支付的相關費用(ERP產品公司有相應的規定)
        *在線服務費用;
        (以上是比較不容易忽略的支出)
        *延誤資訊化應用造成的損失(也就是推遲獲益的損失,如何計入資金投入比較難估算,要和收益結合起來研究) 


         這裡,我們也不妨引入總體擁有成本的概念,就是把系統生命週期的一切費用,包括選型、安裝、應用、維護和管理都考慮進去,而不僅僅考慮初次投資。



(其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] - 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
my_qrcode_1519621481105

2018年2月25日 星期日

大數據(BigData)與商業智慧(BI)差異性

     目前不管我們是在新聞媒體上、雜誌報導、甚至各產業宣傳上幾乎都會提到大數據(BigDaga),那麼大數據與傳統企業的商業智慧(BI)是否相同、又或者有所差異性呢?







 


  大數據(BigData)與商業智慧(BI)概念區隔性:
傳統的商業智慧BI,主要是應用領域比較局限在企業的數字管理思維層級上,將商業智慧應用在企業內部的ERP系統、MRP系統、POS系統、CRM系統、MES系統所有管理系統的數據整合,提供給中高階主管快速提供,有效明確的數據報表,以利於企業做出明智的企業戰略決策,全面提升管理競爭力。
而近來一直一來的大數據(BigData)題材,是因為在物聯網、雲端化普及成熟下,可以有效的利用各種連網設備工具,進行採集、整理、過濾的資料、數據收集,而這樣的模式,當然更需要新的處理模式與技能,大數據著重於解決某一類問題的方法,例如:大量攝影圖像分析,在網路、傳感器等非結構化海量數據的分析、收集空氣品質數據分析等。

所以不管定義如何差異,大數據(BigData)與傳統商業智慧(BI)是社會發展到不同階段的產物,大數據對於傳統BI,既有繼承,也有發展,從"道"的角度講,BI與大數據區別在於前者更傾向於決策,對事實描述更多是基於群體共性,幫助決策者掌握宏觀統計趨勢,適合經營運營指標支撐類問題,大數據則內涵更廣,傾向於刻畫個體,更多的在於個性化的決策, 當然純粹從思想的角度講,兩者在概念上是可以實現統一的,都遵循數據-資訊-知識-智慧這個脈絡,甚至在更高的層次,兩者也是可以視為雷同的。
  大數據(BigData)與商業智慧(BI)技術差異性:
傳統商業智慧的技術領域:ETL、數據倉庫、OLAP、可視化報表。
大數據的技術領域:Hadoop、MPP、HDFS、MapReduce、資料流處理等。

  企業該關注大數據還是商業智慧?
在技​​術領域,雖然傳統BI的一些技術ETL、數據倉庫、OLAP、可視化報表似乎都將處於落後邊緣,因為它難以解決日后海量數據的處理問題,但是,也不能全盤否定或替代成大數據。一些企業採用SAP HANA,Power BId等工具的都是基於這個問題優化的方案。 BI的那套也將長期存在,畢竟企業對BI方案還是很青睞,大數據的普及和應用也是個漫長的過程。
大數據分析也不是空口說說,它的第一要務就是解決業務問題,大數據一定程度上就是用全新的數據技術手段來拓展和優化業務領域,傳統企業需要聚集一群人來研究這個問題,需要有人專門研究和探索。例如如果對外,想清楚新的商業模式,如果對內,想清楚在哪個場景,可以用大數據的手段提升效率。

當前大數據可以產生價值的地方,從行業的角度看,金融、銀行、互聯網、醫療、科研都有廣闊的前景。從領域的角度看,廣告、市場行銷、保險銀行風險控管、供應鏈都是大數據發揮價值的地方,對於特定企業,比如電信運營商、政府交通管制、空氣監控,大數據也可以在網絡優化、數據分析等方面提供新方法。

(其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] - 專案導入深入剖析
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)
大數據(BigData)與商業智慧(BI)差異性




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2018年1月31日 星期三

客戶案例-維修知識管理系統(軟體開發、軟件開發、程式設計)

       網智數位開發團隊去年協助台灣最大代理機械軸封及聯軸器的廠商,開發維修知識管理平台,結合了該產業的維修技能知識整理成數位資料,可以讓台灣、以及大陸、其他國家的經銷商,可以共同登入此平台,查閱維修技術知識、零件資料查閱、更重要的可以有智能地協助各地維修師傅,在上千個複雜零件,如遇到故障該如何進行維修排除建議的決策管理系統 ,導入這樣有效率的平台,也是委託企業的總經理非常有獨特的遠見,知道如何利用資訊軟體工具,把該公司多年來資深老員工多年來的隱形知識變成可以分享與傳遞的顯性知識,以利企業內部甚至是結合上下供應鏈、合作經銷商,充分地在AI與物聯網、雲端資訊化的浪潮下,更鞏固企業的競爭力。 

image 


image




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2018年1月15日 星期一

ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)

       現在的企業競爭越來越激烈,更隨著資訊訊息化的普及,所有企業都處身於資訊與大數據分析的必要性,各行各業的企業不得不面對日益增長的海量資訊數據。可是卻又有許多企業無法充分交換、共享、利用各種數據來加以整合,使自身前後兩端成為各自獨立的資訊孤島,最終使企業在業務運營上出現盲點,以至於無法有效利用資訊數據來引導企業做策略分析。




 


       以往舊資訊管理思維,企業傳統的著眼點在後台,也就是在企業內部精益化管理和成本控制這部分,而對前台,也就是直接面對客戶的那一塊缺乏良好的科學管理思維,隨著資訊化、物聯網、雲端技術的普及發展,在以客戶為中心的市場經濟時代,企業關注的焦點逐漸由過去關注產品轉移到關注客戶上來,由於需要將更多的注意力集中到客戶身上,所以僅僅依靠的封閉式管理模式已難以適應激烈的競爭,企業必需同時運用內部流程數據與整合外部客戶的資訊,而為了彌補專注于企業內部ERP系統的不足,順應企業的需求,以方便與客戶的互動,所以企業必需具備在足夠的力量創造有用決策資訊,引進CRM系統,無疑是個捷徑來提升企業管理競爭力。

       所以企業導入 ERP系統 與CRM 系統非常具有天然的互補傾向,ERP系統得以將很多先進的管理思想變成現實中可實施應用的企業資源管理系統,但如果一味固守原有的管理思想,只停留在企業內部流程的管理上,將不能適應新時代資源優化及企業間協同發展的需要;CRM的價值在於突出了客戶服務與支持、和營運管理等方面的重要性,ERP和CRM的系統整合與導入並不是簡單地將二者進行加和,它們是按照業務模式和經營管理思想被合理地整合在一起,最終實現功能上的協同合作,兩者系統整合的基本思想主要是以模塊化趨勢為立足點,將CRM優勢部分有效融入ERP系統,兩者完全可以形成無縫的封閉系統,將企業內外部資源有效的整合起來,為企業發展提供新的機遇。

      把ERP與CRM整合已是大勢所趨。他們的無縫整理與資訊數據分享共用,勢必將帶來 一加一 大於二 的理想效果,企業的過程流線化、行政管理成本削減、更出色的庫存管理、在線定價與報價、交貨週期的自動化、更好的銷售成本控制,最大化地提高企業對市場的快速響應能力和滿足客戶個性化需求的能力,最終以實現為目標,使企業建立起適應網絡經濟的充分柔性的企業管理資訊系統。

 

網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

(作者其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] - 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)
ERP思維突破:啟動企業智能革命,引領未來行銷新浪潮

AI時代的ERP:釋放企業潛能的新革命 



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen


2017年12月4日 星期一

Java Script D3 資料過濾教學(軟體設計、軟體開發)

       我在網頁繪圖時,現在常使用 D3 來幫客戶做成統計視覺圖表,但一定會遇到客戶要求在使用者界面上可以進行某些條件的過濾篩選,例如根據勾選或者執行某個按鈕(Button)時,可以顯示或隱藏網頁部分元素圖表,而這樣需求條件,我們就可以利用 Java Script D3 支援的 Filter 函數來實作此需求案例。

案例執行畫面如下

2017-12-04_11-11-28

//完整程式碼如下:

<!DOCTYPE html>
< html>
< head>
    <meta charset="utf-8">
    <title>網智數位 Java Script D3 過濾資料技巧</title>
    <link rel="stylesheet" type="text/css" href="styles.css"/>
    <script type="text/javascript" src="d3.js"></script>
< /head>

<body>

<script type="text/javascript">
    var data = [ // <- 程式碼註解 A
        {price: 200, category: "捲簾"},
        {price: 300, category: "直立式軌道"},
        {price: 350, category: "木片百葉窗"},
        {price: 500, category: "木竹簾羅馬"},
        {price: 1000, category: "電動軌道"},
        {price: 800, category: "蜂巢簾"},
        {price: 900, category: "百葉窗"},
        {price: 500, category: "壁紙"},
        {price: 300, category: "耐磨地板"},
        {price: 700, category: "衛浴"},
        {price: 400, category: "馬桶"}
    ];

    function render(data, category) {
        d3.select("body").selectAll("div.h-bar") // <- 程式碼註解 B
                .data(data)
            .enter()
            .append("div")
                .attr("class", "h-bar")
             .append("span");

        d3.select("body").selectAll("div.h-bar") // <- 程式碼註解 C
                .data(data)
            .exit().remove();

        d3.select("body").selectAll("div.h-bar") // <- 程式碼註解 D
                .data(data)
            .attr("class", "h-bar")
            .style("width", function (d) {
                 return (d.price) * 0.6 + "px";}
            )
             .select("span")
                .text(function (d) {
                     return d.category;
                });

        d3.select("body").selectAll("div.h-bar")
                .filter(function (d, i) { // <- 程式碼註解 E
                    return d.category == category;
                })
                .classed("selected", true);
    }

    render(data);

    function select(category) {
        render(data, category);
    }
< /script>

<div class="control-group">
    <button onclick="select('耐磨地板')">
        耐磨地板
    </button>
    <button onclick="select('電動軌道')">
        電動軌道
    </button>
    <button onclick="select('壁紙')">
        壁紙
    </button>
    <button onclick="select()">
        取消選取
    </button>
< /div>

</body>

</html>

重點程式碼講解:

1. 程式碼註解 A ,我在這邊宣告了 一個 data 變數,它存放了一系列 json 格式的物件,該物件 有 2個屬性 分別為 price(記錄價格)、category(記錄類型)。

     var data = [ // <- 程式碼註解 A
        {price: 200, category: "捲簾"},
        {price: 300, category: "直立式軌道"},
        {price: 350, category: "木片百葉窗"},
        {price: 500, category: "木竹簾羅馬"},
        {price: 1000, category: "電動軌道"},
        {price: 800, category: "蜂巢簾"},
        {price: 900, category: "百葉窗"},
         {price: 500, category: "壁紙"},
        {price: 300, category: "耐磨地板"},
         {price: 700, category: "衛浴"},
         {price: 400, category: "馬桶"}
     ];

2.程式碼註解 B,透過 D3 的選取方式

d3.select("body").selectAll("div.h-bar").data(data).enter()

這行程式碼,透將會將 所有數據與 網頁的 <div id=’h-bar’> ,做交集的動作,使得每個數據可以對應各自的 <div id=’h-bar’> 元素。

3.程式碼註解 D,將選取的  <div id=’h-bar’> ,根據 data 的 price 價格 用公式來設定長度,以及透過 text() 來設定文字。

d3.select("body").selectAll("div.h-bar") // <- 程式碼註解 D
                 .data(data)
             .attr("class", "h-bar")
             .style("width", function (d) {
                 return (d.price) * 0.6 + "px";}
             )
            .select("span")
                 .text(function (d) {
                     return d.category;
                 });

4.程式碼註解 E,也是最重要的,我根據 d3 支援的 filter()函數,來過濾要選擇的資料。

d3.select("body").selectAll("div.h-bar")
                 .filter(function (d, i) { // <- 程式碼註解 E
                     return d.category == category;
                 })
                .classed("selected", true);

其他參考文章
HTML CSS 動畫教學–【軟體開發(軟件開發)】
繪圖程式-折線圖、區域圖 實作一
產品報告與能源曲線分析系統
利用 JavaScript D3 在網頁動態產生直條圖(軟體開發、軟件開發)
Java Script D3 資料過濾教學(軟體設計、軟體開發)
利用 JavaScript D3 在網頁動態產生直條圖(軟體開發、軟件開發)


網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:
allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-5599-1310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年11月29日 星期三

利用 JavaScript D3 在網頁動態產生直條圖(軟體開發、軟件開發)

       最近因為我再次改版窗簾產業的ERP軟體(窗簾產業真的是產品格式最多樣化,這又是個革命的軟體了,為了這個領域投入許多時間來了解產業知識),以及又承接越南的一系列的工廠生產系統與ERP,讓我沒有多餘時間可以分享技術文章,剛好近來網智數位開發團隊又承接南部大廠、以及群創科技大廠的10個工廠整合數據所需要的軟體開發案,需要用到大量的程式繪圖技術,之前我們如果遇到繪圖技術通常開發團隊都選擇用Windows Form 或 WPF相關技術直接程式繪圖產生,或者如果是企業商業軟體,我們常用報表開發工具,來產生一系列的數據圖表,有利於系統使用者,看圖來判斷數據、以利作決策分析、異常辨識統計,但這次客戶全部要求都是WEB化的資訊系統建置,所以我們全部採用了 Java Script 直接繪圖及時動態產生圖表。 
       也因為這樣所以我選擇寫一篇利用 Java Script D3 程式技術來示範教學,如何動態產生直條圖(當然也可以產生各式各樣的圖表、例如折線圖),不過這篇技術文章,我假設前提是讀者已經非常熟析Java Script 以及 HTML CSS 語法,也對 D3 有初步認識,或許以後我有機會也會補充撰寫 Java Script 與 D3 的文章。


該案例執行結果 畫面
 

image

在這個案例你首先要先下載 D3.js library (可以到 https://d3js.org/ 去下載最新的 D3.js 檔案,來引入在網頁理)
如下列程式碼,我就在 head 直接引用d3.js

<head>
     <meta charset="utf-8">
     <title>利用Java Sciprt Array 來產生圖表(網智數位)</title>
     <link rel="stylesheet" type="text/css" href="styles.css"/>
     <script type="text/javascript" src="d3.js"></script>
< /head>

接下來底下我寫了一個最主要的核心 Java Scirpt 程式碼 
<script type="text/javascript">
    var data = [   // <- 程式碼A
        {width: 30, color: 23},{width: 35, color: 33},
        {width: 50, color: 40},{width: 30, color: 60},
        {width: 60, color: 22},{width: 65, color: 10},
        {width: 65, color: 5},{width: 30, color: 30},
         {width: 30, color: 60},{width: 70, color: 90},
        {width: 15, color: 10}
    ];
   
    var colorScale = d3.scale.linear()
        .domain([0, 100])
        .range(["#add8e6", "blue"]);   // <- 程式碼B
    function render(data) {
        d3.select("body").selectAll("div.h-bar")
            .data(data)
            .enter().append("div")
                .attr("class", "h-bar")               
            .append("span");
        d3.select("body").selectAll("div.h-bar")
            .data(data)
            .exit().remove();
        d3.select("body").selectAll("div.h-bar")
            .data(data)
                .attr("class", "h-bar")
                .style("width", function (d) { // <-程式碼 C
                     return (d.width * 5) + "px"; // <- 程式碼D
                 })
                .style("background-color", function(d){
                     return colorScale(d.color); // <- 程式碼E
                 })
            .select("span")
                .text(function (d) {
                    return d.width; //  <-程式碼 F
                 });
    }
    function randVal() {
        return Math.round(Math.random() * 100);
    }
    setInterval(function () {
         data.shift();
        data.push({width: randVal(), color: randVal()});
        render(data);
    }, 1500);
    render(data);
< /script>

程式邏輯講解
程式碼A,主要是一堆有 Json 物件組成的陣列,而存在在變數 data 裡,這邊我只是單純為了講解,所以直接在程式開頭就把數據全部宣告起來,實務上在開發中,應該及時讀取後端資料庫、或者 WebAPI,取得 Jason 物件陣列.



程式碼B,主要是利用D3的一個 Scale 函數,這個函數可以接受一個數字參數,而轉換為標準的 CSS 顏色值。這個可以在程式碼E區段,套用漸層顏色的效果。

程式碼C,主要是利用 D3的選擇函數傳回的所有集合物件(就是網頁的HTML 標籤元素,在這邊是 div),套用在每個DIV的 Style 屬性,這邊我直接控制 Width 屬性,這樣就可以變更每個div元素的寬度尺寸。
程式碼D,宣告了一個function(d),而這個 d 參數實際上就是代表程式碼A裡 data 變數陣列的每個數據物件(Json)
function (d)
{
    return (d.width * 5) + "px";
    //這邊我可以直接使用 d.width ,因為 d 就是個jason物件, 而且擁有 width 屬性
}
程式碼E,套用 D3的 Scale函數,使得有漸層效果。
程式碼F,在透過 D3的 Select 函數,選取 <div> 裡面的子元素 <span>,然後在透過標準的 HTML DOM 支援的 text() 函數,動態設定數字文字。






其他參考文章
HTML CSS 動畫教學–【軟體開發(軟件開發)】
繪圖程式-折線圖、區域圖 實作一 
產品報告與能源曲線分析系統
       
       






網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-5599-1310
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年11月9日 星期四

ERP 系統在中小企業如何有效利用條碼與QRCode(軟體開發、軟件開發、客製化軟體)

       現行QRCode與條形碼技術都是一個有效整合編碼、印刷、識別、資料採集和處理於一身的新型技術,目前已被廣泛應用於商業、郵政、圖書管理、倉儲、工業生產、過程控制、交通等領域。




        QRCode與條碼都具有輸入速度快、資料採集量大、可靠性和準確度高等優點,是一種最經濟、最實用的自動識別技術。
 
        而目前為止,中小企業幾乎都會積極進行ERP 的導入與建置,但是成功上線的公司卻鳳毛麟角。而造成系統不能成功上線的原因大部分都是資料收集問題,所謂三分軟體,七分資料,可見資料對於整個系統導入成功的影響至關重要,如何將條形碼技術嵌入到ERP 系統中或使用QRCode來快速整合應用,進而提高ERP 系統基礎資料的採集效率,是擺在企業ERP 資訊部門面前的新課題。



        網智數位-軟體開發團隊,專門協助中小型企業,成功將量身開發的ERP 軟體與條碼技術、QRCode 進行整合,實現了ERP 系統部分資料輸入、輸出流程,從人工操作到條碼化操作的轉變,從而提高了人工的效率,確保了ERP 主要資訊的統一性和準確性。
 
1 圖形條碼技術的原理和過程
 
目前,常見的條碼是由寬度不同、反射率不同的條和空按照一定的編碼規則編制成的,用以表達一組數字或字母符號訊息的圖形識別碼。即:條碼是一組粗細不同,按照一定的規則安排間距的平行線條圖形。產檢的條碼是由反射率相差很大的黑條和白條組成的。由於不同顏色的物體,其反射的可見光的波長不同,白色物體能反射各種波長的可見光,黑色物體則吸收各種波長的可見光,所以當條碼掃描器光源發出的光,照射到黑白相間的條碼上時,通過反射使光電轉換器接收到與白條和黑條相應的強弱不同的反射光信號,並轉換成相應的電信號輸出到放大整形電路。這樣,便得到了被辨讀的條碼符合的條和空的數目及相應的寬度和所用碼製,根據碼製所對應的編碼規則,便可將條形符號換成相應的數字字符訊息,通過接口電路送計算機進行資料處理與管理,便完成了條碼辨讀的全過程。
 
2 幫中小企業ERP 建設中遇到的資料問題
 
資訊化時代下,無論大中小企業都在進行資訊化與行動化建設,尤其對於許多企業在庫存物料種類多達 5000 ~ 8000 種,甚至上萬種物料,出入庫也很頻繁,僅僅依靠原來的人工錄入資料,資料的質量可想而知,肯定會有很多錯誤和缺陷。在生產方面,產品種類多,結構複雜,產品更新速度加快,對於產品質量的跟踪僅僅依靠ERP 系統也不能達到很好跟踪效果。在銷售方面,不同型號的產品源源不斷地投向市場,流向台灣各個縣市甚至其他國家區域,這些產品的跟踪記錄也是對中小企業資訊系統建置的一個考驗。而在庫存盤點方面,面對龐大的資料,倉庫管理人員通常都是抓大放小,造成庫存部門物料資訊不準確,進而是MRP 的運算不能發揮功效;要嘛花費大量的時間盤點整理資料,在盤點和整理資料中也會出現很多人為的錯誤。圖形條碼技術在ERP 中的應用,有效地解決了上述問題。



    
3 條碼技術在企業ERP 中的具體應用


    
 
3.1 條碼技術在倉儲管理模組的應用
 
在倉儲管理模塊中,可將庫存的物料訊息、貨位訊息打印製作成條形碼,即將物料按物料屬性、功能參數、價格高低、放置的合理貨位進行記錄,這樣,就可以將物料訊息和貨位訊息進行綁定。整理物料和貨位訊息是訊息化建設的基礎,沒有準確的物料訊息,訊息化建設就是一張白紙。而將物料訊息和貨位訊息綁定後,就可以對庫存的物料進行盤點。這樣,不但可以按貨位盤點,也可以按物料屬性進行盤點。盤點時,掃描條形碼即可調出物料名稱、規格型號、貨位、庫存數量、批次、盤點數量等訊息,然後將盤點資料輸入、保存即可完成對該條資料的盤點。另外,用入庫掃描機製作二維代碼,當物資和設備被調入庫時,操作人員將待存儲物資的名稱、規​​格型號、日期、批次、使用情況等訊息輸入PC 機,經過PC 機管理軟件製造出二維條碼並通過條碼打印機打印,然後粘貼在待入庫物資的表面。而掃描出庫時,物資需要出庫並登記時,由PC 機調集資料,向二維掃描槍發送出庫單,由掃描槍掃描物資上的條碼,完成後再將資料返回到PC 機,計算機收到訊息後,通過局域網送到資料庫,就可以更新庫存,完成出庫。而移庫管理時,倉庫對實物按庫位進行管理,統提供移庫管理功能,可實現庫位間的相互移動,以達到各庫位間商品的準確性。因此,出入庫、移庫、庫存盤點等功能的訊息輸入,就不需要依靠手工輸入,從而大大簡化了倉庫人員的操作難度和強度,為基礎訊息資訊的建設打下了堅實的基礎。



3.2 條碼技術在採購模組的應用
 
有了準確的庫存訊息、生產的產品計劃、產品的BOM 訊息,物料的在途、已佔用訊息,通過MRP 運算就能提供一份準確的物料需求計劃。根據這份物料需求計劃,採購部門就能製定相應的採購計劃進行採購作業。值得注意的是,當採購人員與供應商進行訂單及合約簽訂時,將物料的訊息屬性也傳達給了供應商。供應商提供出庫清單時,即包括本單位的物料條碼,此訂單號將作為該物料的批次進入來料接收、產品檢驗入庫、產品入庫各個環節,該批次條碼也在入庫、出庫,半成品、部件、產品中流轉。


 
3.3 條碼技術在生產模塊的應用
 
在生產環節,部件是由一個個原材料部件組成的,對於關鍵原材料都有對應的批次代碼,能追溯到採購的批次,同時部件本身也有批次碼,用於記錄生產該部件的時間及生產人員。依此類推,產品主機中又有大量的部件批次代碼。掃描主機就能調出關鍵部件的批次及生產時間,依次能展開這個產品的樹狀結構,直至用到那個批次的原材料。條碼技術的應用為產品質量的跟踪打下了基礎,實現了正向追溯和反向追溯,關注於從原材料採購到形成最終產品的可追溯性。通過分析最終產品與其組成部分(原材料、零件、部件和組件等)的批次組成關係,追溯產品批次及其加工歷史,以確定缺陷產品的分佈情況並找到缺陷產品產生的原因,進而對缺陷產品進行召回。


 
3.4 條碼技術在銷售模組的應用
 
產品在銷售環節,也要將唯一的產品機號與客戶的訂單綁定,由此從供應商到客戶的整個物流鏈通過一個個條形碼連接起來。產品包裝​​上的條碼訊息,可通過條碼掃描槍或者資料採集器採集該貨品條碼,實時核查本批產品所屬訂單號、產品代碼、明細規格、訂單數量及發貨日期等訊息。當客戶產品出貨時,用掃描器掃描出貨產品條碼,自動生成ERP 系統銷售出庫單,出庫單關聯銷售訂單號、客戶資訊等。


 
4 結論
 
條碼技術在ERP 中的應用,彌補了ERP 偏重對計劃的管控而無法監控物流現場執行情況的缺陷,也是企業物流過程透明化管理的有效途徑。一個個條碼從出入庫指令下達到產品完成,從供應商的採購到銷售環節的客戶的大物流中流轉,使整個過程清晰可見,可對產品的質量進行控制,同時也可對整個物流進行優化。通過一個個條碼,可實時獲取現場在製品、物料、物流過程各個環節的各種資訊。




網智數位-軟體開發,專門針對客戶進行量身設計的客製化軟體,已有多年經驗,也在不同產業領域都有實作成功案例。

(作者其他參考文章)
MPS主生產計畫專文介紹(一)
MRPⅡ/ERP 能力需求計畫原理
庫存管理-概念與釐清
庫存管理探討-VMI
真正的庫存量形成探討
庫存管理的中樞控管法則(上)
庫存管理的中樞控管法則(下)
庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)
BOM表管理與設定﹣輔料是否需輸入BOM
何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】
ERP 產品成本管理與計算
庫存量正確性衡量法則
粗能力需求計畫(RCCP) - 專文介紹
如何利用軟體來協助企業銷售統計和分析
開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)
ERP 各種計劃階段的差異
ERP 系統的淺談與優勢
ERP 系統在中小企業如何有效利用條碼與QRCode
[ ERP/MRP 系統 ] - 專案導入深入剖析
ERP 導入的投資報酬評估(ERP客製化、進銷存軟體)
ERP 與 CRM 整合對企業的重要性(軟體開發、ERP客製化)
ERP思維突破:啟動企業智能革命,引領未來行銷新浪潮
AI時代的ERP:釋放企業潛能的新革命



網智數位-開發團隊

一直突破開發技術、累積各種產業知識,而且在出版業、室內設計裝潢業、製造業、機電顧問、貿易、地板、窗簾、窗材、拉門、布料業的商業管理軟體投入有特別的領域知識、也在圖控軟體(圖控軟件)、機械手臂、 Android APP 、iPhone APP、3D列印 開發一直突破再創新,我們也堅持相信好的軟體可以協助企業,不管在管理營運角度、商品創新、決策分析等都絕對是不可缺少的關鍵因素,如果客戶您有任何軟體開發、程式開發委外需求,請聯繫我們讓我們協助您一起討論如何開發一個好的軟體來協助您。




網智數位-軟體開發(軟件開發) 

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen








2017年9月27日 星期三

(軟體開發、軟件開發、程式開發)產品報告與能源曲線分析系統

       我們軟體開發團隊協助台灣最大的泵浦、機械軸封及聯軸器廠商,開發一個各種設備能源評估、價格建議的系統平台,協助客戶的業務可以精確地輸入潛在消費者的需求建議與評估,進而推薦可以使用的產品設備。
        
       該平台我們也採用了微軟雲端的解決方案,協助客戶可以不用投入過多的電腦設備、以及IT人員維護,而且也可以隨著使用人數的遞增自動的加強雲端的效能,在不是尖峰使用時刻,自動降低系統效能,來節省整體的系統預算。

a26fbe53-b04e-4e97-8dba-c0d0a33db648

aaa
    
   

詳細更完整的功能說明,可以聯繫我們….



網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年9月7日 星期四

【軟體開發、軟體公司】FLIR 紅外線熱影像儀、局部放電-機電管理軟體

       網智數位-軟體開發團隊,今年花了非常大的資源與技術針對台灣台北、新竹、南部的機電顧問產業的許多家廠商量身開發了針對該機電行業必須用到的檢測報告管理軟體,該軟體可以協助機電顧問產業的工程師有效管理所有在外地透過 FLIR 紅外線熱影像儀 拍攝的檢測記錄後,可以直接透過設備的大量圖片進行批次匯入到我們的管理系統,我們的系統就自動會進行有效與邏輯的判別圖片類型與建立完整的檢測報告。


(部分功能畫面截取)
透過我們開發的檢測整合管理軟體,就可以直接進行報告的新增與維護
1

       
       我們也知道,機電行業的拍攝工程師們,都非常辛苦,每天要拍上百張圖片,以往沒有管理軟體時,必須回到公司,公司行政人員、助理、甚至是工程師自己,需要花很多時間去手動,將照片轉存電腦資料夾,再歸檔整理圖片,再透過 Excel 很繁雜的一筆一筆的針對每個照片(可見光圖、紅外線圖),插入複製圖片,在輸入各種檢測資料,以及自行判讀是否發生異常現象,這些是花費大量的人力與時間成本,對公司對員工都不是很好的常態現象,尤其是每個月、每季、每年都重複發生,甚至有些客戶都是固定的地點需要進行拍攝維護,但卻沒有一個有效的流程與系統可以簡化不該浪費的成本,現在透過網智數位開發的管理軟體,這些不該浪費以及提升效率的問題,都可以大幅減低,又可以產生報告精美與正取的數據報告給客戶(快速有效地呈現給您們的客戶,提升您們的專業形象與競爭力),只需要一個按鈕,我們的軟體就幫您產生各式該產業客戶閱讀的報告。

aaaa




軟體產生的報告,可以支援 HTML、PDF、Excel等標準各式輸出,直接呈現給客戶…
bbbb




有效的從歷史的檢測報告進行篩選,快速找出所需要的案件資料 

cccc


整合客戶管理系統,維護同一個客戶不同地區的資料、分站資料、用電場所
dddd

我們也將陸續整合台電所需要的報告格式,目前已經許多機電產業委託我們進行導入該軟體,這些廠商也大大的提升所需要的人力,把時間用在更有價值的地方,資料的管理與整合就交給一個好的軟體。



詳細更完整的功能說明,可以聯繫我們….







網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen





2017年9月6日 星期三

【軟體開發、系統開發、程式開發】多執行緒多任務存取相同變數,隔離保留各自任務的值 ThreadLocal 技術講解

      在講解幾篇關於多工、多執行緒、平行作業的技術文章後,想來談談另外一個深入的關鍵多多執行緒的問題,那就是多執行緒(多工)作業模式下,如何存取相同變數值,而且又希望各自的執行緒對相同變數又有各自的“值”。 
      在 .Net 技術平台下,有個 ThreadLocal<T> 的泛型類別,這個類別可以專門用於有多個執行緒需要共同存取一個變數,但每個執行緒對這個變數的值,又個別記錄隔離儲存,互不影響。我舉個例子來說明,有執行緒A、執行緒B、執行緒C、執行緒D,這四個執行緒平行作業,將共同存取一個變數 X ,但在執行緒A存取變數X時,設定值為 10;執行緒B存取變數X時,設定值為 20;執行緒C存取變數X時,設定值為 30;執行緒D存取變數X時,設定值為 40; 在執行緒A設定 X變數值為 10時,並不會影響到 執行緒 B/C/D 各自設定的 X 變數值。 
     一樣在此,我透過一個程式範例來進行實例說明,這個專案類型就簡單用 Console 控制台類型來引導… 
完整程式碼如下: 
namespace NetQna.Demo
{
    /// <summary>
    /// ThreadLocal 示範教學(網智數位-軟體開發)
    /// </summary>
    public class Program
    {
        /// <summary>
        /// 所有執行緒共同存取的變數值
        /// </summary>
        static ThreadLocal<int> X = new ThreadLocal<int>();


        static void ExecThreadTask(object obj)
        {
            ThreadEntity currThread = (ThreadEntity)obj;
            //在各自的執行緒環境設定 X 變數值,觀察各自的執行緒下,X 變數值各自記錄
            X.Value = currThread.ThreadValue;


            //顯示出 目前所在的執行緒 的值
            Console.WriteLine($"現在的執行緒 ID:{Thread.CurrentThread.ManagedThreadId},{nameof(X)}變數值為:{X.Value}。");
            //顯示出 目前所在的執行緒 的值
            Console.WriteLine($"現在的執行緒 名稱:{currThread.ThreadName},{nameof(X)}變數值為:{X.Value}。");
            Console.WriteLine();
        }


        static void Main(string[] args)
        {


            Dictionary<string, int> threadABCD = new Dictionary<string, int> { { "A", 10 }, { "B", 20 }, { "C", 30 }, { "D", 40 } };

            //分別啟動 A、B、C、D 執行緒,並執行 存取 X 變數值
            foreach (var t in threadABCD)
            {
                ThreadEntity obj = new ThreadEntity { ThreadName = t.Key, ThreadValue = t.Value };


                //Action<string, int> action = ExecThreadTask(t.Key, t.Value);
                Thread currThread = new Thread(ExecThreadTask);
                currThread.Start(obj);


                //這邊我刻意停頓 1 秒,以利顯示各自執行緒
                Thread.Sleep(1000);
             }


            Console.Read();

            X.Dispose(); //X 變數 釋放
        }



        public class ThreadEntity
        {
            public string ThreadName { get; set; }
             public int ThreadValue { get; set; }


        }
    }
}


程式說明講解
1


一開始我宣告一個屬性變數為 X ,也就是今天講解主要的類別 ThreadLocal,
待會就是用 這個 X 變數,來讓所有執行緒進行存取設定 X 變數值。
 


2 

宣告一個帶有 object 參數的方法,待會就是要讓所有執行緒去各自執行這個方法,這個方法主要我將  object 型態 的 參數 obj 轉型為我自己宣告的類別 ThreadEntity 類別(PS:因為 Thread 建構子對應的方法的參數只能是 object 型態,所以我透過轉型來避開這限制)。

public class ThreadEntity
{
    public string ThreadName { get; set; }
     public int ThreadValue { get; set; }


}

最關鍵的地方,我在這個方法設定了各自執行緒要對應的 X 變數值 
//在各自的執行緒環境設定 X 變數值,觀察各自的執行緒下,X 變數值各自記錄
X.Value = currThread.ThreadValue;

3 

我這邊分別建立 A、B、C、D 四個執行緒,然後分別設定他們待會要指定 X 變數的值為(10、20、30、40)。 


程式執行結果如下圖
d
 

可以看出 A、B、C、D執行緒各自維護自己 X 變數的值。


參考文章 C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

2017年9月5日 星期二

在非同步作業時,如何取消非同步任務(軟體開發、程式設計、軟件開發)

      在之前我寫過一篇關於用 Task 類別來撰寫非同步化作業(使用 Task 自行控制非同步任務作業),來利用多CPU、多核心處理器的優勢,這樣可以避免某些邏輯需要較長的時間去執行,而造成主界面程式停頓卡卡,讓使用者誤以為當機、或程式有問題,所以透過.Net 的 Task 任務,可以讓系統自行的調度限制可以用的執行緒(Thread)。

   既然有了 Task 任務類別的支援,可以讓我們輕易的撰寫多工、非同步作業的程式,讓長時間執行的程式透過另外一個執行緒(Thread)在背後執行,例如我常幫工廠或企業寫物料需求計算(MRP、MPS計算)、業績獎金計算、APS先進排程規劃,這些都是需要執行讀取大量的系統資料來進行運算,這就可以充分利用 ThradTask的技術再背後另外一個執行緒去執行,使用者,在前端主畫面還可以繼續執行其他作業,而不用只能等待程式執行完畢。
    不過我們也常常遇到常時間執行的程式,我們可以提供一個按鈕讓使用者去選擇【取消】背後執行的任務,那麼這篇技術文章我就是想講解,如何在.Net 平台取消非同步化作業的任務 ,.net 平台裡有個類別專門跟 Task 、Task<TResult> 類別搭配使用,使得完成取消非同步任務作業的執行,這個類別就是 CancellationTokenSource 類別

我在這邊一樣透過 Step By Step 來建立一個範例程式,來說明整個程式的撰寫技巧…


1.這邊我簡單為了好示範,我建立一個 Windows Form 視窗專案,命名為 CancellationTokenSource_Demo,如下圖:

繪圖

2.在 Form1 表單,我設計了一下畫面
繪圖2
在Form1表單,我為了示範,所以放置了2個 Label (分別顯示 輸入一個正整數、運算結果顯示),2個 Button 按鈕(分別為 進行運算、取消非同步任務),還有一個 ProgressBar (作用於非同步任務執行時,可以顯示進度條狀態)。

3.在 Form1.cs 的後端程式,是最重要的,我把程式標註註解,這樣大家就可以容易理解了。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    /// <summary>
    /// 宣告一個 用於支援取消非同步任務的變數
    /// </summary>
    private CancellationTokenSource cts = null;


    private void btnCalc_Click(object sender, EventArgs e)
    {
        //取得的正整數
        int currNum = 0;
        if (!int.TryParse(txtInputInt.Text, out currNum))
        {
            MessageBox.Show("必須輸入一個正整數數字!");
            return;
        }


        //清楚執行結果
        txtFinalResult.Clear();


        btnStartCalc.Enabled = false; //將【進行運算】按鈕啟用狀態取消
        btnCancel.Enabled = true; //將【取消非同步任務】按鈕啟用狀態啟用


        //用於顯示報告進度條的變數
        IProgress<int> progRpt = new Progress<int>((p) =>
        {
            this.progressBar1.Value = p;
        });


        //如果 CancellationTokenSource 物件變數不是為 null , 比較進行釋放(務必)
        if (cts != null)
         {
            cts.Dispose();
        }


        //實體化 CancellationTokenSource 物件
        cts = new CancellationTokenSource();


        //宣告一個任務變數
        Task<string> task = new Task<string>(() =>
        {
            BigInteger bint = new BigInteger(1d);
            double totalProgress = (double)currNum;


            //如果CancellationTokenSource 物件的 IsCancellationRequested 值為 true ,代表使用者已經將非同步任務進行取消
            for (int i = 1; i <= currNum && !cts.IsCancellationRequested; i++)
            {
                 bint *= i; //相乘
                double progressVal = Convert.ToDouble(i) / totalProgress * 100d;


                //顯示非同步任務執行的進度表
                progRpt.Report(Convert.ToInt32(progressVal));
            }


            //傳回執行結果
            return bint.ToString();


        }, cts.Token, TaskCreationOptions.LongRunning);

        //開始執行非同步任務
        task.Start();


        //等待任務操作完成,等待1秒
        while (!task.Wait(1000))
        {
            Application.DoEvents();
        }


        //顯示運算結果
        txtFinalResult.Text = task.Result;
        btnStartCalc.Enabled = true;
        btnCancel.Enabled = false;
    }


    private void btnCancel_Click(object sender, EventArgs e)
    {
         //使用者執行取消非同步任務
        if (cts != null)
        {
             cts.Cancel();
        }
    }
}


1
2
3

4

4.經過步驟3核心程式碼後,就可以編譯執行,執行結果畫面如下:
4-1.
執行運算中…
r1

4-2.
中途,我執行【取消非同步任務】按鈕
r2
完成上述這樣的示範,就可以撰寫讓使用者中途取消任務的執行。


參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。 
5.在非同步作業時,如何取消非同步任務。 
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。





網智數位-軟體開發(軟件開發) 
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen