תוכן עניינים:

EAL-Industri4.0-RFID Dataopsamling Til Database: 10 שלבים (עם תמונות)
EAL-Industri4.0-RFID Dataopsamling Til Database: 10 שלבים (עם תמונות)

וִידֵאוֹ: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 שלבים (עם תמונות)

וִידֵאוֹ: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 שלבים (עם תמונות)
וִידֵאוֹ: Industry 4.0 Internet of Things, Technology Evolution & Big Data. How Technology Changes Our Lives 2024, יולי
Anonim
EAL-Industri4.0-RFID Dataopsamling Til Database
EAL-Industri4.0-RFID Dataopsamling Til Database

זוהי הפרויקט שמטרתו להבחין במשקל נתונים, רישום זהויות. RFID, פיגור הנתונים ואני en MySQL database vha. node-RED, samt fremvisning וטיפול של נתוני opsamlede ותוכנת C# שאני יוצר ביישום Windows Form. Vi forestiller או:

אנו מציעים יצרן של מפיקים בעבודת 200 גרם foliebakker. כל מכשירי חיבור למכשירים עם תגי RFID עם תגיות פלסטיק/תוויות, הכוללות מזהה ייחודי (UID = מזהה ייחודי, הוא בעל 32 סיביות קוד, 8 תכונות הקסדצימליות) לכל זיהוי כל אחד ואחת. Da færdigvægten of each enkelt bakke leverpostej can svinge (אחריות של råvarer, fordampning i ovn mm), and da kunderne each have and specific krav krav færdigvægten, Brug UID tagget to at knute each enkelt leverpostej to a specific lagerlokation on lageret, hvor der kun lagres Leverpostejer til one specific kunde. Kunderne er supermarkedskæder:

1. אירמה. כמות התערוכות היוקרתיות של חג המולד אמורה להישאר בתוספת של +/- 5%, כלומר מינימום 190 גרם וגבוהה ביותר של 210 גרם.

2. ברוגסן. Vægten on Brugsens leverpostej will keep sig inside for +/- 10%, כלומר מינימום 180g ו- maksimum 220g.

3. אלדי. מבצע הנחה על אלדיס צריך להישאר בתוספת של +/- 15%, כך מינימום 170 גרם ומקסימום 230 גרם.

Der er således følgende sorteringer:

טווח 0: מחוץ לטווח

טווח 1: מינימום 190 גרם/מקסימום 210 גרם

טווח 2: מינימום 180 גרם/מקסימום 220 גרם

טווח 3: מינימום 170 גרם/מקסימום 230 גרם

שלב 1: נתוני אוסף של Opsamling לרישום VID Samt

Opsamling נתוני Af עבור Vægt Samt רישום UID
Opsamling נתוני Af עבור Vægt Samt רישום UID

ניתן לאסוף נתונים עבור משקל, ולרשום רישומים של תגי RFID בשימוש ב- Arduino MEGA2560 עם קורא/כותב RFID-RC522. Da vi ikke har any weight, סימולר vi data for vægten med et potmeter tilsluttet en analog analoge on Arduinoen.

הגדרת אופציה מיושמת:

1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, midterbenet er tilsluttet AN0

RFID-RC522 er tilsluttet לוחות Arduino SPI port בכמה אופנים:

SDA -> סיכה 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3.3V -> 3.3V

נתוני De opsamlede, עבור hhv. UID וגם vægten, נשלח על נמל serielle כקודם להפריד טקסט אחר אל node-Red כי עומד אחר ההצגה הבאה על לוח המחוונים והמאגר של מסד נתונים.

שלב 2: תוכנית Arduino

אני ארדואינו תוכנית כוללת את הביבליוטקר SPI.h og MFRC522.h עבור או יכול להשתמש RFID læseren. אני מתחיל את משתנה התוכנה המתאימה. Der laves en instans af MFRC522. אני מגדיר אתחול האתחול של Serielle Connection, SPI Porten ו- MFRC522. לאחר מכן scannes efter תגי RFID. For not at sende det samme UID afsted flere gange efter hverandre, there is made and stump code som tjekker for dette. כאשר der er scannet et UID tag, loades arary nyUID med det בדיוק læste UID. אם מערך nyUID הוא מידע על oldUID, שם ניתן לרכוש ולשנות UID שיכול לשלוח את הנמל הסרלי. אם nyUID og oldUID הוא ens, er der tale om אותו UID tag ו- UID'et צריך להתעלם. אם יש לך UID, אתה יכול לשלוח UID'et על port serielle יחד עם ערך משמעותי מה port serielle. הערך האנלוגי של הסביבה 150-250. הנתונים שולחים מסמך טקסט אחד. Som det sidste s put oldUID = nyUID, således at koden klart to read and nyt RFID tag.. Den last function in program is the function as comparer 2 arrays. פונקציות מחזירות true אם array'ne er ens, ו- false if array'ne er different.

#לִכלוֹל

#include // תוכנית זו סורקת כרטיסי RFID באמצעות לוח קורא/כותב RDIF-RC522. // קוראים UID, קוראים סיכה אנלוגית. ערך אנלוגי 0-1023 משתנה ל -150-250. // ערך ה- UID והערך האנלוגי נשלח כטקסט המופרד בפסיקים ביציאה טורית באמצעות 9600, N, 8, 1. // יש להקפיד לשלוח כל UID פעם אחת ברציפות, // UID חייב להיות קיים לפני שניתן לשלוח שוב את אותו UID. // פונקציה זו מיושמת בקוד על ידי השוואת מערכים: oldUID nyUID בפונקציה array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int ערך = 0; String StringValue = "0000"; בתים oldUID [4] = {}; בתים nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // צור מופע MFRC522.

הגדרת חלל ()

{Serial.begin (9600); // ליזום תקשורת טורית SPI.begin (); // ליזום אוטובוס SPI mfrc522. PCD_Init (); // התחל MFRC522}

לולאת חלל ()

{// חפש כרטיסים חדשים אם (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // בחר אחד מהכרטיסים אם (! Mfrc522. PICC_ReadCardSerial ()) {return; } // טען nyUID עם תג UID עבור (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// שלח תג UID ביציאה טורית עבור (בת i = 0; i 1000) {Value = 1000; } ערך = (ערך / 10) + 150; // שלח ערך אנלוגי בקנה מידה Serial.print (ערך); // שלח newline Serial.println (); // הגדר oldUID = nyUID עבור (בת z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // המתן איחור של 1 שניות (1000); }

// השווה 2 מערכים …

array_cmp בוליאני (בייט a , בת ב ) {bool test = true; // בדוק כל רכיב להיות זהה. אם רק אחד אינו, החזר false עבור (בתים n = 0; n <4; n ++) {אם (a [n]! = b [n]) test = false; // אם על בתים לא שווה, test = false} אם (test == true) החזר נכון; אחרת להחזיר שקר; }

שלב 3: Node-RED, מאגר נתונים של מסד נתונים I

Node-RED, מאגר נתונים של מסד הנתונים I
Node-RED, מאגר נתונים של מסד הנתונים I
Node-RED, מאגר נתונים של מסד הנתונים I
Node-RED, מאגר נתונים של מסד הנתונים I

הזרימה הבאה נכתבה בצומת אדום:

COM4 הוא קשר רציף לכמה נתונים מקבלים מהארדואינו. פונקציונליות "פיצול וקבל ערך" ומפצל "ספליט וקבל UID" מפעל טקסטים שנשלח באמצעות פקודות וחזורים של hhv vægten ו- UID. Vægten bruges to fremvisning on dashboardet in et linechart and in scale. UID fremvises i et tekstfelt. פונקציות test_sound advarer verbalt med sætningen "מחוץ לטווח", אם משקל מתחת ל -170 גרם או מעל 230 גרם, dvs i טווח 0.

פיצול וקבל ערך:

פלט var = msg.payload.split (',');

temp = {מטען: (פלט [1])}; טמפ 'החזרה;

פיצול וקבל UID:

var output = msg.payload.split (",");

temp = {מטען: פלט [0]}; טמפ 'החזרה;

test_sound:

var number = parseInt (msg.payload);

if (מספר> 230 || מספר <170) {newMsg = {מטען: "מחוץ לטווח"}; החזר newMsg; } אחר {newMsg = {מטען: ""}; החזר newMsg; }

Funktions Split string "," indsætter and timestamp, UID and vægten in a database patedb.patelog.

var output = msg.payload.split (","); // פיצול msg.payload לפי פסיק למערך

UIDTag = פלט [0]; // חלק ראשון למיקום הראשון [0] ValueTag = output [1]; // חלק שני לתפקיד שני [1]

var m = {

topic: "INSERT INTO patedb.patelog (חותמת זמן, UID, משקל) VALUES ('"+תאריך חדש (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; החזר מ;

patelog er en database של MySQL יכול להתחבר לאחד הפרמטרים הבאים:

מארח: מארח מקומי

נמל: 3306

משתמש: root

מסד נתונים: patedb

שלב 4: עיצוב מסד נתונים

עיצוב מסד נתונים
עיצוב מסד נתונים

Databasen patedb מכיל 4 טבלרים

patelog er dataopsamlingstabellen, tilskrives data af node-RED og C# תוכנית

ניתן להזמין נתונים בטבלה הכוללת נתונים על הגנריות המבוססות על כתובות, עדכיירים של C# התוכנית

לקוחות מותאמים אישית ורשומים

טווח טווחים הוא טבלה המכילה ירקות עבור טווחי התוכנית.

שלב 5: Patelog

פטלוג
פטלוג

Tabellen patelog כולל folgende 6 קולונרים:

pateID (int) הוא המפתח הראשי והדגמים אוטומטיים.

חותמת זמן, UID & משקל הוא מסוג סוגי varchar (med forskellig max length)

rangeNr er of type tinyint (beregnes and tilføjes af C# program)

orderID er af typen int (orderID tilføjes af C# program)

Node-RED לא יכול להעריך את טווח הקולונר. rangeNr og orderID tillader NULL værdier, det Bruce in C# program til at detektere de rækker som skal tilskrives valuier for rangeNr and orderID

שלב 6: ניתן להפעלה

ניתן להפעלה
ניתן להפעלה

Ordertable מכיל 5 קולונר:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) הוא מספר השכירות בפועל. (Tælles af C# תכנית)

comment (tinytext) הוא הערה לאירוע לשירויות.

customerID (int) הוא נתון הלקוח הנוכחי על סדר היום.

שלב 7: ניתן להתאמה אישית

מותאם אישית
מותאם אישית

התאמה אישית מכילה 6 קולונרים:

customerID (int) הוא מפתח ראשי og auto inc.

שם, כתובת, טלפון, דוא ל (varchar) med forskellig max lengde

rangeNr (int)

שלב 8: לוח טווח

טווח רכבים
טווח רכבים

לוח טווחים מכיל 3 קולונרים:

rangeNr (int) הוא מפתח ראשי og inc.

rangeMin (int)

טווח מקס (int)

שלב 9: תוכנית C#

תוכנית C#
תוכנית C#

כאשר שם הפיקוחים וההנחיות הם הפרוצדורות הבאות:

Kundenummer, ordrenummer, ordreantal og en eventuel comment indtastes i C# program (i practice overases det digitalt from enterpriseens ordresystem. Productions startes nu ved tryk on 'start'- knappen. When en leverpostej is færdigproduceret and låget is monteret, vejes den of Arduinoen (på et transportbånd) Samhørende værdier of UID and the relevant weight sendes serielt til node-RED, which viser the opsamlede data on dashboard 'et. הזמן לא יכול לקבל ערך לטווחNr והזמנה מזהה יש ערך NULL.

Med et timerinterval undersøger C# program patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. כאשר יש לזהות מספר רב של NULL ערך, טווח הערכות והמקרים יחד עם ההזמנה הנוכחית. כאשר en ordre er produceret, afsluttes ordren ved tryk på”stop”- knappen. כאשר ordren avsluttes, tilføjes en row til patedb.ordertable med aktual ordredata. כאשר ניתן לסיים את הנתונים, אני יכול לאסוף נתונים בפתוחים ולפתוח את התצוגה על מנת ללחוץ על קבצים שונים של קבוצת עדכוני DataGridview. ניתן להזמין גם להופיע, ולרשותם ניתן למצוא מידע על יחידות UID'er או לקוח נתונים על פרטים אישיים.

באמצעות מערכת; שימוש ב- System. Collections. Generic; באמצעות System. ComponentModel; שימוש ב- System. Data; שימוש ב- System. Drawing; באמצעות System. Linq; שימוש ב- System. Text; שימוש ב- System. Threading. Tasks; שימוש ב- System. Windows. Forms; באמצעות MySql. Data. MySqlClient;

מרחב שמות show_data_from_database

{מחלקה ציבורית חלקית טופס 1: טופס {חיבור MySqlConnection = MySqlConnection חדש ("מקור מידע = localhost; שם משתמש = root; סיסמא = ''"); int RowNumber = 0; // משתנה לאחסון ערך pateID int RangeNumber = 0; // משתנה לאחסון משקל rangenumber = 0; // משתנה לאחסון המשקל int OrderNr = 0; // משתנה לאחסון OrderNR int QuantProduced = 0; // משתנה לאחסון הכמות המיוצרת int NumberOfRows = 0; // מספר שורות עם null.. bool ProdRunning = false; // משתנה המציין אם לחצני ההתחלה והעצירה הופעלו int גבולות = חדש int [6]; // לאתחל מערך int CustomerID; // משתנה לאחסון customerID public Form1 () {InitializeComponent (); load_table (); // להתקשר load_table}

void load_table ()

{פקודה MySqlCommand = MySqlCommand חדש ("SELECT * מתוך patedb.patelog ORDER BY חותמת זמן DESC;", חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}

חלל פרטי SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["חותמת זמן"]. DisplayIndex = 1; // Her kansequfølgen of kolonner Changres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kansequfølgen of kolonner Changres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kansequfølgen af kolonner ændres}

חלל פרטי GetData_Click (שולח אובייקט, EventArgs e) // קורא טבלת מסדי נתונים והזמנות לפי חותמת זמן

{load_table (); }

חלל פרטי btnRefreshUID_Click (שולח אובייקט, EventArgs e) //

{string timeStr = "SELECT * מתוך patedb.patelog הזמנה לפי UID;"; פקודת MySqlCommand = MySqlCommand חדשה (timeStr, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}

void פרטי btnRefreshValue_Click (שולח אובייקט, EventArgs e)

{string weightSort = "SELECT * מתוך patedb.patelog הזמנה לפי קסטה (משקל כפי שנחתם אינטגר);"; פקודת MySqlCommand = MySqlCommand חדשה (משקלSort, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}

חלל פרטי ChkNullBtn_Click (שולח אובייקט, EventArgs e)

{if (ProdRunning) {CheckTableForNull (); load_table (); }}

חלל פרטי CheckTableForNull ()

{// בדוק/הגדר מרווח זמן מינימלי 100 ms int i; int. TryParse (textTimer1. Text, out i); אם (i <100) {timer1. Stop (); i = 100; טיימר 1. מרווח = i; MessageBox. Show ("ערך מינימלי i 100mS"); טיימר 1. התחל (); } אחר {טיימר1.אינטרוול = i; } textTimer1. Text = timer1. Interval. ToString (); // בדוק אם שורות עם null זמינות בטבלה מחזירות את מספר השורות במשתנה: NumberOfRows string stringStr = ""; string chkNull = "בחירת ספירה (*) מתוך patedb.patelog היכן הטווח NR הוא הזמנה אפסית לפי הגבלת pateID 1;"; פקודת MySqlCommand = MySqlCommand חדשה (chkNull, חיבור); נסה {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); connection. Close (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } לבסוף {if (NumberOfRows! = 0) {try {// בוחר את המספר הנמוך ביותר של pateID שבו rangeNr הוא NULL string readID = "SELECT pateID מתוך patedb.patelog WHERE rangeNR הוא NULL ORDER לפי pateID ASC LIMIT 1;"; MySqlCommand cmdID = MySqlCommand חדש (readID, חיבור); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); //מספר שלם!! connection. Close (); } listPateID. Text = RowNumber. ToString (); // לקרוא את מספר ה- PateID שנבחר // בוחר משקל משורת המחרוזות מספר מס 'rown = RowNumber. ToString (); string readweight = "בחר משקל מתוך patedb.patelog WHERE pateID =" + שורה; MySqlCommand cmdweight = MySqlCommand חדש (משקל קל, חיבור); {connection. Open (); weightStr = (string) cmdweight. ExecuteScalar (); // מחרוזת !! connection. Close (); } משקל = int. Parse (weightStr); // להמיר int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; אם (משקל> = גבולות [0] && משקל = גבולות [2] && משקל = גבולות [4] && משקל <= גבולות [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} חלל פרטי btnStart_Click (שולח אובייקט, EventArgs e) {if (ProdRunning == false) {int valtest; נסה {CustomerID = int. Parse (txtCustomerNr. Text); // read customerID} catch {MessageBox. Show ("הזן נתוני ייצור ולחץ על כפתור 'התחל'."); }

string test = "SELECT COUNT (*) FROM patedb.customertable WHERE customerID ="+CustomerID;

MySqlCommand cmdtestcustomer = MySqlCommand חדש (בדיקה, חיבור); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // מחזירה 0 אם הלקוח אינו קיים חיבור.סגור (); } if (valtest == 1) // אם קיים לקוח במסד הנתונים - התחל בייצור {נסה {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; טיימר 1. התחל (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (יוצא מן הכלל) {MessageBox. Show ("הזן נתוני ייצור ולחץ על כפתור 'התחל'."); }} else MessageBox. Show ("הלקוח אינו במסד הנתונים, נסה שוב"); } // ReadLimits (); }

חלוקות פרטיות של ReadLimits ()

{// קורא גבולות מטווח טווח, טווח 1 עד 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = MySqlCommand חדש (readmin, חיבור); {connection. Open (); גבולות [counter] = (int) cmdmin. ExecuteScalar (); מונה = מונה + 1; connection. Close (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = MySqlCommand חדש (מקס קריאה, חיבור); {connection. Open (); גבולות [counter] = (int) cmdmax. ExecuteScalar (); מונה = מונה + 1; connection. Close (); }} // סוף עבור לולאה}

UpdateLog פרטי חלל ()

{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); string Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+טווח+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = MySqlCommand חדש (עדכון, חיבור); נסה {connection. Open (); updatecmd. ExecuteNonQuery (); connection. Close (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}

חלל פרטי btnStop_Click (שולח אובייקט, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("עדיין לא החלה הפקה. הזן נתונים ולחץ על כפתור" התחל "); }}

פרטי חלל UpdateOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) VALUES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProduced. ToString ()+"','"+this.txtComment. Text+"','"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = MySqlCommand חדש (הכנס, חיבור); נסה {connection. Open (); insertcmd. ExecuteNonQuery (); connection. Close (); QuantProduced = 0; } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}

טיימר חלל פרטי 1_Tick (שולח אובייקט, EventArgs e)

{CheckTableForNull (); load_table (); }

חלל פרטי btnShowOrderTable_Click (שולח אובייקט, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("לחץ על עצור כדי לראות סדר טבלה"); }}

private void btnShowOrderDetails_Click (שולח אובייקט, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text +"' "); פקודת MySqlCommand = MySqlCommand חדשה (בדיקה, חיבור); נסה {connection. Open (); מתאם MySqlDataAdapter = MySqlDataAdapter חדש (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } connection. Close (); } else {MessageBox. Show ("הקש על עצור לצפייה בפרטי ההזמנה"); }}

private void btnShowCustomerDetails_Click (שולח אובייקט, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.customertable.customerID, שם, כתובת, טלפון, דוא"ל, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID = patedb.customertable. customerID WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text +"' "); פקודת MySqlCommand = MySqlCommand חדשה (בדיקה, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("לחץ על עצור כדי לצפות בפרטי הלקוח"); }}}

}

מוּמלָץ: