แสดงกระทู้

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 ... 7 8 9 [10] 11 12 13 ... 46
163

ลองดูตัวอย่างนี้นะครับ ไม่รู้จะเวิคไหมนะ
โค๊ดจะแสดงผล ในมุมมอง Print Preview หรือ มุมมองเหมือนพิมพ์นะครับ
โค๊ดจะอยู่ใน Event Report Detail นะครับ

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer) 'ตรง รายละเอียด ถ้าเป็นภาษาอังกฤษให้เปลี่ยนเป็น Detail_Print แทนรายละเอียด
Dim ctl As Control, strText As Variant, strName As String
    Me.ScaleMode = 1
    For Each ctl In Me.Detail.Controls 'ตรง รายละเอียด ถ้าเป็นภาษาอังกฤษให้เปลี่ยนเป็น Me.Detail แทนรายละเอียด
        If ctl.ControlType = acTextBox Then
        If ctl.Name = "CustomerName" Then 'สีแดงคือชื่อ textbox ที่ต้องการปรับขนาดข้อความ
       
        strName = ctl.Name
            If Nz(ctl.Tag, "") = "" Then
                ctl.Tag = ctl.FontSize
            End If
            ctl.FontSize = ctl.Tag
            Me.FontSize = ctl.FontSize
            strText = ctl.Value
           If Len(strText) > 0 Then
            Do Until TextWidth(strText) < ctl.Width
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
            Do Until TextHeight(strText) < ctl.Height - (ctl.Height * 0.26)
                ctl.FontSize = ctl.FontSize - 1
                Me.FontSize = ctl.FontSize
            Loop
        End If
        End If
       End If
    Next ctl

End Sub

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

ถ้าไม่เข้าใจตรงโค้ด AddnewSQL กับ UpdateSQL ให้ดูการกำหนดคิวรี่ที่ผมใส่ไว้ให้ด้วยนะครับ
ทั้ง 2 คิวรี่นั้นคือคิวรี่ที่นำไปใช้เขียนโค๊ด โดยมีการกำหนดเงื่อนไขไว้แล้ว คิวรี่ 2 อันนั้น สามารถลบทิ้งได้
เพราะผมสร้างไว้ให้ดูการกำหนดเงื่อนไขเฉยๆ
โดยเงื่อนไขการอัพเดทผมเช็คจาก Field PersonalName นะครับ ถ้าส่วนนี้ไม่เหมือนกันจะอัพเดทใหม่

ตัวอย่างโค๊ด
โค๊ด: [Select]
Private Sub Command0_Click()
'ตัวอย่างโค้ดการนำเข้าข้อมูลโดยมี Dialog ให้เลือกไฟล์เข้ามา
Dim dlg As FileDialog
Dim sql, Deletesql, AddnewSQL, UpdateSQL As String
Dim DB As DAO.Database
Dim DBaddnew As DAO.Database
Dim DBupdate As DAO.Database

Set DB = CurrentDb
Set DBaddnew = CurrentDb
Set DBupdate = CurrentDb

If MsgBox("คุณต้องการนำเข้าข้อมูลใหม่หรือไม่", vbQuestion + vbYesNo, "ระบบสอบถาม") = vbYes Then
Set dlg = Application.FileDialog(msoFileDialogFilePicker)
With dlg
.Title = "Select the Excel file to import"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel Files", "*.xls*", 1
.Filters.Add "All Files", "*.*", 2

If .Show = -1 Then
StrFileName = .SelectedItems(1)
Deletesql = "DELETE * FROM TempImport;" 'สั่งให้ลบข้อมูลของตารางสำรองให้หมดก่อนเพื่อรอรับข้อมูลนำเข้าใหม่ที่จะเข้ามา
DB.Execute Deletesql
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "TempImport", StrFileName, True 'นำเข้าไปยังตารางชื่อ TempImport
Else
Exit Sub
End If
End With
End If

'โค้ดสำหรับเพิ่มข้อมูลใหม่ที่ไม่เคยมีรหัสบัตรประชาชน
AddnewSQL = "INSERT INTO tblDataMain ( PersonalID, PersonalName ) " _
& "SELECT TempImport.PersonalID, TempImport.PersonalName " _
& "FROM TempImport WHERE (((TempImport.PersonalID) Not In (select personalID from [tblDataMain])));"

'โค้ดสำหรับอัพเดทข้อมูลใน Field PersonalName ที่มีรหัสบัตรประชาชนตรงกัน
UpdateSQL = "UPDATE tblDataMain INNER JOIN TempImport ON tblDataMain.PersonalID = " _
& "TempImport.PersonalID SET tblDataMain.PersonalName = [TempImport].[PersonalName] " _
& "WHERE (((tblDataMain.PersonalName)<>[TempImport].[PersonalName]) AND ((tblDataMain.PersonalID)=[TempImport].[PersonalID]));"

DBaddnew.Execute AddnewSQL
DBupdate.Execute UpdateSQL

MsgBox "อัพเดทจำนวน " & DBupdate.RecordsAffected & vbCrLf & "เพิ่มใหม่จำนวน " & DBaddnew.RecordsAffected, vbInformation, "Myprogram"
End Sub

165
อ้างถึง
อยากได้แบบคลิกแล้วแสดงตัวอย่างก่อนปริ้นซ์
สามารถใช้   
Docmd.OpenReport "ชื่อของรายงาน",acViewPreview

เพื่อแสดงตัวอย่างก่อนปริ้นซ์ได้
อ้างถึง
(โดยไม่ต้องเด้งกล่องมาให้ใส่เลขที่บิลที่จะปริ้นซ์แบบที่เป็นอยู่)
ที่เด้งกล่อง ต้องเข้าไปดูการออกแบบไว้ครับว่าทำไว้แบบไหน
อ้างถึง
ต้นแบบคืออันนี้ค่ะ
ผมกดเข้าไปดาวน์โหลดไม่ได้มันแจ้งเตือนว่าลิ้งไม่ปลอดภัยแนะนำให้แนบไฟล์มาดีกว่าซึ่งในบอร์ดก็มีให้แนบไฟล์ได้ครับ

166
ใช้32 bitจึงได้ ขอบคุณครับ
ถ้าท่านจะใช้ 64Bit ในอนาคต ที่โค๊ดท่านสามารถเพิ่ม
ptrsafe เพิ่มเข้าไปคำสั่งก็จะสามารถทำงานได้ปกติ
จากคำสั่ง
Declare Function

ให้เพิ่มเป็น Declare PtrSafe Function
ประมาณนี้นะครับ
ถ้าท่านจะสลับกันเพื่อให้คำสั่งสามารถใช้ได้กับ Window ทั้ง 64 และ 32
สามารถกำหนดเงื่อนไขประมาณนี้

โค๊ด: [Select]
#if Win64 then
   Declare PtrSafe Function MyFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else 'ส่วนด้านล่างนี้จะใช้ 32Bit ครับ
   Declare Function MyFunc Lib "User32" (ByVal N As Long) As Long
#end if

167
อันนี้ตัวอย่างนะครับ
ถ้าของท่านไม่ได้และไฟล์นั้นสามารถส่งทางข้อความให้ตรวจสอบได้ก็คงง่ายขึ้น

168
ลองใส่โค้ดดูแล้วครับ โค้ดไม่ทำงานครับ
ถ้าท่าน copy code นี้แล้วก็ไปวางแต่ไม่ได้กำหนดให้ปุ่มรับอีเว้นนี้เข้าไปมันก็จะไม่ทำงานครับ

ลองเช็คตามนี้นะครับกดที่ปุ่ม command botton ตรง event กดเข้าไปแล้วก็เลือกทำงานตามอีเว้นที่ใช้โค้ดนะครับกดเข้าไปแล้วก็เอาโค้ดที่ผมให้ไปลงไปวางแล้วลองดูใหม่อีกครั้งนะครับว่าได้หรือเปล่า

เพราะจากที่เช็คไม่น่าจะมีอะไรผิดพลาดครับ

169
เรียนคุณ

อ้างถึง
ยกตัวอย่าง นาย ก เลขบัตรประชาชน 1234567890123 ข้อมูลเก่า  กกกก อัพเดตใหม่เป็น กก77 ประมาณนี้นะคะ
ตารางชั่วคราวเราก็ควรมีไว้เหมือนเดิม เพื่อใช้ตารางนี้ในการตรวจสอบเงือนไขก่อนนำเข้าสู่ตารางหลักครับ

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

ถ้าโอเคกับขั้นตอนที่ผมกล่าวมา เดี่ยวผมปรับโค๊ดให้ใหม่

170
ที่เป็นอยู่คือ คลิปปุ่มปริ้นซ์แล้วมีกล่องเด้งขึ้นมาให้ใส่เลขใบกำกับภาษี
ถ้าอยากได้เป็น คลิกแล้วไปปริ้นซ์เลย ต้องแก้ยังไงคะ

ที่มีกล่องเด้งขึ้นมาให้ใส่เลขใบกำกับภาษีนั้นเพราะมีการกำหนด Criteria ใน recordsource หรืออ้างจะมีการสร้าง Inputbox ไว้
ที่ปุ้มปริ้นนั้น เพื่อให้รายงานที่จะแสดงนั้นแสดงตามเลขใบกำกับภาษี แล้วถึงจะดำเนินการปริ้น

ถ้าอยากคลิ๊กแล้วปริ้นเลยนั้นต้องสอบถามก่อนว่า
เวลาจะปริ้นคือปริ้นข้อมูลตามที่แสดงอยู่บนฟอร์มได้หรือไม่ ?
เช่น กำหนด criteria = textbox เลขใบกำกับภาษี ที่แสดงอยู่บนฟอร์ม



171
ที่ปุ่มปรับโค๊ดเป็นแบบนี้นะครับ
โค๊ด: [Select]
Private Sub Command145_Click()
On Error Resume Next
Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("M1_GIF", dbOpenDynaset)
    rst.MoveFirst
    Do Until rst.EOF
    rst.Edit
    If rst!Rank > 36 Then
    rst!Status = "2"
    ElseIf rst!Rank <= 36 Then
    rst!Status = "1"
    End If
    rst.Update
       rst.MoveNext
    Loop
   Me.Recalc
    rst.Close: Set rst = Nothing
End Sub

172
ผมลองสร้างปุ่มที่ฟอร์ม แล้วมัน Error ครับ หรือผมน่าจะทำอะไรผิดไป ยังไงขอบคุณมากครับ

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

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

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

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

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

 :shout: :shout: :shout:

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

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


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

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

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


ผมเพิ่มในส่วนการคำนวนเงินต้นคงเหลือให้ด้วยนะครับ
เพราะจากเงื่อนไขของท่านที่ว่างวดสุดท้ายต้องน้อยว่าทุกงวด บางครั้งครบ 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

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

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

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

หน้า: 1 ... 7 8 9 [10] 11 12 13 ... 46