แสดงกระทู้

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 ... 4 5 6 [7] 8 9 10 ... 19
109
ห้อง MS Access / : การ Split database
« เมื่อ: 13 พ.ย. 62 , 01:33:45 »
ไฟล์ A   (หรือเรียกว่า Backend File) จะเก็บเฉพาะเทเบิล  ส่วนไฟล์ B (หรือที่เรียกว่า Frontend File) จะเก็บส่วนอื่นๆนอกเหนือจากเทเบิล  แต่จะสร้าง Linked Table ขึ้นมาแทนเทเบิลที่ได้ย้ายไปยัง A  ซึ่งก็จะโยงไปหาเทเบิลจริงในไฟล์ A นั่นเอง  ดังนั้นการกระทำใดๆกับข้อมูลผ่าน  Linked  Table  ก็คือการทำกับข้อมูลในไฟล์ A ครับ  วิธีนี้คือวิธีที่ถูกต้องในการสร้างระบบใดๆสำหรับ Access ครับ  ไม่เว้นแม้แต่เราทำบนเครื่องเดียว ผู้ใช้เดียว
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

110
ถ้าเป็นบรรทัดเดียว จะไม่จัดให้ไม่ว่าไทยหรืออังกฤษ (ทดลองใน Microsoft Word ก็ไม่ทำให้เหมือนกันนะครับ) แต่ถ้าหลายบรรทัด จะจัดให้
โพสต์นี้ได้รับคำขอบคุณจาก: tanuki

111
ใครเคยใช้ไหม เป็นยังไงบ้าง https://ultraviewer.net/en/
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy, PNR

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

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

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

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

115
ห้อง 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
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

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

117
ไปดูโปรแกรมที่จะใช้ดีกว่า ว่าเขาใช้ฐานข้อมูลฟอร์แมทหรือยี่ห้ออะไร จะได้รู้ว่า export ไปได้ง่ายไหม หรือเขาสามารถอ่านฐานข้อมูลของ Access ได้โดยตรงเลยหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

118
ตามหลักการแล้ว อะไรที่ขึ้นกับคนนั้นและไม่มีทางเปลี่ยน ก็ให้ผูกกับเทเบิลที่มี 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 ต่างๆก็จะอิงกับข้อมูลที่เป็นปัจจุบัน ณ เวลานั้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, Tatchawin

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

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

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


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

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

123
ห้อง 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, ...
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

124
อีกวิธีครับ https://www.thai-access.com/index.php?topic=640.0
โพสต์นี้ได้รับคำขอบคุณจาก: Tongo

125
กรณีที่ต้องการใส่เงื่อนไขให้คิวรี่ วิธีนึงคือให้บรรทัด Criteria (Access ไทยไม่รู้ใช้คำว่าอะไร, "เงื่อนไข" หรือเปล่า) ของฟิลด์ bill_date และ vihecle_no (จริงๆคำสะกดที่ถูกต้องคือ vehicle นะครับ) ใน Qviheclereport อ้างถึงเท็กซ์บ็อกซ์หรือคอมโบบ็อกซ์บนฟอร์ม frmviheclecomh ที่เราได้เลือกเป็นค่าของเงื่อนไขเอาไว้ สำหรับ vihecle_no นั้นคิดว่าไม่มีปัญหา แต่สำหรับ bill_date เราจะสร้างเท็กซ์บ็อกซ์ 2 ตัวเพิ่มเติมไว้บนเมนฟอร์ม สมมุติชื่อ bill_date_from และ bill_date_to เรากำหนดให้ Visible property ของ 2 ตัวนี้เป็น False เพื่อไม่ให้เห็น จุดประสงค์ของ 2 ตัวนี้เพื่อเก็บวันที่แรกและสุดท้ายของเดือน/ปีที่เลือก เช่น 1/9/2019 และ 30/9/2019 สำหรับเดือน 9 ปี 2019 ที่ทำอย่างนี้เพื่อให้เงื่อนไขของฟิลด์ bill_date ในคิวรี่ สามารถอ้างได้อย่างง่ายๆ ต่อไปก็แล้วแต่จะออกแบบไว้ว่าจะให้ subform แสดงคิวรี่ตามเงื่อนไขที่เลือกเมื่อไหร่ สมมุติว่าเมื่อมีการกดปุ่มชื่อ btnRequery แล้วกัน ดังนั้นใน btnRequery_Click event procedure ก็จะต้องรันโค้ดดังต่อไปนี้

โค๊ด: [Select]
Private Sub btnRequery_Click()
   Me.bill_date_from = DateSerial(Me.combo_year , Me.combo_month , 1)
   Me.bill_date_to = DateSerial(Me.combo_year , Me.combo_month + 1 , 0)
   Me.[ชื่อ sub form control].SourceObject = "frmviheclecomd" ' แต่ถ้าผมเข้าใจผิด ถ้า SourceObject ต้องเป็นชื่อ Qviheclereport ก็แก้ให้ถูกต้องด้วย
   Me.[ชื่อ sub form control].Form.Requery ' บรรทัดนี้อย่าเพิ่งใส่ ให้ทดลองดูก่อน ถ้าไม่ใส่แล้วคิวรี่ไม่เปลี่ยนตามเงื่อนไข ค่อยมาใส่
End Sub

กลับมาที่คิวรี่ เราก็จะใส่คำว่า Forms!frmviheclecomh!vihecle_no สำหรับเป็นเงื่อนไขของฟิลด์ videcle_no  และใส่ between Forms!frmviheclecomh!bill_date_from and Forms!frmviheclecomh!bill_date_to สำหรับฟิลด์ bill_date เท่านี้เองครับ

หมายเหตุ :
1. โค้ดทั้งหมดนี้ยังไม่ได้ลองนะครับ และรันแล้วอาจมีผิดพลาด อาจผิด data type ระหว่าง string และ text
2. โค้ดไม่ได้มีการเขียนป้องกันว่า ถ้าไม่ใส่เดือน/ปี จะแสดงข้อความแจ้งเตือนหรืออะไรยังไง ตรงนี้คุณไปจัดการเองแล้วกัน
3. เมื่อเปิดฟอร์มมา เนื่องจากยังไม่ได้ป้อนเลือกอะไร ดังนั้นค่าที่คิวรี่ใช้เป็นเงื่อนไขก็ยังไม่มี อาจจะ error ได้ ผมคิดว่าเราเว้น SourceObject property ของ sub form ว่างๆไว้ดีกว่าครับ (ซึ่งมันจะถูกเติมในโค้ดข้างบน)

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

126
monthname(1) จะให้ชื่อเต็มเดือน 1
monthname(1, True) จะให้ชื่อย่อเดือน 1 ครับ

ในกรณีเป็นค่าคงที่ ใส่ค่าไปใน RowSource property เลยจะง่ายกว่า  สมมุติคอมโบบ็อกส์คุณใช้ 2 คอลัมน์ คอลัมน์แรกเป็นเลขเดือน อีกคอลัมน์เป็นชื่อย่อเดือน ก็ใส่เป็น 1;"Jan.";2;"Feb.";3;"Mar."
โพสต์นี้ได้รับคำขอบคุณจาก: Tongo

หน้า: 1 ... 4 5 6 [7] 8 9 10 ... 19