工廠數據管理系統

工廠數據管理系統

目錄

背景簡介

程序主要功能:管理一條有多個工位(每個工位功能不同)的流水線的數據。
主要用的技術:C#、SQL Server、ADO.Net技術。

功能實現

數據庫設計

  1. 數據庫中共4張表。
    分別爲:
    production_day(實時數據)
    production_month(當月數據)
    production_history(歷史數據)
    login(登錄數據)
  2. 記錄產品的表中有21個字段。
    分別爲:
    下面四個字段每產品一個
    序號 :id int 備註:自增1、非空約束
    序列號 :id_pro varchar(32) 備註:與工位號作爲複合主鍵
    工位號 :id_op varchar(6)
    因爲每條流水線的工位數不同,並且每個工位的屬性、方法不同.爲提高程序複用性,將產品序列號和工位號作爲複合主鍵。
    二維碼 :QR_code varchar(100)
    下面字段每產品的每工位一個
    生產日期 :date date 備註:非空約束
    生產時間 :time time(7) 備註:非空約束
    在線狀態 :online char(1) 備註:非空約束
    上述字段(除二維碼)應該非空,工位只要工作就該有數據
    是否合格 :status char(1)
    工作次數 :time_op int
    壓力*3 :pressure1~3 real
    位移*3 :distance1~3 real
    扭矩*2 :torque1~2 real
    泄漏量*4 :leak1~4 real
  3. 記錄用戶的表中有4個字段
    分別爲:
    自動編號 :auto_Id int 備註:自增1、非空約束
    用戶ID :login_Id varchar(15) 備註:主鍵列
    用戶密碼 :login_pwd varchar(50) 備註:非空約束
    用戶等級 :login_level char(1) 備註:非空約束、1~3

窗體設計

  1. 窗體共分爲4部分:登錄界面、最新寫入數據、當月數據、歷史記錄部分。(附帶測試部分,測試數據用)
  2. 登錄部分:能良好的與用戶交互.
  3. 最新寫入數據部分:將未完工產品實時數據按梯形顯示。
  4. 當月數據部分:顯示產品狀態圖像、顯示本月完成的產品。
  5. 歷史數據部分:按日期查找、按序列號查找、顯示數據庫連接狀態、將當前查詢數據導出execl表、將當月表數據導入歷史表。

具體實現

登錄面板

這裏寫圖片描述
1. 登錄按鈕:連接到數據庫判斷用戶名和密碼是否正確。正確該容器隱藏,顯示操作界面。錯誤文本框清空,用戶名的textBox獲得焦點。(該方法應單獨一個線程,防止窗體假死)
2. 清空按鈕:清除textBox中的文字,使用戶名的textBox獲得焦點。

主面板

這裏寫圖片描述
這裏寫圖片描述
1. 查詢功能:因爲數據庫每條信息是工位工作的信息,而窗體要求每條信息是每條產品的信息。所以,先創建一個產品類,把產品的屬性全部寫上。然後創建一個產品類型的泛型集合。使用Read()方法讀取到數據,判斷與集合最後一個元素的序列號是否相同。若相同不創建新的產品對象,將該條工位工作信息逐條賦值給產品對應工位的屬性。若不同,創建新產品對象,在將信息寫入。最後將把datagataview的數據源綁定爲該集合。
2. 將datagridview數據導出Excel表,前提要裝office,然後該項目的引用要添加COM下的Microosoft Excel 14.0 Object Library引用。

//這是項目需要的一個小功能,上網找的代碼稍加修改,就用了,沒深入學習具體是怎麼工作的。
using Excel = Microsoft.Office.Interop.Excel;
//參數傳要導出excel表的datagridview對象
 public static void DataToExcel(DataGridView dgv)
        {
            if (dgv.Rows.Count == 0)
            {
                MessageBox.Show("無數據"); return;
            }
            MessageBox.Show("開始生成要導出的數據", "導出提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            Excel.Application excel = new Excel.Application();
            excel.Application.Workbooks.Add(true);
            excel.Visible = false;
            for (int i = 0; i < dgv.ColumnCount; i++)
                excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
            string outStr;
            for (int i = 0; i < dgv.RowCount; i++)
            {
                for (int j = 0; j < dgv.ColumnCount; j++)
                {
                    if (dgv[j, i].ValueType == typeof(string))
                    {
                        outStr = dgv[j, i].Value == null ? "" : dgv[j, i].Value.ToString();
                        excel.Cells[i + 2, j + 1] = "'" + outStr;//dgv[j, i].Value.ToString();
                    }
                    else
                    {
                        outStr = dgv[j, i].Value == null ? "" : dgv[j, i].Value.ToString();
                        excel.Cells[i + 2, j + 1] = outStr;// dgv[j, i].Value.ToString();
                    }
                }
            }
            MessageBox.Show("生成成功,請保存。", "生成提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            excel.Visible = true;
        }
  1. datagridview控件簡單用法
    • 1.DataGridView.EditMode 屬性被設置爲 DataGridViewEditMode.EditProgrammatically 時,用戶就不能手動編輯單元格的內容了。但是可以通過程序,調用 DataGridView.BeginEdit 方法,使單元格進入編輯模式進行編輯。
    • 2.設定包括Header和所有單元格的列寬自動調整
      DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    • 3.設置如何選擇單元格SelectionMode=FullRowSelect;設置行選中
    • 4.行選中事件
//選中行顯示事件
//參數爲datagridview對象和選中事件
        private void dgvRowEnter(DataGridView d,DataGridViewCellEventArgs e)
        {
        //創建行對象,接收選中的行的數據
            DataGridViewRow currentRow = d.Rows[e.RowIndex];
            //將行對象項中的值賦給產品對象的屬性
            Production pro = currentRow.DataBoundItem as Production;
            if (pro != null)
            {
                label18.Text = "SN:"+pro.序列號;
                FWTool.Pan(pro.OP10在線狀態, pro.OP10合格狀態, label2);
                FWTool.Pan(pro.OP20在線狀態, pro.OP20合格狀態, label4);
                FWTool.Pan(pro.OP30在線狀態, pro.OP30合格狀態, label6);
                FWTool.Pan(pro.OP40在線狀態, pro.OP40合格狀態, label8);
                FWTool.Pan(pro.OP50在線狀態, pro.OP50合格狀態, label10);
                FWTool.Pan(pro.OP60在線狀態, pro.OP60合格狀態, label12);
                FWTool.Pan(pro.OP70在線狀態, pro.OP70合格狀態, label14);
                FWTool.Pan(pro.OP80在線狀態, pro.OP80合格狀態, label16);
                if (label2.ForeColor == Color.DarkGray && label4.ForeColor == Color.DarkGray && label6.ForeColor == Color.DarkGray && label8.ForeColor == Color.DarkGray && label10.ForeColor == Color.DarkGray && label12.ForeColor == Color.DarkGray && label14.ForeColor == Color.DarkGray && label16.ForeColor == Color.DarkGray
                    )
                    pictureBox1.BackColor = Color.DarkGray;
                else if (label2.ForeColor != Color.Red && label4.ForeColor != Color.Red && label6.ForeColor != Color.Red && label8.ForeColor != Color.Red && label10.ForeColor != Color.Red && label12.ForeColor != Color.Red && label14.ForeColor != Color.Red && label16.ForeColor != Color.Red)
                    pictureBox1.BackColor = Color.Lime;

                else
                    pictureBox1.BackColor = Color.Red;
            }
        }
  • 5.取消行選中狀態dataGridView3.ClearSelection();

    1. 寫入數據
      工作流程:工作臺發送產品序列號和其工位號,控制檯接收並在數據庫查詢是否有該記錄,如果沒有,判斷之前工位在線和合格狀態,如果全在線併合格,向工作臺發送指令可以工作,工作之後向控制檯發送工作信息,控制檯存入數據。如果有不合格或離線,向工作臺發送指令,工作臺向控制檯發送時間日期信息,將狀態轉爲離線,控制檯將數據寫入數據庫。如果有該記錄,判斷其如果在線並不合格並加工次數小於3次,向工作臺發送指令可以工作,工作之後向控制檯發送工作信息,控制檯存入數據,否則不做任何事情。

心得總結

這是我做的第一個項目,前前後後小模型寫了4、5遍,但感覺寫的還是不好,現在功能已經實現了百分之七八十了,應該大體就是這樣了(代碼不多目前大致1300行)。現在寫的差不多了,回頭看看,感覺挺簡單的,也沒用到太多難的東西。但寫的時候問題百出,一個小功能能寫好幾個小時,可能是我第一次寫項目吧,項目比學習的時候小demo綜合性強的多。寫項目的感覺和寫小demo的感覺確實不一樣,能鍛鍊自己分析問題,查資料,構思,解決問題的能力。
然後其實寫個過程遇到了好多問題,也想辦法解決了好多,但不知道咋寫出來。在加上我文筆不好,這博客寫的。。。實則慚愧(我真的是認真在寫)。大家多多批評,我會繼續努力的!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章