กระทู้เก่าบอร์ด อ.Yeadram
10,755 17
URL.หัวข้อ /
URL
การสร้างตารางแบบฟอร์ม ในแอคเซส
เรียนท่านอาจารย์
ขอความช่วยเหลือครับ
สาเหตุ :
ที่บริษัท มีการควบคุมด้วยระบบ ISO9001 เพราะฉะนั้น เอกสารต้องมีแบบฟอร์ม เหมือนเดิมเสมอ แต่เวลาเขียนโปรแกรม และทำเป็นรายงานออกมาพิมพ์ จะมีเส้นตารางเฉพาะ ช่วงข้อมูลที่มีอยู่เท่านั้น ไม่สามารถ ส่งออกมาเป็นช่องว่างให้ฟอร์ม ที่เหมือนกันได้
คำถาม :
จะทำยังไงได้บ้างครับ เพื่อให้เวลาสั่งพิมพ์ถึงแม้เราไม่ได้ ลงข้อมูลหลอกเป็น BLANK เอาไว้ แต่ก็พิมพ์อออกมาได้เป็นฟอร์มเหมือนกันได้เสมอครับ
ขอบคุณมากครับ
ขอความช่วยเหลือครับ
สาเหตุ :
ที่บริษัท มีการควบคุมด้วยระบบ ISO9001 เพราะฉะนั้น เอกสารต้องมีแบบฟอร์ม เหมือนเดิมเสมอ แต่เวลาเขียนโปรแกรม และทำเป็นรายงานออกมาพิมพ์ จะมีเส้นตารางเฉพาะ ช่วงข้อมูลที่มีอยู่เท่านั้น ไม่สามารถ ส่งออกมาเป็นช่องว่างให้ฟอร์ม ที่เหมือนกันได้
คำถาม :
จะทำยังไงได้บ้างครับ เพื่อให้เวลาสั่งพิมพ์ถึงแม้เราไม่ได้ ลงข้อมูลหลอกเป็น BLANK เอาไว้ แต่ก็พิมพ์อออกมาได้เป็นฟอร์มเหมือนกันได้เสมอครับ
ขอบคุณมากครับ
17 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R12626
เรียนท่าน อาจารย์
ตอนนี้ผมก็ใช้วิธีนี้อยู่ครับ โดยการ คีย์เป็นข้อมูลว่างเข้าไป เพื่อให้เต็มฟอร์ม แต่ทำให้มีข้อมูลว่างเยอะ โดยที่ไม่จำเป็นครับ อยากได้แบบ ที่ตัวโปรแกรม สร้างตรวจสอบข้อมูลก่อน ว่ามีกี่เร็คคอร์ด แล้วสร้างตารางขึ้นมาให้เองเพื่อจะได้เต็มฟอร์มน่ะครับ
ตอนนี้ผมก็ใช้วิธีนี้อยู่ครับ โดยการ คีย์เป็นข้อมูลว่างเข้าไป เพื่อให้เต็มฟอร์ม แต่ทำให้มีข้อมูลว่างเยอะ โดยที่ไม่จำเป็นครับ อยากได้แบบ ที่ตัวโปรแกรม สร้างตรวจสอบข้อมูลก่อน ว่ามีกี่เร็คคอร์ด แล้วสร้างตารางขึ้นมาให้เองเพื่อจะได้เต็มฟอร์มน่ะครับ
3 @R12647
เงียบมากเลย ต้องการจริงๆนะครับ
4 @R12649
การเตรียมตัว
-คิวรี่ข้อมูลที่ต้องการเอาไว้ออกรายงาน qrForReport (ไปเอาข้อมูลของคุณมาถ้ามีการเชื่อมตารางใดๆ เชื่อมให้ครบซะก่อน อาจจะกรองให้มีเรคคอร์ดน้อยๆ ก็ได้ เพราะเราต้องการเพียงโครงสร้างของมันเท่านั้น)
- เลือกข้อมูลชุดนี้ไปสร้างตาราง ชื่อ tbTempReport (เปลี่ยนชนิดคิวรี่ให้เป็น Make Table แล้วรัน)
- เปลี่ยนชนิดคิวรี่กลับคืนเป็น Select ธรรมดา เอาเงื่อนไขออกทั้งหมดหรือเท่าที่จำเป็น เซฟแล้วตั้งชื่อ qrTempReport
- ไปมุมมองออกแบบตาราง tbTempReport
- แก้ไข ฟิลด์ทุกๆ ฟิลด์ตรวจสอบอย่าให้มี Required
- ลบข้อมูลออกจากตาราง tbTempReport ออกให้หมด อย่าให้เหลือ
- สร้างคิวรี่ใหม่ ให้เอา ข้อมูลจากสองแหล่งนี้มา UNION กัน แล้วเซฟตั้งชื่อเอาเอง เอาไปเป็น Recordsource ของ รายงานที่ต้องการ
การออกรายงานให้ออกผ่านฟังก์ชั่น (ชุดคำสั่งหลายขั้นตอน)
-เมื่อจะแสดงผลรายงาน ให้มีการส่งเงื่อนไขต่างๆ ที่ต้องการเข้าไปใน คิวรี่ qrTempReport แล้วตรวจนับจำนวนเรคคอร์ดในคิวรี่ ว่ามีเท่าไหร่
-ให้ลบเรคคอร์ดทั้งหมดจากตาราง tbBlank
-ให้เพิ่มจำนวนเรคคอร์ดส่วนต่างเข้าในตาราง tbblank (โควต้า - จำนวนเรคคอร์ดในคิวรี่หลัก)
- ใช้คำสั่งเปิดรายงานได้เลย หากมีการส่งค่าพารามิเตอร์ต่างๆ เพื่อจะใช้โชว์ตามหัวรายงานให้ส่งโดยการผ่านค่าทาง OpenArgs แล้วค่อยไปเรียกใช้ด้วยโค้ดในตอน Report_Open
ตัวอย่างฟังก์ชั่น
x1= ค่าที่เป็นเงื่อนไขที่1
x2= ค่าที่เป็นเงื่อนไขที่2
x3...... ถ้ามี
Dim db As Database
Dim qr As DAO.QueryDef
Set db = CurrentDb
Set qr = db.QueryDefs("qrTempReport")
sq = Left(qr.sql, Len(qr.sql) - 1) ' เอาเครื่องหมาย เซมิฯ ออกจากท้ายประโยค
sq = sq & " Where field1 = " & x1 & " AND field2 Like '" & x2 & "'" ' ตัวอย่างการเพิ่มเงื่อนไขให้คิวรี่
qr.sql = sq ' แล้วเอาสายอักชระที่เพิ่มเงื่อนไขแล้วกลับไปคืนให้คิวรี่เหมือนเดิม
qr.Close
Set qr = Nothing
Set db = Nothing
ต่อไป นับจำนวนเรคคอร์ดในคิวรี่
x = dcount("ชื่อฟิลด์อะไรก็ได้", "qrTempReport")
y= 10 'โค้วต้าที่กำหนดหรือจำนวนบรรทัดทั้งหมดที่ต้องการ
currentproject.connection.execute "Delete from tbTempReport" ' ล้างรายการออกจากตารางชั่วคราวทุกครั้ง เพื่อให้แน่ใจในเรื่องจำนวนเรคคอร์ด
for i = 1 to y-x
currentproject.connection.execute "Insert into tbTempReport (ชื่อฟิลด์ รายการ หรือ Description) values(' ');"
next
' มันคือการเติมค่าว่างลงในฟิลด์ของ "รายการ" ในตารางชั่วคราว โดยเติมไปทั้งสิ้นเป็นจำนวนเรคคอร์ดว่างที่ต้องการ นั่นคือ y - x
สั่งเปิดรายงาน หากต้องการส่งค่าพารามิเตอร์ก็ส่งไปใน OpenArgs
docmd.OpenReport "ชื่อรายงาน",,,,,x1 & "@" & x2
ดูเหมือนยาก วุ่นวาย แต่มันก็แค่ครั้งเดียว แล้วโค้ดก็ไม่ได้ทำงานนานหรอกครับ แค่แว๊บเดียวครับ มันคือการสร้างข้อมูลชั่วคราวนั่นแหละครับ แต่ไม่ได้ใส่ข้อมูลว่างเข้าตารางหลัก มันก็เลยไม่รกฐานข้อมูลเราครับ
ปล. ถ้ามีการแยกฐานข้อมูลแบ่งกันใช้หลาย user ต้องออกแบบให้ตารางชั่วคราวอยู่ที่ front-end นะครับ ไม่งั้นจะมีปัญหาแย่งกันใช้ตาราง
-คิวรี่ข้อมูลที่ต้องการเอาไว้ออกรายงาน qrForReport (ไปเอาข้อมูลของคุณมาถ้ามีการเชื่อมตารางใดๆ เชื่อมให้ครบซะก่อน อาจจะกรองให้มีเรคคอร์ดน้อยๆ ก็ได้ เพราะเราต้องการเพียงโครงสร้างของมันเท่านั้น)
- เลือกข้อมูลชุดนี้ไปสร้างตาราง ชื่อ tbTempReport (เปลี่ยนชนิดคิวรี่ให้เป็น Make Table แล้วรัน)
- เปลี่ยนชนิดคิวรี่กลับคืนเป็น Select ธรรมดา เอาเงื่อนไขออกทั้งหมดหรือเท่าที่จำเป็น เซฟแล้วตั้งชื่อ qrTempReport
- ไปมุมมองออกแบบตาราง tbTempReport
- แก้ไข ฟิลด์ทุกๆ ฟิลด์ตรวจสอบอย่าให้มี Required
- ลบข้อมูลออกจากตาราง tbTempReport ออกให้หมด อย่าให้เหลือ
- สร้างคิวรี่ใหม่ ให้เอา ข้อมูลจากสองแหล่งนี้มา UNION กัน แล้วเซฟตั้งชื่อเอาเอง เอาไปเป็น Recordsource ของ รายงานที่ต้องการ
การออกรายงานให้ออกผ่านฟังก์ชั่น (ชุดคำสั่งหลายขั้นตอน)
-เมื่อจะแสดงผลรายงาน ให้มีการส่งเงื่อนไขต่างๆ ที่ต้องการเข้าไปใน คิวรี่ qrTempReport แล้วตรวจนับจำนวนเรคคอร์ดในคิวรี่ ว่ามีเท่าไหร่
-ให้ลบเรคคอร์ดทั้งหมดจากตาราง tbBlank
-ให้เพิ่มจำนวนเรคคอร์ดส่วนต่างเข้าในตาราง tbblank (โควต้า - จำนวนเรคคอร์ดในคิวรี่หลัก)
- ใช้คำสั่งเปิดรายงานได้เลย หากมีการส่งค่าพารามิเตอร์ต่างๆ เพื่อจะใช้โชว์ตามหัวรายงานให้ส่งโดยการผ่านค่าทาง OpenArgs แล้วค่อยไปเรียกใช้ด้วยโค้ดในตอน Report_Open
ตัวอย่างฟังก์ชั่น
x1= ค่าที่เป็นเงื่อนไขที่1
x2= ค่าที่เป็นเงื่อนไขที่2
x3...... ถ้ามี
Dim db As Database
Dim qr As DAO.QueryDef
Set db = CurrentDb
Set qr = db.QueryDefs("qrTempReport")
sq = Left(qr.sql, Len(qr.sql) - 1) ' เอาเครื่องหมาย เซมิฯ ออกจากท้ายประโยค
sq = sq & " Where field1 = " & x1 & " AND field2 Like '" & x2 & "'" ' ตัวอย่างการเพิ่มเงื่อนไขให้คิวรี่
qr.sql = sq ' แล้วเอาสายอักชระที่เพิ่มเงื่อนไขแล้วกลับไปคืนให้คิวรี่เหมือนเดิม
qr.Close
Set qr = Nothing
Set db = Nothing
ต่อไป นับจำนวนเรคคอร์ดในคิวรี่
x = dcount("ชื่อฟิลด์อะไรก็ได้", "qrTempReport")
y= 10 'โค้วต้าที่กำหนดหรือจำนวนบรรทัดทั้งหมดที่ต้องการ
currentproject.connection.execute "Delete from tbTempReport" ' ล้างรายการออกจากตารางชั่วคราวทุกครั้ง เพื่อให้แน่ใจในเรื่องจำนวนเรคคอร์ด
for i = 1 to y-x
currentproject.connection.execute "Insert into tbTempReport (ชื่อฟิลด์ รายการ หรือ Description) values(' ');"
next
' มันคือการเติมค่าว่างลงในฟิลด์ของ "รายการ" ในตารางชั่วคราว โดยเติมไปทั้งสิ้นเป็นจำนวนเรคคอร์ดว่างที่ต้องการ นั่นคือ y - x
สั่งเปิดรายงาน หากต้องการส่งค่าพารามิเตอร์ก็ส่งไปใน OpenArgs
docmd.OpenReport "ชื่อรายงาน",,,,,x1 & "@" & x2
ดูเหมือนยาก วุ่นวาย แต่มันก็แค่ครั้งเดียว แล้วโค้ดก็ไม่ได้ทำงานนานหรอกครับ แค่แว๊บเดียวครับ มันคือการสร้างข้อมูลชั่วคราวนั่นแหละครับ แต่ไม่ได้ใส่ข้อมูลว่างเข้าตารางหลัก มันก็เลยไม่รกฐานข้อมูลเราครับ
ปล. ถ้ามีการแยกฐานข้อมูลแบ่งกันใช้หลาย user ต้องออกแบบให้ตารางชั่วคราวอยู่ที่ front-end นะครับ ไม่งั้นจะมีปัญหาแย่งกันใช้ตาราง
5 @R12650
ให้สร้าง Sub Report ครับ
- สร้าง Report หลัก
โดยวางข้อมูลที่เป็น Header Footer ทั้งหลายใน report หลัก
ส่วน Detail กำหนด Property Can Grow = No
กำหนดความสูง ตามที่ต้องการให้พอดีหน้ากระดาษตอนพิมพ์ และวาง เส้นตาราง (แนะนำว่า ไม่ควรวางเส้นแนวนอน)
- สร้าง Sub Report
สร้าง report อีกตัว วางข้อมูล สินค้า โดยไม่ต้องมีเส้น หรือ กรอบ
นำ report นี้ไปวางใน Report หลัก จะเกิดเป็น sub Report
กำหนด Link Child Fields ให้เรียบร้อย
อันนี้เป็นปัญหา classic ครับ ลองดูครับ
- สร้าง Report หลัก
โดยวางข้อมูลที่เป็น Header Footer ทั้งหลายใน report หลัก
ส่วน Detail กำหนด Property Can Grow = No
กำหนดความสูง ตามที่ต้องการให้พอดีหน้ากระดาษตอนพิมพ์ และวาง เส้นตาราง (แนะนำว่า ไม่ควรวางเส้นแนวนอน)
- สร้าง Sub Report
สร้าง report อีกตัว วางข้อมูล สินค้า โดยไม่ต้องมีเส้น หรือ กรอบ
นำ report นี้ไปวางใน Report หลัก จะเกิดเป็น sub Report
กำหนด Link Child Fields ให้เรียบร้อย
อันนี้เป็นปัญหา classic ครับ ลองดูครับ
6 @R12651
ขอบคุณคุณPichaiTC มากครับ ความรู้ใหม่สำหรับผมเลยนะเนี่ย
ไม่คิดว่า Access จะทำได้ ผมลองแล้วสวยดีครับ
ไม่คิดว่า Access จะทำได้ ผมลองแล้วสวยดีครับ
7 @R12656
ยินดีครับ
บางเรื่องเหมือนเส้นผมบังภูเขา เป็นเรื่องง่ายๆที่นึกไม่ถึง
ผมเองงานแรกๆ ก็ใช้วิธีเพิ่ม record ว่าง เฉพาะตอนพิมพ์โดยสร้าง temp table - print เสร็จก็ลบทิ้ง
มาร้องอ๋อตอนทำ crystal report (ใช้กับ VB) ก็เลยมาลองทำบน Access นี้แหล่ะครับ
บางเรื่องเหมือนเส้นผมบังภูเขา เป็นเรื่องง่ายๆที่นึกไม่ถึง
ผมเองงานแรกๆ ก็ใช้วิธีเพิ่ม record ว่าง เฉพาะตอนพิมพ์โดยสร้าง temp table - print เสร็จก็ลบทิ้ง
มาร้องอ๋อตอนทำ crystal report (ใช้กับ VB) ก็เลยมาลองทำบน Access นี้แหล่ะครับ
8 @R12657
ขอบคุณมากครับ ท่านอาจารย์ทั้งสอง จะลองทำทั้งสองแบบเลยนะครับ เยี่ยมมากเลยครับ
9 @R12662
ขอบคุณครับเดี๋ยวขอเอาไปลองด้วย
10 @R12664
เอาไปลองมาแล้วครับ ของคุณ พิชัย ผมใส่เส้นตารางแนวนอนด้วยนะครับ โดยการวางรูปสี่เหลี่ยม ตามขนาดฟิลด์ที่ต้องการ และการกำหนดความสูงของสี่เหลี่ยม ให้เท่ากับความสูงของฟิลด์ข้อมูลของ sub report โดยดูจากช่อง Properties น่ะครับ ออกมาสวยเลยล่ะ
มาขอบคุณอีกครับ เส้นผมบังภูเขาจริงๆเลยนะครับ
มาขอบคุณอีกครับ เส้นผมบังภูเขาจริงๆเลยนะครับ
11 @R12667
ที่ผมแนะนำว่าไม่ควรวางเส้นแนวนอน ทึ่ report หลัก เหตุผลคือ
กรณีข้อมูลใน sub report แต่ละ record อาจจะสูงไม่เท่ากัน ตามความยาวของข้อมูล เช่น 1,2,3,.. บรรทัด
เพราะฉะนั้น ถ้าอยากจะให้มีเส้นคั่น record ที่ dynamic ปรับตามความสูงของแต่ละ record ให้ไปวางเส้นใน sub report
ทั้งนี้ ทั้งนั้น ความชอบส่วนตัวของผมคือ ไม่มีเส้นเลยดีกว่า เพราะถ้ามีเส้น แบบความสูงตายตัว อาจติดปัญหา ความสูงของข้อมูลดังกล่าว
ส่วนการวางแบบ dynamic นั้น จะพบปัญหา ไม่สวยงาม เช่น กรณีข้อมูลยาวกว่า 1 หน้า เส้นสุดท้ายของ record ในหน้าอาจจะอยู่ใกล้กับ เส้นแบ่งที่ footer ก็ต้องมาแก้ปัญหานี้ต่อ ว่ากรณีนี้ให้ซ่อนเส้น เรื่องยาวอีก (ทำได้ครับแต่ขี้เกียจทำ)
ที่สำคัญคือผมชอบแบบ โล่งๆ อีกอย่างคือตีเส้นแล้วมัน เปลืองหมึก
กรณีข้อมูลใน sub report แต่ละ record อาจจะสูงไม่เท่ากัน ตามความยาวของข้อมูล เช่น 1,2,3,.. บรรทัด
เพราะฉะนั้น ถ้าอยากจะให้มีเส้นคั่น record ที่ dynamic ปรับตามความสูงของแต่ละ record ให้ไปวางเส้นใน sub report
ทั้งนี้ ทั้งนั้น ความชอบส่วนตัวของผมคือ ไม่มีเส้นเลยดีกว่า เพราะถ้ามีเส้น แบบความสูงตายตัว อาจติดปัญหา ความสูงของข้อมูลดังกล่าว
ส่วนการวางแบบ dynamic นั้น จะพบปัญหา ไม่สวยงาม เช่น กรณีข้อมูลยาวกว่า 1 หน้า เส้นสุดท้ายของ record ในหน้าอาจจะอยู่ใกล้กับ เส้นแบ่งที่ footer ก็ต้องมาแก้ปัญหานี้ต่อ ว่ากรณีนี้ให้ซ่อนเส้น เรื่องยาวอีก (ทำได้ครับแต่ขี้เกียจทำ)
ที่สำคัญคือผมชอบแบบ โล่งๆ อีกอย่างคือตีเส้นแล้วมัน เปลืองหมึก
12 @R22353
ผมทำตามวิธีที่ท่าน PichaiTC บอกทำได้แค่นิดเดียวครับไปต่อไม่ถูก พอมีวิธีแนะนำแบบละเอียดไหมครับ
13 @R22360
ติดตรงไหนครับ
เพราะหลักการมันก็แค่นั้น อยู่ที่ความคุ้นเคยกับการทำ report นะครับ
ลองถามมาเป็นจุดๆ ก็แล้วกัน
หรือส่ง file มาให้ผมดูก็ได้
email: pichaitc@gmail.com
เพราะหลักการมันก็แค่นั้น อยู่ที่ความคุ้นเคยกับการทำ report นะครับ
ลองถามมาเป็นจุดๆ ก็แล้วกัน
หรือส่ง file มาให้ผมดูก็ได้
email: pichaitc@gmail.com
14 @R22365
ทำตัวอย่างส่ง mail คุณ ServerCHITA ให้แล้วนะครับ
15 @R22376
แหมๆ เจ๊มาเก็บความรู้
ทำไมไม่มีความเห็นของท่านสันติสุขล่ะคะ
เสียดายจัง
ทำไมไม่มีความเห็นของท่านสันติสุขล่ะคะ
เสียดายจัง
16 @R22377
ของคุณ PichaiTC ก็เป็นเทคนิคที่ผมไม่รู้มาก่อนเหมือนกันนะ เยี่ยมจริงๆ
ถ้าเป็นผมก็ตามนี้ครับ http://www.thai-access.com/yeadram_view.php?topic_id=4417
ถ้าเป็นผมก็ตามนี้ครับ http://www.thai-access.com/yeadram_view.php?topic_id=4417
17 @R24513
ทำตามวิธีของคุณ pichaiTC แล้วค่ะ แต่มันพอมันออกรายงาน มันมีจำนวนหน้าเท่าจำนวนระเบียนเลยค่ะ ไม่ทราบว่าจะต้องแกยังไงดี ช่วยด้วยค่ะ
Time: 0.3058s
เช่น คุณต้องการให้มีลำดับทั้งหมด 10 บรรทัดเสมอ แต่ข้อมูลของคุณมีแค่ 5 รายการ คุณก็ต้องเพิ่ม Record ว่างๆเข้าไปอีก 5 ครับ ถ้ายังไงก็ส่งไฟล์ตัวอย่างมาที่เมล์นี้ก็ได้ครับ เสร็จแล้วจะส่งกลับให้ไปแกะดูครับ
Piyaphan@Se-ed.com