แสดงกระทู้

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 ... 41
1
ผมลองสร้างปุ่มที่ฟอร์ม แล้วมัน Error ครับ หรือผมน่าจะทำอะไรผิดไป ยังไงขอบคุณมากครับ

คุณข้ามขั้นตอนที่ 1 ไปหรือเปล่าครับคือการสร้างคิวรี่แล้วเอา SQL ที่ให้ไว้วางลงไปแล้วเซฟชื่อ Q1

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

3
สมมุติตาราง 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

4
มันขยายไม่ได้แล้วจริงๆครับ ผมปรับ 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

5
B > รับ PIPE 20 M ......

 :shout: :shout: :shout:

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

โค๊ด: [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


7
จากโจทย์ที่บอกมาได้แบบนี้ครับ

แต่ส่วนของดอกเบี้ยไม่ได้เพิ่มให้นะครับ ยังไม่เข้าใจโจทย์

คือไม่ชัวว่าดอกเบี้ยคงที่ทุกงวด (ถ้าใช้ใช้แบบเดิมได้เลย)
ถ้าดอกเบี้ยเปลี่ยนตามยอดเงินต้นที่ลดลง ก็ต้องคำนวนเพิ่มเติมนิดหน่อย


ผมเพิ่มในส่วนการคำนวนเงินต้นคงเหลือให้ด้วยนะครับ
เพราะจากเงื่อนไขของท่านที่ว่างวดสุดท้ายต้องน้อยว่าทุกงวด บางครั้งครบ 36 งวดแล้ว
แต่งวดสุดท้ายยังเหลือเศษอยู่นิดหน่อยด้วย

เช่น ยอด 98,000.00   ส่งงวดละ 2,722.00 งวดสุดท้ายต้องได้ 2,730.00 เพิ่มมา 8 บาทเป็นต้น

โค๊ด: [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
   
    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
       
       If getPayMonth < getPay Then
        getPay = getPayMonth
      Else
        getPay = getPay
      End If
         
    '---------------เพิ่มเรคคอร์ดใหม่--------------
         rs.AddNew
    'ใส่ชื่อฟิลด์ที่ต้องการ และใส่ค่า โดยกำหนด Data Type ให้ถูกต้อง ถ้าเป็น Text ต้องมี "" คล่อม ถ้าเป็นตัวเลขไม่ต้องมี
       rs!รหัส = "001"
       rs!ชื่อสินค้า = "งวดที่ " & i
       rs!วันครบกำหนด = CDate("5/" & getMonth & "/" & getYear)
        If i = 36 Then
        rs!จำนวน = getPayMonth 'ยอดเหลืออีกเท่าไรก็ยกมาได้เลย
        Else
        rs!จำนวน = getPay 
        End If
         '    rs!ดอกเบี้ย = (((55000 * 15) / 100) / 12)
        rs.Update
       
        getMonth = getMonth + 1
        getPayMonth = getPayMonth - getPay
        Next i
        Loop
   
    '-----------------------------------------
    rs.Close: Set rs = Nothing

End Sub

8
พรุ่งนี้มาทำให้ครับ พอทำได้ครับ
พอดีเลิกงานแล้ว

9
อ้างถึง
1. มีดิวกำหนดชำระทุกวันที่5 ถ้าบวก 30 วันที่จะไม่ตรง แต่อยากให้วันที่เป็นวันที่ 5 (หรือวันที่กำหนด) ทุกเดือน
1.อยากกำหนดวันที่กำหนดชำระเอง เช่นวันที่ 5 น่าจะใช้ datepart มาเช็คได้อยู่ครับ
2.แต่จากโค้ดผมไม่เข้าใจการคำนวนว่าคิดจากอะไร

ผมอาจจะแก้ไขการคำนวนให้ใหม่แต่ต้องอธิบายขั้นตอนการคำนวนให้ละเอียด ว่าต้องการแบบไหน

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

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

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

เช่น ชื่อ 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)

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

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

14
ลองดูครับ

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

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

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

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

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