เพิ่มสินค้า ถ้ามี product_id เหมือนกัน ไห้นำค่าที่จะเพิ่ม กับค่าใน database มา + กัน
ใน onhands สามารถตัด product_id และ quantity ออกมายุบเป็น column incoming_id จะง่ายกว่าไม๊ครับ
ลองๆออกแบบใหม่ดูครับ
พยายามเอา PK มาใช้บ่อยๆครับ
แนะนำด้วยความหวังดีครับ เพราะมันจะช่วยลด
1.ข้อมูล
2.ความซับซ้อนของข้อมูล
3.ระยะเวลาการออกแบบ
4.รูปแบบโค้ด
5.ลดข้อผิดพลาดกรณี insert/update/delete
และยังช่วยให้ข้อมูลกระชับมากขึ้น และยัง ใช้งาน Relationships ง่ายด้วยครับ
อย่าง
onhands
ลองเปลี่ยนจาก column id,product_id,store_id,store_location,quantity
ให้เหลือแค่ column id,incoming_id,store_id,store_location
ลดสิ่งต่างๆที่ว่ามาเยอะเลยครับ
แถมเขียนโค้ดง่ายกว่าด้วย
แค่รับ incoming_id มาจาก incoming อย่างเดียว
Date :
2015-10-05 10:45:57
By :
lamaka.tor
เรื่องค่าที่่เป็น NULL แล้วอยากจะบวกกับค่าอื่นสามารถใช้คำสั่ง ISNULL ช่วยได้ครับ
เช่น update stock_onhand set quantiry =isnull(balance,0)+isnull(quantity,0)
ส่วนเรื่องการออกแบบ Table ผมว่ามันดูซ้ำซ้อนน่ะครับ
สมมุติถ้าผมจะสร้าง Stock Card Report มันจะสามารถทำได้หรือปล่าว
ประวัติการแก้ไข 2015-10-05 11:17:17
Date :
2015-10-05 11:14:58
By :
fonfire
อันนี้โค๊ดที่ทำอยู่อะครับ มั่วๆ หน่อยครับ Y^Y
Code (C#)
object maxid_product_id = new SqlCommand("select product_id from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar();
object maxid_receive_details = new SqlCommand("select receive_id from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar();// maxid
object maxid_receive_details2 = new SqlCommand("select id from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar();// maxid_receive_details2
object remark = new SqlCommand("select remark from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar(); //remark
object maxid_unit_num = new SqlCommand("select product_unit_num from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar();//maxid_unit_num
int maxid_unit_num_x = Convert.ToInt32(maxid_unit_num);
object balance = new SqlCommand("update stock_onhands set quantity = quantity+'" + maxid_unit_num_x + "' where product_id= 'quantity' ", conn).ExecuteScalar();
//////maxid_product_id = new SqlCommand("select product_id from receive_details where id=(select max(id) from receive_details)", conn).ExecuteScalar();
//object maxbalance = new SqlCommand("select isnull(quantity,'0') from stock_onhands where id=(select max(product_id) from stock_onhands)", conn).ExecuteScalar();//balance
//int maxid_unit_num_x = Convert.ToInt32(maxid_unit_num);
//int maxbalance_y = Convert.ToInt32(maxbalance);
//int balance = maxid_unit_num_x + maxbalance_y;
SqlCommand scm1 = new SqlCommand(
"INSERT INTO stock_incomings (receive_id, receive_detail_id, product_id,quantity,balance, remark) values('" + maxid_receive_details + "','" + maxid_receive_details2 + "','" + maxid_product_id + "','" + maxid_unit_num + "','" + balance + "','" + remark + "') "
, conn);
scm1.ExecuteNonQuery();
int store_id = 1;
SqlCommand scm2 = new SqlCommand(
"insert into stock_onhands (product_id,store_id,quantity) values ('" + maxid_product_id + "','" + store_id + "','" + balance + "')"
, conn);
scm2.ExecuteNonQuery();
Date :
2015-10-05 11:45:29
By :
phuriwat
Date :
2015-10-05 14:40:39
By :
lamaka.tor
แล้วตอนนี้ยังติดอะไรอยู่ไหมครับ
Date :
2015-10-05 14:55:11
By :
fonfire
ติด อยู่ครับ ตรงที่ balance จะเอา quantity ของ product_id ล่าสุดมายังไงอะครับ
ประวัติการแก้ไข 2015-10-05 15:47:20
Date :
2015-10-05 15:35:17
By :
phuriwat
Code (C#)
DataTable dt = new DataTable();
dt.Load(new SqlCommand("select * from receive_details where id=(select max(id) from receive_details)", conn).ExecuteReader());
DataRow dr = dt.Rows[0];
จะได้ row สุดท้่ายของ receive_details มาใช้งานเลือกเอา column มาใช้ได้ครับ
เช่น
Code (C#)
MessageBox.Show(dr[1].ToString());
รับรองมาหมดทั้งแถว
Date :
2015-10-05 15:48:35
By :
lamaka.tor
ในส่วนของตาราง onhands อ่าครับ คือ ถ้ามันไม่มีข้อมูลไห้ insert ถ้ามีข้อมูลไห้ update quatity อย่างเดียวทำยังไงครับ ที่ผมทำมันเป็น insert อย่างเดียวอ่าครับ
ประวัติการแก้ไข 2015-10-05 17:13:41
Date :
2015-10-05 17:12:22
By :
phuriwat
https://www.thaicreate.com/tutorial/sql-update.html
Code (C#)
SqlCommand scm2 = new SqlCommand(
"UPDATE stock_onhands SET product_id =" + maxid_product_id + ",store_id = "store_id,quantity =" + balance" , conn);
scm2.ExecuteNonQuery();
น่าจะประมาณนี้ไม๊ มั่วช่วยกัน ๆๆๆ
Date :
2015-10-05 17:49:18
By :
lamaka.tor
อันนี้มันอับเดท อย่างเดียวอ่าครับ ถ้า ไม่มีมันก็ ไม่ insert
Date :
2015-10-06 08:43:10
By :
phuriwat
ถ้าอยากรู้ว่าต้อง Update หรือ Insert ก็ต้องเช็คก่อนครับว่ามันมีข้อมูลหรือยัง
code จะเป็นประมาณนี้ครับ
Code (C#)
Datatable dt;
dt=Connection.Execute(" select * from tablename where product_id='xxxxx' ");
if (dt.RowCount==0)
{
// Insert Data
}
else
{
//Update Data
}
Date :
2015-10-06 09:12:12
By :
fonfire
Date :
2015-10-06 10:38:37
By :
lamaka.tor
ลองใช้แบบนี้ดูครับ
Code (C#)
DataTable dt = new DataTable();
dt.Load(new SqlCommand("select * from tablename where product_id='xxxxx' ", conn).ExecuteReader());
DataRow dr = dt.Rows[0];
Date :
2015-10-06 10:56:00
By :
lamaka.tor
แล้วจะทำไห้เข้าเงื่อนไขยังไงอ่าครับ ว่า มี หรือไม่มี
Date :
2015-10-06 11:08:46
By :
phuriwat
อันนี้ ที่ทำมาครับ มัน ไม่ update เลยอ่าครับ มัน insert อย่างเดียว
Code (C#)
DataTable dt = new DataTable();
dt.Load(new SqlCommand("select * from stock_onhands where product_id='' ", conn).ExecuteReader());
if (dt.Rows.Count == 0)
{
int store_id = 1;
SqlCommand scm12 = new SqlCommand(
"insert into stock_onhands (product_id,store_id,quantity) values ('" + maxid_product_id + "','" + store_id + "','" + balance + "')"
, conn);
scm12.ExecuteNonQuery();
}
else
{
int store_id = 1;
SqlCommand scm11 = new SqlCommand(
"UPDATE stock_onhands SET product_id =" + maxid_product_id + ",store_id = " + store_id + ",quantity =" + balance + " ", conn);
scm11.ExecuteNonQuery();
}
Date :
2015-10-06 11:31:59
By :
phuriwat
ตรงคำสั่ง
select * from stock_onhands where product_id=''
ต้องใส่ product_id ที่เราต้องการตรวจสอบด้วยครับ
Date :
2015-10-06 13:05:11
By :
fonfire
ไม่แนะนำให้ใช้ product_id= ควรเป็น id=
ไม่งั้นจะติดปัญหาคือมันจะ Update ตาม product_id ทั้งๆที่เราไม่ต้องการ
ควร select ตาม pk ครับ
Date :
2015-10-06 13:37:44
By :
lamaka.tor
ได้แล้วครับ ขอบคุณมากครับ ทั้ง 2 ท่านเลย Y^Y น้ำตาจิ ไหล
Date :
2015-10-06 13:58:30
By :
phuriwat
เป็นคนเหนือปะเนี๊ยะ 555
Date :
2015-10-06 14:47:04
By :
lamaka.tor
ในส่วนของ inner join นี่ยังไงอะ ครับ ผมจะเอาตารางของ product มา join กับ onhand อ่าครับ แต่ข้อมูลไม่ มาเลยครับผมพิมผิดหรือป่าวCode (C#)
SqlDataAdapter sda = new SqlDataAdapter(
"select id, private_code, product_code, serial,name, unit_name, description, remark, add_date FROM products INNER JOIN stock_onhands ON products.id=stock_onhands.product_id ", conn);
ประวัติการแก้ไข 2015-10-06 14:59:13
Date :
2015-10-06 14:58:45
By :
phuriwat
products.id=stock_onhands.product_id
มันคนล่ะ filed กันน่ะครับ
ประวัติการแก้ไข 2015-10-06 15:04:59
Date :
2015-10-06 15:02:54
By :
fonfire
แล้วจะต้อง ไห้มันเท่ากันยังไงอ่าครับ
Date :
2015-10-06 15:11:06
By :
phuriwat
อ้อออ งั้นก็เป็นอันเดียวกันแล้วล่ะครับ
ผมนึกว่าพิมพ์ผิด
ถ้าข้อมูลเป็นตามรูป
คำสั่งแบบนี้
select id, private_code, product_code, serial,name, unit_name, description, remark, add_date FROM products INNER JOIN stock_onhands ON products.id=stock_onhands.product_id
ข้อมูลของ id 3 กับ 4 น่าจะมีน่ะครับ
Date :
2015-10-06 15:18:04
By :
fonfire
คือ มันไม่มาเลย อ่าครับ งง อยู่ครับ
Date :
2015-10-06 15:23:45
By :
phuriwat
Code (C#)
SqlDataAdapter sda = new SqlDataAdapter(
"select id, private_code, product_code, serial,name, unit_name, description, remark, add_date FROM (products INNER JOIN stock_onhands ON products.id=stock_onhands.product_id) ", conn);
น่าจะมี () รึป่าวครับ
พอดีผมลองใช้ Query builder ทำแล้วมันมี () ด้วย
Date :
2015-10-06 15:39:40
By :
lamaka.tor
datatype ของทั้ง 2 field เหมือนกันไหมครับ
Date :
2015-10-06 15:49:48
By :
fonfire
แล้ว ถ้า มันไม่มีจะไห้เป็น 0 ยังไงหรอครับ ไห้มันแสดง 0 อ่าครับ
ตอนนี้ ได้แล้วครับ
Code (C#)
SqlDataAdapter sda = new SqlDataAdapter(
"select * FROM products INNER JOIN stock_onhands ON products.id=stock_onhands.product_id", conn);
Date :
2015-10-06 15:50:33
By :
phuriwat
เช่น product นี้ยังไม่ได้แอด เลย เป็น 0 มันไม่มีในตาราง onhand อ่าครับ
Date :
2015-10-06 16:14:19
By :
phuriwat
INNER JOIN stock_onhands ON products.id=stock_onhands.product_id
มันจะสนใจแค่ products.id=stock_onhands.product_id อย่างเดียวครับ
อย่างอื่นไม่สนใจ
นอกจากจะเพิ่ม where ไปอีก
Date :
2015-10-06 16:21:22
By :
lamaka.tor
ครับ งั้นคงไม่เป็นไรครับ ขอบคุณมากครับ
Date :
2015-10-06 16:29:01
By :
phuriwat
เปลี่ยนไปใช้ Left Join ครับ
เช่น
select id, private_code, product_code, serial,name, unit_name, description, remark, add_date,isnull(stock_onhands.quantity,0) as quantity FROM products
Left Join stock_onhands ON products.id=stock_onhands.product_id
Date :
2015-10-06 16:37:57
By :
fonfire
ครับ ขอบคุณมากเลยครับ
Date :
2015-10-06 16:43:52
By :
phuriwat
Load balance : Server 01