แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - สันติสุข

หน้า: 1 ... 9 10 11 [12] 13 14 15 ... 29
199
โค้ดตัวอย่างนี้ เป็นการแปะค่าของฟิลด์ต่างๆในบรรทัดที่ต้องการ มาลงเป็นบรรทัดใหม่ในฟอร์ม/ซับฟอร์มเดียวกัน วิธีคือให้สร้าง Command Button เอาไว้ที่ไหนก็ได้สักที่บนบรรทัดของข้อมูล (สมมุติชื่อ btnCopy) เมื่อต้องการก็อปปี้ ก็แค่คลิกที่ปุ่มนี้

Private Sub btnCopy_Click()
    Dim RS As DAO.Recordset
   
    If Me.NewRecord Or Me.Dirty Then Exit Sub ' ถ้าคลิกปุ่มบนบรรทัดของรายการใหม่ หรือ บนบรรทัดที่รายการกำลังแก้ไขอยู่ ก็ไม่ต้องทำอะไร
   
    Set RS = Me.RecordsetClone    ' กำหนดตัวแปรสำหรับอ้างอิงข้อมูลของบรรทัดปัจจุบัน (บรรทัดที่เลือก)
    RS.Bookmark = Me.Bookmark  ' ให้ตัวแปรดังกล่าวชี้ไปเรคอร์ดเดียวกันกับบรรทัดปัจจุบัน
    DoCmd.GoToRecord , , acNewRec   ' กระโดดไปบรรทัดรายการใหม่
    Me("ชื่อคอนโทรลบนฟอร์ม") = RS("ชื่อฟิลด์ของคอนโทรลบนฟอร์ม") ' ต้องการก็อปปี้ฟิลด์อะไรบ้าง ก็เพิ่มบรรทัดตามจำนวนฟิลด์ที่ต้องการต่อลงไปได้เรื่อยๆ
   
    Set RS = Nothing
End Sub

200
Access มี Page Footer section ให้แค่อันเดียว  ไม่มี Page Footer ซ้อนกันหลายๆอัน  ถ้าจะให้แสดงเฉพาะบางส่วนในทุกๆหน้า แทนที่จะซ่อน Page Footer ทั้ง section  ก็ต้องซ่อนเฉพาะบางส่วนใน section แทน คือ กำหนด .Visible ให้เท็กซ์บ็อกซ์, ลาเบล ฯลฯ ให้เป็น = True หรือ False ไปทีละตัว

แต่กรณีมีหลายๆเท็กซ์บ็อกซ์, ลาเบล ที่จะต้องซ่อน เหมือนอย่างกรณีนี้ เราอาจใช้การสร้างกล่องสี่เหลี่ยมสีขาวทึบ และจัดให้มันอยู่ชั้นบนสุด โดยทับส่วนข้อความที่จะซ่อนเอาไว้ เช่นตัวอย่างในรูป เราสร้าง Box1 และ Box2 (ของจริงต้องสีขาวทึบ ไม่ใช่สีเหลืองโปร่งแสง)  เมื่อต้องการซ่อนข้อความต่างๆ เราก็ให้แสดง Box1, Box2   ถ้าต้องการแสดงข้อความ ก็กลับเป็นให้ซ่อน Box1, Box2 ไปแทน


ส่วนโค้ดก็เปลี่ยนเป็น

Option Compare Database
Option Explicit

Dim ShowPageFooter As Boolean

Private Sub GroupFooter1_Format(Cancel As Integer, FormatCount As Integer)
    ShowPageFooter = True
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    Me.Box1.Visible = Not ShowPageFooter
    Me.Box2.Visible = Not ShowPageFooter
End Sub

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
    ShowPageFooter = False
End Sub

อย่าลืมไปเปลี่ยน Box1, Box2 เป็นชื่อที่คุณสร้างบนรายงานด้วย และถ้ามีกี่ Box ก็เขียนโค้ดซ้ำๆกันไปเท่านั้นบรรทัด

201
ลบส่วนที่ผมตีกรอบเอาไว้

202
ตามรูป เมื่อคลิกไปโค้ดที่บอกแล้ว ที่ Title ตามตำแหน่งที่ลูกศรชี้ จะต้องเป็น Report_ชื่อรายงานของคุณ
ส่วนชื่อของ Group จะดูตามตำแหน่งที่วงกลมไว้ เช็คดูว่าถูกต้องหรือไม่


203
โมดูลของรายงานตัวนี้นะครับ ไม่ใช่โมดูลแยกต่างหาก และบรรทัด Private Sub GroupFooter1_Format(Cancel As Integer, FormatCount As Integer)  เปลี่ยนชื่อ GroupFooter1 ไปเป็นชื่อกรุ๊ปของคุณหรือยัง

204
1. ให้สร้าง Group ในรายงานโดยกลุ่มตามหมายเลข IV  ให้มีแต่ Group Footer section สมมุติชื่อ GroupFooter1  ไม่ต้องมี Group Header   ให้ความสูงเป็น 0 ก็ได้   กำหนดให้ Force New Page property เป็น After Section   ตัว Group section จะครอบ Detail section เอาไว้โดยอัตโนมัติ

2. ใส่โค้ดต่อไปนี้ลงไป
โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim ShowPageFooter As Boolean

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
    ShowPageFooter = False
    Me.Section("PageFooterSection").Visible = True
End Sub

Private Sub GroupFooter1_Format(Cancel As Integer, FormatCount As Integer)
    ShowPageFooter = True
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    If Not ShowPageFooter Then Me.Section("PageFooterSection").Visible = False
End Sub

205
ไม่เข้าใจครับ บิลใบที่ 1 และ 2 เหมือนกัน ?  หมายถึงบิลเลขเดียวกัน แต่มีจำนวนเกิน 1 หน้า แล้วจะให้แสดง Page Footer เฉพาะหน้าสุดท้าย หรือว่ายังไง ?

206
ควรเป็นอย่างนั้นครับ

207
- Report Header/Footer section จะพิมพ์ครั้งเดียวเป็นเหมือนใบแปะหน้าแรกและหน้าสุดท้ายของรายงาน
- Page Header/Footer section จะพิมพ์ทุกๆหน้า ยกเว้นเรากำหนด Property หรือเขียนโค้ดควบคุมเพื่อซ่อนไว้ ไม่ให้พิมพ์
- Group Header/Footer section จะพิมพ์เมื่อข้อมูลที่ใช้ในการกำหนดกลุ่ม เปลี่ยนแปลงไป พิมพ์เมื่อเริ่มต้นกลุ่มใหม่และสิ้นสุดกลุ่มเดิม ยกเว้นเรากำหนด Property หรือเขียนโค้ดควบคุมเพื่อซ่อนไว้ ไม่ให้พิมพ์

ดังนั้นหัวกระดาษจึงไม่ควรอยู่ที่ Report section แต่ควรอยู่ที่ Page section มากกว่าครับ แต่ถ้าเกิดว่า 1 IV มีรายการเกิน 1 หน้า และอยากให้มีหัวกระดาษเฉพาะใบแรกของแต่ละ IV ก็เปลี่ยนจากที่ไว้ใน Page section มาเป็น Group section ที่รวมกลุ่มตามเลข IV และกำหนด Force New Page property เป็น Before Section แทนก็ได้ครับ

208

Public Function RowNum(frm As Form) As Variant
        ...
        ...
        ...

เพิ่งรู้ว่าการอ้าง Form property ผ่านฟังก์ชั่นบน Continuous Form จะทำให้อ้างถึงเรคอร์ดเฉพาะของบรรทัดนั้นๆบนฟอร์ม แทนที่จะเป็นเรคอร์ดปัจจุบันบนฟอร์มเพียงเรคอร์ดเดียว

209
ค่า Default Value เป็นแค่การแสดงลงหน้าฟอร์มสำหรับเรคอร์ดใหม่ ไม่ได้ถือเป็นการป้อนเข้าไปในฟิลด์ที่สัมพันธ์กับคอนโทรลนั้นๆ ยกเว้นมีการทำอะไร เช่น ป้อน/แก้ไขตัวอักษรอะไรในคอนโทรลของฟิลด์จากเทเบิลอย่างที่คุณได้ค้นพบ ถึงจะเหมือนมีการป้อนค่า Default Value จริงๆ แต่ปกติไม่น่าจะเกิดปัญหานี้ เป็นไปได้หรือที่ระบบจะมีเรคอร์ดใหม่ซ้ำกันทุกฟิลด์กับเรคอร์ดเก่า เพราะใช้แต่ค่าจาก Default Value เพียงอย่างเดียว

210
จะสร้างปุ่มขึ้นมาแล้วใส่โค้ดไว้ใน OnClick event หรือจะดักจับ keyboard shortcut โดยใส่ไว้ใน KeyUp ของฟอร์มตามที่คุณเคยถามก็ได้ https://www.thai-access.com/index.php?topic=735.0

211
ผมไม่เชี่ยวชาญและไม่เคยใช้คิวรี่ของ Excel   แต่เชื่อว่านำมาใช้ตรงๆไม่ได้ครับ ไม่เคยเห็น syntax แบบนี้ใน Access มาก่อนเลย  คงต้องแปลงมาเป็น SQL ที่เขียนบน Access ใหม่ครับ

212
ผมคิดว่าก็แค่ลิงค์ Excel เข้ามาเป็นเทเบิลใน Access เท่านี้เอง ส่วนการคิวรี่ก็เขียนใน Query และ/หรือ VBA Code ร่วมด้วย(ถ้าจำเป็น)  วิธีลิงค์ดูในคลิปตั้งแต่ 5:50 ถึง 8:00

213
ถ้า U เป็นชื่อตัวแปรที่เก็บ ID ของผู้ใช้ ก็เพียงใส่โค้ดนี้ไว้ที่ OnClick event procedure ของปุ่มกลับหน้า Home

If U = "ID ของ Admin" Then
   DoCmd.OpenForm "ชื่อฟอร์ม Home ของ Admin"
Else
   DoCmd.OpenForm "ชื่อฟอร์ม Home ของผู้ใช้ทั่วๆไป"
End If

214
คงต้องใส่โค้ดไว้ใน Form_Activate event ของทุกฟอร์มแล้วครับ แล้วถ้าจะป้องกันอีกชั้น ก็ใส่เงื่อนไขตรวจสอบปีไว้ใน Validation Rule ของฟิลด์วันที่ในเทเบิลไปด้วยว่าปีต้องอยู่ในช่วงที่เป็นไปได้ เช่น 2010-2050 ก็เขียนเป็น Year([ชื่อฟิลด์]) between 2010 and 2050 ส่วน Validation Text ก็ใส่ข้อความที่จะแสดงเมื่อไม่เป็นไปตาม Rule ที่ว่านี้

หมายเหตุ : ฟังก์ชั่น Year( ) จะให้ค่าเป็นปี ค.ศ. เสมอ แม้ปฏิทินจะกำหนดเป็น พ.ศ.

215
Ctrl-' ใช้สำหรับเรคอร์ดในฟอร์มที่อยู่บรรทัดก่อนหน้า  ซับฟอร์มถือว่าเป็นฟอร์มต่างหากอีกฟอร์ม ดังนั้นจึงไม่สามารถก็อปปี้ฟิลด์จากเรคอร์ดของซับฟอร์มภายใต้เรคอร์ดก่อนหน้าของเมนฟอร์มได้ครับ วิธีแก้ทางเดียวคือต้องเขียนโค้ดเพื่อก็อปปี้ครับ

216
ถ้าผิดยังไงก็ขอโทษด้วย เพรายังไม่เคยใช้ Office 64  แต่เท่าที่อ่านความหมายของ VBA7, ประเภทข้อมูล LongLong, LongPtr และ PtrSafe Keyword https://codekabinett.com/rdumps.php?Lang=2&targetDoc=windows-api-declaration-vba-64-bit ถ้า Office 32 bit นั้นเป็นเวอร์ชั่นตั้งแต่ 2010 ขึ้นไป เชื่อว่าไม่น่าจะรันได้ครับ เพราะ Compiler Directive VBA7 จะเป็นจริงตั้งแต่ Access 2010 ดังนั้นโค้ดจะรันแล้วเจอะข้อมูลประเภท LongLong ที่มีเฉพาะในเวอร์ชั่น 64 bit เท่านั้น ส่วนต้องโค้ดยังไงถึงจะถูก อันนี้ผมไม่รู้ ต้องคนที่ดู API เป็นครับ

แต่ถ้า Office 32 bit นั้นเป็นเวอร์ชั่นตำกว่า 2010 น่าจะแน่นอนว่าโค้ดนี้จะรันได้

แต่ Compiler Directive มีผลเฉพาะตอนที่ยังเป็นไฟล์ .accdb  ถ้าคอมไพล์เป็นไฟล์ .accde แล้ว  คอมไพล์ด้วย Office กี่ bit ก็ต้องไปใช้ที่เครื่อง Office แค่นั้น bit เท่านั้นครับ


หน้า: 1 ... 9 10 11 [12] 13 14 15 ... 29