เรื่องของเรื่องมีอยู่ว่า มี Module ที่เป็น VB6 อันนึง convert มาเป็น .NET มา 4 ปีและ แต่ลูกค้างอแงมาเรื่อยมา ขอว่าถ้าจะแลกต้องให้โน่นนั่นนี่ และจะทดสอบให้ทั้งๆที่มันดีกว่านะ ดึงมาได้ 4 ปีแหละ จนปีนี้เอาออกเลย สรุปทีลูกค้างอแงมาตลอด ไม่ได้ Test 555 แต่มันถูกไป 90% นะ แต่จะมีอยู่เคสนึงที่ตัว Process ถ้าเป็นเดือน 12 จะมีบางเคสที่เลยมันจะผิดเสมอ เลยลองไล่ๆดู มันเพราะอะไรนะ ?
- VB6 บวกลูกทุ่ง
If DataRecordSet.Fields("MONTHID").Value = Month(ltmpDate) + 1 And _ DataRecordSet.Fields("YEAR").Value = DateTime.Year(ltmpDate) Then 'DO BUSINESS LOGIC End If
- .NET ย้ายมาใช้ DateTime.AddMonth() แทน
if (entry.MonthId == dailyaccEntry.ValueDate.AddMonths(1).Month && entry.Year == dailyaccEntry.ValueDate.Year) { //DO BUSINESS LOGIC }
Debug หาสาเหตุ
เมื่อลอง Debug จริงๆ เราจะพบปัญหากันครับ
- VB6 ตัวแปร month ได้ 13
- .NET month ได้ 1 แล้ว year ขยับเพิ่มไป
ตอนนี้เราจะรู้สาเหตุที่ IF มันทำงานผิดปกติ เพราะค่าที่ได้จาก VB6 และ .NET ตอนเดือนที่ 12 ไม่เหมือนกันนี่เอง
แก้ไข
- ปรับ Logic ของ .NET ใช้วิธีบวกลูกทุ่งแบบ VB6 ไปครับ
if (entry.MonthId == (dailyaccEntry.ValueDate.Month + 1) && entry.Year == dailyaccEntry.ValueDate.Year) { //DO BUSINESS LOGIC }
ได้บทเรียนเหมือนกัน กับประเด็นเล็กๆน้อยๆ ที่ต้องระวังเวลา Convert ระบบจากภาษาเก่า > ใหม่ บางทีความสะดวกสบาย อาจจะสร้าง Defect แปลกๆได้
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.