แสดงกระทู้

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 ... 13 14 15 [16] 17 18 19
271
Has Module หมายถึงฟอร์มนี้ได้มีการเขียนโค้ดลงใน Event อะไรของฟอร์มหรือของ Control หรือไม่ ถ้าเป็น Yes ตัว Access จะมองฟอร์มนี้เป็น Class ด้วย  (ซึ่งทำให้สามารถมอง sub procedure ของฟอร์มเป็น Method และ function procedure ของฟอร์มเป็น Property)  พอเราเลือกเป็น No โค้ดต่างๆในฟอร์มนี้จะถูกลบทิ้งครับ  ผมคิดว่าไม่น่ามีส่วนเกี่ยวข้องกับปัญหาที่เจอนะครับ  ยังคิดไม่ออกว่าเพราะอะไร ลองทำ Compile แล้วตามด้วย Compact and Repair Database อาจช่วยได้ ?!?
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

272
Class Module ใช้เขียนโค้ดเพื่อสร้างตัว Object ของเราเอง เทียบอย่างเช่นเมื่อเราเขียน Dim RS as DAO.Recordset ตัว Recordset ก็คือคลาสจากไลบรารี่ DAO   ตัว RS ก็คือตัวแปร Object จากคลาส Recordset

Class และ Object เป็นแนวคิดการเขียนโปรแกรมเชิงวัตถุ (Object Oriented Programming, OOP) ซึ่งมีคุณสมบัติพิเศษมากมาย แต่ VBA มีแค่ส่วนนึงเท่านั้น จุดประสงค์หนึ่งก็เพื่อให้คนอื่นมาเรียกใช้โค้ดของเราอย่างที่ผมขอเรียกว่า "เข้าตามตรอก ออกตามประตู" ใครจะเรียกใช้ให้โค้ดเราทำอะไร ก็ต้องเรียกผ่านโค้ดที่เรากำหนด (ใน OOP เรียกว่า Method) หรือกำหนด/อ่านค่าอะไรของโค้ดเรา ก็ต้องส่ง/รับผ่าน Property เท่านั้น ไม่ว่าจะเป็น Method หรือ Property ก็จะเป็น Procedure ดังนั้นโค้ดใน Procedure เหล่านี้ก็จะสามารถกรองและตรวจสอบได้ว่าค่าที่ส่ง/รับ เป็นค่าที่เหมาะสมหรือไม่ ถ้าเราจะเขียน Module ธรรมดาเพื่อเลียนแบบให้โค้ดอื่น "เข้าตามตรอก ออกตามประตู" เหมือนกันก็ทำได้ แต่การอ้างชื่อจาก Module ของเราคงไม่สะดวกเท่าการเขียนด้วย Class Module และจะทำไปทำไมในเมื่อมี Class Module ให้ใช้อยู่แล้ว ผมก็เคยมีงานชิ้นนึงที่ตัดสินใจใช้ Class Module เพราะมีความซับซ้อนและเห็นว่าการเขียนในรูปแบบ Object.Property = ค่า และ Object.Method จะทำให้อ่านโค้ดได้เข้าใจมากกว่าเขียนเป็น Variable = ค่า และ Call Procedure มากๆครับ

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

273
กรณีออเดอร์ 1 ใบมีได้หลายรายการ  ก็นึกถึงรูปแบบใบสั่งซื้อทั่วๆไปนี่แหล่ะครับ  รายการแรกในใบออเดอร์ก็มีค่าของเลขบรรทัดเป็น 1  รายการที่สองก็เป็น 2  อย่างนี้ไปเรื่อยๆ  ส่วน Primary Key ก็ประกอบด้วยสองฟิลด์ ฟิลด์เลขใบออเดอร์และฟิลด์เลขบรรทัดครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak

274
ปกติในระบบงาน ทุกเทเบิลจะมีการกำหนดฟิลด์ที่เป็น Primary Key เอาไว้ ระบบฐานข้อมูลจะไม่ยอมให้ค่าในฟิลด์เหล่านี้ซ้ำกัน  Primary Key อาจประกอบไปด้วยหลายฟิลด์ก็ได้  แต่ถ้ามี Primary Key อยู่แล้ว ก็กำหนด Key อื่นๆเพิมเติมก็ได้ และกำหนด Unique property ของ Key นั้นเป็น No หรือ Yes เพื่อให้ค่าในฟิลด์ซ้ำกันหรือไม่ซ้ำกันเหมือนคุณสมบัติของ Primary Key ก็ได้  (Key เหล่านี้รวมๆกันจะอยู่ในหมวดที่ Access เรียกว่า Indexes) 

ในกรณีของออเดอร์สินค้า หมายเลขออเดอร์จะไม่ซ้ำกันอยู่แล้ว ถ้าธุรกิจคุณเป็นแบบออเดอร์เดียวมีแค่รายการเดียว ก็กำหนดฟิลด์หมายเลขออเดอร์เป็น Primary Key ไปได้เลย ดังนั้นเมื่อก็อปปี้มาแล้ว ถ้าไม่แก้ไขค่าฟิลด์ที่เป็น Primary Key ระบบก็จะฟ้องออกมาและไม่ยอมบันทึกลงเทเบิลให้ แต่ถ้าที่ป้อนเป็นแค่รายการหนึ่งในหลายๆรายการในใบออเดอร์ ก็จะต้องหาฟิลด์อื่นๆมารวมกับเลขออเดอร์เพื่อเป็น Primary Key ถ้าระบบไม่ยอมให้ออเดอร์สินค้าตัวเดียวกันปรากฏมากกว่าหนึ่งรายการในออเดอร์หนึ่งๆ ก็เอาฟิลด์เลขอเดอร์และฟิลด์รหัสสินค้ามารวมเป็น Primary Key ได้  แต่ถ้าระบบยอม ก็ต้องหาอย่างอื่นมาเพิ่มเติมเข้าไปอีกเพื่อให้แตกต่างจากรายการอื่นๆในใบนั้นให้ได้ หรือกำหนดฟิลด์หมายเลขบรรทัดรวมกับฟิลด์หมายเลขออเดอร์ก็เป็นวิธีหนึ่งที่ทำๆกันครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, Somsak472

275
RowSource และ ColumnCount property มีค่าเป็นอะไรครับ และอีกอย่าง ทำไมระหว่างชื่อและนามสกุลถึงดูเหมือนมีช่องว่างหลายช่อง
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

276
น่าจะเพราะ AutoExpand property ไม่ได้กำหนดเป็น Yes ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

277
ไม่มีกำหนดครับ และไม่ต้องห่างเท่าๆกันในแต่ละบรรทัด จะมีก็แต่ถ้าเราเขียนหมายเลขบรรทัด/ลาเบลไว้ที่คอลัมน์อื่นๆ ตัว VBA Editor จะเลื่อนกลับไปคอลัมน์แรก(ชิดขอบซ้าย)ให้เองอัตโนมัติเท่านั้นครับ
โพสต์นี้ได้รับคำขอบคุณจาก: สุรเกตุ แซ่เอี้ย

278
ภาษา VBA นำมาจากภาษา BASIC ซึ่งเป็นภาษาเก่าแก่ สิ่งนึงที่ตกทอดมาถึง VBA ก็คือหมายเลขบรรทัด เราสามารถใส่เลขที่บรรทัด จะเป็นเลขอะไรก็ได้ตั้งแต่ 1 ถึง 65535 และแต่ละบรรทัดจะเป็นเลขอะไรก็ได้ ไม่จำเป็นต้องเรียงลำดับ ไม่จำเป็นต้องมีทุกบรรทัด ขอให้ไม่ซ้ำใน Sub หรือ Function Procedure เดียวกันก็พอ โดยเขียนไว้เป็นส่วนแรกของโค้ดแต่ละบรรทัด ที่ทำๆกันมาเป็นมาตรฐานก็คือเริ่มจาก 10  และเพิ่มทีละ 10 เพื่อให้อ่านง่ายและสะดวกเมื่อมีการแทรกบรรทัดเพิ่ม จะได้ใส่เลขบรรทัดได้โดยไม่ต้องไปแก้หมายเลขของบรรทัดอื่นๆให้เสียเวลาครับ

ตย.ของโค้ดก็เช่น
โค๊ด: [Select]
Private Function NewSalesPrice(Price As Variant, Percent As Variant) As Single
          Dim Factor  As Single

          On Error GoTo ErrHandler

10        Factor = 1 + Percent / 100
20        NewSalesPrice = Price * Factor

ExitRtn:
30        Exit Function
               
ErrHandler:
40        MsgBox "In [NewSalesPrice], Line " & Str(Erl) & ", Error " & Str(Err.Number) & " : " & Err.Description
50        Resume ExitRtn
End Function

เลขบรรทัดทำหน้าที่แบบเดียวกับลาเบล เราสามารถสั่ง Goto <ลาเบล/เลขบรรทัด> หรือ GoSub <ลาเบล/เลขบรรทัด> เพื่อให้โค้ดข้ามไปทำงานที่บรรทัดตามเลขที่นั้นได้ แต่ประโยชน์ที่ชัดเจนที่สุดก็คือ ถ้าเกิด Runtime Error ขึ้นในบรรทัดของโค้ดที่มีเลขที่บรรทัดอยู่ เราสามารถใช้ฟังก์ชั่น Erl เพื่อคืนเลขที่บรรทัดออกมาได้ด้วย ดังนั้นเราจึงใส่ไว้ในส่วนของ Error Handling Routine เพื่อบอกให้ทราบว่าเกิดปัญหาที่บรรทัดอะไร การ Debug หรือแก้ไขปัญหาก็จะทำได้ง่ายขึ้นมาก แต่หากเกิด Error ในบรรทัดที่ไม่ได้ใส่หมายเลขบรรทัดเอาไว้  ฟังก์ชั่น Erl จะคืนค่าของเลขบรรทัดสุดท้ายที่อยู่ก่อนหน้าออกมาให้แทน หรือถ้าไม่มีเลย ก็จะคืนค่าเป็นศูนย์แทนครับ

ตย.ของข้อความ

โพสต์นี้ได้รับคำขอบคุณจาก: thaiaccboard, pirin, TTT, kitisak, มาลี, armdack

279
โค๊ด: [Select]
    Dim xlApp           As Object
    Dim xlWorkbook      As Object
    Dim xlSheet         As Object
   
    DoCmd.TransferSpreadsheet acExport, , "ชื่อคิวรี่", "พาธ\ไฟล์.xls หรือ .xlsx", True
   
    Set xlApp = CreateObject("excel.application")
    Set xlWorkbook = xlApp.Workbooks.Open("พาธ\ไฟล์.xls หรือ .xlsx")
    Set xlSheet = xlWorkbook.activesheet

    With xlSheet.range("A1")
        .entirerow.insert -4121             ' Insert and Shift Row Down
        .entirerow.insert -4121             ' Insert and Shift Row Down
        xlApp.DisplayAlerts = False
        xlSheet.range("A1:E2").merge        ' Merge Cells
        xlApp.DisplayAlerts = True
    End With
   
    With xlSheet.range("A1")
        .Value = "ชื่อหัวเรื่อง"
        .Font.Name = "Tahoma"
        .Font.Size = 18
        .Font.Bold = True
        .HorizontalAlignment = -4108        ' Align Center
    End With
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, prajak, มาลี

280
เขียนข้อเสนอแนะให้ทีมพัฒนา Access access.uservoice.com/forums/319956-access-desktop-application

เขียนข้อเสนอแนะให้ทีมพัฒนา Office officespdev.uservoice.com/forums/224641-feature-requests-and-feedback?category_id=164751 ถ้าเกี่ยวกับ VBA IDE ให้เลือกหมวด Office Development Tools

Blog ของทีมซัพพอร์ทของ Access blogs.technet.microsoft.com/the_microsoft_access_support_team_blog/

Blog ของ Office365 ในเรื่องเกี่ยวกับ Access www.microsoft.com/en-us/microsoft-365/blog/access/
โพสต์นี้ได้รับคำขอบคุณจาก: thaiaccboard, TTT, ปิ่นณรงค์, kitisak

281
ห้อง MS Access / : unrecognized database format
« เมื่อ: 06 ก.ค. 61 , 15:40:21 »
ในนี้บอกว่าปัญหาน่าเกิดจากอาจทั้งเน็ทเวิร์คและดิสก์บนเซิร์ฟเวอร์  msdn.microsoft.com/en-us/vba/access-vba/articles/disk-i-o-error-during-readerror-3040 

สำหรับเรื่องดิสก์ มีโปรแกรมชื่อว่า CHKDSK ที่สั่งจาก command line ได้ เพื่อตรวจสภาพดิสก์และมีตัวเลือกให้แก้ไขเมื่อพบปัญหาด้วย แต่ผมไม่เชี่ยวชาญเรื่อง System Admin ไม่กล้าบอกว่าควรจะใช้ยังไง ลองหารายละเอียดจากในกูเกิลดูครับ แต่ให้ใช้ด้วยความระมัดระวังมากๆนะครับ ถ้ามีระบบ backup บนเซิร์ฟเวอร์อยู่แล้ว ก็ควรทำหลังจาก backup เสร็จแล้วจะดีกว่า

สำหรับประเด็นอื่นๆก็ยังไม่สามารถตัดออกได้ครับ

ถามเพิ่มว่า เมื่อเกิดปัญหาแล้ว ถ้าไปนั่งที่เครื่องเซิร์ฟเวอร์แล้วเปิดไฟล์ฐานข้อมูลเลย มันใช้ได้เลยไหมครับ เราสั่งมันซ่อมหรือว่ามันซ่อมแซมให้เราเอง (รู้ได้ยังไงว่ามันซ่อมให้ มันบอกหรือว่าอย่างไร)
โพสต์นี้ได้รับคำขอบคุณจาก: Kxess

282
ลองทำตาม Instructions for use ในนี้ดูครับ www.everythingaccess.com/tutorials.asp?ID=A-new-method-for-disabling-the-Mouse-Scroll-Wheel-in-Access-forms
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

283
ถ้าใช้ฐานข้อมูลนามสกุล .mdb, .mde ตัว Access จะมี User-Level Security เพื่อสร้างผู้ใช้, กลุ่มผู้ใช้ และกำหนดสิทธิ์ได้ว่าจะให้มีสิทธิ์ตามที่ Access ให้มา มากน้อยแค่ไหน หา Google ด้วยคำ Microsoft Access User Level Security มีอธิบายวิธีทำไว้เยอะแยะครับ แต่การเล่นกับระบบ Security อ่านให้เข้าใจดีๆก่อน ถ้าทำอะไรผิดไป เดี๋ยวจะใช้ไฟล์ไม่ได้นะครับ

แต่ถ้านามสกุลเป็น .accdb, .accde  Access ตั้งแต่ 2007 ได้ตัดเอาความสามารถนี้ออกไปแล้ว การสร้างผู้ใช้, กลุ่มผู้ใช้, สิทธิ์ต่างๆ เราต้องเขียนโค้ดเอาเอง ดังนั้นไม่มีอะไรตายตัว มีเทคนิคเยอะแยะแล้วแต่ความซับซ้อน มีทั้งการป้องกันไฟล์ Back-End ที่เป็นฐานข้อมูล และไฟล์ Front-End ที่เป็นไฟล์เก็บหน้าฟอร์ม/รายงานต่างๆ ลองดูตัวอย่างข้างล่าง

- วิธีที่ใช้ Active Directory ของ Windows เอง (เครื่องเราต้องอยู่ในโดเมนเน็ทเวิร์คและมี Active Directory) www.accesssecurityblog.com/post/Securing-Access-databases-using-Active-Directory.aspx

- วิธีที่สร้างเทเบิลผู้ใช้และกำหนดสิทธิ์เอาเอง (เครื่องเราไม่จำเป็นต้องอยู่ในเน็ทเวิร์ค) www.accesssecurityblog.com/post/2011/04/02/Login-Security-using-Access-VBA.aspx

- ลองอ่านอันนี้ด้วยครับ มีโปรแกรมที่คุณสมชายทำเป็นตย.เอาไว้ www.thai-access.com/yeadram_view.php?topic_id=4371

ยังไงก็ตาม โดยส่วนตัวคิดว่าใครก็ตามที่มีสิทธิ์ใช้โปรแกรมนั้น ถ้ามีความรู้ ก็สามารถเจาะเข้าฐานข้อมูลได้อยู่ดี ความปลอดภัยของ Access มีน้อยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

284
ห้อง Ms Access อื่นๆ / : Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:19:39 »
โพสต์นี้ได้รับคำขอบคุณจาก: thaiaccboard, ปิ่นณรงค์, Su

285
ห้อง Ms Access อื่นๆ / : Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:17:43 »
winworldpc.com/product/microsoft-access/10
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, Su

286
ห้อง Ms Access อื่นๆ / Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:17:13 »
ข้ามไปดูเวลาที่ 11:50
โพสต์นี้ได้รับคำขอบคุณจาก: thaiaccboard, Su

287
ห้อง MS Access / : unrecognized database format
« เมื่อ: 28 มิ.ย. 61 , 00:49:47 »
สาเหตุที่ทำให้ไฟล์ฐานข้อมูลเสียหายเป็นไปได้เยอะแยะครับ อาจเกิดจากการใช้งานอยู่แล้วสัญญาณการติดต่อกับฐานข้อมูลหายไป หรือโปรแกรมที่เรียกใช้ฐานข้อมูลหยุดไปเฉยๆ หรือมีโค้ดในโปรแกรมของเราที่ทำร้ายฐานข้อมูล ก็ต้องเช็คเรื่องเหล่านี้ครับ

- Hardware : แผ่นวงจรเน็ทเวิร์ค, สายสัญญาณ, switch/router มีปัญหา
- OS : ค่า config อะไรของวินโดว์ไม่ถูกต้อง, โปรแกรมส่วนที่จัดการดูแลรับส่งข้อมูลมีปัญหา
- Application : มีโค้ดในโปรแกรมของเราที่ทำร้ายฐานข้อมูล, เปิด application เดียวแต่หลายๆวินโดว์ (ไม่แน่ใจ)

ผมว่าถ้าเกิดปัญหาปั๊ป ให้ลอง ping จากเครื่องอื่นมายัง ip ของเครื่องเรา หรือจะสั่งตั้งแต่เริ่มใช้งานวันนั้นด้วยคำสั่ง ping เลขIP -t เพื่อให้มันทำงานตลอดเวลาก็ได้ ถ้าผลการ ping บอกว่า Request timed out. ก็ตัดปัญหาเรื่อง Application ของเราออกไป แล้วให้เครื่องนั้นลองไปดูเวปอะไรก็ได้ ถ้าไปได้ ก็ตัดเรื่อง Hardware ออกไปได้ครับ

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

288
ห้อง MS Access / : unrecognized database format
« เมื่อ: 27 มิ.ย. 61 , 15:30:45 »
ปักครับ



ผมเป็นบ่อยมาก ทุกวันนี้ยังเป็นอยู่บ่อย ๆ
แก้ทุกวิธีที่รู้แล้ว ยังไม่หาย
ถ้า จขกท ทำวิธีใดแล้วหาย รบกวนบอกหน่อยนะครับ
ขอบคุณครับ

ถ้าวางฐานข้อมูลไว้ที่เครื่องเราเองหล่ะครับ จะเกิดปัญหาหรือไม่

เพิ่มเติม : เมื่อหาใน Google ด้วยประโยค upgrade windows 10 map drive not available จะเห็นว่ามีคนมีปัญหาเดียวกันเยอะมาก ที่พบลิงค์นึงน่าสนใจคือ answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_files/network-mapped-drives-not-available-on-windows-10/ef955b4b-1103-42db-a00d-cd1520a8e178?auth=1 ลองดูหน้าสุดท้ายที่ JE
JemHam เขียนไว้วันที่ November 21, 2016 อาจช่วยได้
โพสต์นี้ได้รับคำขอบคุณจาก: Kxess

หน้า: 1 ... 13 14 15 [16] 17 18 19