ทำระบบขายสินค้าค่ะ โดยเชื่อมกับฐานข้อมูล MS SQL Server
พอทำปุ่มบันทึกรายการขาย ให้เก็บลงในฐานข้อมูล มันขึ้น Error ว่า
ไม่สามารถเพิ่มข้อมูลได้ เนื่องจาก Violation of PRIMARY KEY constaint 'PK_Sale', Cannot insert duplicate key in object 'dbo.Sale'. The statement has been terminated.
ฐานข้อมูลของตาราง Sale มี sale_no เป็นPK, sale_date, cus_no
และตาราง sale_detail มี มี sale_no เป็นPK (เป็นFKนะคะ), pro_no เป็นPK, amount, sale_price
(ตารางฐานข้อมูลอื่นๆที่เกี่ยวข้อง) ตารางCustomer มี cus_no เป็น PK, cus_name,cus_add,cus_tel
ตารางProduct มี pro_no เป็น PK, pro_name, pro_cost, pro_price, pro_stock, record_date
และนี่ โค้ดคะ
Private Sub Save_Btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save_Btn.Click
If Sale_ListView.Items.Count > 0 Then
If MessageBox.Show("คุณต้องการยืนยันการขายสินค้า ใช่หรือไม่?", "คำยืนยัน", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
Dim sql As String = ""
Dim SqlParam As SqlParameter
sql = "INSERT INTO Sale (sale_no, sale_date, cus_no)"
sql &= "VALUES (@saleno, @saledate, @cusno)"
_cmd = New SqlCommand(sql, Conn)
SqlParam = New SqlParameter
SqlParam.ParameterName = "@saledate"
SqlParam.SqlDbType = SqlDbType.DateTime
SqlParam.Value = DateTimePicker1.Value
_cmd.Parameters.Add(SqlParam)
_cmd.Parameters.AddWithValue("saleno", Sale_noTextBox.Text)
_cmd.Parameters.AddWithValue("cusno", Cus_noTextBox.Text)
Try
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConnection
.Open()
End With
With _cmd
.CommandType = CommandType.Text
.CommandText = sql
.Connection = Conn
.ExecuteNonQuery()
End With
Catch ErrProcess As Exception
MessageBox.Show("ไม่สามารถเพิ่มข้อมูลได้ เนื่องจาก " & ErrProcess.Message, "ข้อผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
Dim i As Integer = 0
For i = 0 To Sale_ListView.Items.Count - 1
sql = "INSERT INTO sale_detail (sale_no, pro_no, amount, sale_price)"
sql &= " VALUES(" & (Sale_ListView.Items(i).SubItems(0).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(1).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(3).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(4).Text) & ")"
With _cmd
.CommandType = CommandType.Text
.CommandText = sql
.Connection = Conn
.ExecuteNonQuery()
End With
Next
MessageBox.Show("บันทึกรายการขายสินค้า เรียบร้อยแล้ว", "ผลการทำงาน", MessageBoxButtons.OK, MessageBoxIcon.Information)
Sale_ListView.Clear()
ClearCustomerData()
ClearProductData()
Sale_noTextBox.Text = ""
Alltotal_Label.Text = "0"
Sale_noTextBox.Focus()
End If
End If
End Sub
ที่สงสัยคือ เป็นเพราะใส่ sale_no ซ้ำกันรึเปล่าคะ
sale_no ที่จะใส่ลงตาราง Sale นั้น ดึงมาจาก TextBox
ส่วน sale_no ที่จะใส่ลงตาราง sale_detail ที่เป็น FK นั้น ดึงมาจาก ListView ค่ะ
ช่วยแก้ให้ถูกต้องทีนะคะ ติดปุ่มบันทึกนี้มาหลายวันแล้ว ร้อนใจ แล้วก็เครียดมากค่ะ
หรือถ้ามีใครใจดี อยากให้ช่วยเขียนโค้ดปุ่มบันทึก พร้อมตัดStock โดยมี ตารางฐานข้อมูลแบบนี้ให้ทีค่ะ ><
โค้ด VB ปุ่มบันทึก Error ค่ะ ช่วยทีนะคะ
พอทำปุ่มบันทึกรายการขาย ให้เก็บลงในฐานข้อมูล มันขึ้น Error ว่า
ไม่สามารถเพิ่มข้อมูลได้ เนื่องจาก Violation of PRIMARY KEY constaint 'PK_Sale', Cannot insert duplicate key in object 'dbo.Sale'. The statement has been terminated.
ฐานข้อมูลของตาราง Sale มี sale_no เป็นPK, sale_date, cus_no
และตาราง sale_detail มี มี sale_no เป็นPK (เป็นFKนะคะ), pro_no เป็นPK, amount, sale_price
(ตารางฐานข้อมูลอื่นๆที่เกี่ยวข้อง) ตารางCustomer มี cus_no เป็น PK, cus_name,cus_add,cus_tel
ตารางProduct มี pro_no เป็น PK, pro_name, pro_cost, pro_price, pro_stock, record_date
และนี่ โค้ดคะ
Private Sub Save_Btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save_Btn.Click
If Sale_ListView.Items.Count > 0 Then
If MessageBox.Show("คุณต้องการยืนยันการขายสินค้า ใช่หรือไม่?", "คำยืนยัน", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
Dim sql As String = ""
Dim SqlParam As SqlParameter
sql = "INSERT INTO Sale (sale_no, sale_date, cus_no)"
sql &= "VALUES (@saleno, @saledate, @cusno)"
_cmd = New SqlCommand(sql, Conn)
SqlParam = New SqlParameter
SqlParam.ParameterName = "@saledate"
SqlParam.SqlDbType = SqlDbType.DateTime
SqlParam.Value = DateTimePicker1.Value
_cmd.Parameters.Add(SqlParam)
_cmd.Parameters.AddWithValue("saleno", Sale_noTextBox.Text)
_cmd.Parameters.AddWithValue("cusno", Cus_noTextBox.Text)
Try
With Conn
If .State = ConnectionState.Open Then .Close()
.ConnectionString = strConnection
.Open()
End With
With _cmd
.CommandType = CommandType.Text
.CommandText = sql
.Connection = Conn
.ExecuteNonQuery()
End With
Catch ErrProcess As Exception
MessageBox.Show("ไม่สามารถเพิ่มข้อมูลได้ เนื่องจาก " & ErrProcess.Message, "ข้อผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
Dim i As Integer = 0
For i = 0 To Sale_ListView.Items.Count - 1
sql = "INSERT INTO sale_detail (sale_no, pro_no, amount, sale_price)"
sql &= " VALUES(" & (Sale_ListView.Items(i).SubItems(0).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(1).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(3).Text) & ","
sql &= (Sale_ListView.Items(i).SubItems(4).Text) & ")"
With _cmd
.CommandType = CommandType.Text
.CommandText = sql
.Connection = Conn
.ExecuteNonQuery()
End With
Next
MessageBox.Show("บันทึกรายการขายสินค้า เรียบร้อยแล้ว", "ผลการทำงาน", MessageBoxButtons.OK, MessageBoxIcon.Information)
Sale_ListView.Clear()
ClearCustomerData()
ClearProductData()
Sale_noTextBox.Text = ""
Alltotal_Label.Text = "0"
Sale_noTextBox.Focus()
End If
End If
End Sub
ที่สงสัยคือ เป็นเพราะใส่ sale_no ซ้ำกันรึเปล่าคะ
sale_no ที่จะใส่ลงตาราง Sale นั้น ดึงมาจาก TextBox
ส่วน sale_no ที่จะใส่ลงตาราง sale_detail ที่เป็น FK นั้น ดึงมาจาก ListView ค่ะ
ช่วยแก้ให้ถูกต้องทีนะคะ ติดปุ่มบันทึกนี้มาหลายวันแล้ว ร้อนใจ แล้วก็เครียดมากค่ะ
หรือถ้ามีใครใจดี อยากให้ช่วยเขียนโค้ดปุ่มบันทึก พร้อมตัดStock โดยมี ตารางฐานข้อมูลแบบนี้ให้ทีค่ะ ><