แสดงกระทู้

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 ... 5 6 7 [8] 9 10 11 ... 19
127
ถ้าหมายถึงเมื่อเปิดฟอร์มมา จะให้คอมโบบ็อกซ์แสดงปีหลายๆปี ตย.เช่นแสดง 1 ปีย้อนหลังและปีปัจจุบัน ก็ให้กำหนด RowSourceType property ของคอมโบบ็อกซ์เป็น Value List แล้วใส่โค้ดใน Form Load event procedure เป็น

Private Sub Form_Load()
    Me.ชื่อคอมโบบ็อกซ์.RowSource = Year(Date) & ";" & Year(Date) - 1
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Tongo

128
ผมขอเสนอวิธีเขียนโค้ดที่รวม 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
โพสต์นี้ได้รับคำขอบคุณจาก: PNR, Tongo

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

กลับมาอ่านอีกที ชักเลอะเทอะเกินความจำเป็น  ไม่จำเป็นต้องเป็น yyyymmww แค่ yyyyww ก็พอแล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

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

131
จะทำอะไรเหรอครับ   แล้ว Sendkeys ไม่ตอบโจทย์ยังไง
โพสต์นี้ได้รับคำขอบคุณจาก: Un

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

133
ผมลองแล้วดูได้ คุณเปิดดูใน Print Preview หรือเปล่า
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

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

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

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

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

ปล. อย่าถามนะว่า login ID และรหัสผ่านมีอะไรบ้าง  :sweat:
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy, sjs, dtax450556, naekkhung, aek, apirak, PNR, MAKI, Woody, Paiwan, MR.Vinai Wetvithayaklung, Jiw Jewel, I love movies, Tranasit

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

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

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

136
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 21 ก.ย. 62 , 13:26:47 »
ค้นหาในเวปด้วยคำว่า "64 bit"  มีถามกันพอสมควร
โพสต์นี้ได้รับคำขอบคุณจาก: M2M, มาลี

137
Me("Refer") = RS("Refer")

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

138
โค้ดตัวอย่างนี้ เป็นการแปะค่าของฟิลด์ต่างๆในบรรทัดที่ต้องการ มาลงเป็นบรรทัดใหม่ในฟอร์ม/ซับฟอร์มเดียวกัน วิธีคือให้สร้าง Command Button เอาไว้ที่ไหนก็ได้สักที่บนบรรทัดของข้อมูล (สมมุติชื่อ btnCopy) เมื่อต้องการก็อปปี้ ก็แค่คลิกที่ปุ่มนี้

Private Sub btnCopy_Click()
    Dim RS As DAO.Recordset
   
    If Me.NewRecord Or Me.Dirty Then Exit Sub ' ถ้าคลิกปุ่มบนบรรทัดของรายการใหม่ หรือ บนบรรทัดที่รายการกำลังแก้ไขอยู่ ก็ไม่ต้องทำอะไร
   
    Set RS = Me.RecordsetClone    ' กำหนดตัวแปรสำหรับอ้างอิงข้อมูลของบรรทัดปัจจุบัน (บรรทัดที่เลือก)
    RS.Bookmark = Me.Bookmark  ' ให้ตัวแปรดังกล่าวชี้ไปเรคอร์ดเดียวกันกับบรรทัดปัจจุบัน
    DoCmd.GoToRecord , , acNewRec   ' กระโดดไปบรรทัดรายการใหม่
    Me("ชื่อคอนโทรลบนฟอร์ม") = RS("ชื่อฟิลด์ของคอนโทรลบนฟอร์ม") ' ต้องการก็อปปี้ฟิลด์อะไรบ้าง ก็เพิ่มบรรทัดตามจำนวนฟิลด์ที่ต้องการต่อลงไปได้เรื่อยๆ
   
    Set RS = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, nonc31

139

Public Function RowNum(frm As Form) As Variant
        ...
        ...
        ...

เพิ่งรู้ว่าการอ้าง Form property ผ่านฟังก์ชั่นบน Continuous Form จะทำให้อ้างถึงเรคอร์ดเฉพาะของบรรทัดนั้นๆบนฟอร์ม แทนที่จะเป็นเรคอร์ดปัจจุบันบนฟอร์มเพียงเรคอร์ดเดียว
โพสต์นี้ได้รับคำขอบคุณจาก: PNR, Tatchawin

140
ค่า Default Value เป็นแค่การแสดงลงหน้าฟอร์มสำหรับเรคอร์ดใหม่ ไม่ได้ถือเป็นการป้อนเข้าไปในฟิลด์ที่สัมพันธ์กับคอนโทรลนั้นๆ ยกเว้นมีการทำอะไร เช่น ป้อน/แก้ไขตัวอักษรอะไรในคอนโทรลของฟิลด์จากเทเบิลอย่างที่คุณได้ค้นพบ ถึงจะเหมือนมีการป้อนค่า Default Value จริงๆ แต่ปกติไม่น่าจะเกิดปัญหานี้ เป็นไปได้หรือที่ระบบจะมีเรคอร์ดใหม่ซ้ำกันทุกฟิลด์กับเรคอร์ดเก่า เพราะใช้แต่ค่าจาก Default Value เพียงอย่างเดียว
โพสต์นี้ได้รับคำขอบคุณจาก: pim

141
ถ้า U เป็นชื่อตัวแปรที่เก็บ ID ของผู้ใช้ ก็เพียงใส่โค้ดนี้ไว้ที่ OnClick event procedure ของปุ่มกลับหน้า Home

If U = "ID ของ Admin" Then
   DoCmd.OpenForm "ชื่อฟอร์ม Home ของ Admin"
Else
   DoCmd.OpenForm "ชื่อฟอร์ม Home ของผู้ใช้ทั่วๆไป"
End If
โพสต์นี้ได้รับคำขอบคุณจาก: Wonder B

142
คงต้องใส่โค้ดไว้ใน Form_Activate event ของทุกฟอร์มแล้วครับ แล้วถ้าจะป้องกันอีกชั้น ก็ใส่เงื่อนไขตรวจสอบปีไว้ใน Validation Rule ของฟิลด์วันที่ในเทเบิลไปด้วยว่าปีต้องอยู่ในช่วงที่เป็นไปได้ เช่น 2010-2050 ก็เขียนเป็น Year([ชื่อฟิลด์]) between 2010 and 2050 ส่วน Validation Text ก็ใส่ข้อความที่จะแสดงเมื่อไม่เป็นไปตาม Rule ที่ว่านี้

หมายเหตุ : ฟังก์ชั่น Year( ) จะให้ค่าเป็นปี ค.ศ. เสมอ แม้ปฏิทินจะกำหนดเป็น พ.ศ.
โพสต์นี้ได้รับคำขอบคุณจาก: aek

143
ถ้าผิดยังไงก็ขอโทษด้วย เพรายังไม่เคยใช้ Office 64  แต่เท่าที่อ่านความหมายของ VBA7, ประเภทข้อมูล LongLong, LongPtr และ PtrSafe Keyword https://codekabinett.com/rdumps.php?Lang=2&targetDoc=windows-api-declaration-vba-64-bit ถ้า Office 32 bit นั้นเป็นเวอร์ชั่นตั้งแต่ 2010 ขึ้นไป เชื่อว่าไม่น่าจะรันได้ครับ เพราะ Compiler Directive VBA7 จะเป็นจริงตั้งแต่ Access 2010 ดังนั้นโค้ดจะรันแล้วเจอะข้อมูลประเภท LongLong ที่มีเฉพาะในเวอร์ชั่น 64 bit เท่านั้น ส่วนต้องโค้ดยังไงถึงจะถูก อันนี้ผมไม่รู้ ต้องคนที่ดู API เป็นครับ

แต่ถ้า Office 32 bit นั้นเป็นเวอร์ชั่นตำกว่า 2010 น่าจะแน่นอนว่าโค้ดนี้จะรันได้

แต่ Compiler Directive มีผลเฉพาะตอนที่ยังเป็นไฟล์ .accdb  ถ้าคอมไพล์เป็นไฟล์ .accde แล้ว  คอมไพล์ด้วย Office กี่ bit ก็ต้องไปใช้ที่เครื่อง Office แค่นั้น bit เท่านั้นครับ

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

144
Dim TSDYYMM As String
Dim MaxRunNo As Integer

TSDYYMM = "TSD-" & Format([txt_LoanDate], "yymm")
MaxRunNo = Val( Right( Nz(DMax("[Loan_No]", "[Tb_Loan]", "[Loan_No] Like '" & TSDYYMM & "*'"),"0"),3 )  )
txt_LoanNo = TSDYYMM  & Format(MaxRunNo + 1, "000")
โพสต์นี้ได้รับคำขอบคุณจาก: Tonwrp

หน้า: 1 ... 5 6 7 [8] 9 10 11 ... 19