แสดงกระทู้

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 - thanapol.w

หน้า: [1] 2
1
Access 2010 อยู่ที่เมนู File - Save and Publish - Package Solution

ตั้งแต่ Access 2013 เป็นต้นไป ได้ยกเลิกการสร้างไฟล์ setup ให้แก่โปรเจคออกไปแล้ว ต้องไปใช้ซอฟท์แวร์อื่นแทน เช่นที่ได้ยินบ่อยๆคือ Inno Setup ลองไปใช้ดู
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

2
ห้อง MS Access / : ฟอร์ม เพิ่ม ดู แก้ใข
« เมื่อ: 25 มิ.ย. 63 , 13:02:55 »


อ้างถึง
ที่เป็นฟอร์มแบบ ไม่เชื่อมตารางหรือคิวรี่  ครับ    โดยใช้ฟอร์มเดียวกัน ครับ

สามารถสร้างได้ แบบหลายมากตามความต้องการแนวใครใครมันไม่เหมือนกันหรอกครับ อยู่ทีการออกแบบฟอร์มของแต่ละคน
ส่วนการสร้างฟอร์มแบบไม่เชื่อมตารางหรือคิวรี่ คงหมายถึงฟอร์มแบบ Unbound Control ใช่ไหม
               โดยอาจจะใช้การ Dlookup มาแสดง กรณีค้นหา หรือ ต้องการดึงข้อมูลมาแก้ไข (อาจจะสร้าง textbox การในค้นหา หรืออื่นๆ
               ใช้การ Addnew หรือ Append Query กรณีต้องการเพิ่มข้อมูลใหม่
               ใช้การ Edit หรือ ใช้ Update Query ในกรณีแก้ไขข้อมูลเป็นต้น
               กรณีต้องการยกเลิกการแสดงข้อมูลโดยไม่บันทึก ก็อาจจะสร้าง โค้ดไว้ล้างข้อมูลที่กรอกลงไป ทั้งหมดก็ได้
               กรณีต้องการลบข้อมูลเก่าทิ้ง อาจจะใช้ Delete Query หรือโค้ดในการลบระเบียน ที่ต้องการ

ถ้าไม่ถนัดเขียนโค้ด ก็สามารถสร้างฟอร์มที่อยากได้ แล้วมีปุ่มต่างๆ ที่ต้องการแล้วส่ง Inbox มาผมจะใส่โค้ดให้ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

3
ห้อง MS Access / : ไฮไลท์ row ที่โฟกัส
« เมื่อ: 19 มิ.ย. 63 , 16:48:52 »

การสร้าง Highlight ให้กับ Current Record ลองดูตัวอย่างนี้ครับ

1.สร้าง textbox unbound ขึ้นมา 1 อันชื่อ txtHighlight แล้วซ่อนไว้ ไม่ต้องแสดง

2.เลือก textbox ตรง Detail ทั้งหมด แล้วเลือกไปที่ี การจัดรูปแบบตามเงื่อนไข ดังภาพด้านล่าง


3.กำหนดเงื่อนไข นิพจน์ โดยสร้างเงื่อนไขเช็คว่า ถ้าเรคคอร์ดปัจจุบัน = txtHighlight ก็จะแสดง สีตามที่เรากำหนด ดังรูป


4.กำหนดโค้ด Event Form_Current()

Private Sub Form_Current()
Me.txtHighlight = Me.[ID]
End Sub

หมายเหตุ

ถ้าคุณอยากให้ได้แบบการเลือกทีละหลายๆ เรคคอร์ดโดยใช้ In เหมือนตัวอย่างเก่าที่เคยทำ ก็นำมาปรับใช้ได้เลยครับ ใช้วิธีแบบนั้นได้เหมือนกัน
โดยกำหนดเงื่อนไข แบบตัวอย่างข้อ 2
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

4
ขอบคุณท่านอาจารย์มากๆ ครับ พอดีผมไปค้นเจอ อีกหนึ่่งวิธีครับ ใช้ได้กับ IN ครับ

วิธีนี้ต่อยอดได้อีกเยอะเลยครับ
 ใช้วิธีกำหนดให้เก็บ สตริงหลังจากติ๊กเลือกแล้ว
 ใช้ replace เป็น ID,ID ไปเรื่อยๆ แล้วนำไปใส่กับ IN เยี่ยมครับ

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

5
เป็น 1 ถูกแล้วครับ
เวลาจะค้นหาถ้าผ่านฟอร์มก็ใช้การตัดคำให้เหลือเฉพาะตัวเลขเหมือนกับที่จัดเก็บในตารางเช่น

Private Sub Command25_Click()
Dim getID As String
getID = Me.txtSearch  'รับค่าการค้นหาเข้ามาโดยพิมพ์ค้นหา ISP-001 ได้ตามปกติ
getID = Val(Right(getID, Len(getID) - InStrRev(getID, "-"))) 'ตัดคำให้เหลือเฉพาะ ค่าตัวเลข 3 หลักสุดท้ายคือ "000" แล้วใช้ Val แปลงเป็นตัวเลข
Forms![frmtest].Form.Filter = "[INSP_ID] =" & getID  'กำหนดให้ตัวเลขที่ได้นั้น ไปใช้ค้นหาข้อมูลจริง
Forms![frmtest].Form.FilterOn = True
End Sub

ลองทดสอบดูนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

6
ผมใช้วิธีสร้าง Public Array Variable X ในโมดูล M เพื่อเก็บสถานะการเลือกเมื่อเปิดฟอร์ม F โดย X จะถูกกำหนดให้มีจำนวน element ทั้งหมดเท่ากับค่าสูงสุดของ ID  แล้วเชื่อม check box (chkX) ที่ใช้แสดงสถานะการเลือกเข้ากับฟังก์ชั่น XStatus( ) ที่อ่านค่าจาก X อีกทีนึง

แต่เนื่องจาก check box นี้ผูกกับฟังก์ชั่น จึงทำได้แค่แสดง ไม่สามารถคลิกเปลี่ยนแปลงได้ จึงสร้าง combo box command button (btnX) เพื่อรองรับการคลิกเลือกเปลี่ยนสถานะแทน โดยกำหนดให้แสดงเป็นประเภทโปร่งใส (Transparent property = True) และวางขี่อยู่บน chkX เพื่อให้ผู้ใช้รู้สึกเหมือนใช้งาน chkX เท่านั้น  เมื่อคลิกก็จะไปสลับค่าในตัวแปร X ตาม element ที่อ้างอิงด้วยค่า ID และอัพเดตการแสดงของ chkX อีกที  และเมื่อจะนำการเลือกไปใช้ เช่นนำไปออกรายงาน ก็ให้กำหนดเงื่อนไขของคิวรี่หรือ Filter ของรายงานให้มีเงื่อนไข Xstatus(ID) = TRUE

ข้อดีคือ
- ไม่ต้องสร้างฟิลด์หรือเทเบิลชั่วคราวเพื่อเก็บสถานะการเลือก

ข้อด้อยคือ
- ใช้ได้กับฟอร์มที่มี ID เป็นตัวเลข
- ใช้ได้กับฟอร์มที่แสดงเพียงอย่างเดียว ถ้ามีการป้อนเรคอร์ดใหม่ลงในฟอร์มด้วย ต้องแก้ไขโปรแกรมเพิ่มเติม
- สถานะการเลือก ต้องใช้เวลานิดหน่อยในการแสดง ถ้าจำนวนบรรทัดยิ่งมาก อาจจะใช้เวลามากขึ้น
- ต้องเขียนโค้ดเพื่อจัดการ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

7
ต้องสร้างฟิลด์ ลองรับ คอนโทลด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

8
จากไฟล์ตัวอย่างใช้วิธี Datasheet > ซ้อน Datasheet > ซ้อน..... > ซ้อน Continuous Forms
Datasheet นั้นจะมีรูปแบบ,มุมมองคล้ายกับ Table ครับ

ส่วนที่ทำ Continuous มาปิดท้ายนั้นตอบเผื่อกระทู้ https://www.thai-access.com/index.php?topic=1191 ที่เคยโพสถามใว้นะครับ
ตัว Continuous Forms นั้นเหมือนจะมีอำนาจอยู่ต่ำสุดจึงไม่สามารถอยู่เหนือใครได้ และ Datasheet ยังคงมี + ไม่สามารถซ่อนได้แบบ Continuous อย่างที่ต้องการครับ

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

9
สร้างบ้านก่อนแล้วค่อยให้คนเลือกบ้านที่จะเข้าไปอาศัยครับ
ถ้าจะทั้งสร้างคนและสร้างบ้านไปพร้อมๆกันกลัวว่าจะเลขที่บ้านเดียวกันแต่ดันอยู่คนล่ะหลังนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

10
ห้อง MS Access / : การทำ supertype & subtype
« เมื่อ: 11 มี.ค. 63 , 13:35:17 »
เนื้อหาบทเรียนจากมหาวิทยาลัยบูรพาครับ > https://staff.informatics.buu.ac.th/~komate/886301/DB-Chpater-5.pdf link

อ้างถึง
5.1.5 disjoint constaint และ overlapping constaint
เอ็นทิตี้ supertype หนึ่งๆจะสามารถมีความเกี่ยวเนื่องกับเอ็นทิตี้ subtype ใน 2 รูปแบบ คือ แบบ
disjoint หรือแบบ overlapping ตัวอย่างเช่น ธุรกิจสายการบินทำการว่าจ้างพนักงานในตำแหน่งนักบิน ช่าง
ซ่อมบำรุง และนักบัญชี และมีกฎเกณฑ์ทางธุรกิจที่บ่งบอกว่า “พนักงานคนหนึ่งๆไม่สามารถทำงานในหลายๆ
ตำแหน่งได้” จากกฎเกณฑ์ทางธุรกิจดังกล่าวจะช่วยให้เราสามารถกำหนดลักษณะความสัมพันธ์ระหว่าง
เอ็นทิตี้ supertype และเอ็นทิตี้subtype ได้เป็นแบบ “disjoint subtype” หรือ “nonoverlapping
subtype” ที่ซึ่ง “แถวข้อมูลหนึ่งๆในเอ็นทิตี้ supertype จะสามารถมีความสัมพันธ์กับข้อมูลในเอ็นทิตี้
subtype หนึ่งๆเท่านั้น (ห้ามมีความสัมพันธ์กับหลายเอ็นทิตี้ subtype)” เช่น แถวข้อมูลหนึ่งๆในเอ็นทิตี้
EMPLOYEE จะมีความเกี่ยวเนื่องกับเอ็นทิตี้ PILOT หรือ MECHANIC หรือ ACCOUNTANCE อย่างใดอย่าง
หนึ่งเท่านั้น ..........

หรือตามที่ผมตีความสรุปได้ว่า
Disjoint = บังคับว่าเลือกได้เพียงแค่หนึ่งเช่น เป็นนักเรียนก็เรียนไปห้ามทำหน้าที่อื่น
Overlaping = เลือกได้มากกว่าหนึ่งหรือก็คือเป็นนักเรียนแล้วจะขยันทำอะไรอีกถ้าทำได้ก็ทำไป ^u^
แอบไปหาอ่านเจอมาตอบแทนผู้ตั้งกระทู้  :shout:
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

11
อาจสร้าง 2 เทเบิลเพื่อเก็บข้อมูลชั่วคราวสำหรับ ที่ดินที่เลือกมาทำธุรกรรม และสำหรับ ป้อนที่ดินที่เกิดใหม่หลังจากธุรกรรม แล้วพอคลิก สร้างธุรกรรม ก็เอาข้อมูลเหล่านี้ไปสร้างลงเทเบิลจริงอีกที ส่วนการเขียนโค้ดสำหรับสร้างเรคอร์ด กรณีนี้มีหลายเรคอร์ดและหลายฟิลด์ แนะนำใช้ .AddNew, .Edit และ .Update สำหรับ Recordset ต่างๆที่เกี่ยวข้อง จะดูสะอาดตาดีกว่าเขียน SQL INSERT/UPDATE statement ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

12
อ้างถึง
บ้านเลขที่ ให้เป็นตัวเลขและ มี / ได้
Private Sub txtAddress_KeyPress(KeyAscii As Integer)
If (KeyAscii > 46 And KeyAscii < 58)  Then
      KeyAscii = KeyAscii
      Else:
      KeyAscii = 0
   End If
End Sub

อ้างถึง
3. เบอร์ = ตัวเลข ใน tbl เป็น text

สมมุติ txtPhoneNumber

Private Sub txtPhoneNumber_KeyPress(KeyAscii As Integer)
If (KeyAscii > 47 And KeyAscii < 58) Or (KeyAscii = 8) Then
      KeyAscii = KeyAscii
      Else:
      KeyAscii = 0
   End If
End Sub

จะพิมพ์ได้เฉพาะตัวเลขครับ แต่สามารถใช้ Space Bar ได้ เผื่อว่าต้องการพิมพ์เบอร์ 000 0000000  แบบนี้
อ้างถึง
NameEN = เฉพาะอักษรภาษาอังกฤษ

Private Sub txtWordsEng_KeyPress(KeyAscii As Integer)
If (KeyAscii > 65 And KeyAscii < 90) Or (KeyAscii > 97 And KeyAscii < 122) Then
 KeyAscii = KeyAscii
      Else:
      KeyAscii = 0
End If
End Sub
อ้างถึง
ชื่อไทย = เฉพาะอักษรไทย
Private Sub txtWordsTH_KeyPress(KeyAscii As Integer)
If Not (KeyAscii > 0 And KeyAscii < 32) And Not (KeyAscii > 32 And KeyAscii < 127) Then
 KeyAscii = KeyAscii
      Else:
      KeyAscii = 0
End If
End Sub

สำหรับ ใส่ชื่อไทย กำหนดให้ยอมรับการกด Spacebar ได้เพื่อให้เว้นช่องว่างกรณี มีทั้งชื่อและนามสกุล
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

13
- ที่ถามว่า เข้าใจถูกไหม ถ้าจะใช้ภาษาบ้านๆ ก็พอจะอนุโลมได้ว่าถูกครับ

- DoCmd.RunSQL สามารถอ้างคอนโทรลของฟอร์ม (เท็กซ์บ็อกซ์, คอมโบบ็อกซ์, ...) ได้โดยตรงใน SQL โดยไม่ต้องหาค่าของคอนโทรลเหล่านั้นออกมาแล้วแปลงเป็นเท็กซ์เพื่อสร้าง SQL อีกที เช่นเราสามารถเขียน DoCmd.RunSQL "insert into table1 (field1, field2) values (Forms!Form1!Text1, Forms!Form1!Combobox2)" โดยไม่จำเป็นต้องเขียนเป็น

Dim T1 As  string
Dim T2 as  string

T1 = Forms!Form1!Text1
T2 = Forms!Form1!Combobox2
DoCmd.RunSQL "insert into table1 (field1, field2) values ('" & T1 & "', '" & T2 & "')"

หรือ

DoCmd.RunSQL "insert into table1 (field1, field2) values ('" & Forms!Form1!Text1 & "', '" & Forms!Form1!Combobox2 & "')"

แต่การใช้ DoCmd object จะไม่ถูกควบคุมโดยไลบรารี่ DAO (เหมือน 2 คนทำงานให้สำเร็จเหมือนกันได้ แต่คนละเจ้านาย)
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

14
DAO.Recordset คือการอ้างถึงคลาสที่ชื่อ Recordset ในไลบรารี่ DAO (จะไม่เขียน DAO. ก็ได้ถ้า 1. เราแน่ใจว่าเรามีคลาสชื่อ Recordset และชื่อนี้ไม่ซ้ำกับคลาสอื่นในไลบรารี่ตัวอื่นในระบบเรา หรือ 2.มีซ้ำในไลบรารี่อื่นๆด้วย แต่เราอ้างถึงไลบรารี่ลำดับแรกที่พบ ซึ่งเราก็ต้องมั่นใจด้วยว่าลำดับของไลบรารี่เรียงถูกต้องแล้ว)

Dim RST As DAO.Recordset  เป็นการสร้างตัวแปรออปเจค RST ที่จะมีคุณสมบัติตามคลาส Recordset

CurrentDb.OpenRecordset("tb_newmember") ให้ชุดเรคอร์ดที่ได้จากเทเบิล tb_newmember และเทเบิลนี้อยู่ในฐานข้อมูลที่โค้ดเรากำลังทำงาน

Set RST = CurrentDb.OpenRecordset("tb_newmember") ให้ตัวแปรออปเจค RST ชี้ไปยังชุดเรคอร์ดที่ได้มาจากคำอธิบายข้างบน

RST.AddNew เป็นเมธอดที่บอกให้ระบบรู้ว่าเราต้องการให้เตรียมพื้นที่สำหรับเรคอร์ดใหม่ในชุดเรคอร์ดในตัวแปรออปเจค RST

RST.Update เป็นเมธอดที่สั่งให้ตัวแปรออปเจค RST เขียนเรคอร์ด กรณีนี้คือเรคอร์ดในพื้นที่ ที่ได้จาก RST.AddNew

Set RST = Nothing บอกให้ตัวแปรออปเจค RST เลิกชี้ไปยังออปเจคใดๆที่มันเคยชี้อยู่
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

15
อ้างถึง
การจะกำหนดเงื่อนใขให้ต้องสอบผ่าน ถึงจะได้เป็นสมาชิก ต้องกำหนดอย่างไร

ตรง สถานะคำขอ ว่าจะให้เป็นสมาชิกได้หรือไม่นั้น เช็ค ตรง Field ผลการสอบ จากตาราง สอบ  ว่า "ผ่าน" หรือ "ไม่ผ่านครั้งแรก" หรือ "ไม่ผ่าน"  โดยอ้างอิงจาก ID โดย ใช้ Dlookup ก็ได้ครับ  ถ้าผ่านแล้ว ก็ให้มีการสร้าง ID ในตาราง สมาชิกได้ และสามารถใส่รายละเอียดอื่นๆ ในตารางด้วย ID นั้นได้

ถ้าข้อมูลระบุว่า "ไม่ผ่าน" (ไม่ผ่านรอบสองด้วย) ให้ใส่วันที่สอบไม่ผ่านไว้ด้วย เพื่อ ใช้ในการตรวจสอบ วันที่ ว่าครบกำหนด 1 ปี หรือยังเพื่อที่จะะสมัครได้ในครั้งต่อไป

เรื่อง การลาออก คุณมีฟิลล์ สถานะอยู่แล้ว ให้เพิ่มฟิลล์ วันที่ลาออก / สาเหตุการลาออก ไว้ด้วย
โดย ฟิลล์สถานะนั้น อาจจะมีช้อย "ยังเป็นสมาชิก" หรือ "ลาออก" เป็นต้น
ที่ฟอร์ม ถ้าสมาชิกลาออกก็ให้สามารถระบุ วันที่ลาออก / สาเหตุการลาออก มาเก็บไว้ในตารางได้
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

16
ก็แนะนำไปแล้วไงครับ

ออกแบบตามสายหลักของตระกูล พ่อ > ลูก > หลาน > เหลน > ลื้อ

สามี/ภรรยา ให้เป็นข้อมูลเหมือนกับเบอร์โทร เช่น พ่อมีภรรยาชื่ออะไร ลูกของพ่อนี้มีสามีชื่ออะไร บลาๆๆๆ

เลขบัตร ปชช. ปัญหามันจะมีคั้งแต่ป้อนข้อมูลแล้วครับ
เอาไปทำไม/ เชื่อได้ไหม/ ไม่เห็นต้องใช้เลย/ ปลอดภัยหรือเปล่า...สุดท้ายไม่ให้
ไม่เชื่อคุณลองดูก็ได้นะครับ ผมทำมา 2 ตระกูลใหญ่ๆ แล้ว เจอมาทุกรูปแบบ

ส่วนเรื่องญาติ อา-หลาน อะไรนั่นน่ะ ไม่ต้องไปสนใจ ถ้าคุณวางสายหลักได้ เดี๋ยวเรื่องญาติมันจะมาเอง แล้วคุณจะปวดหัวอีกรอบ เมื่อพบสัมพันธ์ระหว่างญาติห่างๆๆๆ มาแต่งงานกัน ไม่รู้จะนับญาติกันอย่างไร
อีกเรื่องคือ สามี-ภรรยา เป็น 1:1 ไม่ได้ เพราะถ้าเค้าเลิกกันแล้วแต่งงานใหม่ จะทำอย่างไร  ลูกก็มีกับทั้งภรรยาเก่า และภรรยาใหม่ ดังนั้นก็ต้องมีข้อมูลความสัมพันธ์ด้วย เช่น สมรส/หย่า/เสียชีวิต
แล้วถ้า สามีที่มีภรรยาหลายคน จะทำอย่างไร ปี 2019 ผมก็ยังเจอสาแหรกแบบนี้อยู่ครับ

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





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

หน้า: [1] 2