กรุณาแก้ไขโค้ด insert into... ให้หน่อยค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 3,556   19
URL.หัวข้อ / URL
กรุณาแก้ไขโค้ด insert into... ให้หน่อยค่ะ

ขอเรียนถามอาจารย์ดังนี้ค่ะ

หนูต้องการ นำข้อมูลทั้งหมดจาก Tbl_Sample-1 เข้าไปยัง Tbl_Sample-2 ซึ่งตารางทั้งสอง มีโครงสร้างที่เหมือนกัน และ อยู่ในฐานข้อมูลเดียวกัน

หนูก็เลยค้นหาโค้ดเก่าๆที่อาจารย์เคยให้ไว้ แล้วลองนำมาดัดแปลงดู ตามด้านล่างนี้

DoCmd.RunSQL "insert into Tbl_Sample-2 select * from Tbl_Sample-1 """

แต่ว่า...ไปไม่รอด มันไม่ผ่านค่ะ อิอิ จึงต้องขอรบกวนอาจารย์กรุณาช่วยแก้ไขให้หน่อยนะคะ

ขอบคุณค่ะ

19 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R05353
ข้างหลังมี double quote เกินมา 2 ตัวครับ ตัดออกก็น่าจะใช้ได้แล้ว
2 @R05355
ตัดออกแล้ว ก็ยังไม่ได้ค่ะอาจารย์
ขึ้น debug สีเหลืองทั้งบรรทัดเลยเหมือนเดิมค่ะ

-------------------------------

หนูพยายามจะโพสรูปตัวอย่างให้ดู แต่มันโพสไม่ได้ค่ะ แจ้ง Error ดังนี้

Parse error: syntax error, unexpected T_STRING in D:\Domains\thai-access.co.cc\upload.php on line 16

รบกวน อ. yeadrum ช่วยตรวจสอบด้วยนะคะ
3 @R05358
ถ้าทั้งสองตารางมีโครงสร้างเหมือนกัน ลองใช้ Append Query ดูซิครับ
ง่ายดี...
Upload รูปไม่ได้เหมือนกันครับ
4 @R05360
ลองคร่อมชื่อเทเบิลด้วย [ ] ดูครับ
5 @R05361
ลองคร่อมชื่อเทเบิลด้วย [ ] แล้วก็ยังไม่ได้ค่ะ อาจเป็นเพราะไม่ได้ระบุชื่อฟิลด์หรือเปล่าคะ

ปัจจุบันหนูก็ใช้ Append Query อยู่อะค่ะ แต่อยากจะลองทำเป็นโค้ดดูบ้าง คือต้องการผนวกคำสั่งอื่นๆเข้าไปด้วยค่ะ (ถ้าสำเร็จ)
6 @R05362
Account Information

thai-access.com

Total Accounts: 100.02 MB
Diskspace Left: OVER BY 22.92 KB
Bandwidth Used: bytes
Bandwidth Left: 2.73 GB
E-Mail Users: 1
E-Mail Size: .01 MB
E-Mail Aliases: 0
E-Mail Mailing Lists: 0
SQL Server Databases: 1
MySQL Databases: 0
FTP Users: 0
Subdomains: 0

............................. สรุปได้ความว่า โควต้าเช่าโฮสต์เต็มครับ .................
เช่าพื้นที่ไว้ 100mb เต็มแล้วครับ อัพรูปไม่ได้แล้วครับ


สำหรับคำถาม ลองแบบนี้ดูครับ ถ้าใช้ insert ..into ไม่ได้ ก็ใช้ select...into แทนครับ

"select * into Tbl_Sample-2 from Tbl_Sample-1;"
7 @R05363
แปลว่าต่อไปนี้ อัพรูปไม่ได้แล้วหรือคะ มีทางออกอื่นอีกไหมคะ

เดี๋ยวหนูจะลองใช้คำสั่ง "select * into Tbl_Sample-2 from Tbl_Sample-1;"
ดูค่ะ อาจารย์

8 @R05364
ทดลองแล้ว...ยังคงไม่ได้เช่นเดิมค่ะอาจารย์

9 @R05365
ผมว่าต้องเส้นผมบังภูเขาแน่เลย ลองคอมไพล์หรือยัง แล้วตอนที่ error มันแสดงข้อความว่าอะไรครับ และเอาโค้ดเต็มๆทั้งหมดมาให้ดูหน่อย
10 @R05366
โค้ดที่หนูทำก็มีเพียงสั้นๆแค่นี้ค่ะ

   Private Sub Command0_Click()
   DoCmd.RunSQL "insert into Tbl_Sample-2 * From Tbl_Sample-1 "
   End Sub

และอันนี้ก็เป็นของที่ อ. yeadram แนะนำค่ะ

   Private Sub Command0_Click()
   DoCmd.RunSQL "select * into Tbl_Sample-2 from Tbl_Sample-1"
   End Sub

อาจารย์ช่วยดูให้หน่อยนะคะ
11 @R05368
ตอนที่ error มันแสดงข้อความว่าอะไรครับ
12 @R05369
ตอบคุณ มาลี ที่ถามหาทางแก้นะครับ อิอิ

Re: FW: ได้ทำการต่ออายุ Doamin ของ thai-access.com ให้แล้วค่ะ‏
From: 4GBHOST.COM (4gbhost gmail.com)
Sent: Friday, March 26, 2010 7:23:46 PM
To: Yeadram Yeadram (yeadram hotmail.com)

สัสดีครับ
หากต้องการจะเพิ่ม package เป็นพื้นที่ 200 MB จะต้องโอนเงินเป็น จำนวน 520+1200 บาทครับ โดย 520 เป็นค่าเช่าโฮสต์ย้อนหลังและอีก 1200 บาทเป็นค่าต่ออายุโฮต์พร้อมกับเพิ่ม package เป็นพื้นที่ 200 MB ครับ

ปิยะพงษ์


พันเจ็ดยี่สิบ แพงจัง เหอๆ
13 @R05372
กรอบข้อความที่ Error มีดังนี้ค่ะอาจารย์

Run-time error '3067'
Query input must contain at least one table or query,

เมื่อคลิกปุ่ม Debug แล้วจะเป็นไฮไลท์สีเหลือง ครอบ ทั้งบรรทัดของโค้ดค่ะ

14 @R05373
520 เป็นค่าเช่าโฮสต์ย้อนหลังและอีก 1200 บาทเป็นค่าต่ออายุโฮต์พร้อมกับเพิ่ม package เป็นพื้นที่ 200 MB

ถือเป็นภาระหนัก...ที่ อ. yeadram ต้องแบกรับอยู่ หากท่านไม่มีจิตกุศลที่แท้จริง คงทำแบบนี้ไม่ได้

สละทั้งเวลา มันสมอง และทุนทรัพย์ ในโลกนี้...จะมีแบบท่านสักกี่คน

ขอให้บุญกุศลที่ท่านสร้างนี้ จงตอบสนองท่านด้วยความสุขความเจริญตลอดไปด้วยค่ะ
15 @R05375
ในคำตอบ (R05366) คุณขาดคำว่า SELECT ใน DoCmd.RunSQL "insert into Tbl_Sample-2 select * From Tbl_Sample-1 " หรือเปล่า
16 @R05377
แล้ว error ที่คุณบอกมา มันมาจากคำสั่งของ อ.yeadram ไม่ใช่แบบแรกนี่ครับ ทำให้เสียเวลาหาตั้งนาน

สรุปนะครับ 1) ไปดูคำตอบ R05375 และ 2) ทั้งคำสั่งในรูปแบบแรกหรือของ อ.yeadram ก็ให้ใส่ [ ] คร่อมชื่อเทเบิลด้วยนะครับ

หมายเหตุ : คำสั่งของ อ.yeadram มันจะให้เคลียร์เรคอร์ดเดิมในเทเบิลก่อนที่จะรับเรคอร์ดเพิ่มเข้าไป ในขณะที่คำสั่งแบบแรกจะเป็นการเพิ่มเรคอร์ดต่อท้ายไปเรือยๆ
17 @R05378
ได้แล้วค่ะอาจารย์
หนูย้อนกลับไปดูโค้ดแรกที่หนูเริ่มตั้งกระทู้ ตามที่ท่านแนะนำ จึงพบสาเหตุและสรุปได้ว่า หนูทำผิดอยู่สองจุดค่ะ คือ
   1.) หนูใส่เครื่องหมายฟันหนู " ที่ท้ายคำสั่ง เกินไปสองตัว
   2.) หนูไม่ได้ใส่เครื่อง [ ] คร่อมชื่อเทเบิล
ตอนแรก หนูแก้ตามที่ท่านแนะนำทีละอย่างค่ะ เมื่อแก้แล้วมันไม่ผ่าน หนูก็กลับไปที่เดิมอีก ทำให้เมื่อแก้จุดที่สองจึงไม??ผ่าน เพราะจุดแรกมันกลับไปผิดอย่างเดิม มันก็เลยไม่ผ่านซักที อิอิ นี่ถ้าอยู่ใกล้ๆ หนูจะเดินไปให้อาจารย์เขกกระบาลแก้โง่ซักที

สรุปคือแก้โค้ดเป็นตามนี้ แล้วก็ผ่านฉลุยค่ะ
DoCmd.RunSQL "insert into [Tbl_Sample-2] select * From [Tbl_Sample-1] "


เมื่อผ่านแล้ว... หนู ขออนุญาตแตกประเด็น ถามต่ออีกหน่อยนะคะ

กรณีย์ที่จะ insert ข้อมูลจำนวนมาก (หลายๆแสนเรคคอร์ด) หนูเคยอ่านเจอ มีผู้แนะนำว่า ควรจะแบ่งข้อมูลต้นทางออกเป็นส่วนๆ แล้วจึงทะยอย insert ทีละส่วน เช่นให้ insert ครั้งละหนึ่งแสน แล้วให้หยุดรอนิดนึง แล้วค่อยทะยอย insert ส่วนที่เหลือต่อไปเรื่อยๆ จนหมด

กรณีย์จะทำเช่นนี้ เราจะใช้คำสั่งอะไรมาคั่นเพื่อให้หยุดรอ คะอาจารย์
ขอคำแนะนำด้วยค่ะ

ขอบพระคุณเป็นอย่างยิ่งค่ะ
18 @R05379
อย่างที่เคยบอกไว้ในคำถามก่อนหน้าแล้วว่า ถ้าต่อท้ายด้วยพารามิเตอร์ False เป็น DoCmd.RunSQL "คำสั่ง". False มันจะไม่ใช้ Transaction Control ในการควบคุมการปรับปรุงข้อมูล ซึ่งจะทำให้เรคอร์ดใดปรับปรุงได้ก็ได้ไป แต่ถ้าเจอเรคอร์ดใดทำไม่ได้ มันก็จะหยุดทำ ส่วนที่ได้ปรับปรุงไปแล้วก็ไม่สามารถยกเลิกการปรับปรุงไปได้ (ไม่ RollbackTransaction) การที่มันไม่ใช้ Transaction Control ทำให้การทำงานเร็วขึ้นมาก เพราะความซับซ้อนในการจัดการน้อยลง ดังนั้นไม่ว่าจะปรับปรุงทีละกี่เรคอร์ดก็ไม่มีความจำเป็นต้องแยกทำทีละช่วงๆ แต่ถ้าต้องการให้มี Transaction Control แล้ว ก็ไ่ม่ได้หมายความว่าการแบ่งออกเป็นช่วงๆจะทำให้มันทำงานได้เร็วขึ้นเช่นกัน

ดังนั้น...มีแต่ว่าจะไม่ใช้ Transaction Control กับการปรับปรุงเรคอร์ดจำนวนมากๆเท่านั้นที่จะทำให้มันไม่ช้า

เอาหล่ะ สมมุติอยากจะทำและจะหยุดรอ ถามกลับก็คือ จะหยุดรอทำไม ? หากคิดว่าจะหยุดเพื่อให้ตัวจัดการฐานข้อมูลมันทำงานอะไรสักอย่างที่มันคั่งค้างในการปรับปรุงเรคอร์ดให้เสร็จสิ้นแล้ว ก็ตอบได้เลยว่าในกรณีที่ฐานข้อมูล backend เป็น .mdb (หรือเทียบเท่า) นั้น และแม้จะวางไว้ที่เครื่องเซิฟเวอร์ คุณก็ไม่จำเป็นต้องรอ เพราะมันไม่มีกระบวนการอะไรที่จะจัดการไว้อย่างที่คิดไว้ครับ การจัดการทุกอย่างถูกกระทำที่เครื่องของเรา อยู่ที่ process ของเรา ให้มองเซิฟเวอร์เป็นแค่ external disk เท่านั้น

ส่วนคำสั่งที่จะหยุด process มีทำได้(เท่าที่รู้) 2 อย่างคือ
1) สั่ง DoEvents เป็นการปล่อยให้ CPU ไปทำงาน process อื่นๆของระบบวินโดว์ที่ยังคั่งค้างอยู่ รวมทั้งงานของ Access เองด้วย แม้ว่างานอื่นนั้นจะยังทำไม่เสร็จแต่เมื่อครบตามจำนวนระยะเวลาที่วินโดว์กำหนดไว้และ process อื่นนั้นไม่ได้ "ยึด" CPU เอาไว้ มันก็จะกลับมาทำยังคำสั่งในบรรทัดต่อไปให้ ซึ่งอาจเป็นแค่เศษ 1 ใน พัน ของวินาทีก็ได้

2) หยุด process ตามระยะเวลที่เราต้องการ เมื่อครบกำหนดก็จะกลับมาทำงานของเราต่อไป ตรงนี้ VBA ไม่มีคำสั่งโดยตรง ต้องเรียกผ่าน Windows API ดังนี้

' กำหนดไว้ที่ส่วน (General) (Declaration)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

เวลาใช้ก็สั่ง Sleep 5000 สำหรับ 5 วินาทีครับ
19 @R05380
ได้แนวคิดที่กระจ่างชัดเจนเลยค่ะอาจารย์

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