แสดงกระทู้

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 - isuccess

หน้า: [1]
1
ปัญหานี้เกิดจากเรื่องของ Relationship ครับ
ถ้าเป็นแบบ 1:1 จะไม่เกิดปัญหาอะไรในการเพิ่มตารางเข้าไปในคิวรี

ถ้าเป็น 1:N ก็ยังพอทำได้อยู่

ถ้า M:N ก็จะเป็นแบบที่คุณเจออยู่ตอนนี้

แนะนำว่าควรทำ Normalization ก่อนครับ
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

2
อ้างถึง
มาวันนี้ผมแก้ไข Table ใหม่ โดยแยกข้อมูล company ออกจาก User

Table ใหม่ ID_CompanyUser น่าจะต้องมี Primary Key เพราะมันน่าจะไม่ซ้ำกัน

ลองดูแบบนี้ก่อนถ้าไม่ได้เดี่ยวลองวิธีใหม่
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

3
อ้างถึง
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

4
นำไปใช้ได้ผล(เพิ่มเติมตรงหากมีการใส่ค่าลำดับให้ส่งค่ามา)ขอบคุณครับผม :love:



ขอโทษด้วยน่ะครับ ผมมือใหม่มากกกครับ
คือไม่ทราบว่า โค้ดชุดนี้เอาไปวางไว้ตรงไหน ของ Form_Current event procedure ครับ
ขอบพระคุณครับ

ภาพตัวอย่างตาม อ.สันติสุข เลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

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

6
หลักการคือ พอขึ้นเรคอร์ดใหม่ปั๊ป ก็เอา "กล่องเป้าหมาย" ของบรรทัดสุดท้ายมาใส่พร้อมบันทึกเรคอร์ดครับ ก็ใส่โค้ดนี้ลงไปใน 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
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

7
ข้อมูล แถวของคอมโบบ๊อกของคุณ มี 2 คอลัมน์ใช่ไหม
ไปกำหนด ตรงนี้ จาก 2 เป็น 1 ได้เลยครับ


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

8
ผมมีตัวอย่างให้ดูคือ
1.การกำหนด Head Group ของรหัสใบสั่งซื้อ กำหนดส่วนหัวของกลุ่ม ไว้ตรงส่วนนี้ ส่วนรายละเอียดต่างๆ ไว้ส่วน detail



2.Head Group ของรหัสใบสั่งซื้อ กำหนดส่วนหัวของกลุ่ม ต้องกำหนด
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

9
แก้เป็น

โค๊ด: [Select]
A: Replace(Replace([ShipToAddress1],Chr(13) & Chr(10),""),Chr(10),"")
หรือ
ถ้าต้องการช่องว่างระหว่าง ข้อความ
โค๊ด: [Select]
A: Replace(Replace([ShipToAddress1],Chr(13) & Chr(10)," "),Chr(10)," ")


หรือ แบบนี้ก็ได้เหมือนกันครับ
โค๊ด: [Select]
A: Replace([ShipToAddress1],Chr(10)," ")
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

10
ลองแบบนี้ในคิวรี่นะครับ

ShipToAdderss: Replace([ShipToAdderss1],Chr(13) & Chr(10),"")

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

11
ProductID ของสินค้าดูจากตาราง Product ของคุณนะครับ
เช่น If IsNull(Me.ProductID) Then
Me.ProductID = "1KA1"
Me.Product_name = Me.ProductID.Column(1)
Me.UnitPriceD = Me.ProductID.Column(2)


 "1KA1" คือรหัสของ กพ. / หมูสับ / 35 บาท เป็นต้นครับ
PrimaryKey ของคุณคือช่อง Barcode ครับ เวลาจะอ้าง ProductID ก็เอามาจาก Field นี้ได้เลย

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

12
ใช่ครับ     ผมแนบ ภาพที่เป็น ไฟล์ pdf ไว้ด้วยนะครับ (พอดีมือใหม่หัดเขียน ไว้ใช้งานที่ร้านนะครับ)
ลองดูตัวอย่างนี้คับ
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

13
ใส่ Criteria ของ Type ไปว่า
IS NOT NULL



ตรงอ้างอิงผิดด้วยครับ
RunID: RunNumber([Type])

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

14
ขอโทษด้วยครับ ลืมบอกไปว่า ฟิลด์ SizePP ในตาราง PricePP มีค่าซ้ำกัน จะต้องทำยังไงครับ
ทำได้ครับแต่ต้องเพิ่มคำสั่งซะหน่อยประมาณนี้ครับ
บน Module
โค๊ด: [Select]
Global sNumber As Long
Global lastcall As Date
Function RunNumber(i) As Long
 If Now - lastcall > 1 / 60 / 60 / 24 Then
        lastcall = Now
        sNumber = 0
        End If
    sNumber = sNumber + 1
    RunNumber = sNumber
    End Function

ส่วนที่ตัว Query
ใส่ RunID: RunNumber([ชื่อฟิลล์ที่จะนับ])

ผลที่ได้

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

15
ribbon menu มันสามารถ custom หรือสร้างขึ้นมาได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

16
โปรแกรมสำเร็จรูปพร้อมใช้งาน เขาก็เขียนให้ซ้อนเมนูไม่ต้องแสดงออกมาให้คนใช้ไปกดเล่นนะครับ :shout:
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

17
เรื่องวุ่นๆ ของออบเจ็กต์และคอนโทรล

สมัยเรียน OOP (Object-Oriented Programming) รู้สึกตัวเองได้เปรียบเพื่อนร่วมชั้นตรงที่ใช้ Access มาก่อนชาวบ้าน เพราะถูกสอนจาก Microsoft ว่า Access น่ะ เป็นโปรแกรมที่ใช้ระบบ OOP
แต่พอเรียน OOP จริงๆ ไม่รู้ทำไมความเชื่อต่างๆ มันค่อย “แฟบ” ลงเรื่อยๆ เพราะยิ่งรู้มาก ก็ยิ่งรู้สึกว่า Access นั้นไม่ใช่ OOP แบบเต็มร้อย แต่ก็ถือว่า “เกือบ” ล่ะ อีกนิดเดียวก็ OOP แล้ว
อธิบายมากไปเดี๋ยวเผลอหยิบเรื่องเครียดมาเล่า ใครอยากรู้ว่า OOP เป็นอย่างไรไปถามอากู๋เอาเอง แต่เลือกเว็บที่น่าเชื่อถือหน่อยนะครับ พวกสถานศึกษาอะไรงี้
เรามาว่าเรื่อง Access กันดีกว่า
ถ้าใครศึกษา Access อย่างจริงจังย่อมหนีไม่พ้นที่จะเจอคำว่า “ออบเจ็กต์” และ “คอนโทรล” อย่างแน่นอน เพราะ Access นั้นถูกออกแบบมาด้วยเทคโนโลยีที่ล้ำกว่า Excel
เรียกว่า Excel นั้นว่าฉลาดแล้วก็จริง เพราะใช้เทคโนโลยีแบบ Neuro ในการออกแบบในสมัยแรกๆ พอมาสมัยหลังๆ ก็เอา XML มาใส่ จนกลายเป็น Excel ฉลาดๆ แบบปัจจุบัน แต่ Access มีมากกว่านั้นครับ คือใส่พวก Database Engine ระดับ OOP เข้าไป ถึงจะใส่ได้ไม่หมดก็เถอะ (แต่ไหงไม่เก่งภาษาไทยก็ไม่รู้)

คราวนี้พอแตะ OOP เข้าไป ก็หลีกไม่ได้ที่เวลาเขียนโค้ด หรือสั่งงานจะมีเรื่องของออบเจ็กต์เข้าไปด้วย
วิธีการมองคือทุกสิ่งอย่างที่เราเห็นได้ด้วยตาในหน้าจอ แบบนี้คือออบเจ็กต์ไม่ว่าจะเป็นตาราง ฟอร์ม รีพอร์ต ฯลฯ ล้วนเป็นออบเจ็กต์
แม้กระทั่ง Text Box, Combo Box อะไรพวกนี้ก็เป็นออบเจ็กต์ครับ
แต่ทีนี้ออบเจ็กต์พวก Text Box, Combo Box นี่ต้องวางอยู่บนออบเจ็กต์พวก ฟอร์มหรือรีพอร์ต
การจะเรียกว่าออบเจ็กต์อาจสร้างความสับสนให้ผู้ใช้งานได้ เขาก็เลยเรียก ออบเจ็กต์พวกที่ต้องวางอยู่บนออบเจ็กต์ว่า “คอนโทรล”
ดังนั้นเวลาพูดถึง “คอนโทรล” ก็จะหมายถึงออบเจ็กต์ที่วางอยู่บนออบเจ็กต์อีกที
แล้วเรื่องพวกนี้ก็เลยติดมาที่การเขียน Code ด้วย ถึงแม้ VBA ของ Access จะอิงกับ VB6 ก็เถอะ
เช่น
Form_frmData.txtDescription.Visible = False
Form_frmData เป็นออบเจ็กต์ประเภทฟอร์มชื่อ frmData
txtDescription เป็นคอนโทรลที่วางอยู่บนฟอร์มนี้
Visible คือ Property หรือคุณสมบัติของคอนโทรล ที่กำหนดให้มีค่าเป็น False
ทีนี้เราก็สามารถแยก “คอนโทรล” กับ “ออบเจ็กต์” ออกจากกันได้แล้วนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: isuccess

18
ดยส่วนตัว ผมเป็นคนที่เกลียดเรื่องภาษามาตั้งแต่เด็ก ไม่ว่าจะภาษาไทย ภาษาอังกฤษ สังคม ประวัติศาสตร์ เป็นอะไรที่ต้องใช้ภาษาเยอะๆ นี่อย่าได้หวังว่าจะหันไปเหลียวแลเลยแม้แต่น้อย
วิชาที่ชอบที่สุดคือคณิตศาสตร์กับฟิสิกส์
ไม่รู้ว่าโชคดีหรือโชคร้ายที่เริ่มต้นชีวิตการทำงานในบริษัทฝรั่งที่ทุกอย่างภายในองค์กรเป็นภาษาอังกฤษล้วน ขนาดคีย์บอร์ดคอมพิวเตอร์ยังไม่มีภาษาไทยให้เลย เวลาจะพิมพ์ภาษาไทยทีนี่เป็นเรื่องน่าปวดหัวมาก
แล้วผมก็เริ่มใช้ Access ที่นี่แหละครับ เริ่มที่ Access 2.0 โดยตอนนั้นไม่มีความรู้เรื่อง Access เลย เห็นชื่อคล้าย Excel ก็เลยรับอาสาจะทำฐานข้อมูลให้
พอเปิดโปรแกรม Access ครั้งแรกเท่านั้นแหละ ปิดโปรแกรมแล้วนั่งทำใจอยู่ 2 วัน ก่อนไปหาหนังสือเกี่ยวกับ Access มานั่งอ่านอยู่เป็นอาทิตย์ กว่าจะได้ฐานข้อมูลที่เจ้านายต้องการออกมาก็เป็นเดือน
แล้วผมก็ตกหลุมรัก Access เข้าเต็มเปา
อ้าว! เล่าเรื่องส่วนตัวเยอะไปแล้ว ดึงกลับมาเข้าเรื่องของเราดีกว่า
บ่อยครั้งที่ผมได้รับไฟล์จากใครหลายคนส่งมาให้ผมช่วยเหลือ แล้วพบว่ามีการตั้งชื่อออบเจ็กต์และคอนโทรลเป็นภาษาไทย ซึ่งผมได้แต่แนะนำไปว่าอย่าใช้ภาษาไทยใน Access ก็เชื่อบ้างไม่เชื่อบ้าง
และนี่คือประสบการณ์ตรง เกิดจริง เจ็บจริง อันเกิดจากการใช้ภาษาไทยใน Access ครับ

เรื่องแรก ขัดขาตัวเอง
หลังจากศึกษา Access จนมั่นใจว่าเชี่ยวชาญในระดับนึง เพราะได้อาจารย์หลายท่านช่วยสั่งสอน ช่วงนั้นมีชื่อเสียงโด่งดังถึงขนาด บ.ไมโครซอฟต์ โทรมาหาเพื่อให้ไปเป็นวิทยากรให้เขา ก็เริ่มใช้ภาษาไทยในการตั้งชื่อออบเจ็กต์ต่างๆ จนกระทั่งพบว่า ภาษาไทยเป็นภาษาที่มี 5 ระดับ คือมีพยัญชนะ สระ วรรณยุกต์ ได้ 5 ชั้น แล้ว Access ก็ใช่ว่าจะเก่งภาษาไทยอะไรนักหนา บางครั้งภาษาไทยเหมือนกันเป๊ะ แต่พิมพ์ด้วยขั้นตอนต่างกัน Access ก็ไม่สามารถจัดการได้ ยิ่งเขียน VBA ยิ่งเละกันเข้าไปใหญ่ โดยที่เราเองก็ไม่รู้มันผิดตรงไหน แก้อย่างไรก็แก้ไม่ได้ แถม Access สมัยก่อน เวลาแก้ชื่อออบเจ็กต์แล้วก็ยังต้องไปตามแก้ในฟอร์ม ในรีพอร์ต ในรายงาน ปวดหัวมาก
ไม่เชื่อลองพิมพ์คำว่า “ปู่ปู่” เป็นชื่อตารางดูสิครับ ให้ ไม้เอกมาก่อนสระอู และสระอูมาก่อนไม้เอก Access จะแสดงเหมือนกันทั้งคู่ แล้วอย่างนี้เราจะไว้ใจภาษาไทยใน Access ได้อย่างไร

เรื่องที่ 2 ภาษาไทยกับคอนโทรลใน Access
เรื่องนี้เกิดจากมีบริษัทการเงินแห่งนึง เอาโปรแกรมฐานข้อมูลที่เปิดไม่ได้มาให้ช่วยแก้ไข Bug ให้ที สิ่งที่เจอคือชื่อคอนโทรลทั้งหมดเป็นภาษาไทย ด้วยเหตุแห่งชาตินิยม ดังนั้นจึงตั้งชื่อคอนโทรลเป็นภาษาไทยเพื่อให้สามารถทำการแก้ไขคำสั่งได้ง่าย และดูเหมือนโปรแกรมไม่มีปัญหาอะไร จนกระทั่ง Access 97 มาถึง แล้วทุกสิ่งก็เปลี่ยนไป เมื่อโปรแกรมเปิดมาแล้วเจอ Bug มากมายมหาศาล

เรื่องที่ 3 โปรแกรมจัดการตารางบินที่ตั้งชื่อ Sub เป็นภาษาไทย
เรื่องนี้ก็เกิดกับบริษัทเกี่ยวกับธุรกิจการบินขนาดเล็กที่ใช้ Access ในการเก็บจำนวนชั่วโมงบินของนักบิน หลังจาก Access ถูกเปลี่ยน Version เป็น 2013 แล้วฝันร้ายก็มาเยือน เพราะการทำงานทุกอย่างดูติดขัดไปหมด แถมการคำนวณจำนวนชั่วโมงก็เพี๊ยนไม่เป็นท่า พอส่งโปรแกรมมาให้ผมแก้ไขก็พบว่า ภาษาไทยที่เคยมีอยู่ กลายเป็น ?????? (ใครใช้ Access นานๆ น่าจะเคยเจอเจ้านี่ ? มหาภัย) กว่าจะไล่แก้ไขได้ก็เป็นเดือนครับ

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

หน้า: [1]