กระทู้เก่าบอร์ด อ.Yeadram
1,525 11
URL.หัวข้อ /
URL
การบันทึกข้อมูล ที่ อีกเขตข้อมูลหนึ่งต้องเก็บหลายอ
คือผม ได้สร้างชุดเก็บข้อมูล และหน้าฟอร์มตัวอย่างมาให้ดูครับ
โดย ฟิลย์ ID ของ Table1 และ Table 2 มีความสำพันธ์กัน แบบ หนึ่ง ต่อ กลุ่ม
ใน Table1 เก็บ ชื่อ และ นามสกุล
แต่ Table2 เก็บข้อมูลการใช้บริการ ซึ่ง ใน คน 1 คนได้ใช้บริการหลายๆอย่าง
เช่น นายทรงพล ใจงาม
ได้ใช้บริการ 1.ตัดขนสุนัข 2.ฉีดวัคซินพิษสุนัขบ้า 3.ตัดหาง เป็นต้น
ผมจะสร้างปุ่มบันทึกข้อมูล อย่างไร ให้ Table2 รับค่า ID มาจาก Table1 แล้วบันทึกค่าการให้บริการครบทุกครั้ง
โดยกำหนดให้ เมื่อกดเซฟ ถ้า cmbService1,cmbService2,cmbService3,cmbService4,cmbService5,cmbService6,cmbService7 มีข้อมูลอยู่ให้นำไปบันทึก ใน Table2 ถ้าไม่มีข้อมูลก็ข้ามไป
-*****ผมได้แบบรูปตัวอย่างมาด้วยครับ*****-
ขอบคุณครับ
โดย ฟิลย์ ID ของ Table1 และ Table 2 มีความสำพันธ์กัน แบบ หนึ่ง ต่อ กลุ่ม
ใน Table1 เก็บ ชื่อ และ นามสกุล
แต่ Table2 เก็บข้อมูลการใช้บริการ ซึ่ง ใน คน 1 คนได้ใช้บริการหลายๆอย่าง
เช่น นายทรงพล ใจงาม
ได้ใช้บริการ 1.ตัดขนสุนัข 2.ฉีดวัคซินพิษสุนัขบ้า 3.ตัดหาง เป็นต้น
ผมจะสร้างปุ่มบันทึกข้อมูล อย่างไร ให้ Table2 รับค่า ID มาจาก Table1 แล้วบันทึกค่าการให้บริการครบทุกครั้ง
โดยกำหนดให้ เมื่อกดเซฟ ถ้า cmbService1,cmbService2,cmbService3,cmbService4,cmbService5,cmbService6,cmbService7 มีข้อมูลอยู่ให้นำไปบันทึก ใน Table2 ถ้าไม่มีข้อมูลก็ข้ามไป
-*****ผมได้แบบรูปตัวอย่างมาด้วยครับ*****-
ขอบคุณครับ
11 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R23144
รอเก็บความรู้
2 @R23145
ลองทำแบบเดียวกับใบสั่งสินค้า ผมว่าน่าจะยืดหยุ่นกว่านะครับ ลองดูที่นี่
VDO
VDO
3 @R23146
ขอบคุณอาจารย์ ttt มากครับ คลิบนี้ผมว่าเป็นประโยชน์กับหลาย ๆ คน
ตัวอย่างที่อาจารย์ ttt รูปแบบการทำงานเหมือนกับการเชื่อม Textbox หรือ cmb กับ Table โดยตรงใช่ไหมครับ แต่ติดที่โปรแกรมที่ผมทำอยู่มันเก็บข้อมูลแบบการ Code ประมาณนี้ คำสั่งด้านล่างคือคำสั่ง บันทึก บางส่วนของผมครับ ที่จริงมีหลาย table แต่อันนี้เอามาแค่ table เดียว คือตอนนี้ผมกำลังอยากจะพัฒนาต่อครับคือเพิ่มส่วนของการทำหัตถการคนไข้แต่โปรแกรมเดิมนั้น textbox หรือ cmb ทุกตัวอยู่ในสถานะ unbound ไม่ได้เชื่อมต่อกับ table โดยตรง
กรณีที 1 textbox หรือ 1 cmb เป็นแค่ตัวเดียว เก็บ 1 เขตข้อมูลผมทำได้คับ
แต่กรณีที่ นำข้อมูล หลายๆตัวมาเก็บใน เขตข้อมูลเดี่ยวหลายๆครับ ยังไม่เคยเขียน code แบบนั้นครับเลยอยากรบกวนอาจารย์ด้วยครับ
นี้ตัวอย่างปุ่มเซฟของผมครับ โดยผมแยกคำสั่งบันทึกแต่ละ table เป็นแต่ละ sub ๆ ไปครับ ค่อยมา Call คำสั่งตรงปุ่มบันทึก ประมาณนี้ครับ
Private Sub cmdSave_Click()
On Error GoTo Err_Err
Call AppeDatamain
Call ResetForm
Exit_err:
Exit Sub
Err_Err:
MsgBox Error$
MsgBox ("Data fail try again")
Resume Exit_err
End Sub
Sub AppeDatamain()
On Error GoTo Err_Err
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("tblDATAMAIN", dbOpenDynaset)
rs.AddNew
rs![ID] = txtID
rs![DateIn] = txtDateIn
rs![TimeIn] = txtTimeIn
rs![ReferHosp] = cmbHosp
rs![HN] = txtHN
rs![Bp1] = txtBp1
rs![Bp2] = txtBp2
rs![Pr] = txtPr
rs![Rr] = txtRr
rs![Bt] = txtBt
rs![Spo2] = txtSat
rs![e] = txtE
rs![v] = txtV
rs![m] = txtM
rs![SEVM] = txtSEVM
rs.Update
Exit_err:
Exit Sub
Err_Err:
MsgBox Error$
MsgBox ("ÁÕ¢éͼԴ¾ÅÒ´à¡Ô´¢Öé¹, ¡ÃسҷÓÃÒ¡ÒÃãËÁè ËÃ×Íá¡·ÐàºÕ¹·ÕèÁÕ»ÑËÒ¹ÕéäÇéµèÒ§ËÒ¡")
Resume Exit_err
End Sub
ตัวอย่างที่อาจารย์ ttt รูปแบบการทำงานเหมือนกับการเชื่อม Textbox หรือ cmb กับ Table โดยตรงใช่ไหมครับ แต่ติดที่โปรแกรมที่ผมทำอยู่มันเก็บข้อมูลแบบการ Code ประมาณนี้ คำสั่งด้านล่างคือคำสั่ง บันทึก บางส่วนของผมครับ ที่จริงมีหลาย table แต่อันนี้เอามาแค่ table เดียว คือตอนนี้ผมกำลังอยากจะพัฒนาต่อครับคือเพิ่มส่วนของการทำหัตถการคนไข้แต่โปรแกรมเดิมนั้น textbox หรือ cmb ทุกตัวอยู่ในสถานะ unbound ไม่ได้เชื่อมต่อกับ table โดยตรง
กรณีที 1 textbox หรือ 1 cmb เป็นแค่ตัวเดียว เก็บ 1 เขตข้อมูลผมทำได้คับ
แต่กรณีที่ นำข้อมูล หลายๆตัวมาเก็บใน เขตข้อมูลเดี่ยวหลายๆครับ ยังไม่เคยเขียน code แบบนั้นครับเลยอยากรบกวนอาจารย์ด้วยครับ
นี้ตัวอย่างปุ่มเซฟของผมครับ โดยผมแยกคำสั่งบันทึกแต่ละ table เป็นแต่ละ sub ๆ ไปครับ ค่อยมา Call คำสั่งตรงปุ่มบันทึก ประมาณนี้ครับ
Private Sub cmdSave_Click()
On Error GoTo Err_Err
Call AppeDatamain
Call ResetForm
Exit_err:
Exit Sub
Err_Err:
MsgBox Error$
MsgBox ("Data fail try again")
Resume Exit_err
End Sub
Sub AppeDatamain()
On Error GoTo Err_Err
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("tblDATAMAIN", dbOpenDynaset)
rs.AddNew
rs![ID] = txtID
rs![DateIn] = txtDateIn
rs![TimeIn] = txtTimeIn
rs![ReferHosp] = cmbHosp
rs![HN] = txtHN
rs![Bp1] = txtBp1
rs![Bp2] = txtBp2
rs![Pr] = txtPr
rs![Rr] = txtRr
rs![Bt] = txtBt
rs![Spo2] = txtSat
rs![e] = txtE
rs![v] = txtV
rs![m] = txtM
rs![SEVM] = txtSEVM
rs.Update
Exit_err:
Exit Sub
Err_Err:
MsgBox Error$
MsgBox ("ÁÕ¢éͼԴ¾ÅÒ´à¡Ô´¢Öé¹, ¡ÃسҷÓÃÒ¡ÒÃãËÁè ËÃ×Íá¡·ÐàºÕ¹·ÕèÁÕ»ÑËÒ¹ÕéäÇéµèÒ§ËÒ¡")
Resume Exit_err
End Sub
4 @R23147
หมายถึง หากคุณมีข้อมูลใน cmbService1,cmbService2,cmbService3,cmbService4,cmbService5,cmbService6,cmbService7
ตัวใดตัวหนึ่ง คุณจะเก็บลงใน Table2 ที่ฟิลด์ Service ฟิลด์เดียวเลย เป็น
ตัดขนสุนัข, ฉีดวัคซินพิษสุนัขบ้า, ตัดหาง (โดยใช้ comma ในการแบ่งช่วงแต่ละข้อมูล) และเก็บ ID ที่ Table1 ลง ID ที่ Table2 โดยใช้โค๊ตอย่างเดียว ?
ช่วยอธิบายรูปแบบที่คุณต้องการเก็บหน่อยครับ ว่าเก็บทุก combo ลงฟิลด์เดียวเลย หรือแยกฟิลด์เก็บ หรืออะไร
แล้วการที่คุณ fix ไว้แค่ 7 งาน มันจะไม่มีปัญหาต่อไปในอนาคตนะครับ การออกแบบต้องพยายามทำให้มันยืดหยุ่นที่สุด เพราะต่อไปนานเข้าหากเราต้องมาแก้ไขเราจะลืมและเสียเวลานานมากที่จะกลับมาทำความเข้าใจมันใหม่อีกครั้ง
ตัวใดตัวหนึ่ง คุณจะเก็บลงใน Table2 ที่ฟิลด์ Service ฟิลด์เดียวเลย เป็น
ตัดขนสุนัข, ฉีดวัคซินพิษสุนัขบ้า, ตัดหาง (โดยใช้ comma ในการแบ่งช่วงแต่ละข้อมูล) และเก็บ ID ที่ Table1 ลง ID ที่ Table2 โดยใช้โค๊ตอย่างเดียว ?
ช่วยอธิบายรูปแบบที่คุณต้องการเก็บหน่อยครับ ว่าเก็บทุก combo ลงฟิลด์เดียวเลย หรือแยกฟิลด์เก็บ หรืออะไร
แล้วการที่คุณ fix ไว้แค่ 7 งาน มันจะไม่มีปัญหาต่อไปในอนาคตนะครับ การออกแบบต้องพยายามทำให้มันยืดหยุ่นที่สุด เพราะต่อไปนานเข้าหากเราต้องมาแก้ไขเราจะลืมและเสียเวลานานมากที่จะกลับมาทำความเข้าใจมันใหม่อีกครั้ง
5 @R23148
Table2 นั้นให้เอา ID กับ service มาเก็บลงฟิลเดียวเลยครับ
ประมาณนี้ครับ
Table1 เก็บข้อมูล แบบนี้
ID = 123
Name = ทรงพล
C_Name = ใจงาม
Table2 เก็บข้อมูลลงไปแบบนี้
เขตข้อมูล เขตข้อมูล
ID = 123 service = cmbService1 (ถ้ามีข้อมูลใน cmbService1)
ID = 123 service = cmbService2 (ถ้ามีข้อมูลใน cmbService2)
ID = 123 service = cmbService3 (ถ้ามีข้อมูลใน cmbService3)
ID = 123 service = cmbService4 (ถ้ามีข้อมูลใน cmbService4)
ID = 123 service = cmbService5 (ถ้ามีข้อมูลใน cmbService5)
ID = 123 service = cmbService6 (ถ้ามีข้อมูลใน cmbService6)
ประมาณนี้ครับอาจารย์ที่คิดไว้
---- ที่จริงผมอยากจะเก็บข้อมูลใน Table2 เป็นแบบใน VDO ของอาจารย์นะครับ คือมี ฟอร์มย่อย ที่สามารถ ใส่การให้บริการได้เรื่อยๆ ไม่จำกัดจำนวนแล้วนำมันจัดเก็บใน ฟิลเดียว
มันจะได้ไม่ซ้ำซ้อน แต่ไม่รู้จะเขียน Code ลงไปอย่างไร อยากให้อาจารย์ลองดู โปรแกรมที่ผมทำไว้ ไม่ทราบว่ามี Email. เพื่อส่งตัวอย่างโปรแกรมหน่อยงานจริงๆ ที่ผมทำไว้ไหมคับ ขอบคุณครับ
ประมาณนี้ครับ
Table1 เก็บข้อมูล แบบนี้
ID = 123
Name = ทรงพล
C_Name = ใจงาม
Table2 เก็บข้อมูลลงไปแบบนี้
เขตข้อมูล เขตข้อมูล
ID = 123 service = cmbService1 (ถ้ามีข้อมูลใน cmbService1)
ID = 123 service = cmbService2 (ถ้ามีข้อมูลใน cmbService2)
ID = 123 service = cmbService3 (ถ้ามีข้อมูลใน cmbService3)
ID = 123 service = cmbService4 (ถ้ามีข้อมูลใน cmbService4)
ID = 123 service = cmbService5 (ถ้ามีข้อมูลใน cmbService5)
ID = 123 service = cmbService6 (ถ้ามีข้อมูลใน cmbService6)
ประมาณนี้ครับอาจารย์ที่คิดไว้
---- ที่จริงผมอยากจะเก็บข้อมูลใน Table2 เป็นแบบใน VDO ของอาจารย์นะครับ คือมี ฟอร์มย่อย ที่สามารถ ใส่การให้บริการได้เรื่อยๆ ไม่จำกัดจำนวนแล้วนำมันจัดเก็บใน ฟิลเดียว
มันจะได้ไม่ซ้ำซ้อน แต่ไม่รู้จะเขียน Code ลงไปอย่างไร อยากให้อาจารย์ลองดู โปรแกรมที่ผมทำไว้ ไม่ทราบว่ามี Email. เพื่อส่งตัวอย่างโปรแกรมหน่อยงานจริงๆ ที่ผมทำไว้ไหมคับ ขอบคุณครับ
6 @R23149
อาจารย์ครับ ที่ fix ไว้ 7 งานนั้นผมทำเป็นตัวอย่างครับ ตัวโปรแกรมจริงๆ ที่จะนำความรู้ไปทำ มีเยอะครับ สร้างไว้ 36 งานครับ
ที่จริงอยากทำเป็นฟอร์มย่อย รับค่าแบบใน VDO แต่ทำไม่เป็นครับ เลยสร้างข้อมูลตรง cmbService ไว้ 36 งานเลย ครับ
ที่จริงอยากทำเป็นฟอร์มย่อย รับค่าแบบใน VDO แต่ทำไม่เป็นครับ เลยสร้างข้อมูลตรง cmbService ไว้ 36 งานเลย ครับ
7 @R23159
อื่ม ถ้าทำเป็นปุ่มเป็น Save ก็เขียนประมาณนี้ครับ
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("Table2", dbOpenDynaset) ' Table2 คือชื่อตารางเป้าหมายที่จะเซฟ
Dim i As Long
For i = 1 To 7 ' 1 ถึง 7 คือ งานที่
If Not IsNull(Me("cmbService" & i)) Then ' ถ้า combobox มีข้อมูลก็เซฟ
rs.AddNew
rs!Service = Me("cmbService" & i).Column(1) ' ชื่อ combobox ตามด้วยเลข และ column ที่ต้องการเซฟ
rs!ID = Me.ID ' เซฟ ID จากฟอร์ม
rs.Update
End If
Next
rs.Close: Set rs = Nothing
น่าจะประมาณนี้นะครับ ปรับใช้ดูครับ
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("Table2", dbOpenDynaset) ' Table2 คือชื่อตารางเป้าหมายที่จะเซฟ
Dim i As Long
For i = 1 To 7 ' 1 ถึง 7 คือ งานที่
If Not IsNull(Me("cmbService" & i)) Then ' ถ้า combobox มีข้อมูลก็เซฟ
rs.AddNew
rs!Service = Me("cmbService" & i).Column(1) ' ชื่อ combobox ตามด้วยเลข และ column ที่ต้องการเซฟ
rs!ID = Me.ID ' เซฟ ID จากฟอร์ม
rs.Update
End If
Next
rs.Close: Set rs = Nothing
น่าจะประมาณนี้นะครับ ปรับใช้ดูครับ
8 @R23161
ขอบคุณครับอาจารย์
9 @R23162
คุณ FindExp ถ้าคุณสนใจเรื่องการออกแบบฐานข้อมูล Normalization ลองดูที่นี่ครับ น้องเค้าจะอธิบายหลักการและหากมีการเปลี่ยนแปลงมันจะไม่กระทบต่อข้อมูลเดิมหากเรามีการออกแบบ Normalization ลดความซ้ำซ้อน
https://www.youtube.com/watch?v=tIzTHyktlVU
https://www.youtube.com/watch?v=tIzTHyktlVU
10 @R23168
ครับอาจารย์ TTT ผมออกแบบฐานข้อมูลซึ่งผมลองทดสอบเก็บข้อมูล และทำตัวรายงานออกมาได้ตามที่ตั้งใจไว้ครับ ส่วนการกำหนด Relationship ประมาณนี้ครับ ส่วนตรงไหนต้องปรับปรุงคงต้องให้อาจารย์แนะนำแล้วละครับ
11 @R23174
ดูให้ยากอะครับ ต้องขออภัยด้วย ไม่รู้ที่มาที่ไปค่าไหนซ้ำกันได้ไม่ได้ อิงกับ pk ตัวไหน งงครับ บอกไปเดี่ยวยิ่งหลงทางต้องตัวคนออกแบบคุยกันยาวครับ และผมเองก็ไม่ใช่อาจารย์ งูๆปลาๆเหมือนกันครับ แต่หลักการณ์มันคือเรื่องที่ให้ดูนั่นแหละครับ หาดูครับมีอาจารย์หลายท่านอธิบายไว้เยอะพอควรครับ จริงๆทำแค่ 1NF, 2NF, 3NF ได้ ฐานข้อมูลก็ถึงว่ามีประสิทธิภาพแล้วนะครับ ไม่ต้องถึง BCNF... ครับ
Time: 0.4932s