สมัครสมาชิก

แสดงกระทู้

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 4 ... 23
1
เมื่อป้อนช่องว่างในข้อความระหว่างการเขียนโพส  จะไม่เห็นช่องว่างจนกว่าจะโพสจริงครับ

2
ห้อง MS Access / : การ Split database
« เมื่อ: วันนี้ เวลา 01:33:45 »
ไฟล์ A   (หรือเรียกว่า Backend File) จะเก็บเฉพาะเทเบิล  ส่วนไฟล์ B (หรือที่เรียกว่า Frontend File) จะเก็บส่วนอื่นๆนอกเหนือจากเทเบิล  แต่จะสร้าง Linked Table ขึ้นมาแทนเทเบิลที่ได้ย้ายไปยัง A  ซึ่งก็จะโยงไปหาเทเบิลจริงในไฟล์ A นั่นเอง  ดังนั้นการกระทำใดๆกับข้อมูลผ่าน  Linked  Table  ก็คือการทำกับข้อมูลในไฟล์ A ครับ  วิธีนี้คือวิธีที่ถูกต้องในการสร้างระบบใดๆสำหรับ Access ครับ  ไม่เว้นแม้แต่เราทำบนเครื่องเดียว ผู้ใช้เดียว

3
ถ้าเป็นบรรทัดเดียว จะไม่จัดให้ไม่ว่าไทยหรืออังกฤษ (ทดลองใน Microsoft Word ก็ไม่ทำให้เหมือนกันนะครับ) แต่ถ้าหลายบรรทัด จะจัดให้

5
ใครเคยใช้ไหม เป็นยังไงบ้าง https://ultraviewer.net/en/ link

6
ส่วนตัวแล้ว ฟอร์มของผมจะอิงกับคิวรี่เมื่อใช้แสดงข้อมูลเท่านั้นครับ นอกนั้นส่วนมากจะโยงกับเทเบิลหรือ SQL SELECT statement ครับ

7
Access ทำคุณสมบัติการลบเรคอร์ดให้ไว้อยู่แล้ว โดยกำหนด Record Selector property ของทั้งฟอร์มหลักและฟอร์มย่อย ให้เป็น Yes   คุณก็จะเห็น แถบ ที่ด้านหน้าเรคอร์ด เมื่อคลิกที่แถบนี้และกดคีย์ DELETE มันก็จะลบเรคอร์ดให้  ส่วนการลบเรคอร์ดบนฟอร์มหลักและไปลบเรคอร์ดในฟอร์มย่อยที่เกี่ยวข้องโดยอัตโนมัติ ก็ใช้คุณสมบัติเรื่อง Referential Integrity ซึ่งเป็นคุณสมบัติพื้นฐานของระบบจัดการฐานข้อมูลทุกตัวอยู่แล้วครับ ดูวิธการที่ อ.Yeadram ตอบใน https://www.thai-access.com/topic_post.asp?CategoryID=1&TopicID=725

หมายเหตุ : ฟอร์มหลักให้ผูกเข้ากับเทเบิลของข้อมูลหลัก ส่วนฟอร์มย่อยก็ผูกเข้ากับเทเบิลของข้อมูลย่อย จะง่ายกว่าไปผูกกับคิวรี่ซึ่งมีเงื่อนไขในฟอร์มหลักอีกที ดูแล้วงงๆ

8
น่าจะได้ แต่ผมไม่กล้ายืนยัน 100% ผมว่าควรเอาโปรแกรมนั้นมาทดลองครับ แต่ที่แน่ๆคือเราต้องจัดฟอร์แมทของข้อมูลให้ตรงตามที่โปรแกรมจะใช้ต้องการเสียก่อน แล้วค่อย export ออกไปครับ

9
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 03 พ.ย. 62 , 12:33:35 »
ผมตรวจสอบเพิ่มเติมโดยเปิด Access แล้วสร้างเท็กซ์บ็อกซ์ที่มี Format เป็น Short Date  แล้วเปลี่ยนฟอร์แมทของ short date ใน windows taskbar ด้วยมือ  กลับมาที่ Access ก็ยังคง Format เดิมไม่เปลี่ยนตามครับ ต่อให้ Close Database แล้วเปิดใหม่ก็ยังเป็น Format เดิม  ต้องปิด Access ไปเลยแล้วค่อยเปิด Access ใหม่  Format ถึงจะเปลี่ยนตาม 

ผมแนะนำว่า ให้เช็คฟอร์แมทของ Short Date ดีกว่าว่าเป็นไปตามที่เราต้องการหรือไม่ ถ้าไม่ใช่ก็ให้ปิด Access ไป  ให้ผู้ใช้เปลี่ยนด้วยมือเอาเอง วิธีการเช็คก็คือสั่งในโค้ดที่เริ่มต้นของระบบ และเช็คด้วยวันที่ 29 กพ. ค.ศ. 2020
โค๊ด: [Select]
If format$(DateSerial(2020,2,29),"Short Date")  <> "29/02/2020" Then
   MsgBox แจ้งให้ผู้ใช้ไปเปลี่ยนฟอร์มแมทเองก่อน
   Application.Quit
End If

10
ถ้า M คือฟิลด์ที่เก็บตารางเมตร คิวรี่ก็เป็น

SELECT M\1600 AS Rai, (M Mod 1600)\400 AS Ngarn, (M Mod 400)/4 AS W2 FROM เทเบิล

ถ้า M เป็น 2581  จะได้เป็น 1 ไร่ 2 งาน 45.25 ตารางวา

11
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 02 พ.ย. 62 , 13:57:07 »
สร้างโมดูล แล้วใส่โค้ดข้างล่างนี้ เวลาเรียกใช้ ก็แค่สั่ง setdate เท่านั้น  โค้ดมีความแตกต่างนิดหน่อยจากโค้ดของคุณ nonc31 นะครับ คือไม่มีการเช็ค compiler directive VBA7 เพราะ VBA7 ไม่ได้เป็นการเช็คว่าระบบเป็น 32 หรือ 64 bit  ถ้าจะเช็คต้องใช้ compiler directive Win64  แต่ยังไงก็ตาม API 3 ตัวนี้ไม่มีความจำเป็นต้องเช็ค เพียงแค่ตบแต่งบางอย่าง ก็จะใช้ได้ทั้ง 32 และ 64 bit แต่ใช้สำหรับ Access 2007 หรือสูงกว่าเท่านั้นนะครับ

เนื่องจากว่า ผมเข้าใจว่าการเรียกใช้ API ทั้ง 3 ตัวนี้ ถูกเรียกจาก procedure setdate เท่านั้น ดังนั้นไม่จำเป็นต้องกำหนดเป็น Pubic ที่คำสั่ง Declare ก็ได้ แต่ใส่ไว้ที่ procedure setdate ที่เดียวก็ได้ครับ

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

โค๊ด: [Select]
Option Compare Database
Option Explicit

Private Const LOCALE_SSHORTDATE = &H1F
Private Const WM_SETTINGCHANGE = &H1A
Private Const HWND_BROADCAST = &HFFFF&

Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long
Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" () As Long

Public Function setdate()
    Dim dwLCID As Long
   
    dwLCID = GetSystemDefaultLCID()
    If SetLocaleInfo(dwLCID, LOCALE_SSHORTDATE, "dd/MM/yyyy") = 0 Then
        MsgBox "ผิดพลาด", vbCritical, "Error"
        Exit Function
    End If
   
    PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End Function

12
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 01 พ.ย. 62 , 13:43:19 »
สร้าง Module ขึ้นมา 1 ตัว แล้วแทนที่จะใส่ Private Declare PtrSafe ... ก็ใส่เป็น Public Declare PtrSafe ... แทนครับ วางไว้ที่เดียว จะได้เรียกใช้จากที่ไหนก็ได้

13
ไปดูโปรแกรมที่จะใช้ดีกว่า ว่าเขาใช้ฐานข้อมูลฟอร์แมทหรือยี่ห้ออะไร จะได้รู้ว่า export ไปได้ง่ายไหม หรือเขาสามารถอ่านฐานข้อมูลของ Access ได้โดยตรงเลยหรือไม่

14
ตามหลักการแล้ว อะไรที่ขึ้นกับคนนั้นและไม่มีทางเปลี่ยน ก็ให้ผูกกับเทเบิลที่มี Primary Key เป็น NationalID เช่น วันเกิด  แต่อะไรที่เปลี่ยนแปลงไปได้ เช่น ชื่อ นามสกุล ที่อยู่ เบอร์โทร ก็ต้องผูกกับเทเบิลที่มี Primary Key เป็น NationalID + NumberOfEdited  แต่เท่าที่ดู มีแค่ฟิลด์วันเกิดเท่านั้นที่ไม่เปลี่ยนแปลง ดังนั้นการจะแยกเป็นอีกเทเบิลที่มีแต่ฟิลด์ NationalID กับ BirthDate อาจจะดูไม่คุ้มกับการทำ ผมคิดว่าให้เทเบิล tbl_Contracter และ tbl_Address มี Primary Key เป็น NationalID + NumberOfEdited ไปเลยจะดีกว่า และคิดว่าเพิ่มฟิลด์ประเภท Boolean อีกฟิลด์ทั้งใน 2 เทเบิล เพื่อบอกว่า Edition ไหน เป็น Edition ปัจจุบันไปด้วย จะทำให้ตอนค้นหาข้อมูลปัจจุบันเพื่อนำมาใช้ในส่วนต่างๆ ไม่ยุ่งยากเมื่อเทียบกับการต้องหาว่า Edition ไหนเป็น Edition ล่าสุดโดยไม่มีฟิลด์ที่ว่า แต่ก็ต้องจัดการให้ดีๆว่า ในขณะใดขณะหนึ่งต้องมีเพียงเรคอร์ดเดียวเท่านั้นที่ฟิลด์ที่ว่ามีค่าเป็น True    ส่วนเทเบิลอื่นๆที่ต้องโยงมายัง 2 เทเบิลนี้ ก็ต้องเก็บทั้ง NationalID และ NumberOfEdited ไปด้วย ดังนั้น transaction ต่างๆก็จะอิงกับข้อมูลที่เป็นปัจจุบัน ณ เวลานั้นครับ

15
API (Application Program Interface)  เป็นชื่อเรียกรวมๆของฟังก์ชันที่ระบบสร้างไว้ให้ผู้พัฒนาโปรแกรมเขียนโค้ดไปเรียกใช้เพื่อสั่งให้ระบบทำงานต่างๆ เพราะภาษาที่เราใช้เขียนโปรแกรมนั้นไม่ว่าจะภาษาอะไรก็ตาม ไม่สามารถสร้างฟังก์ชันเอาไว้ให้ทำได้ทุกอย่างที่ต้องการ  ถ้าเป็น API ของระบบวินโดวส์ เรียกเต็มๆก็คือ Windows API แต่ก็มักเรียกสั้นๆว่า API   ดังนั้นก็ต้องเข้า VBA Editor แล้วกด Ctrl-F เพื่อค้นหาชื่อ API ที่เรา Declare เอาไว้ทีละตัว ว่ามันอยู่ที่ไหนในโค้ดบ้างเท่านั้นเองครับ

16
ฟิลด์วันที่ แต่คุณใช้ประเภทข้อมูล (Data Type) เป็น Text มันก็เรียงตามแบบ Text คือเรียงจากซ้ายมาขวา
01/06/2562 อันนี้คืออักษร ศูนย์ หนึ่ง ทับ ศูนย์ หก ทับ สอง ห้า หก สอง ไม่ใช่วันที่ 1 มิถุนายน พ.ศ. 2562
01/06/62
01/06/62
03/09/2562

ต้องเปลี่ยนเป็นประเภทข้อมูล Date/Time ถึงจะเก็บแบบวันที่จริงๆ ซึ่งจะเรียงให้ได้ถูกต้อง  แต่ยังไงก็ตาม หลังจากเปลี่ยนประเภทข้อมูลไปแล้ว ตรวจดูวันที่อีกครั้ง ถ้าระบบวินโดว์กำหนดปีปฏิทินเป็น ค.ศ. หรือ พ.ศ. เลขปีต้องเห็นเป็น ค.ศ. หรือ พ.ศ. ให้ตรงตามนั้นเหมือนกัน ถ้าไม่ตรงก็ต้องป้อนใหม่ให้ถูกต้อง

่ส่วนคิวรี่ ไม่เห็นว่าจะมีกำหนดให้เรียงตามฟิลด์ไหนเลย เมื่อไม่มี ระบบก็จะดึงตามใจชอบเขาหล่ะ ซึ่งมักไม่เรียง

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