แสดงกระทู้

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 - apirak

หน้า: [1] 2 3 4 5
1
โปรแกรมแจกฟรี (ส่งท้ายปีเก่า ต้อนรับปีใหม่) นี้ ใช้ชื่อว่า Q2RFree

เหมาะสำหรับผู้ทำอาชีพอิสระที่จำเป็นต้องออกพวกใบเสนอราคา/ใบแจ้งหนี้/ใบเสร็จ

ตัวโปรแกรมใช้ระบบ MS Access มีความสามารถดังนี้
1. เก็บข้อมูลลูกค้าได้
2. เก็บข้อมูลการออกเอกสารทุกรายการได้
3. สำเนารายการจากเอกสารที่มีอยู่ได้ สำหรับกรณีทำงานเดิมอีกครั้ง หรือจะสำเนาจากใบเสนอราคาไปเป็นใบแจ้งหนี้แล้วต่อด้วยใบเสร็จก็ได้
4. สามารถใส่ Logo ได้ (อย่าลืมไปจดทะเบียนเครื่องหมายการค้าก่อนนะครับ)
5. ถ้ายังไม่มี Logo ก็สามารถออกเอกสารแบบที่ไม่มี Logo ได้
6. เปลี่ยนสีหัวเอกสารได้ จะแดง/เขียว/น้ำเงิน/ชมพู/ฟ้า/เหลือง ได้หมด ไม่มีสีดำ เพราะทำแล้วดูไม่ได้
7. ทุกเอกสารมีให้เลือก 2 แบบ ตามความชอบ

ดาวน์โหลดได้เองเลยที่ลิงก์ด้านล่างนี้
https://1drv.ms/u/s!ArcuGeSfhpiQhwGsRn9TPBxFIpp-?e=c1NGeI

สุดท้ายอย่าลืมอ่านคู่มือก่อนนะครับ
ติดปัญหาอะไรอีเมลมาถามได้ ตอบทุกอีเมลแน่นอน ถ้าไม่ตอบก็รอหน่อย เมลอาจตกไปอยู่ใน Jung Mail

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

2
ได้เวลาต่ออายุโฮสหลังจากโดน Ransomware แล้วใช้บริการฟรีมาครบ 1ปี :shout:


  ค่าเช่าโฮส   
  ค่าโดเมน 
  คงเหลือ 
ยอดเงินสนับสนุน
  3,269 
  62-63    642.-    400.-    2,227 
  63-64    535.-    300.-   1,392 
  64-65    535.-    300.-   557 
  65-66    ...    357.-    200 
  66-67    535.-    385.25    --- 
  67-68    ...    ...    --- 

#ตัดรอบโฮส ก.ย. #ตัดรอบโดเมน ก.พ.

ปล.ขอปิดการโพสกระทู้ใว้เพียงเท่านี้นะครับผม :cool:


รายงานประจำปี 63-64 ได้รับคำขอบคุณจาก: chai, sjs, OddyWriter, PNR
รายงานประจำปี 64-65 ได้รับคำขอบคุณจาก: chai, OddyWriter, apirak, Max
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

3
เปลี่ยน Data Type จาก Text เป็น Integer ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

4
รบกวนสอบถามคำสั่ง เมื่อกดปุ่ม แล้วให้ TextBox1 มีสีแดง ใน VB ต้องเขียนว่าอะไรครับ ขอบคุณครับ
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

5
รายงานการต่ออายุโดเมนเป็นที่เรียบร้อยครับ :yuush:

เวลามันช่างผ่านไปไวยิ่งนัก :zzz:
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

6
น่าสนใจมากเลยค่ะอาจารย์
ขออนุญาตคุณ001jetnipitด้วยนะคะ

รบกวนอาจารย์ OddyWriter ขอไฟล์ตัวอย่างแบบ 32 bit ด้วยได้ไหมคะ
หนูจะเอาไปปลุกผีงานเก่าที่เคยถอดใจล้มเลิกไปแล้วค่ะ

แต่หนูลองเอาไฟล์ตัวอย่าง64bit ของอาจารย์ไปรันกับ 32bit มันก็ทำงานได้ปกตินะคะ
ไม่ทราบว่าจริงๆแล้วจะมีผลแตกต่างอื่นๆหรือเปล่าคะ

จริงดิ ผมส่งผิดไฟล์เหรอเนี่ย ดันส่ง 32 Bit ไปซะงั้น ถ้าจะ Run บน 64 Bit ให้แก้โค้ด Function เป็น PtrSafe Function ครับ

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

7
ดูที่ On Open/On Close ของฟอร์ม และ Module1 ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

8
หน้าเว็บอัพโหลดภาพทำการปรับแต่งใหม่ให้รูปย่อมีขนาดใหญ่ขึ้น(เพิ่มการมองเห็น)ทำให้จำนวนรูปในหนึ่งหน้าน้อยลง จึงเพิ่มตัวเลือกหน้าดูชุดรูปภาพ จำนวน50รูปล่าสุดให้จะได้ย้อนดูรูปได้มากขึ้นเพื่อนำมาใช้ภายหลังหรือกันอัพภาพซ้ำเป็นต้นครับ :shout:


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

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

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

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

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

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

11
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 เลิกชี้ไปยังออปเจคใดๆที่มันเคยชี้อยู่
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

12
สวัสดีครับ อยากทราบความหมายของโค๊ด
กระผมได้ก็อป โค๊ดนี้มาใช้ แต่ยังไม่เข้าใจในส่วนที่ผมทำสีแดง

Private Sub Bnt_Add_Click()
Dim RST As DAO.Recordset บางที่ก็ใช้ database
Set RST = CurrentDb.OpenRecordset("tb_newmember")
RST.AddNew
RST("เลขบัตรปชช") = Me.T_เลขบัตรปชช
RST("คำนำหน้า") = Me.T_คำนำหน้า
RST("ชื่อ") = Me.T_ชื่อ
RST("สกุล") = Me.T_สกุล
RST.Update
Set RST = Nothing

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

13
ได้แล้วครับอาจารย์ ปัญหาเกิดจาก ผมอ้างอิง Rs!Num  ใส่ชื่อฟิลล์จริงผิดไปครับลิมสังเกตุ

แก้เป็น
โค๊ด: [Select]
Public Sub ExplodeTable()
   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 MakeQryOT.MemID, MakeQryOT.sOT  FROM MakeQryOT ORDER BY MakeQryOT.MemID;")
    Do Until RS.EOF
        If RS!MemID <> LastID Then
            I = 1
            DB.Execute "insert into tblOT_Report (MemID, OT1) values (" & CStr(RS!MemID) & ", " & CStr(RS!sOT) & ")", dbFailOnError
        Else
            I = I + 1
            DB.Execute "update tblOT_Report set OT" & CStr(I) & " = '" & CStr(RS!sOT) & "' where MemID = '" & CStr(RS!MemID) & "'", dbFailOnError
        End If
        LastID = RS!MemID
        RS.MoveNext
    Loop
    RS.Close: Set RS = Nothing
End Sub

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

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

15
ใช้คำสั่ง 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

ขึ้น พารามิเตอร์น้อยเกินไปต้องการ 1 ครับ แถวล่าง Else
DB.Execute "update tblOT_Report set OT" & CStr(I) & " = '" & CStr(RS!OT) & "' where ID = '" & CStr(RS!MemName) & "'", dbFailOnError

Field OT จะมี OT1 , OT2 OT3 ไปเรื่อยๆ
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

16
ใช้คำสั่ง 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

17
ไม่มีทางเพิ่มเกิน 255 ฟิลด์ครับ ให้สร้างอีกเทเบิลที่มีฟิลด์ Primary Key เหมือนเทเบิลแรก และย้ายฟิลด์ส่วนเกินไปไว้เทเบิลที่สองแทน พร้อมกับสร้าง Relationships (ในริบบอน Database Tools) จากเทเบิลแรกไปเทเบิลที่สอง โดยกำหนดให้มี Enforce Referential Integrity, Cascade Update Related Fields และ Cascade Delete Related Fields ด้วย  คุณสมบัติของ Enforce Referential Integrity จะทำให้เมื่อมีการเพิ่มเรคอร์ด เราใส่ข้อมูลลงในฟิลด์ของเทเบิลแรก และเว้นข้อมูลในฟิลด์ของเทเบิลที่ 2 ก็ได้ ก็จะไม่มีเรคอร์ดปรากฏในเทเบิลที่ 2   แต่ถ้าเราใส่ข้อมูลในฟิลด์ของเทเบิลที่ 2 เราจะต้องใส่ข้อมูลอะไรลงในฟิลด์ของเทเบิลแรกด้วย  ส่วนคุณสมบัติ Cascade Update จะทำให้เมื่อมีการแก้ไขค่าในฟิลด์ Primary Key ของเทเบิลแรกแล้ว ค่านั้นจะไปแก้ไขในฟิลด์ Primary Key ของเทเบิลที่ 2 ให้โดยอัตโนมัติ  สุดท้ายคือคุณสมบัติ Cascade Delete จะทำให้เมื่อเราลบเรคอร์ดในเทเบิลแรกแล้ว เรคอร์ดในเทเบิลที่ 2 ที่มีค่า Primary Key เดียวกันก็จะถูกลบโดยอัตโนมัติเช่นกัน

ต่อมาให้สร้าง Query ใน Design View และลากทั้ง 2 เทเบิลนี้มาใส่ (มันจะแสดงเส้น Relationships ออกมาให้ด้วย) แล้วเลือกฟิลด์ที่เป็น * จากทั้ง 2 เทเบิลมาใส่ในคิวรี่

คุณสามารถนำเอา Query ตัวนี้ไปเป็น Record Source ของฟอร์มหรือรายงานที่ต้องการได้

อย่างไรก็ตาม ลองพิจารณาดูอีกทีว่าเราได้ออกแบบเทเบิลให้เป็นไปตามหลักการ Normalization แล้วหรือยัง ทำไมจำนวนฟิลด์ถึงมีมากขนาดนั้น !!!
โพสต์นี้ได้รับคำขอบคุณจาก: apirak

18
 :question: มีข้อมูลจากตารางชื่อ Table1  จะ Add ข้อมูลไปยังตาราง Table 2 โดยให้แยกจากแถวไปใส่ในคอลัมน์แทนจะทำได้ไหม
แบบในรูปเลยครับ  :sweat: :sweat:

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

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