Tips : ตรวจรูปแบบปี ของระบบ
กระทู้เก่าบอร์ด อ.Yeadram

 2,486   8
URL.หัวข้อ / URL
Tips : ตรวจรูปแบบปี ของระบบ

เคยโพสต์ไว้แล้วครับ
ตอนแรกก็ใช้งานได้ดี แต่ทีนี้ ผมเจอปัญหาอย่างนี้ครับ



ถ้าดูตามรูป เมื่อเราตั้งค่า System date เราจะเป็น Dialog หมายเลข 1
ถ้าเรากดปุ่ม Custumize เราจะเห็น Dialog เพิ่มมาอีกเป็นหมายเลข 2

บางคนตั้งค่าที่ dialog1 เป็น English (United State)
แล้ว dialog ด้านใน มันจะเลือกชนิดปี (calendar type) ไม่ได้ครับ มันจะตั้งให้เป็นแบบ คริสต์โดยอัตโนมัติเลย

แต่บางคนตั้งค่าใน dialog1 เป็น Thai ส่วนใน dialog 2 ซึ่งมันสามารถเลือก calendar type ได้ 2 รูปแบบครับ คือแบบพุทธหรือแบบคริสต์

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

ผมไปปรับแต่งเอามาใหม่ ทีนี้เอาแบบรันได้ทั้งบนวินโดวส์ 32bit (x86) และรันได้บนระบบ 64bit เลยทีเดียว

เหมาะสำหรับการใช้ร่วมกับ การรันเลขที่อัตโนมัติ ครับ
- IV 5501001 หรือ IV 1201001   (ความหมายเลขที่คือ เอกสารขายลำดับที่ 1 ของเดือนมกราคม ปีพุทธศักราช 2555)
- PO 5501012 หรือ PO 1201012 (เอกสารใบสั่งซื้อลำดับที่ 12 ที่ออกในเดือนมกราคม ปีพุทธศักราช 2555)
เช่น ฐานข้อมูลวางไว้ที่เครื่องหลัก แล้วมี front-end แจกไปหลายๆ client แต่ละ client อาจใช้ระบบ system date แตกต่างกันเมื่อจะสร้างเอกสารฉบับใหม่ อาจทำให้เกิดรูปแบบเลขที่อัตโนมัติที่ไม่เหมือนกันก็ได้ หากเราต้องเขียนโปรแกรมเราก็ดักไว้ให้ครบเลยครับ นี่คือโมดูล เก็บไว้ใช้ติดบ้านนะครับ อิอิ

Option Compare Database
#If Win64 Then
Public Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare PtrSafe Function GetLocaleInfo Lib "kernel32" _
Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long
#Else
Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare Function GetLocaleInfo Lib "kernel32" _
Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long
#End If

Public Function GettbLoginLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String
Dim sReturn As String
Dim r As Long
r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
If r Then
sReturn = Space$(r)
r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn))
If r Then GettbLoginLocaleInfo = Left$(sReturn, r - 1)
End If
End Function

Public Function cYear(ByVal yourDate As Date) As Long
' เปลี่ยนเลขที่ จากระบบใดๆ ให้เป็นแบบคริสต์เสมอ
cYear = Year(yourDate)
If GettbLoginLocaleInfo(GetSystemDefaultLCID(), &H1005) = 1 And GettbLoginLocaleInfo(GetSystemDefaultLCID(), &H1009) = 7 Then cYear = Year(yourDate) - 543
End Function

Public Function bYear(ByVal yourDate As Date) As Long
' เปลี่ยนเลขที่ จากระบบใดๆ ให้เป็นแบบพุทธเสมอ
bYear = Year(yourDate) + 543
If GettbLoginLocaleInfo(GetSystemDefaultLCID(), &H1005) = 1 And GettbLoginLocaleInfo(GetSystemDefaultLCID(), &H1009) = 7 Then bYear = Year(yourDate)
End Function

8 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R12707
ขอบคุณครับ คุณ yeadram
ส่วนตัวแล้วชอบฟังก์ชั่นนี้มาก สามารถแก้ปัญหาได้หลายๆ อย่าง และยังดัดแปลงใช้ตรวจสอบค่าอื่นๆของเครื่องได้อีกด้วย และเมื่อเห็นคุณ yeadram เขียนฟังก์ชั่นเพื่อรองรับ 64 bit ทำให้ผมเริ่มคิดเลยว่า ต่อไปเราอาจต้องเขียนฟังก์เพื่อรองรับ 64 bit กันมากขึ้นเรื่อยๆ
Compatibility Between the 32-bit and 64-bit Versions of Office 2010
ขอบคุณที่แบ่งปันความรู้ให้กันครับ
2 @R12780
แล้ว Function ดังกล่าวนี้ จะไปใส่ไว้ในส่วนไหนครับ
3 @R12784
สร้างโมดุลเปล่าๆ มาใหม่ 1 อัน ตั้งชื่อตามหลักการตั้งชื่อ และห้ามใช้ชื่อว่า
cYear, bYear, GettbLoginLocaleInfo

เอาโค้ดนี้ไปวางในนั้นครับ
4 @R13022
เราจะเอา function ดังกล่าวไปใช้อย่างไรครับอาจารย์
สมุติว่า textbox ชื่อ txtyear   fied ที่เก็บข้อมูล เป็น Text

me.txtyear= Formate(Now(),"yy")
วันที่ในเครื่องบางวันอาจจะ คริสต์ บ้าง และไทย บ้าง เวลาบันทึกข้อมูล
ต้องการให้บันทึกเป็นวันไทยเสมอ เช่น 55 56 57 ไม่ใช่ 12 13 14

5 @R13023
me.txtyear=right(byear(now()),2)
6 @R13024
ขอบคุณครับอาจารย์ ทำได้แล้ว
7 @R13318
รบกวนด้วยครับ ผมลอง Copy Code ลงไปใน Module แต่บรรท้ดด้านล่าง แสดงเป็นสีแดง ครับ ดังนี้

Public Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare PtrSafe Function GetLocaleInfo Lib "kernel32" _
Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long) As Long

ส่วนบรรทัดอื่นๆ ปกติครับ

ขอบคุณครับ
8 @R13319
ผมเองก็ตกยุคไปมากๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ เช่นกันครับ

ได้คำตอบแล้วครับที่ http://www.thai-access.com/yeadram_view.php?topic_id=1495

ไฟล์ตัวเก่า
-สร้างจากเวอร์ชั่น 2002
-มีการประกาศ Function api ด้วยครับ


พอเอามารันใน win7 64bit ลง access 64 bit
ได้เรื่องเลยครับ ทำให้ต้องค้น กูเกิ้ล แล้วก็ได้ความรู้เพิ่มขึ้นอีกแล้วสำหรับวันนี้ อิอิ (ถ้าวันไหนไม่มีความรู้ใหม่ๆ เข้าหัว มันจะนอนไม่ค่อยหลับ และมีความรู้สึกว่า กำลังใช้ชีวิตแบบไร้ค่า)

ความแตกต่างเบื้องต้นเท่าที่สังเกตได้
- VBA แต่ก่อนไม่รู้ว่าใช้อยู่ประจำเป็นเวอร์ชั่นอะไร แต่ ในนี้ (office2010 64bit) เขาเรียกว่า VBA7
- เคย references
: Microsorft office 10 ก็เปลี่ยนเป็น 14
: MDAC 2.8 ก็เปลี่ยนเป็น 6.0 (โว้ววว เราตกยุคไปหลายเวอร์ชั่นนะเนี่ย อิอิ)

การประกาศฟังก์ชั่น API ในยุค 32bit เช่น
Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
   ByVal LCType As Long, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) As Long

ก็ต้องปรับตัวให้เข้ากับยุค 64bits ดังนี้
Public Declare PtrSaft Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
(ByVal Locale As Long, _
   ByVal LCType As Long, _
   ByVal lpLCData As String, _
   ByVal cchData As Long) As Long

* มีการแทรกคีย์เวอร์ดเพื่อแบ่งชั้นวรรณะกันนิดนึงนะเนี่ย อิอิ จะได้รู้ว่ายุคไหนเป็นยุคไหน ( 55555 เขาก็ช่างคิดกันได้เน๊าะ)
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3165s