กระทู้เก่าบอร์ด อ.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 อะไร ทำอย่างไรครับ
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 นาทีในการเขียน ดังนั้นเวลาคุณจะถาม คุณก็ควรใช้เวลาในการเขียนเช่นกัน เขียนให้ละเอียด แต่ไม่เยิ่นเย้อ ขัดเกลาข้อความ วางรูปประโยค จัดย่อหน้า เรียงลำดับย่อหน้า อ่านทวน และแก้ไข ... เหล่านี้อาจดูเสียเวลาในเบื้องต้น แต่เป็นเวลาทีจำเป็นต้องเสียเพื่อไม่ต้องเสียเวลาในภายหลัง และจะช่วยให้การตอบคำถามทำได้เร็วขึ้นครับ
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
ขอบพระคุณมากครับอาจารย์ ต้องขอกราบประทานโทษอาจารย์ที่ทำให้อาจารย์เสียเวลาครับ
Time: 0.3177s