แสดงกระทู้

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]
1
ถ้าต้องการจัดข้อความให้อยู่กึ่งกลางเซลล์ที่รวม ทั้งแนวตั้งและนอนด้วย เท่าที่คิดออกคือไปสั่งออกรายงานใน Excel แต่เขียนโค้ดเยอะทีเดียว ถ้าจะทำใน Access วิธีเท่าที่คิดออก เป็นแค่การหลอกตาเท่านั้น ข้อความในบรรทัดที่ซ้ำจะหายไปตามต้องการ แต่ข้อความจะยังคงอยู่ที่บรรทัดแรกเสมอ ไม่สามารถไปกึ่งกลางเซลล์ที่รวมได้

วิธีการคือ
- การซ่อนข้อความที่ซ้ำ ให้กำหนด Hide Duplicate property ของเท็กซ์บ็อกซ์ที่แสดง "เหตุผลที่ซื้อ" (สมมุติชื่อ txtReason) เป็น Yes แต่ข้อความนี้จะพิมพ์เสมอเมื่อเป็นบรรทัดแรกของหน้า
- การพิมพ์ขอบของเซลล์ที่รวม เราจะสร้างคอนโทรลของเส้น แทนการใช้กรอบของเท็กซ์บ็อกซ์ ดังนั้น Border Style ของ txtReason กำหนดให้เป็น Transparent ไป ให้สร้างเส้นแนวนอน lineUpper อยู่ที่ขอบบนของ txtReason และให้มีความยาวเท่ากันพอดี  เส้น lineLower วางอยู่ขอบล่าง  เส้น lineRight เป็นแนวตั้งวางอยู่ขอบขวา ส่วนขอบซ้ายคงไม่จำเป็นเพราะเท็กซ์บ็อกซ์ทางซ้ายจะพิมพ์เส้นนั้นอยู่แล้ว   เส้นทั้ง 3 ต้องจัดเลเยอร์ให้อยู่เหนือ txtReason ด้วยนะครับ
- lineUpper จะพิมพ์เมื่อ txtReason พิมพ์ (ซึ่งก็คือบรรทัดแรกของกลุ่มข้อความที่ซ้ำ) โดยเช็คได้จาก .IsVisible property
- lineLower จะพิมพ์เมื่อเป็นบรรทัดสุดท้ายในหน้า ซึ่งต้องใช้เทคนิคให้ระบบรันรายงาน 2 หน (ไม่ใช่เราสั่งพิมพ์ 2 หน) หนแรกเช็คได้จากค่า .Pages property ของ Report object จะเป็นศูนย์ เราใช้หนแรกเพื่อบันทึกว่าบรรทัดไหนเป็นบรรทัดสุดท้ายในแต่ละหน้า โดยบันทึกลงในตัวแปรอะเรย์ A  ค่าของ A(เลขที่บรรทัด) จะเป็น TRUE   ส่วนหนที่สองเพื่อตรวจกับ A ว่า ถ้าบรรทัดที่พิมพ์คือบรรทัดสุดท้ายในหน้านั้น ก็ให้พิมพ์ lineLower
- การบังคับให้ระบบรันรายงาน 2 หน ทำด้วยการสร้างเท็กซ์บ็อกซ์ที่มี Control Source เป็น =[Pages]  เอาไว้ใน Page Header section แต่เราไม่ได้ต้องการจะเห็นมัน เราก็กำหนด Visible property ของเท็กซ์บ็อกซ์ให้เป็น No 
- การที่จะรู้ว่าบรรทัดที่พิมพ์เป็นบรรทัดที่เท่าไหร่ ก็ให้สร้างเท็กซ์บ็อกซ์ txtSeq ที่มี Constrol Source เป็น =1, Running Sum property เป็น Over All และ Visible property เป็น No

อธิบายยืดยาว แต่โค้ดมีสั้นๆแค่
โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim A() As Boolean

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
    Me.lineUpper.Visible = Me.txtReason.IsVisible
    If Me.Pages <> 0 Then Me.lineLower.Visible = A(Me.txtSeq)
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        ReDim Preserve A(Me.txtSeq)
        A(Me.txtSeq) = True
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

2
เพิ่มเป็นแบบนี้ครับ
โค๊ด: [Select]
Private Sub Combo0_AfterUpdate()
If Me.Combo0 = "1" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = False
Me.Text3 = "0"
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
ElseIf Me.Combo0 = "2" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = False
Me.Text3 = "0"
Me.Text4.Locked = False
Me.Text4 = "0"
Me.Text5.Locked = False
Me.Text5 = "0"
Me.Text6.Locked = False
Me.Text6 = "0"
ElseIf Me.Combo0 = "3" Then
Me.Text1.Locked = False
Me.Text1 = "0"
Me.Text2.Locked = False
Me.Text2 = "0"
Me.Text3.Locked = True
Me.Text3 = Null
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
Else
Me.Text1.Locked = True
Me.Text1 = Null
Me.Text2.Locked = True
Me.Text2 = Null
Me.Text3.Locked = True
Me.Text3 = Null
Me.Text4.Locked = True
Me.Text4 = Null
Me.Text5.Locked = True
Me.Text5 = Null
Me.Text6.Locked = True
Me.Text6 = Null
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

3
ผมมีช่องให้กรอกทั้งหมด 6 ช่อง แต่เมื่อผมใส่ค่าประเภทเป็น 1 ให้เปิดช่องสำหรับกรอกค่าแค่ 3 ช่องจาก6ช่อง อีก3 ช่องให่ประติเสธการใส่ค่า

แล้วพอ ผมใส่ค่าประเภทเป็น 2 ให้เปิดช่องสำหรับใส่ค่าทั้งหมด6 ช่อง
พอ ผมใส่ค่าประเภทเป็น 3 ให้เปิดช่องสำหรับใส่ค่าทั้งหมด2 ช่อง



พอมีวิธีทำไหมครับ

ใช้ Locked มาช่วยก็ได้ครับเช่น
โค๊ด: [Select]
Private Sub Combo0_AfterUpdate()
If Me.Combo0 = "1" Then
Me.Text1.Locked = False
Me.Text2.Locked = False
Me.Text3.Locked = False
Me.Text4.Locked = True
Me.Text5.Locked = True
Me.Text6.Locked = True
ElseIf Me.Combo0 = "2" Then
Me.Text1.Locked = False
Me.Text2.Locked = False
Me.Text3.Locked = False
Me.Text4.Locked = False
Me.Text5.Locked = False
Me.Text6.Locked = False
ElseIf Me.Combo0 = "3" Then
Me.Text1.Locked = False
Me.Text2.Locked = False
Me.Text3.Locked = True
Me.Text4.Locked = True
Me.Text5.Locked = True
Me.Text6.Locked = True
End If
End Sub

มี textbox 6 ตัว และ combobox 1 ตัว

combobox ชื่อ Combo0
มี textbox ชื่อ text1 ถึง 6

หรือใช้การซ่อน textbox ก็ได้เช่น
โค๊ด: [Select]
Private Sub Combo0_AfterUpdate()
If Me.Combo0 = "1" Then
Me.Text1.Visible = True
Me.Text2.Visible = True
Me.Text3.Visible = True
Me.Text4.Visible = False
Me.Text5.Visible = False
Me.Text6.Visible = False
ElseIf Me.Combo0 = "2" Then
Me.Text1.Visible = True
Me.Text2.Visible = True
Me.Text3.Visible = True
Me.Text4.Visible = True
Me.Text5.Visible = True
Me.Text6.Visible = True
ElseIf Me.Combo0 = "3" Then
Me.Text1.Visible = True
Me.Text2.Visible = True
Me.Text3.Visible = False
Me.Text4.Visible = False
Me.Text5.Visible = False
Me.Text6.Visible = False
Else
Me.Text1.Visible = False
Me.Text2.Visible = False
Me.Text3.Visible = False
Me.Text4.Visible = False
Me.Text5.Visible = False
Me.Text6.Visible = False
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

4
แนะนำฟ้อนต่างประเทศที่เป็นสากล ดีกว่าครับเช่น Arial , Tahoma , Calibri , Verdana , Lucida , sans serif เป็นต้น
ผมก็เคยใช้ฟ้อนไทย เจอปัญหาพวกนี้ตลอด ปัจจุบันเลยใช้ฟ้อนตามข้างบนแทนครับ มันเป็นฟ้อนที่ติดมากับวินโดร์ไม่ต้องลงเพิ่ม
เพราะบางเครื่องก็ไม่ได้กำหนด Location Thai ไว้ปัญหาก็จะเกิดได้เหมือนกัน
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

5
ผมเขียนแล้วcopyไปเปิดที่อีกเครื่องหนึ่งครับ โดยเครื่องที่ใช้ประจำกับเครื่องที่อาไปลง ใช้ เวอเดียวกัน

แต่ในเครื่องที่เอาไปลง พอกดใช้งานป่มคำสั่ง มันขึ้น ไม่สามารถทำงานeventได้ครับ

แก้ไขยังไงดีครับ :cry:

ไปเปิด Trust Center ครับดูจากกระทู้นี้
https://www.thai-access.com/index.php?topic=375.msg1562#msg1562
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

6
ใช้
DoCmd.RunCommand acCmdSaveRecord
หรือ
Me.Dirty = False
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

7
Private Sub Command0_Click()
DoCmd.SAVE
Me.Requery
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

8
ตัว Control เป็น Unbound หรือ Bound ครับ

อ้างถึง
แบบที่พอจบงานแล้วเคลียคอนโทรลทั้งหมด
เคลียทีเดียวหมด ใช้แบบนี้ดูครับ
ใช้กับ Control ที่ Unbound

โค๊ด: [Select]
Sub ResetForm()   
    On Error GoTo Err_Err
    Dim ctl As Control           
    For Each ctl In Me
        If ctl.ControlType = acComboBox Then  'ถ้าเป็นCombobox ทำให้ว่าง
                ctl = Null       
        End If
        If ctl.ControlType = acTextBox Then   'ถ้าเป็น textbox ทำให้ว่าง
                ctl = Null
        End If
        If ctl.ControlType = acCheckBox Then  'ถ้าเป็น Checkbox ทำให้แสดงเป็น False คือไม่ได้ติ๊กเลือก
                ctl = False
        End If
          Next ctl
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox ("ผิดพลาดตรง Reset Form")
        Resume Exit_err
End Sub

เวลาจะเรียกใช้ ที่ปุ่มเซฟ เมื่อเซฟเสร็จแล้ว
ก็ต่อคำสั่งด้วย
Call ResetForm

อ้างถึง
มีวธีทำให้คิวรีแบบอัปเดททำงานพร้อมกันหมดไหมครับ แบบ ไม่ต้องมากดอัทเดททีล่ะกัน แต่ให้กดทีเดียว ทำงานทุกอันอะครับ
พอจะมีวิธีใหมครับ
สั่งทำงานทีเดียวได้เลยเช่น
DoCmd.SetWarnings False  'ปิดระบบสอบถาม
DoCmd.OpenQuery "Query1"
DoCmd.OpenQuery "Query2"
DoCmd.OpenQuery "Query3"
DoCmd.SetWarnings True  'เมื่อเรียกใช้คิวรี่ทั้ง 3 เสร็จ ก็ให้เปิดระบบสอบถามปกติ

อ้างถึง
แบบที่พอจบงานแล้วเคลียเรคคอททั้งหมด
เคลียเรคคอร์ดทั้งหมด ในตารางใช่หรือไม่ถ้าใช่สามารถใช้คำสั่ง Sql ลบได้เช่น

Dim db As Database
Set db = CurrentDb
db.Execute "DELETE ชื่อตาราง.* FROM ชื่อตาราง;"

อ้างถึง
แบบเลือกให้ลบข้อมูลในเรคคอทที่ต้องการได้

เราสามารถใช้คำสั่งแบบข้างบน โดยกำหนดลบจาก ID เช่น

    Dim strSQL as string
    DoCmd.SetWarnings False
    strSQL = "Delete * From [student] WHERE [Student ID]='007'"
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True

คำสั่งนี้ก็จะลบเรคคอร์ดจากตาราง Student โดยจะลบเรคคอร์ดที่ Student ID = 007 ออกไป
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

9
ก็ยังยืนยันให้รวมตารางอยู่ดีครับ
เราสามารถใช้ฟิลด์ SD-Type เป็นตัวกำหนดสูตรคำนวณได้

โดยใช้ IIF

เช่น IIF(SD-Type = SD-01,สูตรของ SD-01,สูตรของ SD-02)
ค่าที่ได้จากการคำนวณก็จะมาอยู่ในตารางเดียวกันแล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

10
ทำไมต้องแยก SD-01 กับ SD-02 ด้วยครับ ในเมื่อ Data Structure เหมือนกัน น่าจะรวมเป็นตารางเดียวกัน แล้วเพื่อฟิลด์ SD-Type เพื่อแบ่งข้อมูลเป็น SD-01 หรือ SD-02 จะทำให้จัดการได้ง่ายกว่าครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

หน้า: [1]