แสดงกระทู้

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 ... 3 4 5 [6] 7 8 9 ... 19
91
ไม่มีทางเพิ่มเกิน 255 ฟิลด์ครับ ให้สร้างอีกเทเบิลที่มีฟิลด์ Primary Key เหมือนเทเบิลแรก และย้ายฟิลด์ส่วนเกินไปไว้เทเบิลที่สองแทน พร้อมกับสร้าง Relationships (ในริบบอน Database Tools) จากเทเบิลแรกไปเทเบิลที่สอง โดยกำหนดให้มี Enforce Referential Integrity, Cascade Update Related Fields และ Cascade Delete Related Fields ด้วย  คุณสมบัติของ Enforce Referential Integrity จะทำให้เมื่อมีการเพิ่มเรคอร์ด เราใส่ข้อมูลลงในฟิลด์ของเทเบิลแรก และเว้นข้อมูลในฟิลด์ของเทเบิลที่ 2 ก็ได้ ก็จะไม่มีเรคอร์ดปรากฏในเทเบิลที่ 2   แต่ถ้าเราใส่ข้อมูลในฟิลด์ของเทเบิลที่ 2 เราจะต้องใส่ข้อมูลอะไรลงในฟิลด์ของเทเบิลแรกด้วย  ส่วนคุณสมบัติ Cascade Update จะทำให้เมื่อมีการแก้ไขค่าในฟิลด์ Primary Key ของเทเบิลแรกแล้ว ค่านั้นจะไปแก้ไขในฟิลด์ Primary Key ของเทเบิลที่ 2 ให้โดยอัตโนมัติ  สุดท้ายคือคุณสมบัติ Cascade Delete จะทำให้เมื่อเราลบเรคอร์ดในเทเบิลแรกแล้ว เรคอร์ดในเทเบิลที่ 2 ที่มีค่า Primary Key เดียวกันก็จะถูกลบโดยอัตโนมัติเช่นกัน

ต่อมาให้สร้าง Query ใน Design View และลากทั้ง 2 เทเบิลนี้มาใส่ (มันจะแสดงเส้น Relationships ออกมาให้ด้วย) แล้วเลือกฟิลด์ที่เป็น * จากทั้ง 2 เทเบิลมาใส่ในคิวรี่

คุณสามารถนำเอา Query ตัวนี้ไปเป็น Record Source ของฟอร์มหรือรายงานที่ต้องการได้

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

92
ลักษณะเดียวกับโพสนี้ https://www.thai-access.com/index.php?topic=905.0
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

93
คิวรี่ไม่ทำงาน แล้วมี error อะไรแสดงออกมาหรือไม่ และอาจทดสอบโดยการสร้างโปรแกรมเล็กๆ พอกดปุ่มบนฟอร์มก็รันคิวรี่ที่อัพเดตค่าอะไรบางค่าลงฐานข้อมูลทดลองไปเลย ดูว่าทำได้หรือไม่

อีกอย่างคือเมื่อปลายปีที่แล้ว ตัวอัพเดตของ Office ก่อให้เกิดปัญหากับตัวคิวรี่ ตอนนี้ทางไมโครซอฟ์ทได้มีตัวแก้ไขออกมาให้แล้ว ลองอ่านที่นี่ดูครับ https://accessexperts.com/blog/2019/11/13/critical-office-update-breaks-access-query-is-corrupt/?fbclid=IwAR1gvYE82pQJmKUW9HFjBbhrYAnBMDmGEmJ3XI-GdEB09wk0vyvS9hTSEyE
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

94
ห้อง MS Access / : รบกวนสอบถาม QR Code ครับ
« เมื่อ: 30 ม.ค. 63 , 12:14:31 »
https://www.thai-access.com/yeadram_view.php?topic_id=5576
โพสต์นี้ได้รับคำขอบคุณจาก: Eik Q Sang

95
นี่มันข้อสอบไม่ใช่หรือ !
โพสต์นี้ได้รับคำขอบคุณจาก: PNR

96
ขอเพิ่มเติมจาก อ. OddyWriter หน่อยครับ

อ้างถึง
แนวทางการออกแบบ Databased ที่ผมทำมานี้ เหมาะสมแล้วหรือไม่? ถ้าไม่ ผมควรจะออกแบบอย่างไรเพื่อให้ได้ตามโจทย์ที่ผมต้องการ?
เท่าที่เห็นตอนนี้
- ในระบบมีเทเบิลที่มี 2 ฟิลด์เยอะทีเดียว บางตัวจำเป็นหรือไม่ อย่างเช่นเทเบิล tblBlood ถ้าเป็นผม ผมจะกำหนดตัวเลือกลงในส่วนของ Lookup tab ของฟิลด์ tblContractor.BloodID ไปเลยว่ามีอะไรให้เลือกบ้าง เพราะ 1)กรุ๊ปเลือดตายตัวอยู่แล้ว มีไม่กี่กรุ๊ป (A, A+, A-, ...)  2)ระบบของเราไม่มีความจำเป็นต้องเก็บรายละเอียดอะไรของกรุ๊ปเลือดนั้นอีก เช่น กรุ๊ปนั้นมีแอนติเจ้น A,B,D หรือเปล่า การแยกเทเบิลออกไปในกรณีนี้ เป็นภาระแก่ระบบที่ต้องมาลิงค์ไปยังเทเบิล tblBlood อีกต่างหาก 3)ถ้าตั้งค่า BloodID เป็นอะไรที่ไม่สื่อความหมาย เช่น ตัวเลข ดังนั้นเวลาเปิดดูเทเบิล tblContractor ก็จะต้องมานั่งนึกอีกว่ามันคือเลือดกรุ๊ปอะไรกันแน่ ส่วนเทเบิลอื่นเช่น tblPlant คุณคิดว่าโรงงานจะสร้างเพิ่ม/เปลี่ยนแปลงบ่อยขนาดไหน ถ้าไม่ เมื่อไหร่ที่มีก็ค่อยมาเพิ่มใน Lookup tab ก็ได้
- เข้าใจว่าฟิลด์ xxxID ในทุกเทเบิลจะเป็น Primary Key แต่เราใช้ฟิลด์อื่นๆที่เหมาะสมกว่าเป็น Primary Key ก็ดีกว่าเพราะมัน unique คือมีค่าเดียวไม่ซ้ำกันอยู่แล้ว เช่น tblContractor เราเป็นบุคคลทั้งหมด เราก็ใช้เลขประจำตัวประชาชน (เข้าใจว่าคือฟิลด์ NationalID) มาใช้แทน
- ในความสัมพันธ์ระหว่างเทเบิล (Database Tools - Relationships) ดูความเหมาะสมว่าควรกำหนด Referential Integrity, Cascade Update, Cascade Delete ด้วยหรือไม่  (ส่วนมากผมกำหนด Referential Integrity)

อ้างถึง
Subform โดยให้เป็น Unbound SubForm
- ไม่รู้ว่าทำไมกำหนดเป็น Unbound  ถ้าจะเป็น Unbound ซึ่งเราต้องควบคุมการเขียนลงเทเบิลอื่นๆอีกที ก็ย้ายเท็กซ์บ็อกซ์และคอนโทรลต่างๆใน Unbound SubForm มาไว้บน MainForm แล้วตีกรอบเพื่อแสดงเป็นนัยว่าเป็นข้อมูลที่แยกต่างหากจาก Session ไปเลยน่าจะดูเรียบง่ายกว่า หรือจะนำมาใส่ใน Tab control บน MainForm อีกที ก็สื่อเป็นหมวดหมู่ดี

อ้างถึง
ซึ่งผมเขียน Expression ที่ txtWorkID โดยเมื่อ Dropdown เลือก NationalID เมื่อไหร่ ระบบจะไปดึง Last WorkID ของพนง.คนนั้น ๆ มาจากtblWork(Transaction Table) มาโชว์ / เกิด Error ใน Subform
- ต้องเอาโค้ดที่ทำการดึงและแปะลงฟิลด์ที่เกิด #Error นั้นมาดูครับ

อ้างถึง
การทำแบบฟอร์มเพื่อคีย์หลักสูตรที่แต่ละตำแหน่งต้องอบรมให้ครบตามกฎหมาย
- ก็ต้องมีเทเบิลหลักสูตร (tbSubject หรือเปล่า ?) ,เทเบิลตำแหน่ง (อันนี้ผมไม่รู้เทเบิลไหน สมมุติชื่อ tbP หรือเป็นแค่ฟิลด์ในเทเบิล tbWork ? สมมุติชื่อฟิลด์ F) และสร้างเทเบิลหลักสูตรที่ต้องอบรม (สมมุติชื่อ tbC) ที่มีทั้งฟิลด์ Primary Key ของเทเบิลหลักสูตรและ Primary Key ของเทเบิลตำแหน่ง(หรือแค่ฟิลด์ F ถ้าคุณไม่ได้มีเทเบิลตำแหน่งแยกออกมาต่างหาก) มานำมาตั้งเป็น Primary Key ของ tbC ดังนั้นคุณก็สร้างฟอร์มที่มี Mainform เป็น tbP และมี Subform เป็น tbC เพื่อป้อนหลักสูตรที่ต้องอบรมตามกฎหมายได้แล้ว

หมายเหตุ : Database ไม่ต้องใส่ d ต่อท้ายครับ
โพสต์นี้ได้รับคำขอบคุณจาก: PNR, Tatchawin

97
ถ้าให้เห็นด้วยว่าใครตอบสุดท้ายก็จะดีครับ จะได้รู้ว่ากระทู้ที่เราตอบมีการเคลื่อนไหวหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy

98
อ้างถึง
1.ใน Form ผมหาผลรวมของ ชุด1 ได้แล้ว แต่ผมรวมมันโดยใช้ text box แต่ไม่รู้ว่าค่าตัวนี้มันไปบันทึกไว้ที่ไหน
Textbox ที่ Control Source อ้างถึงแหล่งข้อมูลอื่นๆนอกจากฟิลด์ในเทเบิล(ไม่รวม Calculated Field) จะไม่สามารถแก้ไขอะไรได้ และไม่ได้มีการบันทึกไว้ที่ไหน เป็นเพียงการแสดงผลเท่านั้น

อ้างถึง
2. ที่report อยากให้มี drop down list ให้เลือกว่าเราจะเลือกตัวไหนมา report ต้องทำอย่างไรครับ
Report แสดงได้อย่างเดียว ไม่มีส่วนให้รับ input จากผู้ใช้ผ่านหน้าของ Report เอง ต้องไปใส่ Listbox/Combo Box ในหน้าฟอร์มอื่นๆก่อนอีกทีนึงหรือจะใส่เอาไว้ในหน้า FACADE INPUT DATA เลยก็ได้ แล้วเมื่อคลิกปุ่มพิมพ์ ก็ค่อยไปแสดงหน้า Report ให้ตรงตามเงื่อนไขที่ได้เลือกไว้ ถ้าใช้เป็นแมโครก็ใช้ OpenReport action แล้วใส่เงื่อนไขในบรรทัด Where Condition หรือถ้าเขียนเป็นโค้ด VBA ก็ใช้คำสั่ง
โค๊ด: [Select]
DoCmd.OpenReport "ชื่อรายงาน", acViewPrint (เพื่อพิมพ์เลย หรือ acViewPreview เพื่อดูก่อนพิมพ์), , "เงื่อนไข"
สำหรับเงื่อนไข ก็จะมีรูปแบบเป็น expression เช่น "ฟิลด์ = Forms![ชื่อฟอร์ม]![ชื่อ Listbox/Combo Box]" เป็นต้น
หรือลองค้นกระทู้เก่าด้วยคำว่า OpenReport ก็จะเห็นเยอะแยะครับ

อ้างถึง
1.table คือสำหรับสร้างฐานข้อมูล input data
ใช่

อ้างถึง
2. qry เอา input มาจัดเรียงและสร้างการคำนวนผลของ input data เพื่อทำ form
เราสามารถเอาเทเบิลต่างๆที่มีความสัมพันธ์กัน มาเชื่อมโยงกัน(เหมือน Lookup ไปชีทอื่นใน Excel) แล้วเลือกเอาเฉพาะฟิลด์ที่เราสนใจจากเทเบิลเหล่านั้นออกมา หรือเอามาคำนวน แล้วจะเอาคิวรี่มาเป็นแหล่งข้อมูลของ Form, Report, Recordset หรือเอามาแสดงด้วยตัวมันเองเลยก็ได้

อ้างถึง
3. form เพื่อให้หน้าตาในการ input data ง่ายและสะดวกในการใช้งาน
จะว่าอย่างงั้นก็ได้ครับ อีกอย่างคือเพื่อไม่ให้ผู้ใช้เข้าไปถึงแหล่งข้อมูลทั้งหมดเอง

อ้างถึง
4. report เพื่อแสดงรายการที่ต้องให้แสดงและ print
ใช่ครับ

เพิ่มเติม : Access เป็นโปรแกรมประเภท ระบบจัดการฐานข้อมูล (Database Management System, DBMS) แบบคุณสมบัติปานกลาง หลักการที่สำคัญของ DBMS ก็คือจะมีคุณสมบัติ ACID ลองอ่าน https://www.thai-access.com/yeadram_view.php?topic_id=272
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

99
เปิดฟอร์มใน Design View > กด F4 เพื่อเปิด Property Sheet > เลือก Form ในช่อง Selection Type > คลิกที่แทป Event > เลือก [Event Procedure] ในบรรทัด On Current > คลิปปุ่ม ... ที่อยู่ท้ายบรรทัด > จะเห็น VBA Editor > เอาโค้ดตั้งแต่บรรทัด Dim ... จนถึง End If บรรทัดสุดท้ายใส่ลงใน Private Sub Form_Current()
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

100
หลักการคือ พอขึ้นเรคอร์ดใหม่ปั๊ป ก็เอา "กล่องเป้าหมาย" ของบรรทัดสุดท้ายมาใส่พร้อมบันทึกเรคอร์ดครับ ก็ใส่โค้ดนี้ลงไปใน Form_Current event procedure

โค๊ด: [Select]
Private Sub Form_Current()

    Dim RS As DAO.Recordset
   
    If Me.NewRecord Then
        Set RS = Me.RecordsetClone
        If RS.RecordCount > 0 Then
            RS.MoveLast
            If Not IsNull(RS("ชื่อฟิลด์กล่องเป้าหมาย")) Then
                Me.ชื่อเท็กซ์บ็อกซ์กล่องเป้าหมาย = RS("ชื่อฟิลด์กล่องเป้าหมาย")
                DoCmd.RunCommand acCmdSaveRecord
            End If
        End If
        RS.Close
    End If
           
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, isuccess

101
- ศึกษาระบบ VPN หรือไม่ก็ไปใช้ระบบ Dynamic DNS จากด้านบนครับ

ลูกค้าผมเคยเปิด VPN ให้ผมใช้ ลิงค์จาก Front-End ที่เครื่องผมที่บ้านไปยัง Back-End (.mdb) บนเครื่องลูกค้าปลายทางในต่างจังหวัด เร็วในระดับดีใช้ได้ แต่ค่าใช้จ่ายการทำ VPN คงสูงทีเดียว

แล้วขอสอบถามเพิ่มเติมว่า Router ทุกยี่ห้อจะมีให้ติดตั้ง Dynamic DNS ไหมครับ แล้วเมื่อ IP ของ Router เองเปลี่ยน มันจะส่งข้อมูลการเปลี่ยนแปลงนี้เพื่อไปอัพเดตที่ DDNS Service เองใช่ไหมครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Kxess

102
ขอแทรกหน่อยครับ ดูแล้วเหมือนว่า TerminatedDate จะขึ้นกับ Contractor เพียงอย่างเดียว ไม่ได้ขึ้นกับ WorkID เลย ดังนั้น TerminatedDate ควรไปอยู่ในเทเบิลของ Contractor มากกว่าหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: oong2521, PNR, Tatchawin, Somsak472

103
ห้อง MS Access / : โปรแกรม Access error Query " is corrupt
« เมื่อ: 21 พ.ย. 62 , 11:37:20 »
ลิงค์ที่ให้มาคือตัวที่ก่อให้เกิดปัญหาไม่ใช่หรือ ไม่ใช่ตัวแก้ปัญหา ยกเว้นใน Office 2016 ที่มีลิงค์ไปหาตัวแก้ปัญหาอีกที แต่ก็ต้องไม่ใช่ Office ประเภท Click-To-Run ด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

104
ผมไม่ค่อยแน่ใจถึงสิ่งที่ต้องการ  แต่เอาเป็นว่า ถ้าต้องรวมตาม [place] และ [product] เดียวกัน ก็แก้ส่วน sum โดยเพิ่มเงื่อนไข and เข้าไปในส่วนของ where ตามโค้ดข้างล่างนี้ แต่ถ้าต้องมีเงื่อนไขฟิลด์อื่นเพิ่มเติม ก็ทำในลักษณะเดียวกัน คือเพิ่ม and เข้าไปอีกครับ

select T1.*,(select sum(T3.Inboxes) from [In] as T3 where (T3.place = T1.place) and (T3.product = T1.product)) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)

ยังไงก็ทดสอบผลลัพธ์กับข้อมูลเยอะๆ เพื่อดูว่าถูกต้องหรือไม่ด้วย
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

105
เปลี่ยนโหมดคิวรี่จาก Design View ไปเป็น SQL View แล้วเขียนคำสั่งนี้ลงไปแทนครับ

select T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

107
ผมคิดว่าขึ้นกับ ODBC Setup File ตัวนั้นมากกว่า ว่ารองรับ command line ในการติดตั้งหรือไม่ เพราะฐานข้อมูลแต่ละยี่ห้อก็สร้าง ODBC Setup File ของตัวเองขึ้นมา การติดตั้งก็ไม่จำเป็นต้องรองรับ command line เสมอไป (แต่มันควรจะมี) ถ้ามี เราก็อาจทำง่ายๆคือสร้าง .bat, .cmd ไฟล์ที่ก็อปปี้ไฟล์ .accd* ของเราไปโฟลเดอร์ปลายทางและรัน ODBC Setup File โดยใช้ command line parameters  หรือถ้ามีเงื่อนไขการติดตั้งระบบของเรามากกว่านี้ ก็ต้องไปหาโปรแกรมพวก Packaging Solution เพื่อสร้างไฟล์ติดตั้ง (ไฟล์ .msi)   สำหรับ Access 2007, 2010 รู้สึกว่าจะมี Package Solution Wizard มาให้ในชุดติดตั้ง Access ครับ หรือในนี้ก็มี https://download.cnet.com/Access-2007-Download-Access-Developer-Extensions/3000-2070_4-10728244.html แต่ผมไม่เคยใช้นะครับ ต้องไปลองเอง
โพสต์นี้ได้รับคำขอบคุณจาก: ก่องก้อง เองนะคร๊าป

108
ห้อง MS Access / : การ Split database
« เมื่อ: 13 พ.ย. 62 , 09:01:51 »
ตามข้อกำหนดของ Access บอกว่าสามารถมีการใช้ไฟล์ฐานข้อมูลหนึ่งๆได้พร้อมๆกันที่ 255 หรือ 256 คนนี่แหล่ะครับ ส่วนที่เคยเจอก็ 20 กว่าคนพร้อมๆกัน
โพสต์นี้ได้รับคำขอบคุณจาก: Mercury

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