แสดงกระทู้

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

หน้า: 1 ... 6 7 8 [9]
145
จะไม่บันทึกข้อมูลในเมนฟอร์มถ้าไม่มีข้อมูลในซับฟอร์ม มันค้านกับการทำงานของ Access ครับ แนวคิดที่อาจทำได้ (ไม่รู้ว่าจะเกิดปัญหาอะไรหรือเปล่า เพราะไม่เคยทำ) ก็คือได้แค่กระโดดกลับมายัง PO เลขนั้นเท่านั้น โดยทุกครั้งที่สร้างเรคอร์ดใหม่บนเมนฟอร์ม หรือลบเรคอร์ดในซับฟอร์ม ก็จะเกิด AfterUpdate event บนเมนฟอร์มและ AfterDelConfirm event บนซับฟอร์มตามลำดับ ให้เขียนโค้ดเพื่อเก็บเลขที่ PO เอาไว้ในตัวแปรระดับโมดูล พอไปเรคอร์ดอื่น ซึ่งจะเกิด OnCurrent event บนเมนฟอร์ม ก็ให้เช็คว่าถ้า PO มีค่าและไม่มีเรคอร์ดใน POD ที่มีเลข PO เดียวกันกับที่เก็บไว้ ก็ให้กระโดดกลับไป แต่ถ้ามีแล้ว ก็ให้เคลียร์ตัวแปรนั้นทิ้ง โปรแกรมจะได้ไม่ต้องมาทดสอบ POD ตลอดเวลาครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

146
Docmd.RunSQL "DELETE POD.* FROM POD WHERE POD.PONumber = '" & Me.PONumber & "'"
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

147
Private Function FilterOut()
Dim stCriteria As String

stCriteria = IIf(IsNull(Me.[Style No.]), "", "[Style No.] = '" & Me.[Style No.] & "' AND ") & _
                 IIf(IsNull(Me.Buyer), "", "[Buyer] = '" & Me.Buyer & "' AND ") & _
                 IIf(IsNull(Me.[OD#]), "", "[OD#] = '" & Me.[OD#] & "' AND ") & _
                 IIf(IsNull(Me.Currency), "", "[Currency] = '" & Me.[Currency] & "' AND ") & True

Me.SubFormName.Form.Filter = stCriteria
Me.SubFormName.Form.FilterOn = True

End Function

ใน Combobox ทุกอันในช่อง AfterUpdate ให้ใส่ = FilterOut() หรือจะ call FilterOut ใน Sub AfterUpdate event ก็ได้

ปล. พวกชื่อฟิลด์หรือคอนโทรลต่างๆ ให้ตรวจสอบกับชื่อที่ใช้จริงก่อนนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

148
ถ้าเปิดฟอร์มในมุมมอง Datasheet สามารถกำหนด Filter ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

149
ตามที่คุณ PookPuy ตอบมาเลยครับ กรณีที่มี combobox แล้วตัว combobox มีการ populate data มาจากตารางที่ต้องการอยู่แล้ว แล้วจะกำหนดให้ฟิลด์อื่นๆมีค่าตาม data ใน combobox ก็แค่เพียงกำหนดให้ฟิลด์นั้นมีค่าเท่ากับ column(0), column(1), column(2)...โดยที่ไม่ได้ต้องไป dlookup ข้อมูลในตารางอีก แต่ผมแนะนำผูกไว้กับ AfterUpdate event

Private Sub StyleNo_AfterUpdate()
       OD#.Value = StyleNo.Column(1)
       Customers.Value = StyleNo.Column(2)
       QtyOrder.Value = StyleNo.Column(3)
End Sub

ปล. ทำไมถึงไม่ bound Table หรือ Query ไว้กับฟอร์มเลย จะได้ให้ Access มันใส่ค่าให้อัตโนมัติ (หรือต้องการเขียนเผื่อสำหรับ upsize ไป MS SQL)
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

150
ต้องอธิบายอย่างนี้นะครับ บางครั้งการใช้ Query นั้น บางครั้งสามารถจัดการอะไรๆ ในฟอร์มได้ดีกว่า VBA ดังนั้นอยากจะบอกว่า เพียง Query ก็ได้อย่างที่ต้องการแล้วครับ

จาก Combo Box ที่คุณสร้างนั้น ถ้าเป็นผมจะใส่ ID ให้แต่ละเรคอร์ด เพราะ Access นั้นแยกไม่ออกหรอกครับว่า GAGIU ที่เราต้องการนั้นคืออันไหน เค้าเจออันไหนก่อนเค้าก็หยิบอันนั้นมาแสดงผลทันที

การแก้ไขง่ายมากครับ
1. กำหนดให้แต่ละเรคอร์ดมี ID ของตัวเอง
2. นำข้อมูลมาใส่ใน Row Source ของ Combo Box โดยใส่ ID เข้าไปด้วย
3. กำหนด Column Width ของ Row Source ตามที่เราต้องการ โดยกำหนดให้ Column Width ของ ID เป็น 0
เช่น เรานำฟิลด์มาใช้ 3 ฟิลด์คือ ID, Desc,Date เราก็กำหนด Column Width เป็น 0,1,1 อะไรงี้
4. จากข้อ 3 ให้กำหนด Bound Column เป็น 1 เพื่อนำไปใช้งาน

ส่วนช่องอื่นๆ คุณก็ไม่จำเป็นต้องเขียน Code ใน AfterUpdate เลยครับ แค่เอา Dlookup ไปใส่ใน Control Source โดยกำหนด Criteria ของ Dlookup ให้เทียบค่ากับ Combo Box ครับ

ด้วยวิธีนี้ การทำงานจะเร็วกว่า เพราะ Dlookup ทำงานเองโดยตรง ไม่ต้องผ่าน VBA แล้วเอาค่าจะ VBA มาใส่ใน Text Box
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

151
ลองเปลี่ยนเป็นใช้วิธีส่งค่าจากที่เลือกไปยังกล่องข้อความดูครับ
โค๊ด: [Select]
Private Sub StyleNo_Click()
       OD#.Value = StyleNo.Column(1)
       Customers.Value = StyleNo.Column(2)
       QtyOrder.Value = StyleNo.Column(3)
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

152
ห้อง MS Access / > รบกวนสอบถามครับ
« เมื่อ: 26 ก.พ. 61 , 18:27:28 »


สร้างคิวรี แล้วเพิ่ม Expression แบบเดียวกับ subform

เปลียน datasource ของ subform จาก table เป็้น query ที่เราเพิ่งสร้าง

เปลี่ยน control source ของ text box เป็น expression ที่เราใส่เข้าไปในคิวรี
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

153
ห้อง MS Access / > รบกวนสอบถามครับ
« เมื่อ: 24 ก.พ. 61 , 17:14:53 »
ใช้วิธีการเดียวกันครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

154
ดับเบิ้ลคลิกขึ้นมาแล้วแก้ไขรายการ ผมใช้วิธีนี้อยู่ ลองนำไปปรับใช้ดูนะครับ
Private Sub ชื่อText Box_DblClick
Dim stLinkCriteria As String
stLinkCriteria = "[ชื่อText Box1]=" & "'" & Me![ชื่อText Box2] & "'"
DoCmd.OpenForm "ชื่อฟอร์มที่จะให้เปิดขึ้นมา", , , stLinkCriteria
End Sub

หรือสร้างปุ่มขึ้นมา1ปุ่ม
1เลือก Action เป็นOpen Form
2เลือกชื่อฟอร์มที่จะเปิดขึ้นมา
3เลือก เปิดฟอร์มพร้อมกับค้นหาข้อมูลที่แสดง(Open the form and find specific data to display)
4เลือก Text Box ด้านซ้าย และเลือก Text Box ด้านขวา
5คลิกปุ่มสัญลักษณ์ <-> ที่อยู่ตรงกลางระหว่าง2ช่องตามข้อ4

6คลิกNext 2ครั้งแล้ว คลิก Finish
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

155
1. สร้างตารางใหม่ 1 ตาราง ชื่อ tblLog เพื่อเก็บ Log การ Login เข้าใช้งาน
2. ในตาราง tblLog มีฟิลด์ LogName,LogTime
3. ใส่ข้อมูล Initial ให้ตาราง tblLog
4. แทรกบรรทัด "ก่อน" DoCmd.OpenForm "Main form"
5. เรื่องมันยาว ดูตัวอย่างไฟล์เองละกัน

https://www.dropbox.com/s/xu4b2ziskfnmo82/LoginSystem.accdb?dl=0
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

156
พวกชื่อ Object ต่างๆใน Access พวก Form, Report, Table, Query, Control ผมแนะนำให้ใช้ภาษาอังกฤษและไม่มีเว้นวรรคหรือสัญลักษณ์ต่างๆ (ยกเว้น _ ) ในชื่อ Object เหล่านี้ครับ

ถ้าจำเป็นต้องมีเว้นวรรคหรือสัญลักษณ์ในชื่อ เวลาจะเขียน VBA เพื่ออ้างอิง Object เหล่านี้จะต้องมี [ ] คร่อมชื่อเอาไว้เพื่อให้ Access รู้ว่ามันเป็นชื่อของ Object ไม่งั้น Access จะตีความสัญลักษณ์เหล่านั้นตามความหมายที่มันมี ดังนั้นหลีกเลี่ยงการตั้งชื่อที่มีเว้นวรรคหรือสัญลักษณ์ต่างๆจะดีที่สุด จะได้ไม่ต้องพะวงมาคอยใส่ [ ] ตอนเขียน code หรือ SQL ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

157
ต้องมีทั้งชื่อฟอร์มหลักและชื่อฟอร์มย่อยตามอ.pizza_p บอกครับ
หรือตามตัวอย่างของผมลองปรับใช้ดูครับ
Forms("รับสินค้าเข้าคลัง").ฟอร์มย่อยรับสินค้า.Form.Item = Me.Item
DoCmd.Close

ขยายความ
รับสินค้าเข้าคลัง=ชื่่อฟอร์มหลัก
ฟอร์มย่อยรับสินค้า=ชื่อฟอร์มย่อย
Itemตัวที่1=ชื่อText Box ในฟอร์มย่อย
Itemตัวที่2=ชื่อText Boxในฟอร์มที่ต้องการเลือกข้อมูล
ลองดูนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

158
--ก็จะมีฟิวด์ที่ชื่อ pict ไว้เก็บข้อมูลรูปของแต่ละ style อยู่แล้ว
ถ้าอันนี้หมายถึงฟิลด์นั้นเก็บ path ของรูปไว้ เช่น D:\pict\abc.jpg คุณก็ให้แสดงรูปได้โดยกำหนดว่า

Dim mypict As String

mypict = Nz(DLookup("pict","Production","เงื่อนไขที่กำหนด style no."))
Me.ชื่อImageControl.Picture = mypict
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

159
ถ้าหมายถึงการ filter หลาย filter มากกว่า 2 ขึ้นไป

ผมเขียนโค้ด

โค๊ด: [Select]
Function FilterCheck()
    Dim strWhere As String

    If Not IsNull(ชื่อคอมโบ1) Then
            strWhere = strWhere & "[ฟิลด์ที่1] = " & ชื่อคอมโบ1 & " AND "
    End If
               
    If Not IsNull(ชื่อคอมโบ2) Then
            strWhere = strWhere & "[ฟิลด์ที่2] = '" & ชื่อคอมโบ2 & "' AND "
               
    End If
   
    If Not IsNull(strWhere) Then
            strWhere = Left(strWhere, Len(strWhere) - 5)
            Me.Filter = strWhere
            Me.FilterOn = True
            Me.Requery
    Else
            Me.FilterOn = False
    End If
   
   
End Function

เวลาใช้ เรียก Call FilterCheck ในเหตุการณ์ on change ของ combo box
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

หน้า: 1 ... 6 7 8 [9]