แสดงกระทู้

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 5 6 ... 43
33
ถ้าแบบนี้ลองแบบนี้ดูครับว่าได้หรือไม่

โค๊ด: [Select]
IIf([Names] In ("A","B","C","D"),[Qty]+1,IIf([Names] In ("E","F","G"),[Qty]+2,0))

34
คือผมจะเขียนสูตรให้คำนวณนะครับ

เช่น ชื่อ A/B/C/D ให้ +1

E/F/G ให้ +2

ตอนแรกผมใช้iif เอาแต่ พอมันเยอะ ก็ ต้องเพิ่มช่องอีก ซึ่ง มันเยอะ

ลองเปลี่ยนมาใช้ IIf([name] In ("A","B","C","D"),[QTY]+1,IIf([name] In ("E","F","G",),[QTY]+2,[QTY]*0 แล้ว แต่ มันไม่คำวณครับ มันตัดค่าเปลี่ยน 0 หมดเลยครับ

มีทางแก้ไหมครับ
หรือคุณต้องการเช็คว่า ใน Field Name มี อักษร A B C D หรือเปล่าถ้ามีให้ Qty+1  ถ้ามี E F G ให้ Qty+2 ถ้าไม่ใช่อักษรพวกนี้
Qty * 0  คูณทำไมครับ อันนี้แหละสาเหตุที่มันแสดง 0 ทั้งหมด

จากอันเก่าผิด 2 จุดครับคือ มี comma เกินมา และไม่มีวงเล็บปิด
IIf([name] In ("A","B","C","D"),[QTY]+1,IIf([name] In ("E","F","G",),[QTY]+2,[QTY]*0

แก้เป็นแบบนี้ดูครับ
โค๊ด: [Select]
Nz(IIf([Name] In ("A","B","C","D"),[Qty]+1,IIf([Name] In ("E","F","G"),[Qty]+2)),0)

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

สร้าง 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 จากการนำโค๊ดมาปรับใช้กับเคสนี้ครับ

37
ลองดูครับ

38
ห้อง MS Access / : รบกวนสอบถามครับ
« เมื่อ: 24 มี.ค. 64 , 07:54:53 »
ของผมเปิดไฟล์ที่แนบมาทำงานได้ปกติเลยคับ

39
ห้อง MS Access / : รบกวนสอบถามครับ
« เมื่อ: 23 มี.ค. 64 , 16:01:36 »
รบกวนคุณ PNR ด้วยครับ
ผมได้ส่งไฟล์ตัวอย่างมาให้ดูครับ
รบกวนทำให้เป็น ไฟล์ .accdb ได้หรือเปล่าครับ

นามสกุลจริงๆ คงจะเป็น .accde หรือ .MDE มันจะปิดการเข้าไปแก้ไข Code ต่างๆ รวมถึงการออกแบบต่างๆ
วิธีให้ใช้งานได้คือลง MS OFFICE Version 2010 หรือสูงกว่า จะใช้งานได้ครับ

ถ้าจะแปลงจริงๆ ต้องเอาต้นฉบับของตัวโปรแกรมที่เปิดให้สามารถแก้ไขได้มาแปลงครับ

40
ต้องเช็ค ทั้ง 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

41
ห้อง MS Access / : รบกวนสอบถามครับ
« เมื่อ: 23 มี.ค. 64 , 11:48:09 »
ชนิดแฟ้มฐานข้อมูล .mdb ไม่มีการออกแบบตารางที่มี Calculate Field และ Attachment Field

Calculate Field และ Attachment Field จะมีใน ชนิดแฟ้มฐานข้อมูล .accdb
ถ้าจะให้ใช้ได้ต้อง ไปที่ File >> บันทึกและประกาศ >> และเปลี่ยนชนิดแฟ้มฐานข้อมูลเป็น  .accdb

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

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

Private Sub txtDatePick_AfterUpdate()
If Me.txtDatePick < Date() Then
MsgBox "ไม่สามารถเลือกวันที่ย้อนหลังได้", vbCritical, "แจ้งเตือน"
Me.Text0 = Null
End If
End Sub

43


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

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

45
ห้อง 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

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

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

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

47
ถ้าใช่วิธีง่ายๆ มีตัวอย่าง 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) เข้าไปครับ

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

48
เราจะเก็บค่า text box ไว้ในตัวแปรก่อนมีการเปลี่ยนแปลงได้อย่างไร
ลองในเหตุการณ์ before update แล้วไม่ได้ครับ

ให้ประกาศตัวแปรไว้บนสุดของคำสั่งจะทำใน Module ก็ได้ครับ หรือทำใน โค้ดของ Form ก็แล้วแต่
เช่น

Public getstring As String

Private Sub Command0_Click()
getstring = Nz(Me.textboxName)
------คำสั่งอื่นๆที่มี------
End Sub

เมื่อกดคลิ๊กคำสั่ง ของ Command0
ค่าจาก  textboxName จะประกาศเก็บไว้ในตัวแปร getstring ครับ
โดยตัวแปรอยู่บนสุดของคำสั่งอื่นๆ เพื่อให้มีการกำหนดเก็บค่าไว้ในตัวแปรก่อนที่จะทำขั้นตอนการเปลี่ยนแปลงต่อๆไป


หน้า: 1 2 [3] 4 5 6 ... 43