กระทู้เก่าบอร์ด อ.Yeadram
3,551 19
URL.หัวข้อ /
URL
กรุณาแก้ไขโค้ด insert into... ให้หน่อยค่ะ
ขอเรียนถามอาจารย์ดังนี้ค่ะ
หนูต้องการ นำข้อมูลทั้งหมดจาก Tbl_Sample-1 เข้าไปยัง Tbl_Sample-2 ซึ่งตารางทั้งสอง มีโครงสร้างที่เหมือนกัน และ อยู่ในฐานข้อมูลเดียวกัน
หนูก็เลยค้นหาโค้ดเก่าๆที่อาจารย์เคยให้ไว้ แล้วลองนำมาดัดแปลงดู ตามด้านล่างนี้
DoCmd.RunSQL "insert into Tbl_Sample-2 select * from Tbl_Sample-1 """
แต่ว่า...ไปไม่รอด มันไม่ผ่านค่ะ อิอิ จึงต้องขอรบกวนอาจารย์กรุณาช่วยแก้ไขให้หน่อยนะคะ
ขอบคุณค่ะ
หนูต้องการ นำข้อมูลทั้งหมดจาก 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 ช่วยตรวจสอบด้วยนะคะ
ขึ้น 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 รูปไม่ได้เหมือนกันครับ
ง่ายดี...
Upload รูปไม่ได้เหมือนกันครับ
4 @R05360
ลองคร่อมชื่อเทเบิลด้วย [ ] ดูครับ
5 @R05361
ลองคร่อมชื่อเทเบิลด้วย [ ] แล้วก็ยังไม่ได้ค่ะ อาจเป็นเพราะไม่ได้ระบุชื่อฟิลด์หรือเปล่าคะ
ปัจจุบันหนูก็ใช้ Append Query อยู่อะค่ะ แต่อยากจะลองทำเป็นโค้ดดูบ้าง คือต้องการผนวกคำสั่งอื่นๆเข้าไปด้วยค่ะ (ถ้าสำเร็จ)
ปัจจุบันหนูก็ใช้ 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;"
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;"
ดูค่ะ อาจารย์
เดี๋ยวหนูจะลองใช้คำสั่ง "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
อาจารย์ช่วยดูให้หน่อยนะคะ
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 แล้วจะเป็นไฮไลท์สีเหลือง ครอบ ทั้งบรรทัดของโค้ดค่ะ
Run-time error '3067'
Query input must contain at least one table or query,
เมื่อคลิกปุ่ม Debug แล้วจะเป็นไฮไลท์สีเหลือง ครอบ ทั้งบรรทัดของโค้ดค่ะ
14 @R05373
520 เป็นค่าเช่าโฮสต์ย้อนหลังและอีก 1200 บาทเป็นค่าต่ออายุโฮต์พร้อมกับเพิ่ม package เป็นพื้นที่ 200 MB
ถือเป็นภาระหนัก...ที่ อ. yeadram ต้องแบกรับอยู่ หากท่านไม่มีจิตกุศลที่แท้จริง คงทำแบบนี้ไม่ได้
สละทั้งเวลา มันสมอง และทุนทรัพย์ ในโลกนี้...จะมีแบบท่านสักกี่คน
ขอให้บุญกุศลที่ท่านสร้างนี้ จงตอบสนองท่านด้วยความสุขความเจริญตลอดไปด้วยค่ะ
ถือเป็นภาระหนัก...ที่ อ. 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 มันจะให้เคลียร์เรคอร์ดเดิมในเทเบิลก่อนที่จะรับเรคอร์ดเพิ่มเข้าไป ในขณะที่คำสั่งแบบแรกจะเป็นการเพิ่มเรคอร์ดต่อท้ายไปเรือยๆ
สรุปนะครับ 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 ส่วนที่เหลือต่อไปเรื่อยๆ จนหมด
กรณีย์จะทำเช่นนี้ เราจะใช้คำสั่งอะไรมาคั่นเพื่อให้หยุดรอ คะอาจารย์
ขอคำแนะนำด้วยค่ะ
ขอบพระคุณเป็นอย่างยิ่งค่ะ
หนูย้อนกลับไปดูโค้ดแรกที่หนูเริ่มตั้งกระทู้ ตามที่ท่านแนะนำ จึงพบสาเหตุและสรุปได้ว่า หนูทำผิดอยู่สองจุดค่ะ คือ
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 วินาทีครับ
ดังนั้น...มีแต่ว่าจะไม่ใช้ 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
ได้แนวคิดที่กระจ่างชัดเจนเลยค่ะอาจารย์
ขอบคุณอีกครั้งนะคะ
ขอบคุณอีกครั้งนะคะ
Time: 0.3926s