[VB6] Debug RecordSet

Code Snippet แปะไว้ เพราะ Search หา Google แล้วไม่เจอ เวลาไปแงะ Legacy Code จะได้ง่ายๆ

[VB6] Command Line Options

หลังจากทำตัว Auto Build VB6 มา เจอประเด็นที่่าจะมีปัญหาทำให้ระบบที่ทำใหม่ มันมีโอกาสไม่ได้ไปต่อ คือ ระบบใหม่เวลา Build แล้ว Error มันแจ้งแค่ Error แต่ไม่บอกว่า Error ตรงไหน ซึ่งจะต่างกับ Build เองโดยใช้เปิด GUI ของ VB6 มาทำ ที่แสดง Error ช้ดเจน หลังจากเรียนเสร็จ วันนี้ตื่นมาตี 4 เลยลองค้นข้อมูลดูจาก CD MSDN ของ Microsoft ว่ามันทำได้ไหม ปรากฏว่าได้มี

  • /out filename – ถ้า Error จากการ /make หรือ /m ให้แสดง Error Message ถ้าไม่ใช้มันจะ Popup แจ้ง

  • สำหรับการเข้าหน้าจอ Command Line Options พิมพ์ตามนี้เลยครับ

รู้สึก Fail เลย ทำระบบใหม่ แต่ดันลืมสังเกตุ พวก log กับ Error Message หวังว่าการเรียน SE จะช่วยให้เราคิดรอบครอบมากขึ้นนะ

ลองใช้ Hudson กับ Platform VB6

พอดีเห็นงานที่บริษัทมันยุ่งยากมากกับการ Build Legacy Code เก่าอย่าง VBุ6 ที่มีปัญหามากมาย โดยย้าย Code จาก Microsoft Source Safe มายัง SVN แล้ว จากนั้นเชื่อมกับตัว Continuous Integration อย่าง Hudson ครับ เพื่อแก้ไขปัญหา ดังนี้

  • ลดข้อผิดพลาดจากการ Check In Source Code โดยทำให้ตัว CI Server ทดสอบ Build และแจ้งผลหากมีข้อผิดพลาด
  • ทำ Automate Build ของ VB6 เพื่อลดการจากการอัตโนมือ ซึ่งมีข้ออผิดพลาดสูง และจากข้อที่แล้วที่มีการ Build สม่ำเสมอทำให้เราเอาตัว .exe หรือ DLL เหล่านั้นมาใช้ได้เลย
  • พยายามทำ UI Test ถ้าทำได้ เพราะเท่าที่ลองหาข้อมูลดู Nunit กับ TestStack ในการทำ Test แบบ UI Test น่าจะมีความเป็นไปได้สูงสุด เพราะการไปปรับ Code ให้ VB6 รองรับ UnitTest เสียเวลามากเกินไป ยอม Rewrite เป็น Java หรือ .Net ดีกว่าครับ

ใน Blog ตอนต่อไปเป็นการลง Hudson และการลง Plugin ที่จำเป็นรวมถึงการ Config ครับ

 

[VB6] Object Library Not Registered When Adding Windows Common Controls 6.0

  • win 32
    cd C:\Windows\System32
    regsvr32 mscomctl.ocx3
    regtlib msdatsrc.tlb
    
  • win 64
    cd C:\Windows\SysWOW64
    regsvr32 mscomctl.ocx
    regtlib msdatsrc.tlb
    

หมายเหตุ

  • regsvr32 mscomctl.ocx (ระวังตัวใหญ่ตัวเล็ก)
  • เวลาเรียกใช้ cmd ให้ Run as Admin

ที่มาของข้อมูล

[Visual Basic] Run time error 28- Out of stack space

หลายครีั้งที่เราเขียนโปรแกรม อาจจะเจอ Error มาบ้าง แต่ Error วันนี้ผมว่าเป็นกรณีศึกษาที่ดีสำหรับคนที่เขียน VBA กับ VB6 นะครับ โดยเฉพาะคนที่ชอบเขียนโปรแกรม โดยอาศัย Event ต่างๆนะครับ ระวังจะทำให้เกิด Recursive ของ Event ทำให้เกิด Run time error 28- Out of stack space ดังตัวอย่างต่อไปนี้

ถ้ามีโจทย์ หรือ Business ที่ว่า ถ้า Check Box A ถูกติ๊กแล้ว  Check Box B ต้องไม่ติ๊ก เมื่อเรา Assign ค่าให้กับ Check Box จะทำให้เกิด Event Check ขึ้นนะครับ ทหำใ้ห้โปรแกรมของเราเกิด Error นะครับ

ดัก Event Click

ตอนแรกทำได้

แต่พอ Untick แล้วมาคลืกใหม่ทำไมต้องคลิกเบิ๊ล

ใส่ Code เพิ่มเพื่อให้มัน Assign ค่าใหม่

ผล คือ ว่ามันไป Fire Event Click จน Call Stack เต็มจน Error

ท้าย่ที่สุดต้องมากำหนด Flag ดัก

 

 

การตรวจสอบ Regional Setting ว่าเป็น พ.ศ. หรือ ค.ศ. ใน VB6 และ VB.NET

สามารถใช้ CODE ตามนี้ได้เลยครับ

  • Code สำหรับ VB6
  • Code สำหรับ VB.NET สังเกตุว่าตรง Now นะครับมีการเติม () เพิ่มเข้าไป ^___^

[VB6] Regular Expression

ถึง VB6 เป็นเทคโนโลยีที่เก่า ล้าสมัยไปแล้ว แต่อย่าลืมว่าระบบงานบางระบบยังคงใช้ภาษานี้อยู่ ซึ่งการปรับเปลี่ยน หรือ Port ไปทั้งระบบ อาจจะมีค่าใช้จ่ายที่สูง ทางที่ดีที่สุด คือ พัฒนาส่วนเสริมให้มันต่อไปเรื่อยๆ วันนี้ผมจะมาแนะนำการ Validate ข้อมูลโดยใช้ Regular Expression (ตกใจหละซิ เพราะหลายคนคิดว่ามันน่าจะมีใน Java / C# กัน) โดยผมจะแนะนำขั้นตอนการทำ โดยใช้ตัวอย่างของการนำ Regular Expression มาหา IP Address ที่อยู่ในช้อความ ตามขั้นตอน ดังนี้

  • เริ่มวางหน้าจอโปรแกรม ดังรูป
    01
  • จัดการ Add Reference
    02
  • สิ่งที่ควรู้รู้ก่อนดูตัวอย่าง Code การใช้งาน
    • Microsoft vbscript regular expressions 5.5 เป็น Library ที่ทาง Microsoft พัฒนา เพื่อช่วยให้การเขียน Regular Expression ง่ายขึ้น
    • RegExp เป็น Object ที่มีหน้าที่จัดการกับ Regular Expression โดยมีสิ่งที่ควรรู้ดังนี้
      1. Pattern คือ Property ที่ให้ระบุตัว Regular Expression ที่ต้องการหาลงไป
      2. IgnoreCase คือ Property ที่เป็นไว้บอกรู้แบบการตรวจว่าต้องสนใจ ตัวอักษรเล็กใหญ่ หรือไม่ (ถ้า True = ไม่สนใจ)
      3. Test คือ Method ที่จะตรวจสอบคร่าวๆก่อนว่า Pattern ที่กำหนดเข้ามาถูกต้อง หรือไม่
      4. Execute คือ Method ที่สั่งให้ตรวจหาคำที่ตรงตาม Pattern ที่กำหนดไว้ ซึ่งได้ Output ในรูปแบบของ Object MatchCollection อาจจะได้คำที่ตรงตาม Pattern มากกว่า 1 คำ จึงต้องแยกออกมาทีละคำ โดยใช้ For Each ดึงออกมาใส่ Object Match แล้วจึงเอาผลลัพธ์ที่ได้ออกมาผ่านทาง Property Value
  • ตัวอย่าง Code การใช้งาน
    Private Sub cmdOK_Click()
        Dim lStrIPPattern As String
        Dim lStrInput As String
        Dim lStrOutput As String
    
        lStrIPPattern = "([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.[0-9]{1,3}"
        If txtInput.Text <> Empty Then
            lStrInput = txtInput.Text
            'Call Function TestRegExp
            lStrOutput = TestRegExp(lStrIPPattern, lStrInput)
            If lStrOutput <> Empty Then
                MsgBox "Pattern found!!!", vbOKOnly + vbInformation, "System Message"
                txtOutput.Text = lStrOutput
            Else
                MsgBox "Pattern not found!!!", vbOKOnly + vbExclamation, "System Message"
                txtOutput.Text = "Regular expression matching fail"
            End If
        Else
            MsgBox "Please enter input text", vbOKOnly + vbExclamation, "System Message"
        End If
    End Sub
    
    Private Function TestRegExp(pStrPattern As String, pStrInput As String) As String
        'Create objects.
        Dim lObjRegExp As RegExp
        Dim lObjMatch As Match
        Dim lColMatches As MatchCollection
        Dim lStrMatch As String
    
        'Create a regular expression object.
        Set lObjRegExp = New RegExp
    
        'Set the pattern by using the Pattern property.
        lObjRegExp.Pattern = pStrPattern
    
        'Set Case Insensitivity.
        lObjRegExp.IgnoreCase = True
    
        'Set global applicability.
        lObjRegExp.Global = True
    
        'Test whether the String can be compared.
        If (lObjRegExp.Test(pStrInput) = True) Then
            'Get the matches.
            Set lColMatches = lObjRegExp.Execute(pStrInput)   ' Execute search.
    
            For Each lObjMatch In lColMatches   ' Iterate Matches collection.
                lStrMatch = lStrMatch & "Match found at position "
                lStrMatch = lStrMatch & lObjMatch.FirstIndex & vbCrLf
                lStrMatch = lStrMatch & "===== Match Value is ==== " & vbCrLf
                lStrMatch = lStrMatch & lObjMatch.Value & vbCrLf
            Next
        Else
            lStrMatch = Empty
        End If
        'Return Result
        TestRegExp = lStrMatch
    End Function
    
  • ผลการทำงาน
    • กรณีที่พบข้อมูลตรงตาม Pattern โปรแกรมแสดงคำที่พบ ดังรูป
      TestFound
    • กรณีที่ไม่พบข้อมูลตาม Pattern โปรแกรมแสดง Message ดังรูป
      TestNotFound
  • Download ตัวอย่าง Source Code

    [wpdm_file id=2]

  • แหล่งข้อมูล
    1. http://www.experts-exchange.com/Programming/Languages/Visual_Basic/A_1336-Using-Regular-Expressions-in-Visual-Basic-for-Applications-and-Visual-Basic-6.html
    2. http://www.experts-exchange.com/Programming/Languages/Visual_Basic/A_1336-Using-Regular-Expressions-in-Visual-Basic-for-Applications-and-Visual-Basic-6.html
    3. http://www.addedbytes.com/blog/code/vbscript-regular-expressions/
    4. http://www.regular-expressions.info/vb.html

[SQL Server] SELECT * From Table where 1 > 2

เวลาทำงานหลายคนอาจจะเจอ SQL แปลก เช่น

Q: WHERE 1 > 2 คือ อะไร ?
A: คือ การ SELECT ข้อมูล RECORD เปล่าขึ้นมา เพื่ออัปเดต หรือ ทำเป็น TEMP Table เพื่อการใช้งานต่อไป

ตัวอย่างการใช้งาน

  • SELECT RECORD เปล่าขึ้นมา Update Recordset ใน VB6
  • .ใช้สร้าง Table ขึ้นมาใหม่ เช่น