標籤: 庫存

報價系統、估價系統、收款系統(軟體開發/客製化軟體)

      網智數位軟體開發團隊,因為協助多家室內裝修、壁紙、窗簾、地板、磁磚、工程建設等行業,開發一系列管理軟體,也深知該行業群,一直有頻繁的估價/報價需求,而大多數都是使用紙本抄寫,或者好一點的是使用Excel進行報價管理,但因為沒有好的軟體系統可以使用,顯得耗時、不專業、甚至款項常常是否有正確都發生爭議,也無法立刻追溯客戶歷史的報價成交資料,所以我們特別針對室內設計業、裝橫業、木工裝修業等開發出專屬的報價收款管理系統我們的報價單可以根據自行定義的工程施工類型(例如,木作、油漆、水電等),進行類型集中估價(報價),也可以再細分估價的區域位置(例如,廚房、玄關、臥室、廁所、客廳..等),只要輸入數量、單位、價格,系統都會自動統計金額,如下系統部分截圖。


估價-報價主畫面

image

主畫面,系統都會自動計算,估價總金額…

報價細項輸入
image

可以選取工程類型

image

可以選取施工區域
image

系統會自動統計,各工程的金額

image

系統自動計算、已實際收到的款項、最後收款日期、後續工程追加金額

、未收金額,是否已結案(只要款項都收齊,系統自動結案),這樣內部收款負責人,可以很清楚地藉由系統來了解哪些工程案未結案、款項未收齊。
image


系統也可以直接列印報價單給客戶進行確認回簽,使得可以呈現更專業的一面

image

image


目前呈現部分系統軟體的畫面,更完整的流程功能,請洽詢我們,我們也可以量身定做符合您的軟體功能。




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

my_qrcode_1519621481105



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"/>
     http://d3.js
</head>


<body>



     var data = [ //          {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") //                  .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) {
                 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) { //                      return d.category == category;
                 })
                 .classed(“selected", true);
     }


    render(data);


    function select(category) {
         render(data, category);
     }


    
         耐磨地板
    
    
         電動軌道
    
    
         壁紙
    
    
         取消選取
    


</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

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

       最近因為我再次改版窗簾產業的ERP軟體(窗簾產業真的是產品格式最多樣化,這又是個革命的軟體了,以及為了這個領域投入許多知識與時間),以及又承接越南的,讓我沒有多餘時間可以分享技術文章,剛好近來網智數位開發團隊又承接南部大廠、以及群創工廠所需要的軟體開發案,需要用到大量的程式繪圖技術,之前我們如果遇到繪圖技術通常開發團隊都選擇用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"/>
     http://d3.js
</head>

接下來底下我寫了一個最主要的核心 Java Scirpt 程式碼

     var data = [   //          {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"]);   //

    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) { //                      return (d.width * 5) + “px"; //                  })
                 .style(“background-color", function(d){
                     return colorScale(d.color); //                  })
             .select(“span")
                 .text(function (d) {
                     return d.width; //                   });
     }

    function randVal() {
         return Math.round(Math.random() * 100);
     }

    setInterval(function () {
         data.shift();
         data.push({width: randVal(), color: randVal()});
         render(data);
     }, 1500);

    render(data);

程式邏輯講解
程式碼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

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

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

markus-winkler-QuZThQoxwm4-unsplash

        QRCode與條碼都具有輸入速度快、資料採集量大、可靠性和準確度高等優點,是一種最經濟、最實用的自動識別技術。

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

        網智數位-軟體開發團隊,專門協助中小型企業,成功將量身開發的ERP 軟體與條碼技術、QRCode 進行整合,實現了ERP 系統部分資料輸入、輸出流程,從人工操作到條碼化操作的轉變,從而提高了人工的效率,確保了ERP 主要資訊的統一性和準確性。

(一)圖形條碼技術的原理和過程

尤其目前,常見的條碼是由寬度不同、反射率不同的條和空按照一定的編碼規則編制成的,用以表達一組數字或字母符號訊息的圖形識別碼。即:條碼是一組粗細不同,按照一定的規則安排間距的平行線條圖形。產檢的條碼是由反射率相差很大的黑條和白條組成的。由於不同顏色的物體,其反射的可見光的波長不同,白色物體能反射各種波長的可見光,黑色物體則吸收各種波長的可見光,所以當條碼掃描器光源發出的光,照射到黑白相間的條碼上時,通過反射使光電轉換器接收到與白條和黑條相應的強弱不同的反射光信號,並轉換成相應的電信號輸出到放大整形電路。這樣,便得到了被辨讀的條碼符合的條和空的數目及相應的寬度和所用碼製,根據碼製所對應的編碼規則,便可將條形符號換成相應的數字字符訊息,通過接口電路送計算機進行資料處理與管理,便完成了條碼辨讀的全過程。

(二)幫中小企業ERP 建設中遇到的資料問題


資訊化時代下,無論大中小企業都在進行資訊化與行動化建設,尤其對於許多企業在庫存物料種類多達 5000 ~ 8000 種,甚至上萬種物料,出入庫也很頻繁,僅僅依靠原來的人工錄入資料,資料的質量可想而知,肯定會有很多錯誤和缺陷。在生產方面,產品種類多,結構複雜,產品更新速度加快,對於產品質量的跟踪僅僅依靠ERP 系統也不能達到很好跟踪效果。在銷售方面,不同型號的產品源源不斷地投向市場,流向台灣各個縣市甚至其他國家區域,這些產品的跟踪記錄也是對中小企業資訊系統建置的一個考驗。而在庫存盤點方面,面對龐大的資料,倉庫管理人員通常都是抓大放小,造成庫存部門物料資訊不準確,進而是MRP 的運算不能發揮功效;要嘛花費大量的時間盤點整理資料,在盤點和整理資料中也會出現很多人為的錯誤。圖形條碼技術在ERP 中的應用,有效地解決了上述問題。


(三) 條碼技術在企業ERP 中的具體應用

3.1 條碼技術在倉儲管理模組的應用


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

 

3.2 條碼技術在採購模組的應用


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

3.3 條碼技術在生產模塊的應用


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

3.4 條碼技術在銷售模組的應用


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

(四)總結


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

 

 

 

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

 

 

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

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

       我們軟體開發團隊協助台灣最大的泵浦、機械軸封及聯軸器廠商,開發一個各種設備能源評估、價格建議的系統平台,協助客戶的業務可以精確地輸入潛在消費者的需求建議與評估,進而推薦可以使用的產品設備。

        

       該平台我們也採用了微軟雲端的解決方案,協助客戶可以不用投入過多的電腦設備、以及IT人員維護,而且也可以隨著使用人數的遞增自動的加強雲端的效能,在不是尖峰使用時刻,自動降低系統效能,來節省整體的系統預算。


a26fbe53-b04e-4e97-8dba-c0d0a33db648


aaa

    

   


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



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

【軟體開發、系統開發】多執行緒多任務存取相同變數,隔離保留各自任務的值 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

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

  在之前我寫過一篇關於用 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

開發進銷存、ERP、PDM,物料欄位收集與建立重要性(ERP開發、軟體開發、進銷存)

     品名(物料、零件、產品)在進銷存、MRP、ERP開發時,我們通常可以用一個品名基本檔進行記錄歸檔,品名這個詞包含很多的性質(欄位),在開發商用軟體時,品名基本檔欄位的收集與建立重要性是一個基本關鍵。

timg

  品名或許稱物料這個詞包含很多的性質。我們平常所感受到它的物理屬性、自然屬性,但今天我想要特別談的是它的管理欄位開立的重要性。因為物料除了包含有形的實體外,其實還可以包括服務等無形的東西。在大型管理軟件中,與物料相關的東西,除了他的大小、形狀、重量等之外,還包括了他的價格、它的儲位、它的供應商等等,這些都是它的管理屬性。這些屬性關聯到我們如何有效地去管理它的採購、它的儲存、它的銷售。

    所以一般來說,大型ERP管理軟體對於物料(品名)這樣一個小元素就預留有幾乎近數百個控制項,才可以讓我們窺見這些ERP管理軟體嚴密的錯綜複雜的管理邏輯。
 
  我們可以從四個方面來分解品名物料的管理屬性:
 
  基本屬性
 
物料的基本屬性用於描述物料的設計特徵,這些屬性主要包括物料編碼、物料名稱、物料類型編碼、物料類型名稱、設計圖號、設計版次、生效日期、失效日期、品種規格(牌號、技術規格、技術條件和技術狀態)、默認計量單位、單位重量、重量單位、單位體積和體積單位等。
 
  物料編碼和物料名稱都是物料的標識,物料編碼用於唯一標識物料,而物料名稱用於物料的輔助識別。物料類型編碼和物料類型名稱主要用於物料的統計分析。品種規格屬性描述物料的品牌、規格等信息。
 
  庫存與採購屬性
 
物料的採購和庫存屬性主要描述與採購、庫存管理有關的信息,這些屬性包括物料製購類型、默認倉庫、默認庫位、物料條形碼、是否可用、ABC碼、盤點方式、循環盤點編碼、盤點週期、盤點日期、是否批次管理、批次號、批次有效天數、批次檢測週期、最新入庫日期、最新入庫量、最後出庫日期、最新出庫量、最新檢測日期、最新檢測結果、是否單件管理、是否限額領料、是否允許超採購訂單入庫、現有庫存量、最大庫存量、安全庫存量、物料平均日耗量、庫存金額、是否進價控制、物料計劃單價、進價上限率、默認供應商和在供方使用的編碼等。
 
  任何一家企業可以根據自身特點和條件來對物料的這一屬性進行管控。比如,物料製購類型包括自製件和採購件;企業可以有多個性質不同的倉庫,以便存儲不同的物料;如果公司物料管理方面採用了條形碼管理,那麼,可以在物料條形碼屬性中存儲該物料的條形碼數據。條形碼是否與物料編碼相同或關聯,也由公司的編碼規則確定。
 
  談到庫存,還有一項不可分割的活動就是庫存盤點。庫存盤點是對每一種庫存物料進行清點數量、檢查質量和登記盤點表,且對盤盈盤虧數量進行物料賬面調整、達到物料賬物相符目標的管理過程。批次管理也是生產管理的一種重要手段。當某個物料有存儲有效期限制時,或需要對該物料的每一批物料進行跟踪控制時,可以採用批次管理功能。
 
  計劃類屬性
 
  物料的計劃類屬性主要描述與生產計劃管理相關的信息,這些信息包括確定物料需求的方式和物料需求的各種期量數據。例如,是否獨立需求、補貨政策、補貨週期、訂貨點、訂貨批量、採購或加工提前期、生產已分配量、銷售已分配量、不可用量、庫存可用量、批量政策、批量週期、默認工藝路線編碼、默認工藝路線名稱、是否可以替換、可替換物料編碼以及是否虛擬件等。
 
  銷售類屬性
 
  物料的銷售類屬性主要描述與物料銷售有關的信息,包括銷售價格、銷售人員和銷售類型等內容。例如,銷售計劃價格、計價貨幣、折扣率、是否售價控制、銷價下限率、銷售成本科目、佣金、銷售人員編碼、默認的客戶編碼以及物料在買方使用的編碼等。
 
  以上僅僅是從一個物料,就已經剖析出近百個管理屬性。由此可見一個複雜的ERP管理軟件是有著多麼錯綜複雜的管理網狀結構。 ERP的管理對象的複雜性,需求的多變性決定了我們不可能像引進機器一樣引進ERP,引進ERP的管理思想。它必須立足企業,融入企業自身的管理特徵與管理條件才能發揮作用。


 
  我在多年協助企業導入與量身定做開發ERP管理軟體時,很多企業在考慮實施導入的時候,往往只注重到了他們現有看的到、感覺的欄位屬性,但無論是何種生產類型生產什麼產品,無論企業的規模大小,他們都是根據客戶的需求確定什麼時候生產什麼產品生產多少數量,從而確定什麼時間採購和生產什麼物料,採購和生產多少數量。他們要對供應鏈上的物流、資訊流、資金流進行優化控制和管理,使資源利用最大化。他們都追求共同的目標:最大限度的縮短產品的生產週期和採購提前期,最大限度的降低庫存資金佔用,降低生產成本,準時交貨,提高生產能力,快速響客戶的需求。



  但是決定ERP能否真正能給企業帶來經濟效益的,決定ERP實施成敗的,延展諮詢認為是它的專業屬性。製造業企業隨著他們的生產組織、生產批量、生產產品的不同,其管理需求是不盡相同的。一般ERP軟體產品將製造業企業分為離散製造業和流程工業兩類。又將離散製造分為單件生產、多品種小批量生產、大批量流水生產和大規模定制等四種類型,以及上述類型的混合製造模式。根據客戶定單介入生產過程的不同又分為按庫存生產、按定單裝配、按定單生產和按定單設計的管理模式。比較全面的ERP產品他們通過不同功能的配置可以滿足上述不同需求。但一個ERP產品要想把上述各種各樣的需求都包含在產品裡,那麼這個產品就是一個怪物,譬如我們還是以物料的屬性為例,有些物料的屬性是可以窮舉的,譬如成衣生產的規格;而有一些屬性是無法窮舉的,譬如布匹染廠的,布匹顏色、尺寸大小。所以,ERP產品有強烈的專業性,而對這一點認識和客戶化處理決定企業ERP實施的成敗,所以要導入一個好的成功地ERP管理軟體,必須和企業流程、企業產業特性進行徹底地了解與討論,整理出目前與未來要分析管理的品名欄位,才是一個導入與開發ERP的起始點。


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


軟體對企業的價值(軟體開發、軟件開發、客制化軟體)

    這半年,我發覺委託我們開發軟體的客戶,幾乎都再次委託我們進行擴充功能,而且或許值得開心的,除了以往企業管理軟體系統(ERP、進銷存、CRM、POS)等,開始很多客戶為了創造原來產品的價值,開始重視軟體可以帶來的價值。

aa   

    例如,其中一個客戶工業設備空調大廠原本在自有的產品,具有一定的市場競爭性,但客戶董事長,認為如果可以透過軟體來提升使用設備的效益,所以再次委託我們開發軟體,來偵測使用設備的用電量趨勢圖、溫度的變化、散熱效果等,來產生各種圖表、趨勢圖,給客戶不止使用硬體設備,還可以因為使用硬體設備,透過軟體來增加附加價值,給客戶建議用電量使用狀況,而且可以透過軟體管理界面來管理大量的設備,例如批次關閉設備、開啟設備、設定警示音效,當達到某個電量數據、溫度數據,可以發出警報。

    上面我提客戶只是近來一個案例,這個客戶董事長非常有前瞻性思維,他把軟體直接附贈給購買設備的終端客戶,讓原本已經具有競爭性產品設備、更因為軟體的價值,來建立與競爭同業更大的產品優勢,其他競爭廠商還幾乎停留在設備跟價格定價的商業手法。


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

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰

業務合作、軟體委外開發

業務窗口:allen@netqna.com

聯繫電話:0920-883-870

公司電話:02-55991310

公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓

skype: netqna

line:netqna

微信:netqna

黃先生 Allen

產品成本計算系統(軟體開發、軟件開發、客製化軟體)

今年7月份由一家多年在越南設廠的文具用品的台商,委外我量身定做開發屬於他們的ERP系統,該廠商在未委外給我開發軟體時,也在其他知名的套裝軟體有多年的使用經驗,但因為市面上的套裝軟體事實上無法真正的負荷他們的流程以及產品與用料成本計價方式,所以透過 Skype 與我洽談很久(談了2個月),確定我們開發團隊可以了解他們目前工廠遇到的問題就正式放心交個我進行開發設計了。


  不過難度比我想象的還複雜,不是一般BOM表可以用來克服成本計算,所有要分析他們所有會產生成本的各種因素,如材料、人力、耗材、製程,下面系統畫面是一個部分使用者操作畫面,可以用來自動計算單一個產品的所有影響成本的統計計算,未來他們就只要填寫報價單,轉正式訂單,系統就會把複雜的成本計算自動算好,帶入報價與訂單系統。


aaa


一個好的軟體系統,可以有效提升企業與工廠內部管理,讓企業專注於客戶接單、產品研發、而流程整合與數據分析就交給好的軟體系統。




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