บันทึกข้อมูลครั้งละหลายๆเรคคอร์ดอย่างไร
กระทู้เก่าบอร์ด อ.Yeadram

 6,202   12
URL.หัวข้อ / URL
บันทึกข้อมูลครั้งละหลายๆเรคคอร์ดอย่างไร

คือผมอยากจะบันทึกข้อมูลทีละหลายๆเรคคอร์ด ผมต้องเขียนอย่างไรหรอครับ
ผมเขียนใน 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

1 @R06123
ผมว่า มันเป็นไปได้เฉพาะ ค่าที่ทราบค่อนข้างแน่นนอนว่าจะกรอกอะไรลงไปเท่านั้น เช่น วันที่ 1/1/2010 คุณจะกรอกค่า Field1 =1
             วันที่ 2/1/2010 คุณจะกรอกค่า Field1 =2
            วันที่ 3/1/2010 คุณจะกรอกค่า Field1 =3
              ........................................................
จะเห็นว่ามันเป็นลำดับที่แน่นนอน
แบบนี้เขียนเป็น SQL STETMENT หรือ VBA ก็ได้ แต่ถ้าไม่ทรายแน่นอนว่า
ค่า Field1 ที่จะกรอกจะเป็นอะไร ยังงัยก็ต้องทำทีล่ะ Record ครับ
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 ก็มีข้อมูลอยู่
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
แต่มันไม่ได้ ช่วยชี้แนะหน่อยครับ
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
ประมาณนี้ครับ
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 กํรันได้นะค่ะ เป็นเพราะอะไรคะ
6 @R06135
ฐานข้อมูลเป็น mySQL ใช่ไหมครับ
ตัวที่จะ 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 & " "

8 @R06137
9 @R06138
เท่าที่ผมลองเทสดูแล้ว ถ้าเป็น table ที่ครีเอท ใน mysql ใช้งานได้
แต่พอไป 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 ล่ะครับ ใช้วิธีไหน ผ่านหรือเปล่า ยังไม่แจ้งผลบ้างเลย
-------------------------------------------------------
ทำไม บางความเห็นใช้คำลงท้ายเป็นของเพศผู้ แต่บางความเห็นใช้คำลงท้ายเป็นของเพศเมีย ใช่คนเดียวกันหรือเปล่า หรือว่ามีคนสองคน ถามคำถามเดียวกันและใช้ชื่อเดียวกัน จะมั่นใจได้อย่างไร ว่าขณะนี้คนที่เขากำลังช่วยเหลืออยู่ เขากำลังช่วยใคร ช่วยถูกคน หรือถูกประเด็นหรือเปล่า
ผมว่า เว็บนี้ไม่มีระบบ ล็อกอิน ทำให้สะดวกดีแล้วนะ ยังมีการใช้นามแฝงของคนอื่นอีกเหรอเนี่ย แค่เว็บที่แบ่งปันความรู้กันเองนะ ไม่ได้มีผลประโยชน์ใดๆ ที่ต้องยื้อแย่งแข่งกัน ยังแย่งกันใช้ชื่อนามแฝงกันอีกเหรอเนี่ย
11 @R06140
อ่อ พอดีโปรเจ็คนี้มีหลายคนครับผมก็เลยให้ใช้ TCC ไปเลย จะได้ไม่งง
ส่วนเรื่อง execute
ถ้าเป็น table ที่ครีเอท ใน mysql ใช้งานได้
แต่พอไป select query_rpt มาไม่ได้ครับ เพราะมันเป็นแบบสอบถาม

คือที่คุณ yeadram บอกให้ก๊อบ statement มาวางมันก็ยังไม่ได้ครับ ฟ้องว่าผิด syntax ครับ เพราะไอ statement มันก็ไปดึงมาจากแบบสอบถามอีกทีนึงครับ ไม่ทราบว่าปัญหามันจะเกิดจากการที่เราดึงข้อมูลมาจากแบบสอบถามหรือเปล่าครับ

12 @R06141
ขอดู statement ของ query_rpt
และ 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 ตัวนี้มันทำงานได้ ไม่ติดขัดอะไรเลยครับ ขอแค่จำนวนฟิลด์กับชนิดของข้อมูลเหมือนกันเท่านั้นมั้งครับ)
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2324s