แสดงกระทู้

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 [2] 3 4 5 ... 29
19
ควรสร้างเท็กซ์บ็อกซ์ชื่อเดียวกันแต่มีเลขลงท้ายไล่ไปตั้งแต่ 1 ถึง 12   สมมุติชื่อ Textbox1 - 12 
ใส่ sub procedure ไว้ในฟอร์ม

Private Sub CopyText(N As Integer)
   Dim I As Integer

   For I = N+1 to 12
      Me("Textbox" & CStr(I)) = Me("Textbox" & CStr(N))
   Next
End Sub

และในทุก AfterUpdate event procedure ของ Textbox1 - 11 ก็แค่ใส่โค้ด
   Call CopyText(เลขท้ายของ Textbox)

20
ดูที่ผมตอบในกระทู้ตามลิงค์นี้นะครับ พอเป็นแนวทางได้ครับ https://www.thai-access.com/index.php?topic=1322.0

21
ถ้าตอนบันทึกเรคอร์ดใหม่ไม่ได้ช้าอะไรเลย ก็มีความเป็นไปได้ที่เงื่อนไขในการกรองและ/หรือการจัดเรียงข้อมูล ทำกับฟิลด์ที่ไม่ได้สร้าง Index (ดัชนี) เอาไว้ เช่น ฟอร์มขายสินค้า ถูกกำหนดให้แสดงโดยเรียงตามชื่อลูกค้า แต่ฟิลด์ชื่อลูกค้าไม่ได้ทำ Index เอาไว้เลย ดังนั้นทุกครั้งที่เปิด Access ก็ต้องทำการจัดเรียงเองโดยอ่านข้อมูลทุกเรคอร์ดในเทเบิลมาเรียงตามชื่อก่อน แล้วค่อยแสดง  แต่ถ้าสร้าง Index ฟิลด์ชื่อลูกค้าเอาไว้  Access สามารถอ่านตาม Index ชื่อลูกค้าซึ่งถูกจัดเรียงมาตั้งแต่ตอนบันทึกเรคอร์ดไปแล้ว เวลาจึงไม่แตกต่างจากเมื่อตอนมีเรคอร์ดน้อยๆแต่อย่างใด

อีกอย่างที่ควรทำ Compact and Repair Database เป็นระยะๆเช่น สัปดาห์ละครั้งด้วย เมื่อเรียกคืนพื้นที่ที่ไม่ได้ใช้แล้วด้วย

แต่ก่อนที่จะแก้ไขอะไร อย่าลืมก็อปปี้ไฟล์ฐานข้อมูลเก็บสำรองเอาไว้เสมอนะครับ

22
ถ้าฟิลด์ Customer_ID มีประเภทข้อมูลเป็น Text  ต้องเขียนเป็น ... Customer_ID = '" & FromCustomerID & "'" ,dbFailOnError

หมายเหตุ : ถ้าคำสั่งเดิมถูกต้องแล้ว ยังไงก็ให้เติมส่วนสีแดงด้วย

23
ขอบคุณครับ
ขอสอบถามเพิ่มเติม SELECT @@IDENTITY as ID มันจะเอา Autonumber ที่ถูกสร้างล่าสุดในฐานข้อมูลใช้ไหมครับ
ใช่ครับ

ถ้าหลังจากโค๊ดชุดที่ 3 มีการเพิ่ม Auto number ใหม่ในตาราง tbl_1 หรือตารางอื่น ๆ ในไฟล์อีก  ถ้าใช้ Lastid จะยังได้ค่าเท่ากับ AutoNumber ที่ถูกสร้างใน โค๊ดชุด 1 เหมือนเดิมไหมครับ
เหมือนเดิมครับ เพราะถูกเก็บในตัวแปร LastID ไปแล้ว แต่ถ้าสั่ง LastID = CurrentDb.OpenRecordset("SELECT @@IDENTITY as ID")("ID") อีกที ก็จะได้ค่า Autonumber ที่ถูกใช้สุดท้ายใหม่อีกที

อีก 1 ข้อสอบถาม  เมื่อเกิด การ Rollback  Auto number มันข้ามเลขไปครับ ใช้วิธีการใดเพื่อให้ Rollback และไม่ข้ามเลขครับ
ถ้ามี ID 1,2,3 บันทึกไว้แล้ว และต่อมามีการ Rollback หลายครั้งจนทำให้ ID ต่อไปจะเป็นเลข 11  สิ่งที่ทำได้ก็คือ ต้องหาว่า ID สุดท้ายคือเลขอะไรด้วย DMax() แล้วพอจะเพิ่มเรคอร์ดใหม่ ก็ใช้ SQL ที่กำหนดค่าฟิลด์ ID โดยตรงไปเลย เช่น  INSERT INTO (ID, ....) VALUES(เลขสุดท้ายจาก DMax() บวกด้วย 1, ...)  ดังนั้นจะเห็นว่า ถ้าต้องการคุณสมบัติไม่ให้มีเลขข้าม ก็ไม่ควรใช้ฟิลด์ Autonumber ครับ ให้เปลี่ยนเป็นประเภท Number-Long Integer แล้วใช้ DMax() + 1 นี่แหล่ะ เป็นตัวกำหนดค่าตัวต่อไปแทน

24
เพิ่ม
Dim LastID As Long

1. (เหมือนเดิม)

เพิ่มบรรทัดคำสั่งข้างล่างนี้
LastID = CurrentDb.OpenRecordset("SELECT @@IDENTITY as ID")("ID")

2. และ 3. เปลี่ยน DMax("id","tbl_1") เป็น CStr(LastID)

25
ห้อง MS Access / : Invalid procedure call or argument
« เมื่อ: 03 ส.ค. 63 , 17:32:14 »
เหมือนว่าต้องใช้ Access 2007 เปิดเท่านั้น ผมมีแต่ Access 2010 เปิดมา ก็มีปัญหาแต่ต่างออกไปเลย ทำอะไรไม่ได้ ผมแนะนำว่าให้คุณสร้างฐานข้อมูลเปล่าสักตัว แล้ว import ทุกอย่างจากโปรแกรมตัวนี้เข้ามาใหม่ อาจจะช่วยให้ทำการ compile ได้ครับ

26
ห้อง MS Access / : Invalid procedure call or argument
« เมื่อ: 03 ส.ค. 63 , 09:00:11 »
มีสั่งรันแมโคร Autoexec หรือสั่งให้ฟอร์มทำงานทันทีเมื่อเข้า Access หรือไม่ ถ้ามี ก่อนเข้า Access ให้กดคีย์ SHIFT ค้างไว้จนกว่าหน้าต่างของ Access จะแสดงเรียบร้อยแล้ว แล้วลอง compile อีกครั้งครับ หรือถ้าโปรแกรมและข้อมูลไม่เป็นความลับ ลองโหลดขึ้นเวปบอร์ดนี้เพื่อให้ตรวจสอบครับ

27
ขาดบางตัวไป และควรเว้นวรรคสักหน่อยในแต่ละคำใน SQL

sql = "SELECT * FROM SecName WHERE NameEmp = '" & Me.Combo1 & "'"

และพอกำหนด .RecordSource แล้ว ระบบจะอ่านเรคอร์ดเข้ามาแสดงบนฟอร์มอยู่แล้ว ไม่จำเป็นต้องสั่ง .Requery ให้ทำงานซ้ำครับ

28
ห้อง MS Access / : Invalid procedure call or argument
« เมื่อ: 01 ส.ค. 63 , 18:28:43 »
ลอง compile แล้วดูว่ามีแจ้งที่ผิดที่ไหนในโค้ดหรือไม่ ถ้าไม่มี อาจเป็นไปได้ว่ามีการแก้ procedure ที่จุดไหนแล้วมีจำนวน/ประเภทของ argument ที่ส่งไป procedure นั้น แตกต่างจากเดิม

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

30
ผมคิดว่าจากสูตร ก็ตรงไปตรงมา ถ้า [limit_date]<[end_date] ค่าเสื่อมสะสมก็จะถูกหักออก 1   ทีนี้ก็อยู่ที่ว่าคุณป้อน limit_date กับ end_date เป็นอะไร  เห็นในโพสบอกว่า end_date เป็น 31/12/62 ซึ่งไม่น่าเป็นค่าวันที่ปัจจุบัน ดังนั้นก็น่าเป็นวันที่ป้อนเอาจากหน้าจอซึ่งมาจากคิวรี่อีกที ถ้าเป็นอย่างนั้น ใน Query Design View คุณจะเห็น Query Tools - Design - Parameters เมื่อคลิกแล้วจะเห็นหน้าต่าง Query Parameter ให้ใส่คอลัมน์ Parameter เป็นข้อความที่ปรากฏตอนถามบนหน้าจอ และคอลัมน์ Data Type เป็นประเภท Date/Time เพื่อให้ระบบรับรู้ว่าสิ่งที่เราใส่นั้นให้ตีความเป็นวันที่ ไม่อย่างงั้นมันจะตีความเป็น text เท่านั้น ซึ่งอาจทำให้นิพจน์ [limit_date]<[end_date] ตีความหมายผิดไปทุกครั้ง

31
ห้อง MS Access / : รวมตัวเลขไม่ได้
« เมื่อ: 29 ก.ค. 63 , 19:58:53 »
CDec(Format( ))  ไม่ใช่ Format(CDec( ))

32
ห้อง MS Access / : รวมตัวเลขไม่ได้
« เมื่อ: 29 ก.ค. 63 , 14:14:16 »
ไม่ได้ไปดูรายละเอียดนะครับ แต่จะแนะนำว่าให้เลี่ยงการใช้ Round(N, D) เพราะเมื่อหลักต่อไปที่จะปัดเศษมีค่าเป็น 5 เขาจะไม่ปัดขึ้นเสมอไป เขาจะใช้วิธี Banker Rounding ซึ่งตามกฏจะปัดขึ้นหรือลงไปยังเลขคู่ที่ใกล้ที่สุด  เช่น Round(0.245, 2) ถ้าปัดขึ้นจะเป็น 0.25 แต่ปัดลงจะได้ 0.24 ดังนั้นเขาก็ปัดลงแทน จะได้เป็น 0.24  และ Round(0.235, 2) ก็จะได้ 0.24 เช่นกัน   แต่ Access ยิ่งมั่วไปกว่านั้นในค่าตัวเลขบางตัว เช่น Round(1.245, 2) ก็ควรจะเป็น 1.24 แต่กลับเป็น 1.25 ไปซะอย่างงั้น ซึ่งขัดกับ Banker Rounding ไปเสียอีก

ถ้าจะปัดเป็น 2 หลัก ให้ใช้เป็น CDec(Format(N, "0.00")) ดีกว่าครับ แต่ถ้าแสดงเฉยๆไม่ได้เอาไปคำนวน ก็ใช้แค่ Format(N, "0.00") ก็พอ

อีกอย่างที่ขอแนะนำคือ อย่าใช้ประเภทข้อมูล Number-Single หรือ Double เพราะจะเก็บค่าที่ไม่ตรงกับข้อมูล โดยจะมีผิดเพี้ยนในทศนิยมตำแหน่งหลังๆได้ ควรใช้ Number-Decimal แล้วกำหนด Scale property เป็นจำนวนทศนิยมที่ต้องการเก็บ จะทำให้การคำนวนตัวเลขที่มีทศนิยมได้ตรงตามความจริง

33
ตัวแปรที่เก็บชื่อและID ควรกำหนดไว้เป็นตัวแปร Public (Public strfullname As String) อยู่ใน Access Module ต่างหาก และเขียนโค้ดใน Form_Load event procedure ของแต่ละฟอร์ม เพื่อนำค่าในตัวแปรไปแสดงออกเท็กซ์บ็อกซ์บนฟอร์มนั้นๆ

34
พึ่งคิดได้ว่าก็ใช้คำสั่งให้ทุกปุ่มที่มีซ่อนก่อนแล้วค่อยมาสั่งแสดงตามตัวเลขที่หลังอีกที  :meaw:

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

Me.Command1.Visible = False
Me.Command2.Visible = False
Me.Command3.Visible = False
Me.Command4.Visible = False

GetNum = Me.Text5
    Select Case GetNum
        Case "1": Me.Command1.Visible = True
        Case "2": Me.Command2.Visible = True
        Case "3": Me.Command3.Visible = True
        Case "4": Me.Command4.Visible = True
    End Select
End Sub

โค้ดข้างบนสามารถลดรูปลงมาได้นะครับ พร้อมกับรองรับกรณี Text5 ไม่ได้เป็นตัวเลข

   Dim I   As Integer
   Dim J   As Integer

   If IsNumeric(Me.Text5) Then J = CInt(Me.Text5)
   For I = 1 to 12
      Me("command" & Cstr(I)).Enabled = (I = J)
   Next

แต่สงสัยว่าทำไมต้องทำ 12 ปุ่ม สร้างปุ่มเดียวแล้วพิจารณาการทำงานของโค้ดในปุ่มนั้นด้วยค่าจาก Text5 ไม่ง่ายกว่าหรือ ?

35
1. เข้า VBA Editor ไปคอมไพล์โปรแกรมก่อน ถ้าไม่ผ่านก็แก้ให้ถูกครับ
2. ดูชื่อปุ่มบนฟอร์มว่ายังชื่อ cmdFind หรือเปล่า ถ้าไม่ใช่ก็แก้ให้ถูกต้อง
3. ที่บรรทัด On Click ใน Property Sheet ของปุ่ม cmdFind แสดงเป็นคำว่า [Event Procedure] หรือไม่ ถ้าไม่ใช่ก็คลิกปุ่ม ... หลังบรรทัด  Access จะเปิด VBE Editor ให้ใส่โค้ดอีกทีและทดสอบการทำงานครับ

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

36
ผมไม่มีมอนิเตอร์ 2 จอ เลยทดสอบไม่ได้ว่าให้ผลจริงแค่ไหน แต่ถ้าจอเดียว ก็ให้กำหนด Popup property ของฟอร์มเป็น Yes ก่อน และใส่โค้ดนี้ไว้ใน OnLoad event procedure ของฟอร์ม

Private Sub Form_Load()
    DoCmd.MoveSize ซ้าย, บน
End Sub

โดยที่ซ้ายและบน คือความห่างจากขอบซ้ายและขอบบนของจอ มีหน่วยเป็น twips (เท่ากับ 567 * เซ็นติเมตร) ดังนั้นต้องหาเองว่าจอที่ 2 มีขอบซ้ายเป็นเท่าไหร่กันแน่

หน้า: 1 [2] 3 4 5 ... 29