ช่วยกันต่อยอด Auto Reference library
กระทู้เก่าบอร์ด อ.Yeadram

 2,209   5
URL.หัวข้อ / URL
ช่วยกันต่อยอด Auto Reference library

ปัญหาอย่างหนึ่งของการพัฒนา Access แล้วส่งไฟล์ไปให้คนอื่นใช้ คือเราไม่ได้เป็นคน ติดตั้ง windows และ office ด้วยตัวเราเอง เราก็ไม่รู้ว่า
- เครื่องของผู้ใช้ มีอะไร ไม่มีอะไรบ้าง    
- ตอนเขาติดตั้ง office เขาติดตั้งสมบูรณ์แบบ ด้วยการเลือกออบชั่นต่างเอง หรือปล่อยให้วิซาร์ดมันพาติดตั้งอย่างอัตโนมัติ
- เครื่องนั้นๆ ผ่านการติดตั้งและถอดถอน office มาแล้วกี่ครั้ง ตั้งแต่การติดตั้งระบบปฎิบัติครั้งล่าสุด บางคน เดี๋ยวลง XP เดี๋ยวก็ถอดเปลี่ยนเป็น 2007 แล้วไม่ถูกใจ ก็ถอดเปลี่ยนเป็น 2003 อีก กลับไปกลับมา ขึ้นๆ ลงๆ

เราซึ่งพัฒนาโปรแกรม Access ของเรา ส่งไปให้เขาใช้ แล้วมักจะเจอ Error Missing Library อยู่บ่อยๆ
ก็เลยคิดว่า จะมีวิธีไหนตรวจจับ การ Error Missing แล้วทำการแก้ไข ด้วยระบบอัตโนมัติ ก่อนที่ผู้ใช้จะเจอ เพราะว่าการเจอ Error หรือ Bug ต่างๆ ในโปรแกรมของเรา ไม่ว่าจะร้ายแรงหรือไม่ก็ตาม นั่นหมายถึง ความน่าเชื่อถือของโปรแกรมของเรามันลดลงแบบ ฮวบๆ เลย

ผมนั่งคิด นั่งค้นกระทู้เก่าๆ ค้น google บ้าง ได้ฟังก์ชั่นสำเร็จรูปมาเป็นตัวนี้ครับ บังคับให้รันทุกครั้งที่เปิดโปรแกรมกันเลยทีเดียว แต่ก็อย่างว่าแหละครับ มันเพิ่งได้รับการทดสอบที่เครื่องผม เพียงเครื่องเดียว มันยังสรุปไม่ได้ว่า ดีพร้อมแล้วหรือยัง จึงเอามาโพสต์ ให้ทุกๆ คน ได้ลอง ได้รัน ได้ต่อยอด ช่วยกันคิด ช่วยกันเสริม ให้มันสมบูรณ์หน่อยครับ

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

Function CheckReference()
   Dim chkRef As Reference
   Dim RefLoop As Integer
    Dim AccPath As String
    Dim CommonPath As String
        AccPath = SysCmd(acSysCmdAccessDir)
        j = InStr(1, AccPath, "Microsoft")
        CommonPath = Left(AccPath, j - 1) & "Common Files\"

    Dim Arr(4, 1) As String
        Arr(0, 0) = "stdole": Arr(0, 1) = Environ("Windir") & "\System32\Stdole2.tlb"           ' OLE automation ( Show picture on form, report )
        Arr(1, 0) = "MSACAL": Arr(1, 1) = AccPath & "MSCAL.OCX"                                         ' Microsoft Calendar Control xx.0    ( Calendar on form to select date )
        Arr(2, 0) = "Office": Arr(2, 1) = Replace(AccPath, "Microsoft Office", "Common Files\Microsoft Shared") & "MSO.DLL"        'Microsoft Office xx.0 Object Library ( msoFiledialogFilePicker )
        Arr(3, 0) = "DAO": Arr(3, 1) = CommonPath & "Microsoft Shared\DAO\dao360.dll"   ' Microsoft DAO 3.6 Object Library ( DAO )
        Arr(4, 0) = "ADODB": Arr(4, 1) = CommonPath & "System\ADO\msado25.tlb"              ' Microsoft ActiveX Data Object 2.8 Library ( ADODB )

For RefLoop = 0 To UBound(Arr())
    For Each chkRef In Application.References
        If chkRef.Name = Arr(RefLoop, 0) Then
            If chkRef.IsBroken Then
               Application.References.Remove chkRef
               Application.References.AddFromFile Arr(RefLoop, 1)
            End If
            GoTo NextRefLoop
        End If
    Next chkRef
    Application.References.AddFromFile Arr(RefLoop, 1)
    
NextRefLoop:
Next RefLoop
       
End Function



5 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R13237
จะลองดูครับ ได้ผลแล้วจะแจ้งให้ทราบ
2 @R13239
อาจารย์ครับ วิธีการคือ ก็อป function นี้ของอาจารย์ไป paste ลง module แล้วกด Run ใช่ไหมครับ
3 @R13242
ทำความเข้าใจกับ logic แล้วคิดว่า OK ครับ
แต่ไม่ชอบตรง Goto NextRefLoop
จึงขอแก้ช่วง For loop ดังนี้

For RefLoop = 0 To UBound(Arr())
    bolIsExist = False
    For Each chkRef In Application.References
        If chkRef.Name = Arr(RefLoop, 0) Then
            bolIsExist = True
            If chkRef.IsBroken Then
               Application.References.Remove chkRef
               Application.References.AddFromFile Arr(RefLoop, 1)
            End If
        End If
    Next chkRef
    If Not bolIsExist Then
        Application.References.AddFromFile Arr(RefLoop, 1)
    End If
Next RefLoop
4 @R13259
ตอบคุณ TheBeginner
ฟังก์ชั่นนี้จะไม่มีปฎิกิริยาตอบสนองใดๆ เลยนะครับ ไม่ว่า ทำงานผ่านหรือไม่ก็ตาม ไม่มีจุด Debug check ด้วยครับ

เพราะเป้าหมายคือ ต้องการจะจัดการกับปัญหาอย่างเงียบๆ ไม่ให้แจ้งอะไรกับผู้ใช้เลยครับ

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

เอาอย่างนี้นะครับ สำหรับคนที่จะช่วยทดสอบ
ให้จำลองสถานการณ์สมมติขึ้นก่อน ว่าในเครืองของเรา Libraries ของเรามันหาย หรือมันผิดเวอร์ชั่นหรือมัน Missing
แล้วเอาฟังก์ชั่นนี้ไปวางในโมดูล อย่างที่คุณ TheBeginer ว่า ต่อไปวาง เคอร์เซอร์ไว้ภายในฟังก์ชั่น แล้วกดปุ่ม F5

เมื่อมันทำงานเสร็จ (เคอร์เซอร์ไม่ได้เป็นรูปนาฬิกาทรายแล้ว) ให้ไปเช็คดู ไลบรารี่ครับ ว่ามันกลับมาครบ   ว่ามันหายอาการ Missing แล้วหรือยัง

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

การจำลองสถานการณ์สมมติ ก็ยกตัวอย่างเช่น ไปติ๊กเครื่องหมาย ในรายชื่อไลบราที่ที่ติ๊กอยู่แล้ว ให้ติ๊กออกก่อนครับ (ย้ำว่าต้องเป็นหนึ่งในรายการสมาชิกอาเรย์นะครับ)

เวลานำไปใช้ ไปปรับใช้ หากต้องการเพิ่มสมาชิกอาเรย์แต่ไม่รู้ว่า ชื่อของไลบรารี่ที่เรามีนั้น (หมายถึงในโปรแกรมของคุณ ที่มันอาจจะมีเพิ่มหรือแตกต่างจากตัวอย่างของผม)    ใช้ฟังก์ชั่นง่ายๆ นี้ เพื่อหารายชื่อไลบรารี่ที่เราติดตั้งครับ
Function ListLibraryName()
Dim chkref as Reference
For Each chkRef In Application.References
   debug.print chkRef.name; chkRef.Fullpath
Next
End Function
5 @R13267
ในโปรแกรมผม เพียงแต่ตรวจว่าทุก reference ที่ต้องการ มันยังมีอยู่หรือไม่ตอนเริ่มระบบเท่านั้น ไม่ได้มีการแก้ไขให้แต่อย่างใด เพราะถือว่าตอนลงโปรแกรม ต้องลงทุกอย่างครบแล้ว ถ้าใช้ๆไปเกิด reference มันหาย ก็ถือว่าไม่ใช่ความผิดของเราแต่อย่างใด ก็ต้องมีค่าบริการสำหรับซ่อมแซมหล่ะครับ แต่นั่นอาจเป็นเพราะผมเขียนให้แก่ลูกค้าเพียง 2 ราย จึงดูแลได้ทั่วถึง ถ้าทำเป็น package คงต้องคิดอีกทีว่าจะทำยังไง
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2397s