แสดงกระทู้

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 ... 8 9 10 [11] 12 13 14 ... 29
182
from sale_H ไม่ใช่ form sale_H

183
กรณีที่ต้องการใส่เงื่อนไขให้คิวรี่ วิธีนึงคือให้บรรทัด 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 ว่างๆไว้ดีกว่าครับ (ซึ่งมันจะถูกเติมในโค้ดข้างบน)


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

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

185
ถ้าหมายถึงเมื่อเปิดฟอร์มมา จะให้คอมโบบ็อกซ์แสดงปีหลายๆปี ตย.เช่นแสดง 1 ปีย้อนหลังและปีปัจจุบัน ก็ให้กำหนด RowSourceType property ของคอมโบบ็อกซ์เป็น Value List แล้วใส่โค้ดใน Form Load event procedure เป็น

Private Sub Form_Load()
    Me.ชื่อคอมโบบ็อกซ์.RowSource = Year(Date) & ";" & Year(Date) - 1
End Sub

186
ผมขอเสนอวิธีเขียนโค้ดที่รวม 2 เงื่อนไขด้วย AND แบบสั้นๆ

Dim Cond1 As String, Cond2 As String

If Nz(Me.combonamesearch,"") = "" Then Cond1 = " TRUE " Else Cond1 = " ([cus_name] = '" & Me.combonamesearch & "') "

If Nz([acculate],"") = "" Then Cond2 = " TRUE " Else Cond2 = " ([acculate] = " & Me.acculatesearch & ") "

Forms!frmhistoryh!frmhistorylist.Form.RecordSource = "select * from Qsaleh_cusprof where " & Cond1 & " AND " & Cond2

187
ห้อง MS Access / : เรียกข้อมูล Weekly
« เมื่อ: 27 ก.ย. 62 , 12:20:56 »
SELECT * FROM [ชื่อเทเบิล]
WHERE Format$([ชื่อฟิลด์วันนัดชำระ],"yyyymmww",2))=Format$(Date(),"yyyymmww",2)))
ORDER BY [ชื่อฟิลด์วันนัดชำระ]

กลับมาอ่านอีกที ชักเลอะเทอะเกินความจำเป็น  ไม่จำเป็นต้องเป็น yyyymmww แค่ yyyyww ก็พอแล้วครับ

188
หาว่า error เพราะอะไรและแก้ไขที่จุดนั้น จะเป็นสิ่งที่ถูกกว่าเลี่ยงมาใช้ Sendkeys ครับ  ส่วนอาการ NumLock เท่าที่เคยได้ยิน เป็นบักของ VBA ครับ แก้ไขไม่ได้ แต่สั่ง Sendkeys "{NUMLOCK}", True ไปอีกทีเพื่อให้กลับสถานะเดิมพอจะกล้อมแกล้มไปได้ แต่ได้ผล 100% ไหม อันนี้ไม่ทราบครับ

189
จะทำอะไรเหรอครับ   แล้ว Sendkeys ไม่ตอบโจทย์ยังไง

190
ผมเข้าใจว่า Access เองไม่สามารถจำ Custome Form ได้ เพราะเมื่อดู property ของ Printer object เองก็ไม่มีคุณสมบัติอะไรที่จะกำหนดชื่อ Custom Form ได้เลย มีแต่กำหนดขนาดกระดาษมาตรฐานที่มีมาให้เท่านั้น ดังนั้นเราต้องสร้าง Printer Device ในวินโดว์ขึ้นมาเฉพาะอีกตัว โดยเลือก Paper Size ของ Printer ตัวใหม่นี้เป็น Custom Form  แล้วกำหนดให้ Report ผูกกับ Printer ตัวนี้ครับ

191
ถึงแม้ทำได้ แต่ Report ไม่ได้มีจุดประสงค์เอาไว้เพื่อออก Excel ครับ   ข้อมูลไปครบหรือไม่ รูปแบบยังคงเอาไว้ได้หรือไม่ ต้องลองเองแล้วครับ

192
ผมลองแล้วดูได้ คุณเปิดดูใน Print Preview หรือเปล่า

193
โค้ดของคุณคือ

Me.Text23.Text = IIf(Dir(Me.[FilePath]) = "", "ไม่มี", "มี")

ปัญหาคือ
1. คุณใส่ .Text   ตรงนี้ต้องให้เอาออกครับ
2. FilePath มีบางเรคอร์ดที่ไม่มีค่าอะไรเลย 
อย่างนั้นก็ต้องแก้โค้ดเป็น

If Nz(Me.[FilePath], "") = "" Then
   Me.Text23 = "ไม่มี"
ElseIf Dir(Me.[FilePath]) = "" Then
   Me.Text23 = "ไม่มี"
Else
   Me.Text23 = "มี"
End If

194
เอาใหม่ ผมบอกผิดไป

- อย่างแรก ในเทเบิลต้องมีฟิลด์ที่เก็บว่าไฟล์รูปของเรคอร์ดนั้นอยู่ที่ไหน สมมุติชื่อฟิลด์ว่า FilePath
- วางฟิลด์ FilePath ลงใน Detail section และกำหนด Visible property เป็น No
- Control Source ของ [มี/ไม่มีรูปถ่าย] ให้เว้นว่างไว้
- ใส่โค้ดข้างล่างนี้ไว้ใน Format event ของ Detail section

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
        Me.[มี/ไม่มีรูปถ่าย] = IIf(Dir(Me.[FilePath]) = "", "ไม่มี", "มี")
End Sub

195
พอดีมีเวลาและเห็นว่ามีหลายครั้งที่มีการถามถึงการสร้างฟอร์มล็อคอินและเมนู ผมเลยเขียนตัวอย่างขึ้นมาเอาไว้ให้เป็นแนวทางในการศึกษาครับ

ระบบมี 2 เทเบิลคือ tbUser ไว้เก็บ ID,รหัสผ่าน,และเมนูที่จะใช้ ในขณะที่อีกเทเบิล tbMenu จะเก็บว่าแต่ละเมนูมีโครงสร้างอย่างไร

ฟอร์มหลักๆคือ FmLogon เพื่อรับ ID และรหัสผ่านผู้ใช้ เมื่อป้อนถูกต้องแล้ว ระบบก็จะเปิดฟอร์ม FmMenu เพื่อแสดงเมนูของแต่ละคน เมื่อคลิกหรือเลื่อนมาที่แต่ละรายการในเมนู คำอธิบายของรายการนั้นจะแสดงที่กรอบด้านล่าง แต่ถ้าดับเบิลคลิก จะเป็นการเปิดหน้าฟอร์ม/รายงานของรายการนั้น พร้อมกับตัวเมนูจะถูกหดย่อลงไป และจะกลับมาแสดงโดยอัตโนมัติเมื่อปิดฟอร์ม/รายงานที่ได้เปิดไป หลังจากปิดเมนู ก็จะกลับมาเปิดฟอร์มล็อคอินอีกครั้ง  ส่วนฟอร์มและรายงานที่เหลือเป็นแค่ตัวอย่างเพื่อแสดงให้เห็นว่าฟอร์ม/รายงานนั้นได้เปิดจริงๆแล้วเท่านั้น

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

ปล. อย่าถามนะว่า login ID และรหัสผ่านมีอะไรบ้าง  :sweat:

196
- อย่างแรก ในเทเบิลต้องมีฟิลด์ที่เก็บว่าไฟล์รูปของเรคอร์ดนั้นอยู่ที่ไหน สมมุติชื่อฟิลด์ว่า FilePath
- ใส่นิพจน์ไว้ใน Control Source property ของเท็กซ์บ็อกซ์ [มี/ไม่มีรูปถ่าย] เป็น

= IIf(Dir(Me.[FilePath]) = "", "ไม่มี", "มี")  <=== เครื่องหมายเท่ากับที่ด้านหน้า ต้องมีใส่ไว้ด้วย

หมายเหตุ เพื่อลดปัญหาที่อาจเกิดขึ้นได้ เราไม่ควรสร้างชื่อของอะไรก็ตาม เป็นภาษาอื่นนอกจากภาษาอังกฤษ และไม่ควรมีช่องว่างหรืออักขระพิเศษต่างๆในชื่อเช่นกัน

197
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 21 ก.ย. 62 , 13:26:47 »
ค้นหาในเวปด้วยคำว่า "64 bit"  มีถามกันพอสมควร

198
Me("Refer") = RS("Refer")

แต่แนะนำให้เปลี่ยนชื่อเท็กซ์บ็อกซ์บนฟอร์มไปเป็นชื่ออื่นที่แตกต่างจากชื่อฟิลด์ดีกว่า อาจเป็น txtRefer ก็ได้ ก็จะเป็น Me("txtRefer") = RS("Refer")

หน้า: 1 ... 8 9 10 [11] 12 13 14 ... 29