แสดงกระทู้

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

หน้า: 1 2 [3] 4 5 6 7
37
มีตาราง A และตาราง ฺB เหมือนกัน แต่ตาราง B ขาดรายการบิลที่ป้อนในเดือนมีนาคม 63(date_sale) ทั้งเดือน เราจะใช้ query แบบ append ได้ไหมครับ และ criteria จะระบุช่วงเดือนอย่างไร?

ใช้Append ได้ครับแต่เงื่อนไขก็คือ ที่ Field date_sale ของตาราง A
โดยใช้การระบุช่วงเดือนโดยใช้ Between

สมมุติชื่อฟอร์ม ชื่อ FormName
มี textbox 2 ตัวชื่อ DateStart และ DateEnd เพื่อใช้ในการระบุวันที่เริ่มต้น และวันที่สิ้นสุด

สร้างปุ่มขึ้นมา 1 ปุ่ม ใส่โค้ดนี้เข้าไป

Dim strSQL As String
strSQL = "INSERT INTO TableB SELECT TableA.* FROM TableA  WHERE TableA.date_sale Between [forms]![FormName]![DateStart] And [forms]![FormName]![DateEnd];"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

38
ก็น่าจะเป็น

โค๊ด: [Select]
                rs.Edit
                rs!Password = Me.txtNewPassword
                rs.Update
                rs.Close: Set rs = Nothing
                DoCmd.SendObject ,,,"ผู้รับ@xyz.co.th",,,"ข้อความใน Subject","เนื้อความในเมล์"
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

39
ถ้าต้องการจัดข้อความให้อยู่กึ่งกลางเซลล์ที่รวม ทั้งแนวตั้งและนอนด้วย เท่าที่คิดออกคือไปสั่งออกรายงานใน Excel แต่เขียนโค้ดเยอะทีเดียว ถ้าจะทำใน Access วิธีเท่าที่คิดออก เป็นแค่การหลอกตาเท่านั้น ข้อความในบรรทัดที่ซ้ำจะหายไปตามต้องการ แต่ข้อความจะยังคงอยู่ที่บรรทัดแรกเสมอ ไม่สามารถไปกึ่งกลางเซลล์ที่รวมได้

วิธีการคือ
- การซ่อนข้อความที่ซ้ำ ให้กำหนด Hide Duplicate property ของเท็กซ์บ็อกซ์ที่แสดง "เหตุผลที่ซื้อ" (สมมุติชื่อ txtReason) เป็น Yes แต่ข้อความนี้จะพิมพ์เสมอเมื่อเป็นบรรทัดแรกของหน้า
- การพิมพ์ขอบของเซลล์ที่รวม เราจะสร้างคอนโทรลของเส้น แทนการใช้กรอบของเท็กซ์บ็อกซ์ ดังนั้น Border Style ของ txtReason กำหนดให้เป็น Transparent ไป ให้สร้างเส้นแนวนอน lineUpper อยู่ที่ขอบบนของ txtReason และให้มีความยาวเท่ากันพอดี  เส้น lineLower วางอยู่ขอบล่าง  เส้น lineRight เป็นแนวตั้งวางอยู่ขอบขวา ส่วนขอบซ้ายคงไม่จำเป็นเพราะเท็กซ์บ็อกซ์ทางซ้ายจะพิมพ์เส้นนั้นอยู่แล้ว   เส้นทั้ง 3 ต้องจัดเลเยอร์ให้อยู่เหนือ txtReason ด้วยนะครับ
- lineUpper จะพิมพ์เมื่อ txtReason พิมพ์ (ซึ่งก็คือบรรทัดแรกของกลุ่มข้อความที่ซ้ำ) โดยเช็คได้จาก .IsVisible property
- lineLower จะพิมพ์เมื่อเป็นบรรทัดสุดท้ายในหน้า ซึ่งต้องใช้เทคนิคให้ระบบรันรายงาน 2 หน (ไม่ใช่เราสั่งพิมพ์ 2 หน) หนแรกเช็คได้จากค่า .Pages property ของ Report object จะเป็นศูนย์ เราใช้หนแรกเพื่อบันทึกว่าบรรทัดไหนเป็นบรรทัดสุดท้ายในแต่ละหน้า โดยบันทึกลงในตัวแปรอะเรย์ A  ค่าของ A(เลขที่บรรทัด) จะเป็น TRUE   ส่วนหนที่สองเพื่อตรวจกับ A ว่า ถ้าบรรทัดที่พิมพ์คือบรรทัดสุดท้ายในหน้านั้น ก็ให้พิมพ์ lineLower
- การบังคับให้ระบบรันรายงาน 2 หน ทำด้วยการสร้างเท็กซ์บ็อกซ์ที่มี Control Source เป็น =[Pages]  เอาไว้ใน Page Header section แต่เราไม่ได้ต้องการจะเห็นมัน เราก็กำหนด Visible property ของเท็กซ์บ็อกซ์ให้เป็น No 
- การที่จะรู้ว่าบรรทัดที่พิมพ์เป็นบรรทัดที่เท่าไหร่ ก็ให้สร้างเท็กซ์บ็อกซ์ txtSeq ที่มี Constrol Source เป็น =1, Running Sum property เป็น Over All และ Visible property เป็น No

อธิบายยืดยาว แต่โค้ดมีสั้นๆแค่
โค๊ด: [Select]
Option Compare Database
Option Explicit

Dim A() As Boolean

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
    Me.lineUpper.Visible = Me.txtReason.IsVisible
    If Me.Pages <> 0 Then Me.lineLower.Visible = A(Me.txtSeq)
End Sub

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        ReDim Preserve A(Me.txtSeq)
        A(Me.txtSeq) = True
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

40
ถ้าหมายถึงชื่อฟิลด์คือ Approved, ชื่อ Option Group คือ O, Checkbox Yes ที่ผูกอยู่ภายใน Option Group ตั้งค่าเป็น 1, No ตั้งค่าเป็นค่าอื่นๆที่ไม่ใช่ 1 

แต่ไม่รู้ว่า O คือค่าที่ต้องการอัพเดตลงเรคอร์ด หรือเป็นเงื่อนไขที่เลือกเรคอร์ดที่จะอัพเดต ถ้าเป็นกรณีแรก ก็จะได้โค้ดเป็นลักษณะ
โค๊ด: [Select]
CurrentDB.Execute "update [P] inner join [I] on [P].[ITEM] = [I].[ITEM] set [P].[Approved] = " & iif(Me.O=1, "TRUE", "FALSE") & " where [I].[PK] = xxx", dbFailOnError
ถ้ากรณีที่สอง ก็จะเป็น
โค๊ด: [Select]
CurrentDB.Execute "update [P] inner join [I] on [P].[ITEM] = [I].[ITEM] set [P].[BALQTY] = [I].[FWQTY] - [I].[ISSUEQTY] where [I].[PK] = xxx and Approved = " & iif(Me.O=1, "TRUE", "FALSE") , dbFailOnError
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

41
คือคุณต้องการ Update ข้อมูลในตารางไหน คุณเอาตารางนั้นมาทำ Update Query ครับ ไม่จำเป็นต้องทำ Union เลยนี่นา เพราะ Union นั้นเขาเอาไว้ดูข้อมูลอย่างเดียว

คราวนี้มาดูรูปแบบการกรอกข้อมูลแล้ว มันเหมาะกับ Excel มากกว่า เนื่องจากยังไม่ได้ทำ Normalization
การใช้งานฐานข้อมูลนั้นต้องทำ Normalization ครับ เรื่องนี้เป็นเรื่องสำคัญมากมาย

ถ้าคุณทำ Normalization แล้ว การ Update ข้อมูลน่าจะทำได้ง่ายกว่านี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

42

ใช้การสร้าง HeadGroup นะครับ
ใช้การตัดสระโดย Replace()

โค้ด
SELECT Table1.CustomerName, Left(Replace(Replace(Replace(Replace(Replace([CustomerName],"เ",""),"แ",""),"ไ",""),"ใ",""),"โ",""),1) AS GroupString, *
FROM Table1
ORDER BY Left(Replace(Replace(Replace(Replace(Replace([CustomerName],"เ",""),"แ",""),"ไ",""),"ใ",""),"โ",""),1);

กรณีถ้าอยากให้แต่ละตัวอักษรแยกหน้าออกไปเช่น หน้าที่ 1 หมวดอักษร ก หน้าที่ 2 หมวดอักษร ข
(แสดงผลในมุมมองเหมือนพิมพ์หรือ Print Preview Mode)
สามารถกำหนดค่าตามรูปด้านล่างได้เลยครับ




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


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

43
ห้อง MS Access / : ความเข้าใจ .Tag code vb access
« เมื่อ: 17 ก.ย. 63 , 11:13:59 »
.Tag ในกรณีของผมเอามาใช้ในการจัดกลุ่มโดยในหน้า Property -> Ohter จะมีให้ใส่ Tag อยู่
ตัวอย่างผมมี combo box อยู่หลายตัวแต่เมื่อใช้คำสั่งนี้อยากให้มีผลเฉพาะตัวที่กำหนด Tag "B1" ใว้เท่านั้น

อ้างถึง
Private Sub CleanAllFieldsButton_Click()
Dim ctl As Control
    For Each ctl In Me.Controls
    Select Case ctl.ControlType

    Case acComboBox And ctl.Tag = "B1"
           ctl.Value = Null

    End Select
   Next

    Set ctl = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

44
ห้อง MS Access / : ความเข้าใจ .Tag code vb access
« เมื่อ: 17 ก.ย. 63 , 00:06:50 »
.Tag property คือพื้นที่ว่างๆในคอนโทรลต่างๆที่ให้เราใส่ค่าอะไรลงไปก็ได้ เปรียบเหมือนตัวแปรนึง ไม่มีผลต่อการทำงานหรือคุณสมบัติใดๆต่อตัวคอนโทรลนั้นๆ ความหมายของค่าก็แล้วแต่เราจะกำหนดเอาเอง ในงานที่ผมเคยใช้ ก็เช่นตอนก่อนจะบันทึก ผมก็จะวิ่งอ่านแต่ละคอนโทรลดูว่า .Tag ไหนมีข้อความบ้าง ถ้ามี แต่ผู้ใช้ไม่ได้เป้อนค่าลงคอนโทรลนั้น ก็จะเอาข้อความใน .Tag ไปแสดงเป็นข้อความเตือนให้ผู้ใช้รับรู้ว่าข้อมูลที่ขาดหายไปมีอะไรบ้าง ผมก็จะได้ไม่ต้องมาเขียนโค้ดเช็คทีละคอนโทรล ซึ่งแต่ละฟอร์มก็มีคอนโทรลที่แตกต่างกัน ผมก็จะสามารถเขียนโค้ดเป็น Public Function ที่ทำการเช็คเอาไว้แค่ที่เดียว โค้ดเดียว ก็พอ เช่น ในเท็กซ์บ็อกซ์ Customer Name ผมก็ใส่คำว่า "ชื่อลูกค้า", ในเท็กซ์บ็อกซ์ Purchase Order ก็ใส่คำว่า "เลขที่ใบสั่งซื้อ" เป็นต้น

ส่วนในบรรทัดแรกนั้น เป็นการเช็คว่าถ้า .Tag ไม่มีค่า , แต่จริงๆไม่มีความจำเป็นต้อง & กับ "" เพียงเขียนว่า if txtID.Tag = "" then ก็พอแล้ว
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

45
Map Google Drive in Windows (ตัวอย่างเขาเพิ่มเป็นไดรฟ์ I)

หมายเหตุ ทุกเครื่องที่ลงโปรแกรมแล้วเชื่อมต่อจะเห็นข้อมูลใน Google Drive เหมือนทำ map network drive

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

46
กำหนด Format ครับ
" รายการนำเข้า จำนวน"& Format([txtจำนวนเงิน], "Standard") &" บาท"

โค๊ด: [Select]
Format (210.6, "#,##0.00")
Result: '210.60'

Format (210.6, "Standard")
Result: '210.60'

Format (0.981, "Percent")
Result: '98.10%'

Format (1267.5, "Currency")
Result: '$1,267.50'
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

47
เพราะไม่ได้บอกอะไรมาเลย ก็เดานะครับว่า 3 ตำแหน่งที่เป็นสีแดง อาจเป็นจุดที่ทำให้ผิดพลาดได้ นอกจากนี้ ก็เช็คด้วยว่าค่าใน tblKeyword ถูกต้องหรือไม่

                If Len(cc) > 0 Then
                    MST.Open "tblKeyword", CON, adOpenStatic, adLockReadOnly
                ' Do Until MST.EOF <---- Comment ก็ทำให้ไม่วนลูปสิครับ !!
                 '  Debug.Print MST!keyword
                        If cc = MST!Keyword Then <---- เช็คดีๆว่า เปรียบค่าของ cc กับ MST!Keyword ใช่สิ่งที่ต้องการหรือไม่
                 '  MsgBox MST!Category & " --- " & MST!Value
                            TRN.Update MST!Category, MST!Value <---- แน่ใจหรือไม่ว่าอัพเดตด้วย MST!Value
                            ' Debug.Print MST!Category
                        End If
                        MST.MoveNext
                ' Loop
                    MST.Close
                End If
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

48
ห้อง MS Access / : รวมฟิวส์ Text
« เมื่อ: 02 ก.ย. 63 , 12:15:17 »
ขอบคุณมากๆเลยครับ แต่ตอนนี้ถ้าเกิด text1 เราไม่ต้องการกรอกข้อมูล แต่ตอนรวม มันจะมีค่าเว้นวรรคมาด้วย ถ้าเราไม่ต้องการทำยังไงครับ
ใช้ Trim เข้ามาช่วยครับ


Option Compare Database
Public strText1, strText2, strText3 As Variant

Private Sub Text1_Change()
If Len(Me.Text1.Text) > 0 Then
strText1 = Me.Text1.Text
Else
strText1 = Null
End If
OutPutString
End Sub

Private Sub Text2_Change()
If Len(Me.Text2.Text) > 0 Then
strText2 = Me.Text2.Text
Else
strText2 = Null
End If
OutPutString
End Sub

Private Sub Text3_Change()
If Len(Me.Text3.Text) > 0 Then
strText3 = Me.Text3.Text
Else
strText3 = Null
End If
OutPutString
End Sub

Private Sub OutPutString()
Me.total = Trim(strText1 & IIf(IsNull(strText2), Null, " " & strText2) & IIf(IsNull(strText3), Null, " " & strText3))
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

49
จากอันเก่าปรับโค้ดเป็นแบบนี้นะครับ ไม่ต้องสร้างตารางใหม่
เอาตาราง Temp ออกไปได้เลย

โค๊ด: [Select]
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strWong_Code As String
Dim strMember_Code As String
Dim SQL As String
Set db = CurrentDb()
Set rst = db.OpenRecordset("TB2", dbOpenDynaset)
If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
  strWong_Code = rst![วง]
  strMember_Code = rst![สมาชิก]
  rst.MoveNext
 
  Do Until rst.EOF
    If strWong_Code = rst![วง] Then
      strMember_Code = strMember_Code & "," & rst![สมาชิก]
    Else
DoCmd.SetWarnings False
   SQL = "UPDATE TB1 " & _
        "SET samachik= '" & strMember_Code & "'" & _
        "WHERE [รหัส] = '" & strWong_Code & "'"
    DoCmd.RunSQL SQL
      strWong_Code = rst![วง]
      strMember_Code = rst![สมาชิก]
    End If
    rst.MoveNext
  Loop 

DoCmd.SetWarnings False
   SQL = "UPDATE TB1 " & _
        "SET samachik= '" & strMember_Code & "'" & _
        "WHERE [รหัส] = '" & strWong_Code & "'"
    DoCmd.RunSQL SQL
    DoCmd.SetWarnings True
End If
rst.Close
Set rst = Nothing
db.Close
Set db = Nothing
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

50
Shell """c:\program files\7-zip\7z.exe"" a """ & PathString & "\" & "Work.zip" & """ """ & PathString  & "\" & "Work.mdb" & """ "
กรณีข้อความใน PathString มีเครื่องหมาย \ ปิดท้ายอยู่แล้ว ก็ให้เปลี่ยน & "\" & ทั้ง 2 ตำแหน่งเป็น & ก็พอครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

51
เสริมหน่อยนะครับ คือ Unix Timestamp ในการแปลง เวลาจะเป็นมาตรฐาน GMT ซึ่งหากต้องการให้แสดงเป็นเวลาไทยต้อง GMT+7:00 ขึ้นอยู่กับว่าข้อมูลบันทึกมาจากไหนถ้าบันทึกเวลาเป็นไทยอยู่แล้วก็ไม่ต้องแปลง แต่ส่วนใหญเวลาเขาแปลงแสดงในสาธารณะเขาจะใช้ GMT ถ้าอย่างนั้น หากเราอยากจะรู้ว่าเป็นเวลาไทยเท่าไหร่ก็ต้องบวกอีก 7 ชั่วโมงด้วยนะครับ ไม่งั้นเวลาจะไม่ตรง ต้องตรวจสอบความถูกต้องของข้อมูลด้วยนะครับ
https://www.epochconverter.com/
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

52
ลองดูครับแบบนี้ไหม


วิธีการคือสร้าง textbox แล้วตั้งค่าตามภาพครับ

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

53
ผมใช้วิธีสร้าง Public Array Variable X ในโมดูล M เพื่อเก็บสถานะการเลือกเมื่อเปิดฟอร์ม F โดย X จะถูกกำหนดให้มีจำนวน element ทั้งหมดเท่ากับค่าสูงสุดของ ID  แล้วเชื่อม check box (chkX) ที่ใช้แสดงสถานะการเลือกเข้ากับฟังก์ชั่น XStatus( ) ที่อ่านค่าจาก X อีกทีนึง

แต่เนื่องจาก check box นี้ผูกกับฟังก์ชั่น จึงทำได้แค่แสดง ไม่สามารถคลิกเปลี่ยนแปลงได้ จึงสร้าง combo box command button (btnX) เพื่อรองรับการคลิกเลือกเปลี่ยนสถานะแทน โดยกำหนดให้แสดงเป็นประเภทโปร่งใส (Transparent property = True) และวางขี่อยู่บน chkX เพื่อให้ผู้ใช้รู้สึกเหมือนใช้งาน chkX เท่านั้น  เมื่อคลิกก็จะไปสลับค่าในตัวแปร X ตาม element ที่อ้างอิงด้วยค่า ID และอัพเดตการแสดงของ chkX อีกที  และเมื่อจะนำการเลือกไปใช้ เช่นนำไปออกรายงาน ก็ให้กำหนดเงื่อนไขของคิวรี่หรือ Filter ของรายงานให้มีเงื่อนไข Xstatus(ID) = TRUE

ข้อดีคือ
- ไม่ต้องสร้างฟิลด์หรือเทเบิลชั่วคราวเพื่อเก็บสถานะการเลือก

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

54
ห้อง MS Access / : ส่ง line notify ไม่ได้ครับ
« เมื่อ: 29 พ.ค. 63 , 17:58:47 »
ขอถามต่อนะครับ เมื่อข้อความถูกส่งแล้วจะมี message ตามรูปแสดงขึ้นมา ถ้าไม่ต้องการให้messageแสดงขึ้นมาต้องเขียน code เพิ่มอย่างไรครับ ขอบคุณครับ


Sub SendMessageToLineNotify()

Dim myurl As String, iMessage As String, postDATA As String, winHttpReq As Object
iMessage = Me.TxtMessage
Set winHttpReq = CreateObject("Microsoft.XMLHTTP")
myurl = "https://notify-api.line.me/api/notify"

postDATA = "message= " & iMessage
winHttpReq.Open "POST", myurl, False
winHttpReq.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
winHttpReq.SetRequestHeader "Authorization", "Bearer " & Me.TxtToken
winHttpReq.Send (postDATA)
MsgBox winHttpReq.responsetext

End Sub

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

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