แสดงกระทู้

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 - ปิ่นณรงค์

หน้า: 1 [2] 3
19
วิเคราะห์เหตุการณ์โจรไซเบอร์ปล้นเงิน 10 ล้านบาทด้วยมัลแวร์

https://www.catcyfence.com/it-security/article/analysis-of-cyber-crooks-use-malware-robbing-10-mb/?fbclid=IwAR3ykbcbvMGVDz73pVAARPoOdvGwO5X7yzAFEBN_EzrR8bZm6HE6tXvyNEI
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

21
อ้างถึง
ไม่ให้ช่องภูมิภาคเป็นช่องหลัก , เลือกจังหวัดเสร็จ > ช่องภูมิภาคขึ้นมาให้เลย
ผมขออนุญาตนำไฟล์ของ อ.ปิ่นณรงค์ ไปแก้นะครับ โดย
• เปลี่ยนช่องเลือกภาค(Cb_geography) เป็น TextBox
• จังหวัด
  - column count = 3 , column widths = 0cm;2cm;0cm
  - Data > Row Source =
โค๊ด: [Select]
SELECT tb_province.province_id, tb_province.Province_th, tb_geography.GEO_NAME FROM tb_province INNER JOIN tb_geography ON tb_province.geo_id = tb_geography.GEO_ID;
  - VB ในส่วนของ cb_province_AfterUpdate เพิ่ม     
โค๊ด: [Select]
Me.Cb_geography = cb_province.Column(2)
ปล.ผมก็...เอาอ่านะลองดูจากไฟล์เลยครับ :prettiness:
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

22
ห้อง MS Access / : อยากทำ progress meter
« เมื่อ: 10 ธ.ค. 61 , 17:14:08 »
ลองดูคลิปนี้นะครับ แต่การแสดง meter มันทำให้เครื่องต้องเสียเวลาแสดงส่วนนี้เพิ่มด้วยทำให้การทำงานช้าลงอีกนะครับ



ปล. มันจะมีอีกอย่างคือ progress meter ที่ Status bar ไม่แน่ใจว่าตั้งแต่ MS Access เวอร์ชั่น 2007 หรือ 2010 ขึ้นไป ก็สามารถเขียนคำสั่งให้มันแสดงความก้าวหน้าได้ ตัวอย่าง

1. สร้างตัวแปร
Dim ReturnValue As Variant
 
2. กำหนด สเกล ให้ เท่ากับ 100
ReturnValue = SysCmd(acSysCmdInitMeter, "Processing ", 100)
 
3. สมมุติเป็นการนับเรคคอร์ดทั้ง ก็ทำให้ เป็น เปอร์เซนต์
For StartLoop = 0 To (TotalRecord - 1)
      ReturnValue = SysCmd(acSysCmdUpdateMeter, ((StartLoop) / TotalRecord) * 100)
Next StartLoop
 
4. เคลียร์
ReturnValue = SysCmd(acSysCmdRemoveMeter)

อะไรประมาณนี้ครับ ปรับใช้ดู

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

23
ห้อง MS Access / : การใช้คำสั่ง iifซ้อน iif
« เมื่อ: 10 ธ.ค. 61 , 17:06:21 »
ใช้ MS Access เวอร์ชั่นอะไรอะครับ ทำไมเหมือนใส่ได้น้อยจัง เหมือนกับมันใส่อักษรเกินที่ Textbox มันรับได้ป่าวครับ ถ้าใช่ให้แก้โดยแบ่งครึ่งเงื่อนไขครับ เช่น
a: IIf(Not IsNull([Eff20]),[Eff20],IIf(Not IsNull([Eff19]),[Eff19],Null)) ไปเรื่อยๆ จนสุดที่ใช้ได้
สร้างอีกฟิลด์
b: IIf(IsNull([a]),IIf(Not IsNull([Eff18]),[Eff18],Null),[a]) ไปเรื่อยๆ อีก ถ้ายังไม่หมดก็ต่ออีกฟิลด์ แล้วเราก็เอาฟิลด์สุดท้ายไปใช้งานครับ พอนึกภาพออกไม๊ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

24
อ.ปิ่นณรงค์ไม่ต้องทำแล้วก็ได้ครับ ผมแก้ไขตัวโปรแกรมเรียบร้อยแล้วครับ เปลี่ยนจากคำสั่งVBเป็นมาโครทั้งหมดเลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

25
ห้อง MS Access / : รวมตาราง
« เมื่อ: 31 ส.ค. 61 , 16:27:02 »
ไม่เคยทำระบบที่ต้องสร้างข้อมูลซ้ำกันแบบนี้ ดีที่สุดคือไม่สร้างซ้ำ แต่ถ้าจำเป็นต้องสร้างซ้ำแล้ว โดยหลักการของ DBMS แล้ว น่าจะเป็นเรื่องของ Trigger http://www.mysqltutorial.org/mysql-triggers.aspx ที่จะทำงานเมื่อเกิดการเปลี่ยนแปลงข้อมูลในเทเบิล ก็ต้องเขียนโค้ดใน Trigger ใน MySQL สำหรับทุกเทเบิล ให้ไปปรับปรุงข้อมูลในเทเบิลที่เกี่ยวข้องให้ถูกต้องตรงกัน

อีกอย่างที่ต้องคำนึงถึงคือเรื่องของ Transaction Control คือ DBMS จะปรับปรุงข้อมูลทั้งเทเบิลตัวเองและที่เกี่ยวข้องได้สำเร็จ ก็ต้องทำได้สำเร็จทั้งคู่ (Commit Transaction) ถ้าเทเบิลใดเทเบิลหนึ่งปรับปรุงไม่สำเร็จ ก็ต้องยกเลิกได้ทั้งคู่โดยอัตโนมัติ  (Rollback Transaction)  ไม่งั้นข้อมูลก็จะไม่เหมือนกัน ตรงนี้ผมไม่รู้ว่า MySQL สนับสนุนให้ทำได้พร้อม Trigger ด้วยหรือไม่ และถ้าทำได้ ถ้าเกิดกรณี Rollback Transaction แล้ว  จะมี runtime error อะไรส่งกลับมาบอก Access ด้วยหรือไม่ ตรงนี้ก็ต้องทดลองด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

26
Forms("ชื่อฟอร์ม").SetFocus
Docmd.RunCommand acCmdDocMinimize ' สำหรับหดฟอร์ม หรือใช้ acCmdDocMaximize สำหรับขยายเต็มวินโดว์ของ Access หรือใช้ acCmdDocRestore สำหรับกลับคืนขนาดก่อนการหดหรือขยายฟอร์ม
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

27
หากคำสั่งอยู่ที่ฟอร์มหลัก ต้องโฟกัสที่ซับฟอร์มก่อนแล้วค่อยโฟกัสที่คอนโทรลซับฟอร์มอีกครั้ง

Forms![เมนฟอร์ม]![ซับฟอร์ม].SetFocus
Forms![เมนฟอร์ม]![ซับฟอร์ม].Form.[คอนโทรล].SetFocus

เป็น
Forms![Frm_Main]![Frm_Sub].SetFocus
Forms![Frm_Main]![Frm_Sub].Form.[Text1].SetFocus
หรือแบบนี้ก็ได้
Me("Frm_Sub").SetFocus
Me("Frm_Sub").Form.Text1.SetFocus

ปรับใช้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

28
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
    <tabs>
<!-- ซ่อนแท็บ CREATE ->
      <tab idMso="TabCreate" visible="false" />
<!-- เพิ่ม TAB A Custom Tab ->
      <tab id="dbCustomTab" label="A Custom Tab" visible="true">
        <group id="dbCustomGroup" label="A Custom Group">
          <control idMso="Paste" label="Built-in Paste" enabled="true"/>
        </group>
        <group id="dbCustomGroup2" label="Another Custom Group">
          <control idMso="ImportExcel" label="Import from Excel" enabled="true"/>
          <control idMso="ExportExcel" label="Export to Excel" enabled="true"/>
          <control idMso="FontColorPicker" label="FontColorPicker" enabled="true"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

ผมก็ไม่ได้เก่ง XML นะครับ ถ้ามีพื้นฐาน HTML จะเข้าใจ Code XML ได้ไม่ยาก

ข้างบนนี่คือตัวอย่าง Code ง่ายๆ ที่คุณน่าจะเอาไปต่อยอดเองได้

โดยผมได้แนบไว้ไฟล์เอาไปทดลองมาให้ด้วย

วิธีการเอา Code เกี่ยวกับ Ribbon แบบง่ายๆ คือ ให้สร้าง Custom Menu แล้ว Export จากนั้นเปิดอ่านด้วย Notepad เอาครับ

Code ไม่ยากจริงๆ

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

29
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

30
บอร์ดเรียนรู้ Access สำหรับคนไทย ก็โพสวาดเส้น,ตาราง,กล่องข้อความได้นะ :meaw:

ปกติ
แต่งโค๊ด
หมายเหตุ
table table border=1 ทำให้กล่องข้อความมีเส้น(เลขกำหนดขนาดเส้นขอบนอก)
table border=1 style="border: 2px inset red;" ใส่สีเส้น(border 1.ทำให้มีเส้นทั้งตาราง,2.ขนาดขอบ&สี)
td td colspan=2 รวมคอลัมน์(ตามตัวเลข)ให้เหลือคอลัมน์เดียว
ฯลฯ อื่นๆอีกมากปรับใช้งานตามสะดวกเลยครับ  :shout:

ตัวอย่างโค๊ดสี
Name hexadecimal ........
aqua #00ffff
black #000000
blue #0000ff
fuchsia #ff00ff
gray #808080
green #008000
lime #00ff00
maroon #800000
navy #000080
olive #808000
orange #ffa500
purple #800080
red #ff0000
silver #c0c0c0
teal #008080
white #ffffff
yellow #ffff00

EXAMPLE
โค๊ด: [Select]
[table border=1 style="border: 3px inset #ffa500;"]
[tr][td colspan=2][center][b]1+2[/b][/center][/td][td]  [b]3[/b][/td][/tr]
[tr][td]  abc [/td][td]  xxxxxx  [/td][td]  yyy [/td][/tr]
[/table]
1+2
  3
  abc   xxxxxx    yyy

โค๊ด: [Select]
[table border=2 style="border: 2px inset #ffa500;"]
[tr][td style="background-color: #FFFF33;"]!!![/td][td style="background-color: red;"]!!![/td][/tr]
[tr][td style="background-color: white;"]!!![/td][td style="background-color: #00CC00;"]!!![/td][/tr]
[/table]
!!!!!!
!!!!!!

โค๊ด: [Select]
[table style="background-color: black;" border="0" cellpadding="2"][tr][td][color=#DDDDDD][b]@ เริ่มหัวข้อใหม่[/b][/color][/td][/tr][/table]
@ เริ่มหัวข้อใหม่

ใส่กล่องข้อความบางส่วน --> span style="border: 1px inset สี" --> Text1 Text2 Text3
โค๊ด: [Select]
[span style="border: 1px inset black"] Text2 [/span]


credit SMF Mod Site : BBCode with style
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

31
ผมเขียนตัวอย่างสมมุติของ Class Recordset เพื่อให้เห็นภาพว่าเมื่อเราอ่านหรือกำหนดค่าให้ Property ของ Object ทำงาน มันจะไปสัมพันธ์กับโค้ดส่วนไหนใน Class นั้นๆ หวังว่าพอจะมีประโยชน์บ้างครับ แต่เอาไปรันจริงไม่ได้นะครับ แค่ตัวอย่างเท่านั้น

โค้ดข้างล่างนี้จะเขียนอยู่ใน Class Module และบันทึกในชื่อ Recordset
โค๊ด: [Select]
Option Compare Database
Option Explicit

Type RecordStructure                ' โครงสร้างของ Recordset Object
    RSField1    As Variant
    RSField2    As Variant
End Type

Dim Ptr         As Integer          ' เก็บตำแหน่งเรคอร์ดปัจจุบันของ Recordset นี้
Dim RC()        As RecordStructure  ' ตัวแปร Recordset Object

Private Sub Class_Initialize()
    ' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกสร้าง
    ' ตย.โค้ดเช่น เพิ่ม object นี้ลงใน Recordsets Collection (Collection คือ อ็อปเจ็คของกลุ่ม Object อีกที)
End Sub

Private Sub Class_Terminate()
    ' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกเคลียร์ให้เป็น Nothing
    ' ตย.โค้ดเช่น นำ object นี้ ออกจาก Recordsets Collection
End Sub

Public Property Let Bookmark(NewPosition As Integer)
    ' กำหนดตำแหน่งเรคอร์ดปัจจุบันของ Recordset
    If NewPosition <= UBound(RC) Then
        Ptr = NewPosition
    Else
        Err.Raise 1234, "Invalid Bookmark"
    End If
End Property

Public Property Get RecordCount() As Long
    ' คืนค่าจำนวนเรคอร์ดทั้งหมดใน Recordset
    RecordCount = UBound(RC)
End Property

Public Property Get Fields(Name As String) As Variant
    ' คืนค่าฟิลด์ตามชื่อฟิลด์ที่ส่งมาในตัวแปร Name
    Select Case Name
        Case "CustomerID"
            Fields = RC(Ptr).RSField1
        Case "CustomerName"
            Fields = RC(Ptr).RSField2
        Case Else
            Err.Raise 2589, "Invalid Field Name"
    End Select
End Property

Public Property Get EOF() As Boolean
    ' คืนค่า True เมื่อตำแหน่งเรคอร์ดปัจจุบันเลยเรคอร์ดสุดท้ายไปแล้ว
    If Ptr > UBound(RC) Then
        EOF = True
    Else
        EOF = False
    End If
End Property

Public Sub MoveNext()
    ' เลื่อนไปยังเรคอร์ดถัดไปใน Recordset
    If Ptr <= UBound(RC) Then
        Ptr = Ptr + 1
    Else
        Err.Raise 7654, "End of file"
    End If
End Sub

ส่วนข้างล่างนี้เป็นโค้ดที่อยู่ใน Module ธรรมดาๆ ที่เรียกใช้ Object, Method และ Property ต่างๆใน Class Module Recordset ครับ
โค๊ด: [Select]
Private Sub Example()
    ' โค้ดพิมพ์ CustomerID และ CustomerName จากเทเบิล Customer ตั้งแต่เรคอร์ดที่ 10 เป็นต้นไป
   
    Dim RS  As DAO.Recordset
       
    Set RS = CurrentDb.OpenRecordset("Customer")
    ' เมื่อ Object ถูกสร้าง จะไปเรียก Class_Initialize procedure มาทำงาน
   
    If RS.RecordCount > 10 Then     ' โค้ดใน Property Get RecordCount จะถูกทำงาน
        RS.Bookmark = 10            ' โค้ดใน Property Let Bookmark จะถูกทำงาน เป็นการนำค่าเข้าไปใน Property Bookmark
    End If
    Do Until RS.EOF                 ' โค้ดใน Property Get EOF จะถูกทำงาน
        Debug.Print RS.Fields("CustomerID") & ";" _
                  & RS.Fields("CustomerName") ' โค้ดใน Property Get Fields จะถูกทำงาน
        RS.MoveNext                 ' โค้ดใน Sub MoveNext จะถูกทำงาน
    Loop
   
    Set RS = Nothing
    ' เมื่อ Object ถูกเคลียร์ จะไปเรียกโค้ดใน Class_Initialize procedure มาทำงาน
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

32
เขียนข้อเสนอแนะให้ทีมพัฒนา Access access.uservoice.com/forums/319956-access-desktop-application

เขียนข้อเสนอแนะให้ทีมพัฒนา Office officespdev.uservoice.com/forums/224641-feature-requests-and-feedback?category_id=164751 ถ้าเกี่ยวกับ VBA IDE ให้เลือกหมวด Office Development Tools

Blog ของทีมซัพพอร์ทของ Access blogs.technet.microsoft.com/the_microsoft_access_support_team_blog/

Blog ของ Office365 ในเรื่องเกี่ยวกับ Access www.microsoft.com/en-us/microsoft-365/blog/access/
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

33
ห้อง Ms Access อื่นๆ / : Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:19:39 »
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

34
ห้อง Ms Access อื่นๆ / : Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:17:43 »
winworldpc.com/product/microsoft-access/10
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

35
ผมมีไฟล์ตัวอย่าง ไฟล์ตัวอย่าง By Peter Hibbs July 2017
เป็นโปรเจคที่เค้าเรียนแบบ Calendar ของ Outlook ไม่รู้อาจารย์เคยเห็นยังนะครับ เผื่อพอช่วยได้ โค้ดดิ้งเยอะใช้ได้ แต่ดูคร่าวๆแล้วคิดว่าน่าจะเป็นแนวคิดประมาณนี้อะครับที่เห็นคนเค้าทำกันบน MS Access เมื่อก่อนคิดว่าจะนั่งไล่โค้ดดู จนถึงวันนี้ยังไม่ได้ดูเลย ยอมรับว่าขึ้เกียจครับ
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

36
Nz คือฟังก์ชั่นในการกำหนดว่าเมื่อค่าในตัวแปลที่1 มีค่าเท่ากับ Null หรือก็คือว่างไม่มีค่าอะไรเลยให้มีค่าเท่ากับตัวแปลที่2

ดังนั้น Nz(Me.Amount, 0) จึงเป็นการกำหนดว่าเมื่อ Me.Amount ว่างให้มีค่าเท่ากับ 0

หมายเหตุ ทุกการคำนวนของโปรแกรมต้องมีค่า จะมา 1+2+Null+4 ไม่ดี,ไม่ควร(หรือจะใช้ไม่ได้ด้วยซ้ำไปครับ) :dizzy: 
            เมื่อใช้ Nz มาช่วยจะกลายเป็น 1+2+0+4 โปรแกรมจึงจะหาผลลัพธ์(=7)ให้ครับ
            หรือจะเอาไปประยุกต์ใช้อย่างอื่นนอกเหนือจากแนวคำนวนก็ได้นะ https://www.techonthenet.com/access/functions/advanced/nz.php
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์

หน้า: 1 [2] 3