แสดงกระทู้

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 ... 16
1
SQL ของ Access มีแต่เอาข้อมูลจากฐานข้อมูลที่เรากำลังเปิด ไปใส่เพิ่มเข้าไปในฐานข้อมูลอื่น แต่ในกรณีนี้ตรงกันข้ามกัน สิ่งที่ทำได้ก็คือ

1. สร้างลิงค์เทเบิล student จาก "D:\รับสมัครนักเรียน ม.3.accdb" มายังฐานข้อมูลปัจจุบัน โดยสร้างเป็นลิงค์เทเบิลชื่ออื่นแทน สมมุติสร้างเป็นชื่อ Temp
docmd.TransferDatabase acLink,"Microsoft Access" , "D:\รับสมัครนักเรียน ม.3.accdb",acTable,"student","Temp"

2. สั่งเลือกข้อมูลทั้งหมดจาก Temp นำมาใส่เทเบิล student
currentdb.Execute "insert into student select * from Temp", dbfailonerror

3. ลบลิงค์เทเบิล Temp
docmd.DeleteObject acTable, "Temp"
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

2
เพิ่มเติมต่อท้ายเป็น CurrentDB.Execute xxxxxxx , dbFailOnError Or dbSeeChanges ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

3
คุณตกอักษร s หลังคำว่า Form ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: เก่ง

4
สมมุติฟิลด์เลขลำดับที่ชื่อ 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

5
ลองใหม่ครับ อันนี้สำหรับทั้ง 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

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

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

7
สมมุติเทเบิลชื่อ 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

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

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

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

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


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

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

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

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

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

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

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

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

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

16
ที่ดินเกิดธุรกรรม ทำให้ข้อมูลของที่ดินรหัสนั้นๆมีการเปลี่ยนแปลง และเนื่องจากต้องการเก็บประวัติ ดังนั้นรหัสของที่ดิน (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

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