การบันทึกข้อมูล ที่ อีกเขตข้อมูลหนึ่งต้องเก็บหลายอ
กระทู้เก่าบอร์ด อ.Yeadram

 1,426   11
URL.หัวข้อ / URL
การบันทึกข้อมูล ที่ อีกเขตข้อมูลหนึ่งต้องเก็บหลายอ

คือผม ได้สร้างชุดเก็บข้อมูล และหน้าฟอร์มตัวอย่างมาให้ดูครับ

โดย ฟิลย์ 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
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
4 @R23147
หมายถึง หากคุณมีข้อมูลใน cmbService1,cmbService2,cmbService3,cmbService4,cmbService5,cmbService6,cmbService7
ตัวใดตัวหนึ่ง คุณจะเก็บลงใน 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. เพื่อส่งตัวอย่างโปรแกรมหน่อยงานจริงๆ ที่ผมทำไว้ไหมคับ ขอบคุณครับ
6 @R23149
อาจารย์ครับ ที่ fix ไว้ 7 งานนั้นผมทำเป็นตัวอย่างครับ ตัวโปรแกรมจริงๆ ที่จะนำความรู้ไปทำ มีเยอะครับ สร้างไว้ 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

น่าจะประมาณนี้นะครับ ปรับใช้ดูครับ
8 @R23161
ขอบคุณครับอาจารย์
9 @R23162
คุณ FindExp ถ้าคุณสนใจเรื่องการออกแบบฐานข้อมูล Normalization ลองดูที่นี่ครับ น้องเค้าจะอธิบายหลักการและหากมีการเปลี่ยนแปลงมันจะไม่กระทบต่อข้อมูลเดิมหากเรามีการออกแบบ Normalization ลดความซ้ำซ้อน

https://www.youtube.com/watch?v=tIzTHyktlVU
10 @R23168
ครับอาจารย์ TTT ผมออกแบบฐานข้อมูลซึ่งผมลองทดสอบเก็บข้อมูล และทำตัวรายงานออกมาได้ตามที่ตั้งใจไว้ครับ ส่วนการกำหนด Relationship ประมาณนี้ครับ ส่วนตรงไหนต้องปรับปรุงคงต้องให้อาจารย์แนะนำแล้วละครับ
11 @R23174
ดูให้ยากอะครับ ต้องขออภัยด้วย ไม่รู้ที่มาที่ไปค่าไหนซ้ำกันได้ไม่ได้ อิงกับ pk ตัวไหน งงครับ บอกไปเดี่ยวยิ่งหลงทางต้องตัวคนออกแบบคุยกันยาวครับ และผมเองก็ไม่ใช่อาจารย์ งูๆปลาๆเหมือนกันครับ แต่หลักการณ์มันคือเรื่องที่ให้ดูนั่นแหละครับ หาดูครับมีอาจารย์หลายท่านอธิบายไว้เยอะพอควรครับ จริงๆทำแค่ 1NF, 2NF, 3NF ได้ ฐานข้อมูลก็ถึงว่ามีประสิทธิภาพแล้วนะครับ ไม่ต้องถึง BCNF... ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.1611s