แอดเข้า Table ไม่ได้ครับ
กระทู้เก่าบอร์ด อ.Yeadram

 3,627   23
URL.หัวข้อ / URL
แอดเข้า Table ไม่ได้ครับ

ผมเขียน Code ให้กับปุ่ม ๆ หนึ่งมันไม่ยอม Add เข้า Table ให้ครับผม Code เป็นดังนี้
Private Sub Request_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "DelNew"
DoCmd.OpenQuery "InsertNew"
DoCmd.SetWarnings True

Dim strNo
strNo = DLookup("runno", "Runno")
Me!no = strNo

If Me!no <> 0 Then
Me!newcode = Cate & Right(Period1, 3) & "-" & Num1 & "-" & Num2 & "-" & Format(no + 1, "000")
Else
Me!newcode = Cate & Right(Period1, 3) & "-" & Num1 & "-" & Num2 & "-" & "001"
End If

DoCmd.OpenQuery "InsertMKTDetail"

End Sub

และอันนี้เป็น Query ของ InsertMKTDetail

INSERT INTO MKTDetail ( ReqNo, Period, Subject, Comment, ReqDate, ReqName, CateID, Status )
SELECT MKTDetail.ReqNo, MKTDetail.Period, MKTDetail.Subject, MKTDetail.Comment, MKTDetail.ReqDate, MKTDetail.ReqName, MKTDetail.CateID, MKTDetail.Status, *
FROM MKTDetail
WHERE (((MKTDetail.ReqNo)=[Forms]![RequestDocMktNewGen]![newcode]) AND ((MKTDetail.Period)=[Forms]![RequestDocMktNewGen]![period1]) AND ((MKTDetail.Subject)=[Forms]![RequestDocMktNewGen]![Subject]) AND ((MKTDetail.Comment)=[Forms]![RequestDocMktNewGen]![Comment]) AND ((MKTDetail.ReqDate)=[Forms]![RequestDocMktNewGen]![newdate]) AND ((MKTDetail.ReqName)=[Forms]![RequestDocMktNewGen]![ReqName]) AND ((MKTDetail.CateID)=[Forms]![RequestDocMktNewGen]![Cate]) AND ((MKTDetail.Status)=[Forms]![RequestDocMktNewGen]![Status]));

ลองหาดูแล้ว COde ไม่ได้ Error อะไร ทำอย่างไรครับ

23 Reply in this Topic. Dispaly 2 pages and you are on page number 2

21 @R10230
เพราะว่า มันเหมือนจะต้องเปิด recordset แต่ผมเองไม่อยากเปิดให้มันดูยุ่งยากครับอาจารย์
22 @R10250
เปลี่ยนคิวรี่เป็นแบบนี้ครับ

INSERT INTO MKTDetail ( ReqNo, Period, Subject, Comment, ReqDate, ReqName, CateID, Status )
SELECT [Forms]![RequestDocMktNewGen]![newcode], [Forms]![RequestDocMktNewGen]![period1], [Forms]![RequestDocMktNewGen]![Subject], [Forms]![RequestDocMktNewGen]![Comment], [Forms]![RequestDocMktNewGen]![newdate], [Forms]![RequestDocMktNewGen]![ReqName], [Forms]![RequestDocMktNewGen]![Cate], [Forms]![RequestDocMktNewGen]![Status]

คือไม่ต้องมี FROM ... และ WHERE อะไรทั้งสิ้น มันก็เป็นแค่การเพิ่มเรคอร์ดตามค่าที่อยู่บนหน้าจอเท่านั้นเอง

มีอีก 3 วิธีที่จะทำได้ผลลัพธ์แบบเดียวกัน ก็คือ

1) ให้ Access เป็นตัวจัดการ โดยสร้าง SQL statement ในโปรแกรมเลย วิธีนี้ไม่ต้องอาศัยคิวรี่ [InsertMKTDetail] ตย. เช่น

Dim SQL as String

SQL = "INSERT INTO ......."
DoCmd.RunSQL SQL

2) ให้ DAO (ไลบรารี่ประเภทนึงที่ติดต่อกับตัวจัดการฐานข้อมูล) เป็นตัวจัดการ วิธีนี้คล้ายข้อแรก แต่คุณต้องหาค่าของฟอร์มเพื่อสร้างเป็น SQL เอง เพราะมันจะไม่รู้จัก [Forms]![...]![...] ที่ฝังอยู่ใน SQL string    ตย.เช่น

Dim DB   as DAO.Database
Dim SQL as String

SQL = "INSERT INTO ....... VALUE ('" & [Forms]![RequestDocMktNewGen]![newcode] & "', '" & [Forms]![RequestDocMktNewGen]![period1] & "' .....')"
Set DB = CurrentDB
DB.Exexute SQL, dbFailOnError

3) เปิด recordset ซึ่งก็เป็นอีกวิธีที่ใช้ให้ DAO เป็นตัวจัดการ (แต่คุณบอกว่าไม่อยากใช้วิธีนี้) ตย. เช่น

Dim DB   as DAO.Database
Dim RS   as DAO.Recordset

Set DB = CurrentDB
Set RS = DB.OpenRecordset("MKTDetail", , dbAppendOnly)
With RS
     .AddNew
     !ReqNo = [Forms]![RequestDocMktNewGen]![newcode]
     !Period = [Forms]![RequestDocMktNewGen]![period1]
     .....
     .....
     .....
     .Update
End With


- วิธีที่อธิบายไว้บนสุดต้องพึ่ง Query object ซึ่งทำให้เวลากลับมาไล่โปรแกรม ผมว่าวุ่นวาย (แต่ก็ดูง่ายดีสำหรับมือใหม่) ผมไม่นิยมวิธีนี้

- แบบที่ 1) ให้ Access เป็นตัวจัดการ แม้ยังไม่เคยทดลอง แต่ผมเชื่อว่า performance ของวิธีนี้ค่อนข้างจะต่ำกว่าวิธีที่ 2) และ 3) แต่ข้อดีก็คือมันสามารถตีความ [Forms]![...]![...] ซึ่งอยู่ใน SQL string ออกมาเป็นคำสั่ง SQL ที่ถูกต้องแล้วส่งไป DAO ให้เราได้เอง ง่ายสำหรับมือใหม่เช่นกัน และสำหรับโปรแกรมที่ไม่ต้องคำนึงถึงเรื่อง performance เท่าไรนัก หรือเมื่อมีจำนวนเรคอร์ดน้อยๆ

- แบบที่ 2) และ 3) เป็นวิธีที่ผมเชื่อว่า performance ดีกว่า ผมใช้ 2 วิธีหลังนี้เป็นหลักครับ เพราะโปรแกรมที่ผมทำ จะต้องชั่งน้ำหนักระหว่าง performance และการ maintenance โปรแกรมในภายภาคหน้าให้สมดุล ในโปรแกรมหนึ่งๆอาจมีได้ทั้ง 2 วิธีนี้

เลือกใช้ตามอัธยาสัยเลยครับ

ปล.ผมเขียนตอบคุณนี่ ผมใช้เวลาประมาณ 40 นาทีในการเขียน ดังนั้นเวลาคุณจะถาม คุณก็ควรใช้เวลาในการเขียนเช่นกัน เขียนให้ละเอียด แต่ไม่เยิ่นเย้อ ขัดเกลาข้อความ วางรูปประโยค จัดย่อหน้า เรียงลำดับย่อหน้า อ่านทวน และแก้ไข ... เหล่านี้อาจดูเสียเวลาในเบื้องต้น แต่เป็นเวลาทีจำเป็นต้องเสียเพื่อไม่ต้องเสียเวลาในภายหลัง และจะช่วยให้การตอบคำถามทำได้เร็วขึ้นครับ
23 @R10262
ขอบพระคุณมากครับอาจารย์ ต้องขอกราบประทานโทษอาจารย์ที่ทำให้อาจารย์เสียเวลาครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3177s