[C#] ทำไม Process มันผิดแค่เดือน 12 นะ

เรื่องของเรื่องมีอยู่ว่า มี 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
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.