แสดงกระทู้

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

หน้า: 1 [2] 3 4 5
19
ไปตั้งค่า Trust Center ครับ
https://www.thai-access.com/index.php?topic=375.0
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

20
ขอบคุณมากครับอาจารย์
ผมลอง Run แล้วมันติดว่า การกระทำหรือเหตุการณ์ถูกบล็อกโดยปิดโหมดการใช้งาน

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

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

สร้าง 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 จากการนำโค๊ดมาปรับใช้กับเคสนี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

22
ห้อง MS Access / : Combo box Date picker
« เมื่อ: 03 ก.ค. 63 , 22:37:11 »
ผมได้ทำฟอร์มตัวอย่างแสดงการเลือก Date Picker ตามลักษณะที่ต้องการ โดยมีการตรวจสอบความถูกต้องของวันที่ระหว่างการเลือก แต่ผมไม่การันตีว่าจะตรวจสอบได้ถูกต้อง 100% หรือมีที่ผิดพลาดที่ไหนหรือไม่นะครับ ลองดูรายละเอียดการทำงานใน comment ภายในโค้ดที่ผมได้เขียนอธิบายไว้แล้วครับ

แก้บัก : ใน Private Sub cbMonth_AfterUpdate() บรรทัดต่อจาก Case 2 ให้แก้เป็น If Me.cbDay >= 29 Then
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

23
แสดงเลขคู่ ให้ใช้เงื่อนไขต่อท้ายในใน SQL เป็น WHERE (student.ordinal mod 2 = 0)    และเปลี่ยนเป็น mod 2 = 1 สำหรับเลขคี่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

24
ใช้วิธีการซ่อน Control ต่างๆ ที่อยู่ในแต่ละ Area ของฟอร์มดูนะครับ  วิธีง่ายๆ ตามด้านล่างนี้ครับ
==================================================
เพิ่มปุ่ม Command เข้าไปในฟอร์ม 4 ปุ่ม
Name:    cmdShowAll  |  cmdShowA1 | cmdShowA2   |  cmdShowA3
Caption:  [Show All]    |   [Show #1]  |  [Show #2]    |   [Show #3]

และที่ Control แต่ตัว เฉพาะใน Area 1, 2 และ 3 ให้ระบายรวบ ทุกๆ Control ใน Area นั้นๆ
     แล้วเปลี่ยน Properties ที่ชื่อว่า tag เป็นตัวเลข 1, 2 และ 3 ตามแต่ละ Area
     ส่วน Control อื่นๆ ที่ต้องพิมพ์ทุกๆครั้ง ไม่ต้องระบุครับ
เมื่อคลิกปุ่มหนึ่งปุ่มใดใน 4 ปุ่ม นี้ จะทำการซ่อน/แสดง Control ตาม Area
หลังจากที่ซ่อนแล้ว สามารถสั่งพิมพ์ฟอร์มได้ต่างต้องการครับ
----------------------------------------------------------------------------------------

Option Compare Database
Option Explicit


Sub ShowForm(Optional ShowArea As Byte = 0)
   'ซ่อน/แสดง Control
   Dim ctl As Control
   Dim ShowMe As Boolean
   
   'ShowArea = 0 is Show All
   
   'ย้ายโฟกัสมาที่ Control ตัวอื่นก่อน กัน Error ขณะซ่อน Control ที่โฟกัสอยู่
   txtDATE.Tag = ""
   txtDATE.SetFocus
   'วนซ่อน Control
   For Each ctl In Me.Controls
        If ShowArea = 0 Or ctl.Tag = "" Or ctl.Tag = ShowArea Then
           'Show All | Show for No Tag | Show for Matching Area
           ctl.Visible = True
        Else
           ctl.Visible = Fase
        End If
       
   Next ctl
   
   'ซ่อนปุ่มคำสั่ง Show ต่างๆ
   cmdShowAll.Visible = False
   cmdShowA1.Visible = False
   cmdShowA2.Visible = False
   cmdShowA3.Visible = False
   '4 ปุ่มนี้ แสดงเมื่อ Form_load หรือ Detail_DblClick
End Sub

Private Sub cmdShowAll_Click()
   ShowForm
End Sub

Private Sub cmdShowA1_Click()
  Call ShowForm(1)
End Sub

Private Sub cmdShowA2_Click()
  Call ShowForm(2)
End Sub

Private Sub cmdShowA3_Click()
  Call ShowForm(3)
End Sub


Private Sub Detail_DblClick(Cancel As Integer)
   'คลิกๆ ที่ว่าง (Form Detail) เพื่อแสดงปุ่มที่ซ่อนไป
   cmdShowAll.Visible = True
   cmdShowA1.Visible = True
   cmdShowA2.Visible = True
   cmdShowA3.Visible = True
End Sub

----------------------------------------------------------------------------------------


ลองปรับใช้ดูนะครับ
ูู๋^J^
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

25
ห้อง MS Access / : ส่ง line notify ไม่ได้ครับ
« เมื่อ: 30 พ.ค. 63 , 16:21:37 »
ได้แล้วครับ
ลบ MsgBox winHttpReq.responsetext ออก
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

26
ตัวอย่างครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

27
คงต้องประยุกต์ใช้หน่อยละ เพื่อไม่ให้เป็นการลำบาก อ.
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

28
ใช้ Function Replace ช่วยครับ

Private Sub TextboxName_AfterUpdate()
Dim strWord As String
If Not IsNull(Me.TextboxName) Then
strWord = Me.TextboxName
Me.TextboxName1 = Replace(Replace(Replace(strWord, "*", ""), "/", ""), "?", "")
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

29
SQL ของ Access มีแต่เอาข้อมูลจากฐานข้อมูลที่เรากำลังเปิด ไปใส่เพิ่มเข้าไปในฐานข้อมูลอื่น แต่ในกรณีนี้ตรงกันข้ามกัน สิ่งที่ทำได้ก็คือ

1. สร้างลิงค์เทเบิล student จาก "D:\รับสมัครนักเรียน ม.3.accdb" มายังฐานข้อมูลปัจจุบัน โดยสร้างเป็นลิงค์เทเบิลชื่ออื่นแทน สมมุติสร้างเป็นชื่อ Temp
docmd.TransferDatabase acLink,"Microsoft Access" , "D:\รับสมัครนักเรียน ม.3.accdb",acTable,"student","Temp"

2. สั่งเลือกข้อมูลทั้งหมดจาก Temp นำมาใส่เทเบิล student
currentdb.Execute "insert into student select * from Temp", dbfailonerror

3. ลบลิงค์เทเบิล Temp
docmd.DeleteObject acTable, "Temp"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

30
สมมุติฟิลด์เลขลำดับที่ชื่อ R และมี data type เป็น Integer หรือ Long นะครับ

SQL = "update M4_sobgen_sci T0 set R = dcount('*', 'M4_sobgen_sci', 'room_sob = ''' & T0.room_sob & ''' and number_sob < ''' & T0.number_sob & '''')"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

31
ลองใหม่ครับ อันนี้สำหรับทั้ง room_sob และ number_sob มี data type เป็น Text ทั้งคู่ครับ

โค๊ด: [Select]
SQL = "update M4_sobgen_sci T0 set room_sob = cstr(int(dcount('*', 'M4_sobgen_sci', 'number_sob < ''' & T0.number_sob & '''')/40)+1)"

ให้ก็อปปี้ไปเลยนะครับ ไม่งั้นเดี๋ยวจะสับสน เพราะ '' ภายในไม่ใช่ double quote เหมือนที่ให้ไปก่อนหน้า แต่เป็น single quote ครับ  ส่วน " ครอบหน้าและหลัง ยังเป็น double quote
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

32
ถ้า data type ของฟิลด์ห้องสอบเป็น Text ให้เปลี่ยนเป็น

SQL = "update T as T0 set room_sob = cstr(int(dcount(""*"", ""T"", ""number_sob < "" & T0.number_sob)/40)+1)"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

33
สมมุติเทเบิลชื่อ T และ data type ของฟิลด์ห้องสอบเป็น Numeric

Dim SQL as String

SQL = "update T as T0 set room_sob = int(dcount(""*"", ""T"", ""number_sob < "" & T0.number_sob)/40)+1"
CurrentDB.Execute SQL, dbFailOnError
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

34
ห้อง MS Access / : คำสั่ง Answer เกิด error
« เมื่อ: 15 มี.ค. 63 , 08:22:34 »
เพิ่มเป็น

Private Sub Command166_Click()
            On Error Resume Next
            Dim strSQL,Answer As String
            Answer = MsgBox("คุณแน่ใจเหรอว่าต้องการลบตารางคนมามอบตัวทิ้ง" & vbCrLf & "ตรวจสอบให้แน่ใจ เอาคืนไม่ได้" & vbCrLf & "กด yes = ยืนยันการลบ" & vbCrLf & "กด No = ยกเลิกการลบ", vbYesNo + vbDefaultButton2, "!!!!ลบตารางคนมามอบตัว!!!!")
            If Answer = vbYes Then

            DoCmd.SetWarnings False
            strSQL = "Delete * from m1_Total_student;"
            DoCmd.RunSQL strSQL
 
            MsgBox "คุณได้ลบตารางคนมามอบตัวทิ้งเรียบร้อยแล้ว" & vbCrLf & "กรุณาตรวจสอบข้อมูล", , "ผลการลบตารางคนมามอบตัว"
            DoCmd.Close
            DoCmd.OpenForm "frm_main_menu"
            DoCmd.MoveSize 300, 400, 18500, 11000
            DoCmd.SetWarnings True
            Else
            MsgBox "คุณได้ยกเลิกการลบตารางคนมามอบตัวทิ้ง", , "ยกเลิก"
            End If
End Sub

Error เกิดจาก Answer ยังไม่ได้กำหนดให้เป็นตัวแปร เลยครับ แต่มีการนำมาเรียกใช้แล้ว เลยเกิดปัญหาดังกล่าว
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

35
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

36
ห้อง Ms Access อื่นๆ / MS Access Runtime by อ.TTT
« เมื่อ: 02 ก.พ. 63 , 13:18:13 »
MS Access Runtime ของฟรีมีอยู่จริง? โดย อ.TTT (Access-Creator@youtube)

ฝากกดไลท์ แชร์ และติดตามอาจารย์ในยูทูปด้วยนะครับ :love:
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

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