Copyright © 2003-2009
By Suthep Sangvirotjanaphat
  Mobile: 089-967-2200, 081-915-7816
Phone: 0-2992-4877   Fax: 0-2992-4878
Fast Contact Us
^
%
.

GreatFriends.Biz Community

Custom Search
 MESSAGE #107955 (อ่าน 974 ครั้ง)

อาจาร์ยและพี่ ๆ GF ช่วยนู๋ด้วยนะค่ะ เรื่องคำนวณส่วนลดค่ะ

Tags: Windows, VB, .NET 2, SQL Server 2005, Crystal Report, Project Management, Blog, Article, News

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

อ.และพี่ ๆ ค่ะ มันเป็นแบบนี้ค่ะ
 
    ครั้งแรก กรอกโดยไม่ให้ส่วนลด หรือจะให้ส่วนลด ก็ตามแต่ เมื่อกดเพิ่มลงใน listview แล้วก็ปกติดีไม่มีปัญหาอะไร
แต่...
    ครั้งที่สอง กรอกโดยให้ส่วนลด ตอนกดเพิ่มลงใน listview มันก็คำนวณเฉพาะสินค้าของมันเองถูก แต่ที่เป็นปัญหา มันดันเอาส่วนลดของสินค้าที่เพิ่มครั้งที่ 2 ไปคำนวณกับสินค้าที่มีอยู่ใน listview ด้วยนี่ซิค่ะ!! แล้วยังงี้ นู่จะทำไงดี พี่ ๆ ที่น่ารักและอาจาร์ยที่เคารพ รบกวนช่วยแนะนำด้วยนะค่ะ
 
(การคิดส่วนลดให้กับสินค้าของนู๋ คือ ลดสินค้าเฉพาะแต่ละตัวน่ะค่ะ ถ้าสินค้าตัวไหนให้ส่วนลดก็คำนวณในสินค้าตัวนั้นทันทีนะค่ะ ไม่ได้เอาสินค้าทั้งหมดมารวมกันแล้วให้ส่วนลดทีหลังนะค่ะ )  รบกวนขอคำแนะนำ หรือไม่ก็ โค้ดตัวอย่างก็ดีนะค่ะ อิอิ
เป็น vb.net ค่ะ
 
รูปประกอบค่ะ
 
 
 
กรอกสินค้า ครั้งที่ 2
 
 
    ตามที่นู๋สงสัย นู๋คิดว่าเป็นตรงคำนวณอ่าค่ะ แต่พอลองเปลี่ยนโค้ดแล้วมานเป็นยังงี้อ่ะ
ฟ้อง error ตรงที่นู๋ ไฮไลท์ สีชมพูเอาไว้ ว่า   Conversion from string "" to type 'Integer' is not valid.
 
     โค้ดค่ะ
 

Private Sub Calculate()

Dim i As Integer = 0

Dim tmpDiscount As Single = 0

Dim tmp As Single = 0

Dim tmpv As Single = 0

Dim tmpVAT As Single = 0

Dim vat As Single = 0

Dim net As Single = 0

For i = 0 To lv.Items.Count - 1

tmpDiscount = tmpDiscount + CSng(lv.Items(i).SubItems(5).Text) 'ส่วนลด

tmp = CSng(lv.Items(i).SubItems(3).Text) * (lv.Items(i).SubItems(4).Text) 'ราคาต่อหน่วย*จำนวน

tmpv = tmpv + CSng(lv.Items(i).SubItems(6).Text) 'รวมเป็นเงิน

'vat = vat + CSng(lv.Items(i).SubItems(5).Text)

vat = vat + lblvat.Text 'ภาษี

net = CSng(tmpv + vat).ToString("#,##.00") 'ยอดสุทธิ

Next

lbldiscount.Text = tmpDiscount.ToString("#,##0.00") 'เลเบลส่วนลด = tmpdiscount

tmpVAT = CSng(tmp - tmpDiscount) * txtvat.Text / 100 '(ราคาต่อหน่วย*จำนวน-ส่วนลด)*7/100

lblvat.Text = vat.ToString("#,##0.00")

' lbltotal.Text = tmpv.ToString("#,##0.00")

' lblnet.Text = tmpv.ToString("#,##0.00")

' txttotal.Text = tmpv.ToString("#,##0.00")

lbltotal.Text = tmpv.ToString("#,##0.00") 'ยอดรวมเงิน

lblnet.Text = net.ToString("#,##0.00") 'ยอดสุทธิ

End Sub

 

Private Sub VerifyDiscount()

Dim i As Integer = 0

Dim tmpDiscount As Single = 0

Dim tmpTotal As Single = 0

Dim vat As Single

For i = 0 To lv.Items.Count - 1

'ส่วนลด

tmpDiscount = CSng((CInt(lv.Items(i).SubItems(3).Text) * CInt(lv.Items(i).SubItems(4).Text)) * CInt((lv.Items(i).SubItems(5).Text)) / 100)

tmpDiscount = CSng((CInt(txtprice.Text) * CInt(txtcount.Text)) * (CInt(txtdiscount.Text) / 100))

lv.Items(i).SubItems(5).Text = tmpDiscount.ToString("#,##0.00")

'ภาษี

vat = CSng(((CInt(lv.Items(i).SubItems(3).Text) * CInt(lv.Items(i).SubItems(4).Text)) - CDbl(lv.Items(i).SubItems(5).Text)) * CInt(txtvat.Text) / 100)

lblvat.Text = vat.ToString("#,##0.00")

'รวมเป็นเงิน

tmpTotal = (CSng(lv.Items(i).SubItems(3).Text) * CSng(lv.Items(i).SubItems(4).Text)) - CSng(tmpDiscount.ToString("#,##0.00"))

lv.Items(i).SubItems(6).Text = CSng(tmpTotal.ToString("#,##0.00"))

Next

End Sub

 

โค้ดปุ่มแอด

 

Private Sub btAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAdd.Click

Dim i As Integer = 0

Dim lvi As ListViewItem

Dim tmpcodeitem As String = ""

txtTaxNo.Focus()

If (txtcodeitem.Text = "") Or (lblTitle.Text = "") Then

MessageBox.Show("กรุณาเลือกรหัสสินค้า!!!", "ข้อผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Error)

txtcodeitem.Focus()

Exit Sub

End If

If (txtcount.Text = "") Then

MessageBox.Show("กรุณากรอกจำนวนสินค้า!!!", "ข้อผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Error)

txtcount.Focus()

Exit Sub

End If

' If (txtdiscount.Text = "") Then

'txtdiscount.Text = "0"

' End If

For i = 0 To lv.Items.Count - 1

tmpcodeitem = lv.Items(i).SubItems(0).Text

If txtcodeitem.Text = tmpcodeitem Then

MessageBox.Show("คุณเลือกรหัสสินค้าซ้ำกัน !!!", "ผลการตรวจสอบ", MessageBoxButtons.OK, MessageBoxIcon.Information)

txtcodeitem.Text = ""

lblTitle.Text = ""

txtprice.Text = ""

txtcount.Text = ""

txtdiscount.Text = "0"

txtvat.Text = "7"

txtcodeitem.Focus()

txtcodeitem.SelectAll()

Exit Sub

End If

Next

Dim anyData() As String

Dim tmpDiscount As Single = 0

Dim tmpTotal As Single = 0

Dim total As Single = 0

Dim vat As Single = 0

tmpDiscount = CSng((CInt(txtprice.Text) * CInt(txtcount.Text)) * (CInt(txtdiscount.Text) / 100)) 'คิดส่วนลด (ราคาต่อหน่วย*จำนวน)*ส่วนลดที่ได้รับ/100

tmpTotal = (CInt(txtprice.Text) * CInt(txtcount.Text)) - tmpDiscount 'คิดรวมเป็นเงิน (ราคาต่อหน่วย*จำนวน)-ส่วนลดที่คิดได้

vat = (CInt(txtprice.Text) * CInt(txtcount.Text) * CInt(txtvat.Text) / 100) 'คิด vat (ราคาต่อหน่วย*จำนวน*7/100)

total = CSng(tmpTotal.ToString) + CSng(vat.ToString) 'คิดราคาสุทธิ (ราคารวมที่คิดได้ + vat ที่คิดได้)

anyData = New String() { _

txtcodeitem.Text, _

lblTitle.Text, _

lblunit.Text, _

txtprice.Text, _

txtcount.Text, _

lblnet.Text, _

tmpDiscount.ToString("#,##0.00"), _

total.ToString("#,##0.00") _

}

lvi = New ListViewItem(anyData)

lv.Items.Add(lvi)

VerifyDiscount()

Calculate()

cleartxt()

End Sub

 

รบกวนอาจาร์ยและพี่ ๆ ด้วยนะค่ะ ว่ายน้ำต่อไปไม่ถูกแล้วอ่าค่ะ

ขอบคุณมาก ๆ ล่วงหน้าเลยค่ะ

 

 



maicomsci วันที่ส่ง: 6 มิ.ย. 52 01:09 GMT+7
วันที่ปรับล่าสุด: 7 มิ.ย. 52 06:21 GMT+7
REPLY #1 (107961)

ที่ส่วนลดของการคีย์ครั้งที่ 2 ไปแสดงซ้ำกับการคีย์ครั้งแรก เพราะว่ามีโค้ดซ้ำกันอยู่ที่

Sub VerifyDiscount()
 
บรรทัดถัดจากที่ Hightlight สีชมพู (มันมี tmpDiscount 2 ครั้ง ต้องตัดอันที่ 2 ออก)

'ส่วนลด

tmpDiscount = CSng((CInt(lv.Items(i).SubItems(3).Text) * CInt(lv.Items(i).SubItems(4).Text)) * CInt((lv.Items(i).SubItems(5).Text)) / 100)

tmpDiscount = CSng((CInt(txtprice.Text) * CInt(txtcount.Text)) * (CInt(txtdiscount.Text) / 100))

 

 

ส่วนที่ error นั้นอาจจะมาจากค่าของตัวแปรบางตัวใน anyData อาจจะไม่ถูก เพราะเห็นว่าไปดึงค่ามาจาก lblnet.Text ด้วย

ให้ลอง Debug ดูก็จะทราบเองว่าค่าของตัวแปร ที่จะใส่เข้าไปใน ListViewItem นั้น เป็นค่าที่เราต้องการหรือเปล่าครับ



V# Guy วันที่ส่ง: 6 มิ.ย. 52 05:33 GMT+7
วันที่ปรับล่าสุด: 6 มิ.ย. 52 05:33 GMT+7
REPLY #2 (107994)
ขอบคุณมากนะค่ะ K. V# Guy  จะลองทำดูใหม่ค่ะ ตอนนี้ขอออกไปกินข้าวก่อน ^^
 
ว่าแต่ว่า "debug  ดูก็จะทราบเองว่าค่าของตัวแปร ที่จะใส่เข้าไปใน ListViewItem นั้น เป็นค่าที่เราต้องการหรือเปล่า"
 
นั้นทำยังไงหรอค่ะ เหอ ๆ ม่ะรู้จริง ๆ อ่ะค่ะ รบกวนอีกรอบนะค่ะ
 
ขอบคุณค่ะ

 



maicomsci วันที่ส่ง: 6 มิ.ย. 52 18:07 GMT+7
วันที่ปรับล่าสุด: 6 มิ.ย. 52 18:07 GMT+7
REPLY #3 (107997)
มาช่วยเสริมอีกแรงนะครับ
 
ผมยังไม่มีเวลาช่วยอ่านโค้ดนะครับ
แต่พอมีคำแนะนำอื่นๆ
 
 
1. ควรแยกโค้ดส่วน input, process, output ให้เป็นระบบระเบียบ
    โดยส่วน process ขอให้ไม่มีการอ้างอิงถึง control ใดๆ เลย
    เรื่องนี้ผมสอนและฝึกนิสัยให้ผู้เรียนหลักสูตรเบื้องต้นมาตลอด
    พอเราใช้ control ต่างๆ ใน logic ของโค้ด โค้ดจะอ่านยาก ดีบั๊กยาก
    และ maintain ยากด้วย ตัวอย่าง
 
    ' ---- อย่างนี้ไม่ดี
    tmpDiscount = CSng((CInt(txtprice.Text) * CInt(txtcount.Text)) * (CInt(txtdiscount.Text) / 100))
   
    ' ---- ควรแก้ไขเป็น
    Dim Price As Integer
    Dim Count As Integer
    Dim Discount As Integer
    Dim TempDiscount As Single
 
    ' Input
    Price = CInt(txtPrice.Text)
    Count = CInt(txtCount.Text)
    Discount = CInt(txtDiscount.Text)
   
    ' Process
    TempDiscount = CSng(Price * Count * Discount / 100.0)
 
 
2. เข้าใจว่ากำลังทำอยู่ ยังไม่เสร็จ
    ดังนั้นขอ comment ตอนนี้ ก็คงไม่ว่าอะไรนะครับ
   
    UI design ที่ควรปรับ
    สีแดงบนพื้นเทาเข้ม อ่านค่อนข้างยากครับ
    โดยเฉพาะถ้าจอภาพไม่ดี จะทำให้ผู้ใช้ลำบากตา
    ลองปรับให้มีสีที่ contrast เพิ่มขึ้นกว่านี้ครับ
   
 
3. ไม่ควรผสมภาษาไทย/อังกฤษ
    และตัวอักษรเล็ก/ใหญ่ครับ
   
 


surrealist วันที่ส่ง: 6 มิ.ย. 52 18:50 GMT+7
วันที่ปรับล่าสุด: 6 มิ.ย. 52 18:50 GMT+7
REPLY #4 (108001)
ขอบคุณอาจาร์ยมาก ๆ เลยนะค่ะ เพิ่มความรู้ให้กับนู๋ได้มากเลยค่ะ 
คอมเมนต์ได้ไม่มีปัญหาเลยค่ะ นู๋เองจะได้รู้ในสิ่งที่ไม่ทราบ+ไม่ได้มองถึงด้วยค่ะ
(ขอเมาท์นิดนึงได้ป่ะค่ะ ว่า ที่นู๋ทำโปรเจคมาเนี่ยะ ต้องขอบคุณ GF มากเลยค่ะ ถ้าไม่มี GF โปรเจคนู๋คงไปไหนไม่รอด)
 


maicomsci วันที่ส่ง: 6 มิ.ย. 52 20:20 GMT+7
วันที่ปรับล่าสุด: 6 มิ.ย. 52 20:20 GMT+7
REPLY #5 (108012)
Debug = หาจุดบกพร่องของโปรแกรมแล้วแก้ไข
 
กำหนดจุด BreakPoint:
  • ให้ Cursor อยู่บรรทัดที่ต้องการ Debug แล้วกด F9 หรือ
  • ใช้ mouse click ตำแหน่งเดียวกับรูปด้านล่าง
 
 
จะมีจุดกลมสีแดงปรากฎขึ้น จากนั้นให้กด F5(Run) เพื่อเริ่มโปรแกรม
เมื่อโปรแกรมทำงานมาถึงจุดดังกล่างจะหยุดรอ ให้โปรแกรมเมอร์ตรวจสอบค่าต่าง ๆ ได้ ซึ่งการตรวจสอบค่าต่าง ๆ นั้น
อาจทำได้โดย (ตามรูปด้านล่าง)
 
  • ใช้ mouse ไปอยู่เหนือค่าตัวแปรที่ต้องการทราบ, visual stuio จะแสดงค่าให้ทราบว่าขณะนั้น ตัวแปรมีค่าเป็นอะไร หรือ
  • คลิ้กขวาที่ตัวแปร ที่ต้องการทราบค่าแล้วเลือกเมนู Add Watch หรือ
  • พิมพ์ชื่อของตัวแปรนั้น ๆ ในหน้าต่าง Watch
 


V# Guy วันที่ส่ง: 7 มิ.ย. 52 06:21 GMT+7
วันที่ปรับล่าสุด: 7 มิ.ย. 52 06:21 GMT+7
กระทู้นี้มีอายุเกิน 365 วันแล้ว ท่านจะไม่สามารถตอบกระทู้นี้ได้อีก
ถ้าต้องการสนทนาต่อ กรุณาตั้งเป็นกระทู้ใหม่ได้ในหน้าโฮม
และอาจจะอ้างถึงกระทู้นี้ โดยก๊อปปี้ข้อความในกล่องสีขาวด้านล่างไปแปะในกระทู้ใหม่

copy เพื่ออ้างอิงถึงข้อความนี้:
อาจาร์ยและพี่ ๆ GF ช่วยนู๋ด้วยนะค่ะ เรื่องคำนวณส่วนลดค่ะ
http://greatfriends.biz?107955


8 ก.ย. 19:53
Online: 165