工廠數據管理系統
目錄
背景簡介
程序主要功能:管理一條有多個工位(每個工位功能不同)的流水線的數據。
主要用的技術:C#、SQL Server、ADO.Net技術。
功能實現
數據庫設計
- 數據庫中共4張表。
分別爲:
production_day(實時數據)
production_month(當月數據)
production_history(歷史數據)
login(登錄數據) - 記錄產品的表中有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 - 記錄用戶的表中有4個字段
分別爲:
自動編號 :auto_Id int 備註:自增1、非空約束
用戶ID :login_Id varchar(15) 備註:主鍵列
用戶密碼 :login_pwd varchar(50) 備註:非空約束
用戶等級 :login_level char(1) 備註:非空約束、1~3
窗體設計
- 窗體共分爲4部分:登錄界面、最新寫入數據、當月數據、歷史記錄部分。(附帶測試部分,測試數據用)
- 登錄部分:能良好的與用戶交互.
- 最新寫入數據部分:將未完工產品實時數據按梯形顯示。
- 當月數據部分:顯示產品狀態圖像、顯示本月完成的產品。
- 歷史數據部分:按日期查找、按序列號查找、顯示數據庫連接狀態、將當前查詢數據導出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;
}
- 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();
- 寫入數據
工作流程:工作臺發送產品序列號和其工位號,控制檯接收並在數據庫查詢是否有該記錄,如果沒有,判斷之前工位在線和合格狀態,如果全在線併合格,向工作臺發送指令可以工作,工作之後向控制檯發送工作信息,控制檯存入數據。如果有不合格或離線,向工作臺發送指令,工作臺向控制檯發送時間日期信息,將狀態轉爲離線,控制檯將數據寫入數據庫。如果有該記錄,判斷其如果在線並不合格並加工次數小於3次,向工作臺發送指令可以工作,工作之後向控制檯發送工作信息,控制檯存入數據,否則不做任何事情。
- 寫入數據
心得總結
這是我做的第一個項目,前前後後小模型寫了4、5遍,但感覺寫的還是不好,現在功能已經實現了百分之七八十了,應該大體就是這樣了(代碼不多目前大致1300行)。現在寫的差不多了,回頭看看,感覺挺簡單的,也沒用到太多難的東西。但寫的時候問題百出,一個小功能能寫好幾個小時,可能是我第一次寫項目吧,項目比學習的時候小demo綜合性強的多。寫項目的感覺和寫小demo的感覺確實不一樣,能鍛鍊自己分析問題,查資料,構思,解決問題的能力。
然後其實寫個過程遇到了好多問題,也想辦法解決了好多,但不知道咋寫出來。在加上我文筆不好,這博客寫的。。。實則慚愧(我真的是認真在寫)。大家多多批評,我會繼續努力的!!!