แสดงกระทู้

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 ... 7 8 9 [10] 11 12 13 ... 29
163
ส่วนตัวแล้ว ฟอร์มของผมจะอิงกับคิวรี่เมื่อใช้แสดงข้อมูลเท่านั้นครับ นอกนั้นส่วนมากจะโยงกับเทเบิลหรือ SQL SELECT statement ครับ

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

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

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

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

167
ถ้า 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 ตารางวา

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

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

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

171
ตามหลักการแล้ว อะไรที่ขึ้นกับคนนั้นและไม่มีทางเปลี่ยน ก็ให้ผูกกับเทเบิลที่มี 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 ต่างๆก็จะอิงกับข้อมูลที่เป็นปัจจุบัน ณ เวลานั้นครับ

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

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

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

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

174
เท่าที่ลองดู ถ้ากำหนด Text Format property ของเท็กซ์บ็อกซ์เป็น Rich Text มันจะแสดงได้ในโหมด Print Preview ซึ่งเป็นภาพจริงที่จะเกิดตอนพิมพ์ ผมลองพิมพ์ไปเป็น pdf ไฟล์ ก็เห็นจัดให้ครับ แต่ถ้าไม่กำหนด มันจะไม่จัดให้ครับ

175
ปิดฟิลด์ก็คือ ไม่ให้เห็นหรือเปล่าครับ ถ้าใช่ ก็กำหนด Me.ชื่อฟิลด์.Visible = False   หรือถ้าจะกลับมาให้เห็น ก็กำหนด Me.ชื่อฟิลด์.Visible = True  เหมือนอย่างโค้ดที่ใช้กับ Me.Box1.Visible นั่นเอง  ส่วนการใช้ Tag property กำหนด ก็ลองดูคำตอบสุดท้ายของคุณ PNR ใน https://www.thai-access.com/index.php?topic=834.0

176
ห้อง MS Access / : Access Runtime 2013ติดปัญหาครับ
« เมื่อ: 18 ต.ค. 62 , 22:03:58 »
จากที่คุณบอกว่าปลายทางมีแต่ Runtime มันก็จะหาจากเครื่องปลายทางคงไม่ได้ ก็มีแต่ที่เครื่องต้นทางให้เข้าโปรแกรมไฟล์แล้วกด F11 ตามที่คุณ PNR บอก คุณก็เห็นไลบรารี่ทุกตัวที่ทำเครื่องหมายเลือกเอาไว้ ซึ่งจะแสดงติดๆกันที่ด้านบนของลิสท์ ให้คุณดูส่วนที่เขียนว่า Location ที่อยู่ด้านล่างที่จะบอกว่าไฟล์อะไรอยู่ที่ไหน เราก็ไปดูที่เครื่องปลายทางว่ามีไฟล์นั้นหรือไม่ ตัวไหนไม่มีก็ค่อยก็อปปี้ไป ย้ำว่าเอาเฉพาะตัวที่หาไม่มีในเครื่องปลายทางนะครับ อย่าไปก็อปปี้ทับ หลังก็อปปี้ไปอาจจะใช้ได้หรือไม่ ก็ยังไม่แน่ครับ ขึ้นกับปัจจัยมากมาย แต่โปรแกรมไม่ต้องแก้ไขอะไรครับ


แต่ถ้าเกิด Location มันยาว ก็จะมองเห็นไม่หมด ทีนี้ก็ต้องเข้าโปรแกรม RegEdit ซึ่งเป็นโปรแกรมของระบบวินโดว์ที่เข้าไปยุ่งกับค่าทุกค่าที่เกี่ยวกับระบบวินโดว์และโปรแกรมต่างๆในเครื่องแล้ว ซึ่งถ้าทำอะไรผิดไป ระบบวินโดว์อาจพังไปเลย  ถ้าไม่เคยใช้ RegEdit ตรงนี้ไม่ค่อยอยากให้เข้าไปยุ่งเลยครับ

177
ห้อง MS Access / : Access Runtime 2013ติดปัญหาครับ
« เมื่อ: 18 ต.ค. 62 , 19:37:54 »
ถ้าไลบรารี่หาย ดังนั้นไม่ว่าจะใช้ Runtime หรือ Full Version ก็ทำงานไม่ได้อยู่ดีครับ  ถ้ามี Source Code ไฟล์ .mdb, .accdb และ Full Version สักเครื่องก็จะหาตัวที่หายไปได้ ถ้าไม่ได้ใช้ไลบรารี่ตัวนั้นแล้ว ก็อย่าไป reference ถึง แต่ถ้ายังต้องใช้ ก็อาจลองโดยก๊อปปี้จากเครื่องที่มีมาลงเครื่องที่ไม่มี อาจแก้ไขได้ครับ

178
ห้อง MS Access / : การผูก Queries
« เมื่อ: 17 ต.ค. 62 , 10:52:57 »
ไม่ค่อยเข้าใจคำถาม แต่เอาเป็นว่า ภาพจาก Query Design ที่นำเอาคิวรี่แต่ละตัวมาเชื่อมความสัมพันธ์กับตัวก่อนหน้า ก็จะให้ผลเป็นว่า   box-inqty จะเป็นคิวรี่หลัก ถ้ามีเรคอร์ดของ 1A030000008 ก็ถึงจะแสดงบรรทัดออกมาให้เห็น แต่ว่า 1A030000008 ไม่มีใน box-outqty ดังนั้น inhouse (และฟิลด์อื่นๆ) ของ box-outqty จะเป็นค่าว่างๆ ดังนั้นมันก็ไม่สามารถไปหา inhouse จากคิวรี่ตัวถัดไปได้ สมมุติถ้ามี 1A030000008 จากทุกคิวรี่ยกเว้น pcs-in ผลก็คือมันจะแสดงค่าจาก box-inqty และ box-outqty เท่านั้น  หรือว่า ถ้ามีในทุกคิวรี่ยกเว้น box-inqty ทีนี้ก็กลายเป็นว่าจะไม่มีแสดงบรรทัดของ 1A030000008 ออกมาเลย

วิธีแก้ไขก็คือ เปลี่ยนเป็นสร้างความสัมพันธ์ระหว่างคิวรี่ทุกตัวกับตัวหลักแทนครับ ก็คือ box-inqty กับ box-outqty, box-inqty กับ pcs-in, ...

179
ไม่ใช่ทำให้ดีขึ้น แต่ในการเขียนโค้ด VBA ของ Office 64 bit ในส่วนที่เรียกใช้ Windows API (ฟังก์ชั่นที่วินโดว์มีมาให้) จะต้องเขียน (Declare) บอกประเภทข้อมูลของตัวแปรที่รับ/ส่งกับ Windows API ให้ถูกต้องสำหรับระบบ 64 bit ด้วย เพราะในระบบ 32 bit  Window API นั้นๆอาจใช้ประเภทข้อมูลของตัวแปรบางตัวที่กินหน่วยความจำเพียง 32 bit (เช่นประเภทข้อมูลแบบ Long) แต่พอเป็น 64 bit  ตัว API อาจต้องการหน่วยความจำสำหรับตัวแปรตัวนั้นเป็น 64 bit แทน (เช่นประเภทข้อมูลแบบ LongLong)

ดังนั้นถ้า Declare ไม่ถูกต้อง ข้อมูลการรับ/ส่งก็ผิดไป แย่น้อยสุดก็คือมี error แสดงออกมา  แย่ยิ่งขึ้นก็คือโปรแกรมทำงานผิด แต่ไม่มี error  แย่สุดก็คือ อะไรในระบบวินโดว์พังไปเลยครับ

180
ไปเจอว่ามีแอปรวบรวมการ Declare Windows API สำหรับ Microsoft Office  คิดว่ามีประโยชน์ทีเดียวครับ http://www.rondebruin.nl/win/dennis/windowsapiviewer.htm

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