กระทู้เก่าบอร์ด อ.Yeadram
6,202 12
URL.หัวข้อ /
URL
บันทึกข้อมูลครั้งละหลายๆเรคคอร์ดอย่างไร
คือผมอยากจะบันทึกข้อมูลทีละหลายๆเรคคอร์ด ผมต้องเขียนอย่างไรหรอครับ
ผมเขียนใน vba มันก็บันทึกได้แค่ครั้งละเรคคอร์ด
ผมต้องวนรับข้อมูลทั้งเดือน ผมอยากให้มัน for i = 1/1/2010 to 12/1/2010 แล้วมันก็จะเริ่มบันทึกข้อมูลทีละวันครับ ไม่ทราบผมต้องใช้วิธีไหนหรอครับ
ปล.ผมอยากให้มัน onload ครั้งเดียวเก็บข้อมูลเรียบร้อยครับ
ขอบคุณล่วงหน้าครับ
ผมเขียนใน vba มันก็บันทึกได้แค่ครั้งละเรคคอร์ด
ผมต้องวนรับข้อมูลทั้งเดือน ผมอยากให้มัน for i = 1/1/2010 to 12/1/2010 แล้วมันก็จะเริ่มบันทึกข้อมูลทีละวันครับ ไม่ทราบผมต้องใช้วิธีไหนหรอครับ
ปล.ผมอยากให้มัน onload ครั้งเดียวเก็บข้อมูลเรียบร้อยครับ
ขอบคุณล่วงหน้าครับ
12 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R06124
เขียน vba ไว้แบบนี้ครับ
Dim i
For i = [Forms]![Dialog]![FromDate] To [Forms]![Dialog]![ToDate]
Debug.Print i
Dim SQL
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"select idate,Total_1,Total_2,Total_3 from query_rpt where idate=" & i & " "
Debug.Print SQL
DoCmd.RunSQL SQL
Next i
โอเคทำงานได้ ไม่เกิด bug แต่ว่า insert ข้อมูลไม่เข้าครับ
query_rpt คือตาราง query ที่สร้างขึ้นภายใน access
rpt คือ table ที่ mysql
อยากทราบว่าเกิดจากอะไรครับ เพราะใน query_rpt ก็มีข้อมูลอยู่
Dim i
For i = [Forms]![Dialog]![FromDate] To [Forms]![Dialog]![ToDate]
Debug.Print i
Dim SQL
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"select idate,Total_1,Total_2,Total_3 from query_rpt where idate=" & i & " "
Debug.Print SQL
DoCmd.RunSQL SQL
Next i
โอเคทำงานได้ ไม่เกิด bug แต่ว่า insert ข้อมูลไม่เข้าครับ
query_rpt คือตาราง query ที่สร้างขึ้นภายใน access
rpt คือ table ที่ mysql
อยากทราบว่าเกิดจากอะไรครับ เพราะใน query_rpt ก็มีข้อมูลอยู่
3 @R06126
และอีกอย่างนึงนะครับ
ผมอยากให้เช็คก่อนว่า idate ที่เท่ากับ i ใน table rpt มีแล้วหรือยัง ถ้าไม่มีถึงจะให้ insert ครับ ผมเขียนแบบนี้ครับ
dim ins_date
dim SQL
SQL ="select idate from rpt where idate=" & i & ""
docmd.runsql SQL
ins_date = SQL '// เพื่อจะเก็บค่า idate
แต่มันไม่ได้ ช่วยชี้แนะหน่อยครับ
ผมอยากให้เช็คก่อนว่า idate ที่เท่ากับ i ใน table rpt มีแล้วหรือยัง ถ้าไม่มีถึงจะให้ insert ครับ ผมเขียนแบบนี้ครับ
dim ins_date
dim SQL
SQL ="select idate from rpt where idate=" & i & ""
docmd.runsql SQL
ins_date = SQL '// เพื่อจะเก็บค่า idate
แต่มันไม่ได้ ช่วยชี้แนะหน่อยครับ
4 @R06131
ประเด็นแรก ผมเดาว่าน่าจะเกิดจากระบบวันที่ที่รับค่ามา ตรง [Forms]![Dialog]![FromDate] ค่าที่รับมันตรงกับรูปแบบ ที่ควรจะเป็นหรือเปล่า วิธีการทดสอบ
ถ้าเป็นผม ผมจะลองใส่ค่าคงที่ลงไปก่อน เช่น #06/22/2553# (เดือน-วัน-ปี)แล้วทดสอบดูว่าUPDATE ได้หรือไม่ ถ้าได้แสดงว่า รูปแบบที่คุณรับมา จาก TEXTBOX ไม่ถูกต้อง ให้ไปแก้ไขให้ถูกต้อง ด้วยวิธีการใดก็แล้วแต่ ลองดูครับ
ส่วนประเด็นที่ 2 ผมอ่านแล้วไม่เข้าใจ ว่าจะทำต่อไปในแนวไหน อย่างไรก็ตามใน Webbord นี้ มีวิธีการ CHECK ค่าซ้ำอยู่หลายกระทู้ ลองหาดู
วิธีการที่ผมเคยใช้คือ DAO เทียบค่าที่ต้องการ CHECK ,
อ้าง Recordset ที่จะไป Check วนลูปหา ว่ามีหรือไม่ เช่น
Dim Rs as dao.recordset
set RS=CurrendDB.openrecordset( select form..........)
dountil rs.eof
if me.เช็ค =Rs("Field1")
then
................
end if
rs.movnext
loop
ประมาณนี้ครับ
ถ้าเป็นผม ผมจะลองใส่ค่าคงที่ลงไปก่อน เช่น #06/22/2553# (เดือน-วัน-ปี)แล้วทดสอบดูว่าUPDATE ได้หรือไม่ ถ้าได้แสดงว่า รูปแบบที่คุณรับมา จาก TEXTBOX ไม่ถูกต้อง ให้ไปแก้ไขให้ถูกต้อง ด้วยวิธีการใดก็แล้วแต่ ลองดูครับ
ส่วนประเด็นที่ 2 ผมอ่านแล้วไม่เข้าใจ ว่าจะทำต่อไปในแนวไหน อย่างไรก็ตามใน Webbord นี้ มีวิธีการ CHECK ค่าซ้ำอยู่หลายกระทู้ ลองหาดู
วิธีการที่ผมเคยใช้คือ DAO เทียบค่าที่ต้องการ CHECK ,
อ้าง Recordset ที่จะไป Check วนลูปหา ว่ามีหรือไม่ เช่น
Dim Rs as dao.recordset
set RS=CurrendDB.openrecordset( select form..........)
dountil rs.eof
if me.เช็ค =Rs("Field1")
then
................
end if
rs.movnext
loop
ประมาณนี้ครับ
5 @R06134
พอดีเขียนลองทดสอบเขียน insert ดู แบบนี้ค่ะ
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "INSERT INTO test(number) values (11)"
db.Close
Set db = Nothing
มัน error
เขียนอีกอย่างนึงก็ error ค่ะ
Dim SQL
SQL = "INSERT INTO test(number) values (12)"
DoCmd.RunSQL SQL
แต่ลองก๊อบไปรันที่ mysql กํรันได้นะค่ะ เป็นเพราะอะไรคะ
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "INSERT INTO test(number) values (11)"
db.Close
Set db = Nothing
มัน error
เขียนอีกอย่างนึงก็ error ค่ะ
Dim SQL
SQL = "INSERT INTO test(number) values (12)"
DoCmd.RunSQL SQL
แต่ลองก๊อบไปรันที่ mysql กํรันได้นะค่ะ เป็นเพราะอะไรคะ
6 @R06135
ฐานข้อมูลเป็น mySQL ใช่ไหมครับ
ตัวที่จะ Execute ได้เหมาะกว่า ชัวร์กว่า น่าจะเป็น connection นะครับ
สังเกตุการประกาศ db ของทั้งคุณ Kratokman ทั้งคุณ TCC ทำไมถึงใช้ database ล่ะครับ
ลองนี่ก่อนไหมครับ
หมายเหตุ : ในเครื่องคอมต้องติดตั้ง "mysql-connector-odbc-5.1.5-win32.msi" ก่อนนะครับ หาได้ฟรีจากเน็ต ตัวเล็กติดตั้งง่าย
ทีนี้เมื่อเราได้ object ตัว connect มาแล้ว เราก็ใช้ตัวนี้และครับ รัน statement อันนี้จะรันได้ดี ไม่มีติดขัดอะไรแล้วครับ
เช่น
cn.Execute "INSERT INTO test(number) values (11)"
ตัวที่จะ Execute ได้เหมาะกว่า ชัวร์กว่า น่าจะเป็น connection นะครับ
สังเกตุการประกาศ db ของทั้งคุณ Kratokman ทั้งคุณ TCC ทำไมถึงใช้ database ล่ะครับ
ลองนี่ก่อนไหมครับ
SV = "ชื่อserver"
DB = "ชื่อฐานข้อมูล"
UN="ชื่อผู้ใช้"
PW="รหัสผ่านผู้ใช้"
ConnectString = "DRIVER={MySQL ODBC 5.1 Driver};" & _
"SERVER=" & SV & _
";DATABASE=" & DB & ";" & _
"USER=" & UN & _
";PASSWORD=" & PW & _
";OPTION=3;"
Dim cn As New ADODB.Connection
Set cn = createobject("ADODB.Connection")
cn.Open ConnectString
หมายเหตุ : ในเครื่องคอมต้องติดตั้ง "mysql-connector-odbc-5.1.5-win32.msi" ก่อนนะครับ หาได้ฟรีจากเน็ต ตัวเล็กติดตั้งง่าย
ทีนี้เมื่อเราได้ object ตัว connect มาแล้ว เราก็ใช้ตัวนี้และครับ รัน statement อันนี้จะรันได้ดี ไม่มีติดขัดอะไรแล้วครับ
เช่น
cn.Execute "INSERT INTO test(number) values (11)"
7 @R06136
แล้วถ้าตาราง query_rpt เป็นแบบสอบถามที่สร้างขึ้นมา เราสามารถทำแบบที่ผมเขียนได้มั้ยครับ
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"select idate,Total_1,Total_2,Total_3 from query_rpt where idate=" & i & " "
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"select idate,Total_1,Total_2,Total_3 from query_rpt where idate=" & i & " "
9 @R06138
เท่าที่ผมลองเทสดูแล้ว ถ้าเป็น table ที่ครีเอท ใน mysql ใช้งานได้
แต่พอไป select query_rpt มาไม่ได้ครับ เพราะมันเป็นแบบสอบถาม
อย่างนี้พอจะมีทางใดที่ผมสามารถดึงข้อมูลจากแบบสอบถาม มา insert ลง table ได้บ้างครับ
แต่พอไป select query_rpt มาไม่ได้ครับ เพราะมันเป็นแบบสอบถาม
อย่างนี้พอจะมีทางใดที่ผมสามารถดึงข้อมูลจากแบบสอบถาม มา insert ลง table ได้บ้างครับ
10 @R06139
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"select q.idate,q.Total_1,q.Total_2,q.Total_3 from (" & _
ไปเอา statement จากคิวรี่ query_rpt ของคุณมาวางตรงนี้ วางบรรทัดเดียวได้ก็ดี ตรวจสอบเครื่องหมายให้ดี
") as q " & _
"where q.idate=" & i & ";"
หรือ
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"ตรงนี้ให้คุณเอา statement ของ query_rpt มาวาง แทนได้เลย ตัดเอาฟิลด์อื่นๆ ที่ไม่เกี่ยวข้องออก แล้วเพิ่ม where ว่า idate=" & i & ";"
ลองดูอีกทีครับ
--------------------------------------------------------
แล้วเรื่อง execute ล่ะครับ ใช้วิธีไหน ผ่านหรือเปล่า ยังไม่แจ้งผลบ้างเลย
-------------------------------------------------------
ทำไม บางความเห็นใช้คำลงท้ายเป็นของเพศผู้ แต่บางความเห็นใช้คำลงท้ายเป็นของเพศเมีย ใช่คนเดียวกันหรือเปล่า หรือว่ามีคนสองคน ถามคำถามเดียวกันและใช้ชื่อเดียวกัน จะมั่นใจได้อย่างไร ว่าขณะนี้คนที่เขากำลังช่วยเหลืออยู่ เขากำลังช่วยใคร ช่วยถูกคน หรือถูกประเด็นหรือเปล่า
ผมว่า เว็บนี้ไม่มีระบบ ล็อกอิน ทำให้สะดวกดีแล้วนะ ยังมีการใช้นามแฝงของคนอื่นอีกเหรอเนี่ย แค่เว็บที่แบ่งปันความรู้กันเองนะ ไม่ได้มีผลประโยชน์ใดๆ ที่ต้องยื้อแย่งแข่งกัน ยังแย่งกันใช้ชื่อนามแฝงกันอีกเหรอเนี่ย
"select q.idate,q.Total_1,q.Total_2,q.Total_3 from (" & _
ไปเอา statement จากคิวรี่ query_rpt ของคุณมาวางตรงนี้ วางบรรทัดเดียวได้ก็ดี ตรวจสอบเครื่องหมายให้ดี
") as q " & _
"where q.idate=" & i & ";"
หรือ
SQL = "INSERT INTO rpt (idate,Total_1,Total_2,Total_3) " & _
"ตรงนี้ให้คุณเอา statement ของ query_rpt มาวาง แทนได้เลย ตัดเอาฟิลด์อื่นๆ ที่ไม่เกี่ยวข้องออก แล้วเพิ่ม where ว่า idate=" & i & ";"
ลองดูอีกทีครับ
--------------------------------------------------------
แล้วเรื่อง execute ล่ะครับ ใช้วิธีไหน ผ่านหรือเปล่า ยังไม่แจ้งผลบ้างเลย
-------------------------------------------------------
ทำไม บางความเห็นใช้คำลงท้ายเป็นของเพศผู้ แต่บางความเห็นใช้คำลงท้ายเป็นของเพศเมีย ใช่คนเดียวกันหรือเปล่า หรือว่ามีคนสองคน ถามคำถามเดียวกันและใช้ชื่อเดียวกัน จะมั่นใจได้อย่างไร ว่าขณะนี้คนที่เขากำลังช่วยเหลืออยู่ เขากำลังช่วยใคร ช่วยถูกคน หรือถูกประเด็นหรือเปล่า
ผมว่า เว็บนี้ไม่มีระบบ ล็อกอิน ทำให้สะดวกดีแล้วนะ ยังมีการใช้นามแฝงของคนอื่นอีกเหรอเนี่ย แค่เว็บที่แบ่งปันความรู้กันเองนะ ไม่ได้มีผลประโยชน์ใดๆ ที่ต้องยื้อแย่งแข่งกัน ยังแย่งกันใช้ชื่อนามแฝงกันอีกเหรอเนี่ย
11 @R06140
อ่อ พอดีโปรเจ็คนี้มีหลายคนครับผมก็เลยให้ใช้ TCC ไปเลย จะได้ไม่งง
ส่วนเรื่อง execute
ถ้าเป็น table ที่ครีเอท ใน mysql ใช้งานได้
แต่พอไป select query_rpt มาไม่ได้ครับ เพราะมันเป็นแบบสอบถาม
คือที่คุณ yeadram บอกให้ก๊อบ statement มาวางมันก็ยังไม่ได้ครับ ฟ้องว่าผิด syntax ครับ เพราะไอ statement มันก็ไปดึงมาจากแบบสอบถามอีกทีนึงครับ ไม่ทราบว่าปัญหามันจะเกิดจากการที่เราดึงข้อมูลมาจากแบบสอบถามหรือเปล่าครับ
ส่วนเรื่อง execute
ถ้าเป็น table ที่ครีเอท ใน mysql ใช้งานได้
แต่พอไป select query_rpt มาไม่ได้ครับ เพราะมันเป็นแบบสอบถาม
คือที่คุณ yeadram บอกให้ก๊อบ statement มาวางมันก็ยังไม่ได้ครับ ฟ้องว่าผิด syntax ครับ เพราะไอ statement มันก็ไปดึงมาจากแบบสอบถามอีกทีนึงครับ ไม่ทราบว่าปัญหามันจะเกิดจากการที่เราดึงข้อมูลมาจากแบบสอบถามหรือเปล่าครับ
12 @R06141
ขอดู statement ของ query_rpt
และ statement อื่นๆ ที่เกี่ยวข้องกันกับมันด้วยครับ (ถ้ามี)
หรืออีกแนวทางหนึ่ง ถ้าคิดว่ามันมีปัญหาของการดึงข้อมูลจากคิวรี่ แล้วยาก
ให้ลองสร้าง TEMPORARY TABLE เอาครับ
ถ้าใช้คู่กับการคอนเนคชั่นด้วย odbc ที่ผมให้ไปก่อนหน้า มันจะเหมาะมากครับ
เพราะเมื่อเราสั่งตัดการเชื่อมต่อแล้ว ตาราง TEMPORARY TABLE จะถูกลบออกเอง ไม่เปลื้องพื้นที่ด้วยครับ
อันนี้เป็นตัวอย่างโค้ด php ที่ผมใช้เขียนเว็บของผมเอง ลองดูแนวทางแล้วลองดูว่าพอจะนำไปประยุกต์ใช้ได้หรือไม่ครับ
ข้อสังเกตุอีกอย่างของโค้ดผมคือ ชื่อฟิลด์ต้นทางกับชื่อฟิลด์ปลายทาง จะไม่ให้มันเหมือนกันครับ (ผมจำไม่ได้ว่าเพราะอะไรผมถึงต้องทำอย่างนั้น แต่ว่า statement ตัวนี้มันทำงานได้ ไม่ติดขัดอะไรเลยครับ ขอแค่จำนวนฟิลด์กับชนิดของข้อมูลเหมือนกันเท่านั้นมั้งครับ)
และ statement อื่นๆ ที่เกี่ยวข้องกันกับมันด้วยครับ (ถ้ามี)
หรืออีกแนวทางหนึ่ง ถ้าคิดว่ามันมีปัญหาของการดึงข้อมูลจากคิวรี่ แล้วยาก
ให้ลองสร้าง TEMPORARY TABLE เอาครับ
ถ้าใช้คู่กับการคอนเนคชั่นด้วย odbc ที่ผมให้ไปก่อนหน้า มันจะเหมาะมากครับ
เพราะเมื่อเราสั่งตัดการเชื่อมต่อแล้ว ตาราง TEMPORARY TABLE จะถูกลบออกเอง ไม่เปลื้องพื้นที่ด้วยครับ
อันนี้เป็นตัวอย่างโค้ด php ที่ผมใช้เขียนเว็บของผมเอง ลองดูแนวทางแล้วลองดูว่าพอจะนำไปประยุกต์ใช้ได้หรือไม่ครับ
$sql ="CREATE TEMPORARY TABLE tbview (
tCode CHAR(10) NOT NULL,
tseek TEXT);";
mysql_query($sql);
$sql="
INSERT INTO tbview
select tbproduct.pCode AS pCode,
concat_ws(tbproduct.pName,' ',tbproduct.pDesc,' ',tbproduct.scFloor,' ',
tbproduct.scPrice,' ',tbproduct.scAvailWhen,' ',tbproduct.scRefer,' ',
tbproduct.scCondition,' ',tbcategory.CategoryName,' ',tbzone.zoneName) AS vseek
from (
tbproduct join tbcategory
on (tbproduct.pCategory = tbcategory.CategoryID)
) join tbzone
on (tbproduct.pZone = tbzone.zoneID)
;
";
mysql_query($sql);
ข้อสังเกตุอีกอย่างของโค้ดผมคือ ชื่อฟิลด์ต้นทางกับชื่อฟิลด์ปลายทาง จะไม่ให้มันเหมือนกันครับ (ผมจำไม่ได้ว่าเพราะอะไรผมถึงต้องทำอย่างนั้น แต่ว่า statement ตัวนี้มันทำงานได้ ไม่ติดขัดอะไรเลยครับ ขอแค่จำนวนฟิลด์กับชนิดของข้อมูลเหมือนกันเท่านั้นมั้งครับ)
Time: 0.2324s
วันที่ 2/1/2010 คุณจะกรอกค่า Field1 =2
วันที่ 3/1/2010 คุณจะกรอกค่า Field1 =3
........................................................
จะเห็นว่ามันเป็นลำดับที่แน่นนอน
แบบนี้เขียนเป็น SQL STETMENT หรือ VBA ก็ได้ แต่ถ้าไม่ทรายแน่นอนว่า
ค่า Field1 ที่จะกรอกจะเป็นอะไร ยังงัยก็ต้องทำทีล่ะ Record ครับ