แสดงกระทู้

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] 6 7 8 ... 19
73
คุณตกอักษร s หลังคำว่า Form ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: เก่ง

74
สมมุติฟิลด์เลขลำดับที่ชื่อ R และมี data type เป็น Integer หรือ Long นะครับ

SQL = "update M4_sobgen_sci T0 set R = dcount('*', 'M4_sobgen_sci', 'room_sob = ''' & T0.room_sob & ''' and number_sob < ''' & T0.number_sob & '''')"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, SakDa

75
ลองใหม่ครับ อันนี้สำหรับทั้ง room_sob และ number_sob มี data type เป็น Text ทั้งคู่ครับ

โค๊ด: [Select]
SQL = "update M4_sobgen_sci T0 set room_sob = cstr(int(dcount('*', 'M4_sobgen_sci', 'number_sob < ''' & T0.number_sob & '''')/40)+1)"

ให้ก็อปปี้ไปเลยนะครับ ไม่งั้นเดี๋ยวจะสับสน เพราะ '' ภายในไม่ใช่ double quote เหมือนที่ให้ไปก่อนหน้า แต่เป็น single quote ครับ  ส่วน " ครอบหน้าและหลัง ยังเป็น double quote
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

76
ถ้า data type ของฟิลด์ห้องสอบเป็น Text ให้เปลี่ยนเป็น

SQL = "update T as T0 set room_sob = cstr(int(dcount(""*"", ""T"", ""number_sob < "" & T0.number_sob)/40)+1)"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, apirak

77
สมมุติเทเบิลชื่อ T และ data type ของฟิลด์ห้องสอบเป็น Numeric

Dim SQL as String

SQL = "update T as T0 set room_sob = int(dcount(""*"", ""T"", ""number_sob < "" & T0.number_sob)/40)+1"
CurrentDB.Execute SQL, dbFailOnError
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, SakDa

78
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy, chai, pirin, Un, sjs, OddyWriter, kitisak, apirak, PNR, S'Saifon SB B'Banjongjairak, pattan0013, Tranasit

79
ต้องเช็คผลจากฟังก์ชั่นก่อนด้วยสิครับ ถึงจะบอกได้ว่ามีหรือขาดฟอนท์นั้น


Private Sub Command0_Click()
    If Not CheckFont ("Angsana New") Then
       MsgBox "ไม่มีฟอนต์นี้ในระบบ"
    End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

80
https://www.thai-access.com/index.php?topic=370.msg1542#msg1542
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

81
Excel มีให้โหลดเป็นโค้ดหรืออะไรครับ อยู่ที่เวปไหน จะได้ดูว่ามันเป็น VBA อยู่แล้วหรือเปล่า
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

82
https://www.thai-access.com/index.php?topic=411.0
โพสต์นี้ได้รับคำขอบคุณจาก: lalerster, เก่ง

83
เข้า VBA Editor แล้วเลือ Debug > Compile และดูที่ Tools > Reference ดูว่ามีบรรทัดไหนที่ทำเครื่องหมายเลือกไว้ แต่มีคำว่า Missing นำหน้าบ้าง  ถ้ามีก็แปลว่า ไลบรารี่ ตัวนั้นหายไปจากระบบ ถ้าไม่ได้ใช้ก็ไม่ต้องทำเครื่องหมาย แล้ว Compile อีกที

ลองอ่านอันนนี้ด้วยครับ ไม่แน่ใจว่าเกี่ยวข้องหรือไม่
https://www.thai-access.com/yeadram_view.php?topic_id=2120
โพสต์นี้ได้รับคำขอบคุณจาก: S'Saifon SB B'Banjongjairak

84
เมื่อ C คือ ชื่อซับฟอร์มคอนโทรล ซึ่งอาจคนละชื่อกับตัวซับฟอร์มเองก็เป็นได้

Me.C.SetFocus
On Error Resume Next
DoCmd.GoToRecord , , acNewRec
โพสต์นี้ได้รับคำขอบคุณจาก: S'Saifon SB B'Banjongjairak

85
อาจสร้าง 2 เทเบิลเพื่อเก็บข้อมูลชั่วคราวสำหรับ ที่ดินที่เลือกมาทำธุรกรรม และสำหรับ ป้อนที่ดินที่เกิดใหม่หลังจากธุรกรรม แล้วพอคลิก สร้างธุรกรรม ก็เอาข้อมูลเหล่านี้ไปสร้างลงเทเบิลจริงอีกที ส่วนการเขียนโค้ดสำหรับสร้างเรคอร์ด กรณีนี้มีหลายเรคอร์ดและหลายฟิลด์ แนะนำใช้ .AddNew, .Edit และ .Update สำหรับ Recordset ต่างๆที่เกี่ยวข้อง จะดูสะอาดตาดีกว่าเขียน SQL INSERT/UPDATE statement ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa, thanapol.w

86
ที่ดินเกิดธุรกรรม ทำให้ข้อมูลของที่ดินรหัสนั้นๆมีการเปลี่ยนแปลง และเนื่องจากต้องการเก็บประวัติ ดังนั้นรหัสของที่ดิน (FL_CODE) อย่างเดียว นำไปเป็น primary key ไม่ได้ ก็ต้องมีอีกฟิลด์ที่เป็นลำดับแสดงสถานะภาพของที่ดินรหัสนั้นร่วมอยู่ด้วย (ผมไม่แน่ใจว่าในนี้คือ FL_ID หรือเปล่า) เช่น F100 ลำดับที่ 1 เมื่อมีการเปลี่ยนแปลงอะไรไปก็จะเป็น F100 ลำดับที่ 2

ต่อไปที่ดินมีเกิดธุรกรรมคือ การแบ่ง ทำให้เกิดความสัมพันธ์ one-to-many ระหว่าง รหัสที่ดิน+ลำดับสถานะภาพนั้นๆ กับ รหัสที่ดิน(รหัสเดิมและ/หรือรหัสใหม่)+ลำดับสถานะภาพใหม่  ส่วนธุรกรรม การรวม ที่ดินก็ทำให้เกิดความสัมพันธ์ many-to-one  ระหว่าง รหัสที่ดิน+ลำดับสถานะภาพนั้นๆ กับ รหัสที่ดิน(รหัสเดิมและ/หรือรหัสใหม่)+ลำดับสถานะภาพใหม่  จะสังเกตเห็นว่ามันเป็นความสัมพันธ์แบบ many-to-many ระหว่างเทเบิล Tbl_Farmland กับตัวมันเอง ฟังดูแล้วอาจจะแปลกๆเพราะปกติจะเห็นแต่ความสัมพันธ์ระหว่างเทเบิลที่แตกต่างกัน แต่ความสัมพันธ์แบบนี้ก็มีครับ และเป็นกฏเกณฑ์เลยว่าเมื่อมี many-to-many ก็จะต้องสร้างเทเบิลกลางขึ้นมาใหม่อีกตัว และมีความสัมพันธ์กับเทเบิลเดิมแบบ many-to-one เทเบิลใหม่นี้คือเทเบิล "ความสัมพันธ์ของที่ดินจากธุรกรรม" ซึ่งน่าจะประกอบไปด้วย 6 ฟิลด์เป็นอย่างน้อย (สามารถใช้ทั้ง 6 ฟิลด์รวมเป็น primary key ได้) คือ
   - เลขที่ธุรกรรม
   - รหัสที่ดินก่อนธุรกรรม
   - ลำดับสถานะภาพของที่ดินในฟิลด์ที่ 2
   - รหัสที่ดินหลังธุรกรรม
   - ลำดับสถานะภาพของที่ดินในฟิลด์ที่ 4
   - ประเภทธุรกรรม (แบ่ง,รวม,โอน)
จากเทเบิลนี้ ก็สามารถเช็คได้ว่าที่ดินรหัสนั้นๆมีธุรกรรมอะไรเกิดขึ้น แต่ต้องเช็คทั้ง 2 ขาคือเช็คในฟิลด์ที่ 2 และ 4 ด้วยครับ

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

87
- ที่ถามว่า เข้าใจถูกไหม ถ้าจะใช้ภาษาบ้านๆ ก็พอจะอนุโลมได้ว่าถูกครับ

- DoCmd.RunSQL สามารถอ้างคอนโทรลของฟอร์ม (เท็กซ์บ็อกซ์, คอมโบบ็อกซ์, ...) ได้โดยตรงใน SQL โดยไม่ต้องหาค่าของคอนโทรลเหล่านั้นออกมาแล้วแปลงเป็นเท็กซ์เพื่อสร้าง SQL อีกที เช่นเราสามารถเขียน DoCmd.RunSQL "insert into table1 (field1, field2) values (Forms!Form1!Text1, Forms!Form1!Combobox2)" โดยไม่จำเป็นต้องเขียนเป็น

Dim T1 As  string
Dim T2 as  string

T1 = Forms!Form1!Text1
T2 = Forms!Form1!Combobox2
DoCmd.RunSQL "insert into table1 (field1, field2) values ('" & T1 & "', '" & T2 & "')"

หรือ

DoCmd.RunSQL "insert into table1 (field1, field2) values ('" & Forms!Form1!Text1 & "', '" & Forms!Form1!Combobox2 & "')"

แต่การใช้ DoCmd object จะไม่ถูกควบคุมโดยไลบรารี่ DAO (เหมือน 2 คนทำงานให้สำเร็จเหมือนกันได้ แต่คนละเจ้านาย)
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w

88
DAO.Recordset คือการอ้างถึงคลาสที่ชื่อ Recordset ในไลบรารี่ DAO (จะไม่เขียน DAO. ก็ได้ถ้า 1. เราแน่ใจว่าเรามีคลาสชื่อ Recordset และชื่อนี้ไม่ซ้ำกับคลาสอื่นในไลบรารี่ตัวอื่นในระบบเรา หรือ 2.มีซ้ำในไลบรารี่อื่นๆด้วย แต่เราอ้างถึงไลบรารี่ลำดับแรกที่พบ ซึ่งเราก็ต้องมั่นใจด้วยว่าลำดับของไลบรารี่เรียงถูกต้องแล้ว)

Dim RST As DAO.Recordset  เป็นการสร้างตัวแปรออปเจค RST ที่จะมีคุณสมบัติตามคลาส Recordset

CurrentDb.OpenRecordset("tb_newmember") ให้ชุดเรคอร์ดที่ได้จากเทเบิล tb_newmember และเทเบิลนี้อยู่ในฐานข้อมูลที่โค้ดเรากำลังทำงาน

Set RST = CurrentDb.OpenRecordset("tb_newmember") ให้ตัวแปรออปเจค RST ชี้ไปยังชุดเรคอร์ดที่ได้มาจากคำอธิบายข้างบน

RST.AddNew เป็นเมธอดที่บอกให้ระบบรู้ว่าเราต้องการให้เตรียมพื้นที่สำหรับเรคอร์ดใหม่ในชุดเรคอร์ดในตัวแปรออปเจค RST

RST.Update เป็นเมธอดที่สั่งให้ตัวแปรออปเจค RST เขียนเรคอร์ด กรณีนี้คือเรคอร์ดในพื้นที่ ที่ได้จาก RST.AddNew

Set RST = Nothing บอกให้ตัวแปรออปเจค RST เลิกชี้ไปยังออปเจคใดๆที่มันเคยชี้อยู่
โพสต์นี้ได้รับคำขอบคุณจาก: thanapol.w, apirak, Somsak472

89
เช็คว่ามีจำนวนเรคอร์ดใน ID เดียวกันตัวไหนที่เกิน 10  เพราะบอกมาว่ามีฟิลด์แค่ Field1 - Field10 เท่านั้น
โพสต์นี้ได้รับคำขอบคุณจาก: apirak, PNR

90
ใช้คำสั่ง SQL ล้วนๆคงไม่ได้ ต้องใช้ VBA ด้วย โค้ดนี้ต้องปรับแก้ให้ใส่ ' ' คร่อม ถ้า data type ของ ID, Num, Fieldxx เป็น Text ด้วยนะครับ

Public Sub xxx()
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim LastID  As Variant
    Dim I   As Integer
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select * from Table1 (order by ..., ถ้ามี)")
    Do Until RS.EOF
        If RS!ID <> LastID Then
            I = 1
            DB.Execute "insert into Table2 (ID, Field1) values (" & CStr(RS!ID) & ", " & CStr(RS!Num) & ")", dbFailOnError
        Else
            I = I + 1
            DB.Execute "update Table2 set Field" & CStr(I) & " = " & CStr(RS!Num) & " where ID = " & CStr(RS!ID), dbFailOnError
        End If
        LastID = RS!ID
           
        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: apirak, PNR

หน้า: 1 2 3 4 [5] 6 7 8 ... 19