กระทู้เก่าบอร์ด อ.Yeadram
7,987 17
URL.หัวข้อ /
URL
ให้รัน ลำดับที่
ต้องการให้ รัน ลำดับที่ ในรายงาน ให้ถึง 50 ทุกหน้า ต้องทำอย่างไรครับ
อธิบายเหตุผล คือ
1. รายการ สิ่งอุปกรณ์ มี 50 บ้าง ไม่ถึง 50 บ้าง
2. แต่แบบฟอร์มกำหนดให้ทุกหน้า มี 50 รายการ
3. คราวนี้จะทำอย่างไร ให้ รัน ลำดับที่ ในรายงาน ให้ถึง 50 ทุกหน้า
4. ลำดับที่ ผมใช้กล่องข้อความ โดย กำหนดข้อมูล = 1 , ผลรวมสะสม = ทั้งหมด
อธิบายเหตุผล คือ
1. รายการ สิ่งอุปกรณ์ มี 50 บ้าง ไม่ถึง 50 บ้าง
2. แต่แบบฟอร์มกำหนดให้ทุกหน้า มี 50 รายการ
3. คราวนี้จะทำอย่างไร ให้ รัน ลำดับที่ ในรายงาน ให้ถึง 50 ทุกหน้า
4. ลำดับที่ ผมใช้กล่องข้อความ โดย กำหนดข้อมูล = 1 , ผลรวมสะสม = ทั้งหมด
17 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R14320
ขอเป็น 2 กรณี ครับ
กรณี 1. ถ้ารายการที่เกิน 50 ให้เริ่ม ลำดับที่ 1 ในหน้าใหม่
กรณี 2. ถ้ารายการที่เกิน 50 ให้เริ่มหน้าใหม่เป็น ลำดับที่ 51 หน้าต่อไปก็ เริ่มลำดับต่อไป ครับ
กรณี 1. ถ้ารายการที่เกิน 50 ให้เริ่ม ลำดับที่ 1 ในหน้าใหม่
กรณี 2. ถ้ารายการที่เกิน 50 ให้เริ่มหน้าใหม่เป็น ลำดับที่ 51 หน้าต่อไปก็ เริ่มลำดับต่อไป ครับ
3 @R14334
ขอความกรุณาด้วยครับ ต้องส่งงานพรุ่งนี้แล้ว
4 @R14336
มีหลายคำถาม และบางคำถาม ถ้าผมเข้าใจไม่ผิด ผมทำไม่ได้ คิดไม่ออก เลยเอาเป็นว่าช่วยเท่าที่ช่วยได้แล้วกันนะครับ
คำถาม
- หมายถึงรายงานหนึ่งหน้า หากข้อมูลมีไม่ถึง 50 รายการ คุณจะให้มันแสดงเป็น Blank เรคคอร์ดจนครบ 50 ใช่หรือไม่ครับ
- หากใช่ ที่ Blank เรคคอร์ดเปล่าๆ คุณจะให้แสดงเลขต่อจากเรคคอร์ดจริงด้วยหรือครับ (อันนี้แหละ หากใช่ผมคิดไม่ออกจริงๆว่าจะใช้อะไรให้แสดงเลขในเรคคอร์ดที่ไม่มีจริงได้)
คำถาม
- หมายถึงรายงานหนึ่งหน้า หากข้อมูลมีไม่ถึง 50 รายการ คุณจะให้มันแสดงเป็น Blank เรคคอร์ดจนครบ 50 ใช่หรือไม่ครับ
- หากใช่ ที่ Blank เรคคอร์ดเปล่าๆ คุณจะให้แสดงเลขต่อจากเรคคอร์ดจริงด้วยหรือครับ (อันนี้แหละ หากใช่ผมคิดไม่ออกจริงๆว่าจะใช้อะไรให้แสดงเลขในเรคคอร์ดที่ไม่มีจริงได้)
5 @R14337
ใช่ครับ ถ้าไม่มีเรคคอร์ด จะให้มันแสดงเป็น Blank เรคคอร์ดจนครบ 50
6 @R14339
กรณีที่ 1
แบบที่ 1 (แบบยอดนิยม) - สร้างตารางชั่วคราวแล้ว append ข้อมูลที่มี ตามด้วยเติมค่าให้ครบจำนวน record ที่ต้องการ --> ออกรายงานตามตารางชั่วคราวนั้น
แบบที่ 2 (ประยุกต์ต่อจาก 1) สร้างตาราง กำหนดบรรทัด โดยในตารางมีข้อมูลว่างๆเป็นจำนวนเท่ากับบรรทัดที่ต้องการ แล้วสร้าง query ด้วยคำสัาง union ระหว่างข้อมูลที่ต้องการกับตารางที่ใช้กำหนดบรรทัด แต่ select แค่ Top 50 (ตัวเลขตามจำนวนบรรทัดที่ต้องการ) และใช้ query นี้อกกรายงาน
แบบทึ่ 3 สร้างรายงานเป็นตัว main ไว้ก่อน และกำหนดความสูงของส่วน detail ตามต้องการพร้อมทั้งสร้สง label แสดงเลขบรรทัด จากนั้นสร้าง sub report ซึ่งแสดงข้อมูลรายการที่ต้องการมาวางในส่วน detail
ส่วนกรณีที่ 2 ก็ต่อยอดจากกรณีที่ 1 แบบ 1 โดยเพิ่มจำนวนเท่าของบรรทัด ตามหน้าที่เพิ่มขึ้น
ต่อยอดจากแบบ 2 โดยการเอา จำนวนบรรทัดที่ต้องการคูณด้วยผลลบของเลขหน้าลบหนึ่ง แล้วบวกกับเลขบรรทัด เช่น (50*(page-1))+row
หรือต่อยอดจากแบบที่ 3 ด้วยการเปลี่ยน label เป็น textbox แล้วทำสูตรเหมือนแบบ 2
แบบที่ 1 (แบบยอดนิยม) - สร้างตารางชั่วคราวแล้ว append ข้อมูลที่มี ตามด้วยเติมค่าให้ครบจำนวน record ที่ต้องการ --> ออกรายงานตามตารางชั่วคราวนั้น
แบบที่ 2 (ประยุกต์ต่อจาก 1) สร้างตาราง กำหนดบรรทัด โดยในตารางมีข้อมูลว่างๆเป็นจำนวนเท่ากับบรรทัดที่ต้องการ แล้วสร้าง query ด้วยคำสัาง union ระหว่างข้อมูลที่ต้องการกับตารางที่ใช้กำหนดบรรทัด แต่ select แค่ Top 50 (ตัวเลขตามจำนวนบรรทัดที่ต้องการ) และใช้ query นี้อกกรายงาน
แบบทึ่ 3 สร้างรายงานเป็นตัว main ไว้ก่อน และกำหนดความสูงของส่วน detail ตามต้องการพร้อมทั้งสร้สง label แสดงเลขบรรทัด จากนั้นสร้าง sub report ซึ่งแสดงข้อมูลรายการที่ต้องการมาวางในส่วน detail
ส่วนกรณีที่ 2 ก็ต่อยอดจากกรณีที่ 1 แบบ 1 โดยเพิ่มจำนวนเท่าของบรรทัด ตามหน้าที่เพิ่มขึ้น
ต่อยอดจากแบบ 2 โดยการเอา จำนวนบรรทัดที่ต้องการคูณด้วยผลลบของเลขหน้าลบหนึ่ง แล้วบวกกับเลขบรรทัด เช่น (50*(page-1))+row
หรือต่อยอดจากแบบที่ 3 ด้วยการเปลี่ยน label เป็น textbox แล้วทำสูตรเหมือนแบบ 2
7 @R14340
เข้าไปใน mail ของ board :: accboard@gmail.com
password :: accgmail
วันที่ 31/5/2553 ดูตัวอย่าง
ตัวอย่างไฟล์ การเพิ่มบรรทัดในหน้ารายงานเพื่อความสวยงามครับ
password :: accgmail
วันที่ 31/5/2553 ดูตัวอย่าง
ตัวอย่างไฟล์ การเพิ่มบรรทัดในหน้ารายงานเพื่อความสวยงามครับ
8 @R14342
OK ไม่ทราบว่า คุณจอมโจ เข้าใจการเขียน MS Access มากน้อยแค่ไหน เพราะการทำแบบที่คุณตั้งใจนั้นทำกันหลายขั้นตอน อยากให้คุณรอศึกษาอย่างที่ท่าน อ.PichiaTC และ อ.ditasilk แนะนำดูครับ น่าจะเป็นแนวทางที่ดี แต่ถ้าอยากลองแบบวิธีผมก็ทำตามดูนะครับ ขอบอกว่าผมไม่ค่อยใช้ Report ใน MS Access ซักเท่าไร แต่ก็เป็นทางเลือกแล้วกันครับ
9 @R14343
1. มุมมอง Design View ของ Report สร้าง Text Box ขึ้นใหม่ในพื้นที่ Detail Section กำหนด Property ดังนี้:
Other > Name: TotRec
Data > Control Source: =Count(*)
Format > Display When: Screen Only
(หากมีการแบ่ง Group ให้สร้างในพื้นที่ Group Header แทน)
2. ใส่โค๊ดใน Module ที่สร้างขึ้นใหม่:
'----------------------Declarations----------------------
Option Explicit
Global TotCount As Integer
'--------------------------------------------------------
Function PrintLines(R As Report, TotGrp)
TotCount = TotCount + 1
If TotCount = TotGrp Then
R.NextRecord = False
ElseIf TotCount > TotGrp And TotCount < 50 Then ' กำหนดค่า Blank line ต่อหน้า
R.NextRecord = False
Dim CtrX As Control
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
End If
End Function
Function SetCount(R As Report)
TotCount = 0
Dim CtrX As Control
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = True
End If
Next
End Function
3. ที่ Page Header > Event > On Print:
'Private Sub PageHeaderSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
'End Sub
4. ที่ Detail Section > Event > On Print:
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Call PrintLines([Report], [TotRec])
'End Sub
- จากนั้นเมื่อ Print Preview ดู หากเรคคอร์ดทั้งหมดไม่ถึงค่าที่กำหนดคือ 50 ก็จะมี Blank line แสดงจนครบ 50 แต่หากเท่ากับ หรือเกิน 50 ก็จะไม่มี
- หากต้องการให้แสดงเส้นใน Blank Line เราอาจสร้าง Control แบบ Unbound ที่เหมือนกันซ้อนทับ เช่น Text Box ทับกับ Text Box ข้อมูล แล้วเซ็ท Property เช่น Format > Back Style: Transparent, Format > Border Style: Solid และเซ็ท Position: Bring to Front เป็นต้น
ไม่ทราบพอเข้าใจแค่ไหน ผมพยามอธิบายแล้วแต่ก็ได้แค่นี้นะครับ หวังว่าคงพอเข้าใจ และช่วยได้
Other > Name: TotRec
Data > Control Source: =Count(*)
Format > Display When: Screen Only
(หากมีการแบ่ง Group ให้สร้างในพื้นที่ Group Header แทน)
2. ใส่โค๊ดใน Module ที่สร้างขึ้นใหม่:
'----------------------Declarations----------------------
Option Explicit
Global TotCount As Integer
'--------------------------------------------------------
Function PrintLines(R As Report, TotGrp)
TotCount = TotCount + 1
If TotCount = TotGrp Then
R.NextRecord = False
ElseIf TotCount > TotGrp And TotCount < 50 Then ' กำหนดค่า Blank line ต่อหน้า
R.NextRecord = False
Dim CtrX As Control
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
End If
End Function
Function SetCount(R As Report)
TotCount = 0
Dim CtrX As Control
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = True
End If
Next
End Function
3. ที่ Page Header > Event > On Print:
'Private Sub PageHeaderSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
'End Sub
4. ที่ Detail Section > Event > On Print:
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Call PrintLines([Report], [TotRec])
'End Sub
- จากนั้นเมื่อ Print Preview ดู หากเรคคอร์ดทั้งหมดไม่ถึงค่าที่กำหนดคือ 50 ก็จะมี Blank line แสดงจนครบ 50 แต่หากเท่ากับ หรือเกิน 50 ก็จะไม่มี
- หากต้องการให้แสดงเส้นใน Blank Line เราอาจสร้าง Control แบบ Unbound ที่เหมือนกันซ้อนทับ เช่น Text Box ทับกับ Text Box ข้อมูล แล้วเซ็ท Property เช่น Format > Back Style: Transparent, Format > Border Style: Solid และเซ็ท Position: Bring to Front เป็นต้น
ไม่ทราบพอเข้าใจแค่ไหน ผมพยามอธิบายแล้วแต่ก็ได้แค่นี้นะครับ หวังว่าคงพอเข้าใจ และช่วยได้
10 @R14360
ขอขอบพระคุณ อาจารย์TTT อาจารย์ditasilk อาจารย์PichaiTC เป็นอย่างสูงครับ จะลองทำแต่ละแนวทางที่แนะนำมา ได้ผลอย่างไรจะแจ้งให้อาจารย์ทราบครับ
ปล.บอร์ดนี้เป็นบอร์ดที่เปี่ยมล้นด้วยน้ำใจจริง ๆ ขอขอบพระคุณอีกครั้งครับ
ปล.บอร์ดนี้เป็นบอร์ดที่เปี่ยมล้นด้วยน้ำใจจริง ๆ ขอขอบพระคุณอีกครั้งครับ
11 @R14363
ได้ลองแล้วครับของ อาจารย์TTT และ อาจารย์PichaiTC ใช้ได้ตรงความต้องการ ของอาจารย์TTT รู้สึกจะใช้งานง่ายกว่า แต่ของที่ อาจารย์ditasilk แนะนำมา ยังแกะวิธีทำไม่ออก ครับ
12 @R14366
http://access.mvps.org/access/resources/downloads.htm
ลองประยุกต์ตัวอย่าง printline report ดูครับ ร่วมกับ ฟังก์ชั่น mod , if ช่วย เพื่อให้ record หน้าละ 50
ลองประยุกต์ตัวอย่าง printline report ดูครับ ร่วมกับ ฟังก์ชั่น mod , if ช่วย เพื่อให้ record หน้าละ 50
13 @R15973
รบกวน อาจารย์ TTT อีกครั้งครับ
1.ถ้ามันเกิน 50 รายการ หน้าต่อไป ให้มันมี มี Blank line ถึง 50 ของทุกหน้าได้ไหมครับ
2. Blank line ผมนั่งดูในสูตรไม่มี มันอยู่ตรงไหนของสูตร หรือ ที่อื่น ครับ
1.ถ้ามันเกิน 50 รายการ หน้าต่อไป ให้มันมี มี Blank line ถึง 50 ของทุกหน้าได้ไหมครับ
2. Blank line ผมนั่งดูในสูตรไม่มี มันอยู่ตรงไหนของสูตร หรือ ที่อื่น ครับ
14 @R15980
1.ถ้ามันเกิน 50 รายการ หน้าต่อไป ให้มันมี มี Blank line ถึง 50 ของทุกหน้าได้ไหมครับ
- หมายถึง ไม่ว่าจะมีกี่รายการ ให้หน้าสุดท้ายมี Blank line จนครบหน้างั้นหรือเปล่า หากใช่ เปลี่ยนคำสั่งจากข้อ 4 จาก
4. ที่ Detail Section > Event > On Print:
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Call PrintLines([Report], [TotRec])
'End Sub
เปลี่ยนเป็น
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
If Me.Page = Me.Pages Then
Call PrintLines([Report], Me.TotRec Mod 50)
Else
Call PrintLines([Report], Me.TotRec)
End If
'End Sub
2. Blank line ผมนั่งดูในสูตรไม่มี มันอยู่ตรงไหนของสูตร
- Blank line คือชื่อเรียกการแสดงบรรทัดเปล่าเฉยๆ ไม่ใช่คำสั่งครับ จริงๆก็เรียกกันไปหลายอย่าง แต่ผมเห็นเค้าเรียกกันแบบนี้ก็เรียกตาม เทคนิคของ Blank line คือการใช้คำสั่ง Report.NextRecord = False ให้ Report หยุดอ่านข้อมูลเรคคอร์ดต่อไป เมื่อตรงกับเงื่อนไขที่ TotCount > TotGrp And TotCount < 50 เมื่อทำลักษณะนี้ Report จะแสดงเรคคอร์ดสุดท้ายที่มันอ่านก่อนถูกคำสั่งหยุด แสดงซ้ำไปเรื่อยๆจนจบหน้า แล้วเราก็ใช้การใช้คำสั่ง Loop เพื่อ Visible = False คอนโทรลทุกตัว ไม่ให้เห็น มันก็จะแสดงเหมือนมีแถวเรคคอร์ด แต่ไม่มีข้อมูล ประมาณนี้ครับ ลองปรับใช้ดู
- หมายถึง ไม่ว่าจะมีกี่รายการ ให้หน้าสุดท้ายมี Blank line จนครบหน้างั้นหรือเปล่า หากใช่ เปลี่ยนคำสั่งจากข้อ 4 จาก
4. ที่ Detail Section > Event > On Print:
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Call PrintLines([Report], [TotRec])
'End Sub
เปลี่ยนเป็น
'Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
If Me.Page = Me.Pages Then
Call PrintLines([Report], Me.TotRec Mod 50)
Else
Call PrintLines([Report], Me.TotRec)
End If
'End Sub
2. Blank line ผมนั่งดูในสูตรไม่มี มันอยู่ตรงไหนของสูตร
- Blank line คือชื่อเรียกการแสดงบรรทัดเปล่าเฉยๆ ไม่ใช่คำสั่งครับ จริงๆก็เรียกกันไปหลายอย่าง แต่ผมเห็นเค้าเรียกกันแบบนี้ก็เรียกตาม เทคนิคของ Blank line คือการใช้คำสั่ง Report.NextRecord = False ให้ Report หยุดอ่านข้อมูลเรคคอร์ดต่อไป เมื่อตรงกับเงื่อนไขที่ TotCount > TotGrp And TotCount < 50 เมื่อทำลักษณะนี้ Report จะแสดงเรคคอร์ดสุดท้ายที่มันอ่านก่อนถูกคำสั่งหยุด แสดงซ้ำไปเรื่อยๆจนจบหน้า แล้วเราก็ใช้การใช้คำสั่ง Loop เพื่อ Visible = False คอนโทรลทุกตัว ไม่ให้เห็น มันก็จะแสดงเหมือนมีแถวเรคคอร์ด แต่ไม่มีข้อมูล ประมาณนี้ครับ ลองปรับใช้ดู
15 @R16037
ใช้ได้ตรงตามความต้องการเลยครับ ขอขอบพระคุณอาจารย์ TTT เป็นอย่างสูงครับ
16 @R16038
คุณทักมาก็ดีแล้วครับ เพราะผมลองตรวจสอบดู โค๊ดมันมีบักครับ เพราะตอนแรกผมไม่ได้คิดเผื่อไว้หากเกิน 1 หน้า ทำให้หากเรคคอร์ดเป็น 49 หรือ 50 จะมีปัญหา และหากมีการแบ่ง Group ก็จะมีปัญหาเช่นกัน
แนะนำแก้ไขฟังก์ชั่นเป็นอย่างนี้ครับ
Function PrintLines(R As Report, TotGrp)
Dim CtrX As Control
TotCount = TotCount + 1
If TotCount = TotGrp Then
R.NextRecord = False
ElseIf TotCount > TotGrp And TotCount < 50 Then
R.NextRecord = False
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
ElseIf TotCount > TotGrp And TotCount = 50 Then
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
End If
End Function
และใน Report ให้ใส่โค๊ดต่างๆใน Event ต่างๆ ดังนี้
- ส่วน Declarations Section
'------------------------------------
Private Last_Page As Long
'------------------------------------
- ส่วน Event ต่างๆ บนรายงาน
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
If Me.TotRec Mod 50 <> 0 Then
If Me.Page = Last_Page Then
Call PrintLines([Report], Me.TotRec Mod 50)
Else
Call PrintLines([Report], Me.TotRec)
End If
End If
End Sub
Private Sub PageFooterSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
End Sub
Private Sub PageHeaderSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
If Me.Page = Last_Page + (-Int(-([TotRec] / 50))) Then
Last_Page = Last_Page + (-Int(-([TotRec] / 50)))
End If
End Sub
ลองปรับใช้ดู จะสามารถใช้ได้ยืดหยุ่นกว่าแบบเดิม คือไม่ว่าเรคคอร์ดจะมีเท่าไหร่ หน้าสุดท้ายไม่สุดบรรทัดก็จะมี Blank Line ขึ้นให้
แนะนำแก้ไขฟังก์ชั่นเป็นอย่างนี้ครับ
Function PrintLines(R As Report, TotGrp)
Dim CtrX As Control
TotCount = TotCount + 1
If TotCount = TotGrp Then
R.NextRecord = False
ElseIf TotCount > TotGrp And TotCount < 50 Then
R.NextRecord = False
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
ElseIf TotCount > TotGrp And TotCount = 50 Then
For Each CtrX In R
If TypeOf CtrX Is TextBox Or TypeOf CtrX Is CheckBox Or TypeOf CtrX Is Label Then
CtrX.Visible = False
End If
Next
End If
End Function
และใน Report ให้ใส่โค๊ดต่างๆใน Event ต่างๆ ดังนี้
- ส่วน Declarations Section
'------------------------------------
Private Last_Page As Long
'------------------------------------
- ส่วน Event ต่างๆ บนรายงาน
Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
If Me.TotRec Mod 50 <> 0 Then
If Me.Page = Last_Page Then
Call PrintLines([Report], Me.TotRec Mod 50)
Else
Call PrintLines([Report], Me.TotRec)
End If
End If
End Sub
Private Sub PageFooterSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
End Sub
Private Sub PageHeaderSection_Print(Cancel As Integer, PrintCount As Integer)
Call SetCount([Report])
If Me.Page = Last_Page + (-Int(-([TotRec] / 50))) Then
Last_Page = Last_Page + (-Int(-([TotRec] / 50)))
End If
End Sub
ลองปรับใช้ดู จะสามารถใช้ได้ยืดหยุ่นกว่าแบบเดิม คือไม่ว่าเรคคอร์ดจะมีเท่าไหร่ หน้าสุดท้ายไม่สุดบรรทัดก็จะมี Blank Line ขึ้นให้
17 @R16042
ขอขอบพระคุณ อาจารย์ TTT เป็นอย่างสูงอีกครั้งครับ
Time: 0.3809s
-ไม่มีทางเกิน หรือ ถ้าเกินก็ไม่สนขึ้นหน้าใหม่เริ่ม 1 ใหม่?