กระทู้เก่าบอร์ด อ.Yeadram
2,553 11
URL.หัวข้อ /
URL
ข้อมูล 2 Query ลง TextFile เดียวกัน
เราสามารถส่งออกข้อมูล 2 Query ที่มีจำนวนฟิลด์ไม่เหมือนกัน และไม่เท่ากันลง TextFile เดียวกัน หรือไม่ครับ ถ้าได้ทำอย่างไรครับ
11 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R12350
ลอง method writeline ดูครับ
3 @R12359
method writeline มันคืออะไร ครับ
4 @R12361
สร้าง object ที่เป็น text file ขึ้นมาก่อน แล้วใช้ object.writeline เพื่อเขียนข้อมูลลงไปทีละบรรทัด
ข้อดีคือกำหนด ข้อมูลที่จะเขียนได้อย่างอิสระ
ข้อเสียคือ ต้อง ควบคุมข้อมูล ทำการวนลูปต่างๆเอง ไม่ง่ายเหมือน export file
ข้อดีคือกำหนด ข้อมูลที่จะเขียนได้อย่างอิสระ
ข้อเสียคือ ต้อง ควบคุมข้อมูล ทำการวนลูปต่างๆเอง ไม่ง่ายเหมือน export file
5 @R12366
ในการ Export ผมเคย Export ออกเป็น EXcel โดยให้เข้าไปยังไฟล์
ที่กำหนด โดยมาจาก Query หลายๆ Query วิธีการก็ทำจากแมรโคร
ไม่รู้ว่า Text File ต้องทำอย่างไรบ้าง
ที่กำหนด โดยมาจาก Query หลายๆ Query วิธีการก็ทำจากแมรโคร
ไม่รู้ว่า Text File ต้องทำอย่างไรบ้าง
6 @R12370
ประมาณว่า
dim RS
Dim conn
Dim tx อันนี้ text ถ้าใช้ filesystemobject ก็ได้(ผมชอบมัน) หรือเปิดแบบ dos โบราณก็ได้ เอาเป็นว่ามันคือการสร้าง text file เปล่าขึ้นมาอันนึงนั่นแหละครับ
' งานแรก
rs.open "query1", conn, 1
do while not rs.eof
tx.writeline rs(0) & "; " & rs(1) & .......
rs.movenext
loop
' งานต่อไป
rs.close
rs.open "Query2", conn,1
เขียนเหมือนกันนั่นแหละครับ....
แล้วสั่งจบงานให้ครบถ้วน
tx.close สั่งให้มันปิด หรือสั่งให้มันเซฟแล้วปิด นั่นคือการสร้าง text file เรียบร้อยแล้ว
rs.close สั่งปิดคิวรี่ที่ค้างในแรม
set rs=nothing ปิดอื่นๆ ตามปกตินั่นแหละครับ
มันลำบากสำหรับการเขียนลูป นิดนึงครับแต่ถ้าไล่ครับ เขียนครบจริงๆ แล้วจะเห็นได้ว่า มันละเอียด มันอิสระ มันยืดหยุ่นกว่าการใช้คำสั่ง export เยอะเลยครับ สังเกตง่ายๆ ไหมครับว่า ลูปแรก คิวรี่แรก ไม่มีอะไรเกี่ยวข้องกับ ลูปสอง คิวรี่สองเลยสักนิด ดังนั้น ไม่ง้อ ไม่สนครับ ว่ามันจะมีกี่ฟิลด์
dim RS
Dim conn
Dim tx อันนี้ text ถ้าใช้ filesystemobject ก็ได้(ผมชอบมัน) หรือเปิดแบบ dos โบราณก็ได้ เอาเป็นว่ามันคือการสร้าง text file เปล่าขึ้นมาอันนึงนั่นแหละครับ
' งานแรก
rs.open "query1", conn, 1
do while not rs.eof
tx.writeline rs(0) & "; " & rs(1) & .......
rs.movenext
loop
' งานต่อไป
rs.close
rs.open "Query2", conn,1
เขียนเหมือนกันนั่นแหละครับ....
แล้วสั่งจบงานให้ครบถ้วน
tx.close สั่งให้มันปิด หรือสั่งให้มันเซฟแล้วปิด นั่นคือการสร้าง text file เรียบร้อยแล้ว
rs.close สั่งปิดคิวรี่ที่ค้างในแรม
set rs=nothing ปิดอื่นๆ ตามปกตินั่นแหละครับ
มันลำบากสำหรับการเขียนลูป นิดนึงครับแต่ถ้าไล่ครับ เขียนครบจริงๆ แล้วจะเห็นได้ว่า มันละเอียด มันอิสระ มันยืดหยุ่นกว่าการใช้คำสั่ง export เยอะเลยครับ สังเกตง่ายๆ ไหมครับว่า ลูปแรก คิวรี่แรก ไม่มีอะไรเกี่ยวข้องกับ ลูปสอง คิวรี่สองเลยสักนิด ดังนั้น ไม่ง้อ ไม่สนครับ ว่ามันจะมีกี่ฟิลด์
7 @R12371
Dim RS
Dim conn ตัวนี้คืออะไรครับ
Dim tx
RS.Open "Query1", conn, 1
Do While Not RS.EOF
tx.writeline RS(0) & "; " & RS(1) บรรทัดนี้คือสั่งให้อะไรครับ
RS.MoveNext
Loop
RS.Close
RS.Open "Query2", conn, 1
RS.Close
Set RS = Nothing
Dim conn ตัวนี้คืออะไรครับ
Dim tx
RS.Open "Query1", conn, 1
Do While Not RS.EOF
tx.writeline RS(0) & "; " & RS(1) บรรทัดนี้คือสั่งให้อะไรครับ
RS.MoveNext
Loop
RS.Close
RS.Open "Query2", conn, 1
RS.Close
Set RS = Nothing
8 @R12372
ตัวแรก เรียกว่า ตัวแปร class object
ให้เราประกาศเป็น class connection
ในที่นี้ประกาศเต็มๆ คือ
dim Conn as new adodb.connection
เมื่อประกาศแล้วมันก็พร้อมใช้ มันสามารถ สั่งเปิดเรคคอร์ดเซ็ตได้ เช่น ถ้ากำหนด ให้ RS คือ new adodb.recordset
เราก็ให้ conn มาเปิด
rs.open .... , conn
หรือจะใช้มันสั่งรันคิวรี่ได้เช่น
conn.execute "Delete * from table1"
เป็นต้น
ต่อไปบรรทัดที่ว่า คือการสั่งโปรยข้อมูลแต่ละฟิลด์ลงใน text file ครับ
เราจะให้โปรยฟิลด์ที่เท่าไหร่บ้าง โปรยอย่างไร
เช่น จะให้โปรยฟิลด์ (จากคิวรี่1) ที่1(ID) และฟิลด์ที่ 3(fName)
ในรูปแบบต่อกันไปในบรรทัดเดียว คั่นด้วยเครื่องหมาย เซมิ ก็จะเขียนได้สองอย่าง เช่น
tx.writeline RS(0) & "; " & RS(3)
หรือ
tx.writeline RS("ID") & "; " & RS("fName")
หรือถ้าต้องการให้แต่ละฟิลด์ แยกกันอยู่คนละบรรทัด เราก็อาจต้องสั่ง writeline สองครั้งเช่น
do whil.....
tx.writeline rs(0)
tx.writeline rs(2)
rs.movenext
loop
เป็นต้น
ให้เราประกาศเป็น class connection
ในที่นี้ประกาศเต็มๆ คือ
dim Conn as new adodb.connection
เมื่อประกาศแล้วมันก็พร้อมใช้ มันสามารถ สั่งเปิดเรคคอร์ดเซ็ตได้ เช่น ถ้ากำหนด ให้ RS คือ new adodb.recordset
เราก็ให้ conn มาเปิด
rs.open .... , conn
หรือจะใช้มันสั่งรันคิวรี่ได้เช่น
conn.execute "Delete * from table1"
เป็นต้น
ต่อไปบรรทัดที่ว่า คือการสั่งโปรยข้อมูลแต่ละฟิลด์ลงใน text file ครับ
เราจะให้โปรยฟิลด์ที่เท่าไหร่บ้าง โปรยอย่างไร
เช่น จะให้โปรยฟิลด์ (จากคิวรี่1) ที่1(ID) และฟิลด์ที่ 3(fName)
ในรูปแบบต่อกันไปในบรรทัดเดียว คั่นด้วยเครื่องหมาย เซมิ ก็จะเขียนได้สองอย่าง เช่น
tx.writeline RS(0) & "; " & RS(3)
หรือ
tx.writeline RS("ID") & "; " & RS("fName")
หรือถ้าต้องการให้แต่ละฟิลด์ แยกกันอยู่คนละบรรทัด เราก็อาจต้องสั่ง writeline สองครั้งเช่น
do whil.....
tx.writeline rs(0)
tx.writeline rs(2)
rs.movenext
loop
เป็นต้น
9 @R12373
อ้อลืมไป สำหรับตัวแปร object connection เมื่อประกาศแล้วต้องระบุค่าให้มันด้วยนะครับ ว่ามันคือคอนเนคชั่นของฐานข้อมูลใด
Dim Conn as New ADODB.Connection
ถ้าต้องการให้คือฐานข้อมูลปัจจุบัน ก็ต้องให้ค่า
Set Conn = CurrentProject.connection
หรือถ้าต้องการติดต่อสั่งการฐานข้อมูลตัวอย่างก็ต้องให้ค่าเช่น
Conn.open "Provider=sqloledb;Data Source=thai-access.com;Database=accweb;User ID=yeadram;password=board224;"
Dim Conn as New ADODB.Connection
ถ้าต้องการให้คือฐานข้อมูลปัจจุบัน ก็ต้องให้ค่า
Set Conn = CurrentProject.connection
หรือถ้าต้องการติดต่อสั่งการฐานข้อมูลตัวอย่างก็ต้องให้ค่าเช่น
Conn.open "Provider=sqloledb;Data Source=thai-access.com;Database=accweb;User ID=yeadram;password=board224;"
10 @R12374
อ้างถึง tx.writeline RS(0) & "; " & RS(3) หรือ tx.writeline RS("ID") & "; " & RS("fName")
ถ้าเรามี 40 Column เราต้องเขียนต่อกันไป RS(0)...ไปจนถึง...RS(39)
ใช่มั้ยครับอาจารย์
ถ้าเรามี 40 Column เราต้องเขียนต่อกันไป RS(0)...ไปจนถึง...RS(39)
ใช่มั้ยครับอาจารย์
11 @R12375
วน loop ต่อ string ก่อนค่อยสั่ง writeline ทีเดียวครับ
str = rs(0)
For i = 1 to 39
str = str & ";" & rs(i)
Next i
tx.writeline str
str = rs(0)
For i = 1 to 39
str = str & ";" & rs(i)
Next i
tx.writeline str
Time: 0.3146s
อยากรู้ว่าใน Access มีคำสั่งให้ออกไปรวมกันได้เลยรึปล่าว