แสดงกระทู้

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 - PNR

หน้า: [1] 2 3 4 ... 29
1
ห้อง MS Access / : เปิดฟอร์มแล้ว ...
« เมื่อ: 09 เม.ย. 64 , 09:59:27 »
1. เปิดฟอร์มแล้วให้ซ่อนหน้าต่างนำทาง โค้ดอย่างไรครับ
2. เปิดฟอร์มแล้วให้ขอบซ้ายของฟอร์มชิดขอบหน้าต่าง (ตอนนี้หน้าต่างมันอยู่กึ่งกลาง) กำหนดตรงไหนครับ
ข้อ1 ใส่ใน Event Form_Load ก็ได้ครับ

    Private Sub Form_Load()
    DoCmd.ShowToolbar "Ribbon", acToolbarNo  'ซ่อน Ribon ด้านบน
    DoCmd.NavigateTo "acNavigationCategoryObjectType"
    DoCmd.RunCommand acCmdWindowHide  'ซ่อนหน้าต่างนำทาง
    End Sub

ข้อ2
1.ประกาสตัวแปลไว้บนสุดของคำสั่ง
    Public FrmTop  As Long
    Public FrmLeft As Long

2.ที่ Event Form_Activate() ใส่โค๊ดนี้เข้าไป
    Private Sub Form_Activate()
    FrmTop = Forms![ชื่อฟอร์ม].WindowTop
    FrmLeft = Forms![ชื่อฟอร์ม].WindowLeft
    FrmTop = Me.WindowTop
    FrmLeft = Me.WindowLeft
    End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

2
สมมุติตาราง A ชื่อ Mytable
1.สร้างคิวรี่ใส่ SQL เข้าไป ตั้งชื่อ Q1
SELECT Idnumber, LV  FROM MyTable GROUP BY Idnumber, LV HAVING ((Not (LV) Is Null));

2.สร้างปุ่มขึ้นมา 1 ปุ่ม
ใส่โค้ดนี้เข้าไป
Private Sub Command0_Click()
Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Mytable", dbOpenDynaset)
   
    rst.MoveFirst
    Do Until rst.EOF
    If IsNull(rst!LV) Or rst!LV = "" Then
    rst.Edit
    rst!LV = DLookup("LV", "Q1", "Idnumber =" & rst!Idnumber & "")
    rst.Update
    End If
       rst.MoveNext
    Loop
   
    rst.Close: Set rst = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs, nawahovvp

3
มันขยายไม่ได้แล้วจริงๆครับ ผมปรับ width เป็น maximum แล้ว ตอนเปิดฟอร์มจึงแสดงผลได้แค่ครึ่งจอครับ


ที่คุณ UnKnown บอกมาคือไม่ได้กำหนดขนาดฟอร์มใช้ใหญ่เท่าขนาดจอครับ
แต่หมายถึงการกำหนดความละเอียด หรือ pixel ของเครื่องคอมที่จะแสดงบนหน้าจอทีวีมากกว่า
ยิ่งความละเอียดหน้าจอคอมยิ่งมากการแสดงผลที่ จอทีวีก็จะยิ่งใหญ่ขึ้น

และผมลงค้นข้อมูลการกำหนดให้ แสดงผลเต็มหน้าจอ monitor ลองดูจากเว็บไซส์นี้ครับ
มีตัวอย่างโค๊ด และ ไฟล์ access ให้ลองใช้งานและดูการแสดงผลด้วย

https://codedocu.com/Office-365/Access/Basics/vba-Code/Automatically-adjust-Access-forms-to-the-maximum-monitor-size?2505 link
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, chai

4
ถ้าเท่ากันทุกงวดงั้นโค๊ดจะเป็นแบบนี้

โค๊ด: [Select]
Private Sub Command0_Click()
Dim rs As DAO.Recordset
    Dim i As Integer
    Dim getMonth As String
    Dim getYear As String
    Dim getDate As String
    Dim getTotal As Long
    Dim getPay As Long
    Dim getPayMonth As Long
    Dim getLastpay As Long
    Dim getInterest As Long
    Set rs = CurrentDb.OpenRecordset("Table1", dbOpenDynaset)
    getTotal = 98000   'ส่วนที่จะสร้าง textbox ระบุยอดเงิน
    getDate = "5"     'ส่วนที่จะสร้าง textbox กำหนดวันที่ชำระ
    getMonth = DatePart("m", Date)
    getYear = DatePart("yyyy", Date)
    getPay = (getTotal) / 36
    getPayMonth = getTotal
    Do Until i > 36
    For i = 1 To 36
       getMonth = getMonth
       If getMonth > 12 Then
       getYear = getYear + 1
       getMonth = "1"
       Else
       getYear = getYear
       End If
           '---------------เพิ่มเรคคอร์ดใหม่--------------
         rs.AddNew
    'ใส่ชื่อฟิลด์ที่ต้องการ และใส่ค่า โดยกำหนด Data Type ให้ถูกต้อง ถ้าเป็น Text ต้องมี "" คล่อม ถ้าเป็นตัวเลขไม่ต้องมี
       rs!รหัส = "001"
       rs!ชื่อสินค้า = "งวดที่ " & i
       rs!วันครบกำหนด = CDate(getDate & "/" & getMonth & "/" & getYear)
        If i = 36 Then
        rs!จำนวน = getPayMonth
        Else
        rs!จำนวน = getPay
        End If
        rs!ดอกเบี้ย = (((getTotal * 15) / 100) / 12)
        rs.Update
        getMonth = getMonth + 1
        getPayMonth = getPayMonth - getPay
        Next i
        Loop
    '-----------------------------------------
    rs.Close: Set rs = Nothing

End Sub

โพสต์นี้ได้รับคำขอบคุณจาก: assetthai

5
พรุ่งนี้มาทำให้ครับ พอทำได้ครับ
พอดีเลิกงานแล้ว
โพสต์นี้ได้รับคำขอบคุณจาก: assetthai

6
ถ้าแบบนี้ลองแบบนี้ดูครับว่าได้หรือไม่

โค๊ด: [Select]
IIf([Names] In ("A","B","C","D"),[Qty]+1,IIf([Names] In ("E","F","G"),[Qty]+2,0))
โพสต์นี้ได้รับคำขอบคุณจาก: ชุติพนธ์ มหาทรัพย์

7
ไปตั้งค่า Trust Center ครับ
https://www.thai-access.com/index.php?topic=375.0
โพสต์นี้ได้รับคำขอบคุณจาก: nawahovvp

8
ลองดูตัวอย่างนี้นะครับ

สร้าง Module ใส่โค๊ด
โค๊ด: [Select]
Public Function ConcatRelated(strField As String, _
    strTable As String, _
    Optional strWhere As String, _
    Optional strOrderBy As String, _
    Optional strSeparator = ", ") As Variant
On Error GoTo Err_Handler
 
    Dim rs As DAO.Recordset
    Dim rsMV As DAO.Recordset
    Dim strSql As String
    Dim strOut As String
    Dim lngLen As Long
    Dim bIsMultiValue As Boolean
   
   
    ConcatRelated = Null
   
 
    strSql = "SELECT " & strField & " FROM " & strTable
    If strWhere <> vbNullString Then
        strSql = strSql & " WHERE " & strWhere
    End If
    If strOrderBy <> vbNullString Then
        strSql = strSql & " ORDER BY " & strOrderBy
    End If
    Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)
   
    bIsMultiValue = (rs(0).Type > 100)
   

    Do While Not rs.EOF
        If bIsMultiValue Then
         
            Set rsMV = rs(0).Value
            Do While Not rsMV.EOF
                If Not IsNull(rsMV(0)) Then
                    strOut = strOut & rsMV(0) & strSeparator
                End If
                rsMV.MoveNext
            Loop
            Set rsMV = Nothing
        ElseIf Not IsNull(rs(0)) Then
            strOut = strOut & rs(0) & strSeparator
        End If
        rs.MoveNext
    Loop
    rs.Close
   
 
    lngLen = Len(strOut) - Len(strSeparator)
    If lngLen > 0 Then
        ConcatRelated = Left(strOut, lngLen)
    End If

Exit_Handler:

    Set rsMV = Nothing
    Set rs = Nothing
    Exit Function

Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "ConcatRelated()"
    Resume Exit_Handler
End Function


สร้างคิวรี่แรกเพื่อสร้าง เลขที่เอกสาร(Qty)  ตั้งชื่อ Q1
โค๊ด: [Select]
SELECT t1.IDProduct, t1.Qty, [เลขที่เอกสาร] & "(" & [qty] & ")" AS เลขที่
FROM t1;

สร้างคิวรี่ที่สอง ใส่โค๊ดเพื่อแสดงผลโดยใช้ฟังชั้นจากโค๊ดด้านบน
โค๊ด: [Select]
SELECT Q1.IDProduct, Sum(Q1.Qty) AS ผลรวม, ConcatRelated("เลขที่","Q1","IDProduct = '" & [IDProduct] & "'") AS เลขที่เอกสาร
FROM Q1
GROUP BY Q1.IDProduct, ConcatRelated("เลขที่","Q1","IDProduct = '" & [IDProduct] & "'");

เครดิต allenbrowne จากการนำโค๊ดมาปรับใช้กับเคสนี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: nawahovvp

9
ลองดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

10
ต้องเช็ค ทั้ง 2 textbox และ 2 Field ในครั้งเดียว ตัวอย่างโค้ด

Sub SearchDuplicate()
If Not IsNull(Me.txtCongDiseaseID1) And Not IsNull(Me.txtPersonID) Then
If DLookup("[CongDiseaseID]", "tblCongDiseaseDetails", "CongDiseaseID=" & Me.txtCongDiseaseID1 & "") _
And DLookup("[PersonID]", "tblCongDiseaseDetails", "PersonID='" & Me.txtPersonID & "'") Then
MsgBox "ไม่อนุญาตให้กรอกข้อมูลซ้ำ, กรุณาลองใหม่", vbInformation, "ข้อมูลซ้ำกับข้อมูลเดิม"
End If
End If
End Sub

Private Sub txtCongDiseaseID1_Exit(Cancel As Integer)
Call SearchDuplicate
End Sub

Private Sub txtPersonID_Exit(Cancel As Integer)
Call SearchDuplicate
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

11
ถ้าหากจะใช้การตัดวันที่ ที่ผ่านมาออกไปแสดงเฉพาะวันที่ปัจจุบันเป็นต้นไปยังไม่เคยทำครับ

แต่ถ้าจะใช้การกำหนดเงื่อนไขว่าถ้าเลือกวันที่ๆผ่านมาแล้วให้แจ้งเตือนและให้ระบุใหม่ก็ลองแบบนี้
สมมุติ textbox เลือกวันที่ ชื่อ txtDatePick

Private Sub txtDatePick_AfterUpdate()
If Me.txtDatePick < Date() Then
MsgBox "ไม่สามารถเลือกวันที่ย้อนหลังได้", vbCritical, "แจ้งเตือน"
Me.Text0 = Null
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, pattan0013

12


Private Sub Form_Dirty(Cancel As Integer)
    If Me.Dirty = False Then
        DBEngine.BeginTrans
    End If
End Sub
ตรง Event นี้  If Me.Dirty = False Then เงื่อนไขคือถ้าไม่มีการทำงาน เพิ่มเติมข้อมูลหรือแก้ไขข้อมูลแล้วถึงจะ BeginTrans
แต่การเพิ่มข้อมูลใหม่หรือทำงานบนฟอร์ม ทำให้เงื่อนไขนี้คือ Me.Dirty = true ทำให้ไม่เข้าเกณฑ์การทำงานของเงื่อนไขหรือเปล่า

ทำให้เมื่อเพิ่มข้อมูลใน ซัฟฟอร์มแล้ว CommitTrans ไม่ทำงานครับ

ลองดูรูปแบบที่อาจารย์สันติสุข เคยโพสไว้เพิ่มเติมดูนะครับ
https://www.thai-access.com/topic_post.asp?CategoryID=1&TopicID=4896
โพสต์นี้ได้รับคำขอบคุณจาก: Jiw Jewel

13
ท่านไปจับ Event Before Update ก็ไม่ได้อยู่แล้วครับ
เพราะตัวแปรที่เก็บค่าไว้จะถูกให้รับค่าใหม่ก่อนที่จะได้แสดงผล
ตรงที่ท่านเรียกใช้ NameDocinSu นั้นท่านจะมาใส่ไว้ใน beforupdate ไม่ได้ครับ
ควรจะให้ทำงานที่ event อื่นแล้วค่อยมาเรียกใช้ OldItem ใน BeforeUpdate เอา
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, kitisak

14
ห้อง MS Access / : ตรวจสอบนามสกุลไฟล์
« เมื่อ: 18 มี.ค. 64 , 08:24:22 »
โค๊ด: [Select]
Private Sub Command6_Click()
Dim extensionName As String
extensionName = Dir(Me.txtPath & (Me.txtFileName & "*"))
extensionName = Right$(extensionName, Len(extensionName) - InStrRev(extensionName, "."))
Me.txtExtensionName = extensionName
End Sub

ลองดูตัวอย่างเอานะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

15
ห้อง MS Access / : ตรวจสอบนามสกุลไฟล์
« เมื่อ: 17 มี.ค. 64 , 14:54:11 »
ใน textbox มีแต่ชื่อไฟล์ ไม่มีนามสกุลไฟล์ เราจะตรวจสอบได้อย่างไรครับ

ใน textbox มี path และ ชื่อไฟล์ หรือเปล่าครับ
เพราะถ้าจะระบุชื่อไฟล์แล้วต้องค้นหาไฟล์นั้นมาเพื่อจะดูนามสกุลไฟล์
ที่ต้องระบุตำแหน่งไฟล์เพราะ ไฟล์ในเครื่องทั้งหมดต้องมีชื่อซ้ำกันอยู่แล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

16
ถ้าใช่วิธีง่ายๆ มีตัวอย่าง 2 แบบ
ในการตรวจเช็คก็คือ เช็คว่ามีตัวเลขเหล่านี้ทั้ง 3 ตัวหรือไม่ (เหมือนเช็คว่าใช่ตัวสลับหรือไม่  :shout:)

ถ้าใช้ textbox ในการตรวจสอบ 2 textbox ก็จะใช้โค้ดแบบนี้
สมมุติ textbox ใช้ในการกรอก ชื่อ InputTextbox
textbox ที่แสดงตัวเลขเริ่มต้นไว้ตรวจสอบชื่อ  targetTextbox
โค๊ด: [Select]
Dim InputNum, TargetNum As Long
Dim Num1, Num2, Num3, Num4, Num5, Num6 As Integer
Dim Digit1, Digit2, Digit3 As Long

InputNum = Trim(Me.InputTextbox)
TargetNum = Trim(Me.targetTextbox)
Digit1 = Left(InputNum, 1)
Digit2 = Mid(InputNum, 2, 1)
Digit3 = Right(InputNum, 1)

Num1 = Digit1 & Digit2 & Digit3
Num2 = Digit1 & Digit3 & Digit2
Num3 = Digit3 & Digit2 & Digit1
Num4 = Digit3 & Digit1 & Digit2
Num5 = Digit2 & Digit1 & Digit3
Num6 = Digit2 & Digit3 & Digit1

If Num1 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
ElseIf Num2 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
ElseIf Num3 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
ElseIf Num4 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
ElseIf Num5 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
ElseIf Num6 = TargetNum Then
MsgBox "ท่านถูกรางวัล"
Exit Sub
Else
MsgBox "ท่านไม่ถูกรางวัล้"
End If


ส่วนถ้าจะนำไปใช้กับคิวรี่ให้ทำแบบนี้

1.นำโค้ดนี้ไปวางใน Module
โค๊ด: [Select]
Public Function MyCheck(FieldTarget As Integer, FieldInput As Integer) As String
Dim InputNum, TargetNum As Long
Dim Num1, Num2, Num3, Num4, Num5, Num6 As Integer
Dim Digit1, Digit2, Digit3 As Long
Dim Result As String
InputNum = Trim(FieldInput)
TargetNum = Trim(FieldTarget)
Digit1 = Left(InputNum, 1)
Digit2 = Mid(InputNum, 2, 1)
Digit3 = Right(InputNum, 1)

Num1 = Digit1 & Digit2 & Digit3
Num2 = Digit1 & Digit3 & Digit2
Num3 = Digit3 & Digit2 & Digit1
Num4 = Digit3 & Digit1 & Digit2
Num5 = Digit2 & Digit1 & Digit3
Num6 = Digit2 & Digit3 & Digit1

If Num1 = TargetNum Then
Result = "ท่านถูกรางวัล"

ElseIf Num2 = TargetNum Then
Result = "ท่านถูกรางวัล"

ElseIf Num3 = TargetNum Then
Result = "ท่านถูกรางวัล"

ElseIf Num4 = TargetNum Then
Result = "ท่านถูกรางวัล"

ElseIf Num5 = TargetNum Then
Result = "ท่านถูกรางวัล"

ElseIf Num6 = TargetNum Then
Result = "ท่านถูกรางวัล"
Else
Result = "ท่านไม่ถูกรางวัล"
End If
MyCheck = Result
End Function

2.สมมุติตารางมี Field F1 คือฟิลล์ผลออก
                    Field F2 คือฟิลล์ที่เราระบุ
SQL ก็จะได้แบบนี้
โค๊ด: [Select]
SELECT IIf(Not IsNull([F2]),Mycheck([F1],[F2]),Null) AS ตรวจ, *
FROM Table1;


เวลาเรียกใช้ฟังชั้น ก็ให้ใส่ ตรวจ: IIf(Not IsNull([F2]),Mycheck([F1],[F2]),Null) เข้าไปครับ

พอดีผมไม่ค่อยเข้าใจโจทย์ที่ท่านอธิบาย ถ้าตอบไม่ตรงประเด็นต้องขออภัยด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

หน้า: [1] 2 3 4 ... 29