المشاركات : 314
المواضيع 90
الإنتساب : Oct 2017
السمعة :
11
الشكر: 316
تم شكره 225 مرات في 150 مشاركات
السلام عليكم.اخواني برجاء المساعدة .عندي الكود التالي لحفظ بيانات بعض التاكسات بكس و كذلك بيانات سطور الداتاجريد.يشتغل كلو تمام لكن بالنسبة للداتاجريد يحفظ فقط السطر الأول
اريد احفظ راس الفاتورة و التفاصيل يلي بالداتاجريد في جدول واحد بارك الله فيكم
كود :
Dim Sql As String = "Insert Iinto Table1 (Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10,Field11) Values (@Field1,@Field2,@Field3,@Field4,@Field5,@Field6,@Field7,@Field8,@Field9,@Field10,@Field11)"
Dim cmd As New OleDbCommand(Sql, Conne)
cmd.Parameters.Clear()
cmd.Parameters.AddWithValue("@Field1", Val(Me.TextBox1.Text))
cmd.Parameters.AddWithValue("@Field2", Me.TextBox2.Text)
cmd.Parameters.AddWithValue("@Field3", Me.TextBox3.Text)
cmd.Parameters.AddWithValue("@Field4", Me.TextBox4.Text)
cmd.Parameters.AddWithValue("@Field5", Val(Me.TextBox5.Text))
cmd.Parameters.AddWithValue("@Field6", Me.TextBox6.Text)
For I As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters.Add(New OleDbParameter("@Field7", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(1).Value
cmd.Parameters.Add(New OleDbParameter("@Field8", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(2).Value
cmd.Parameters.Add(New OleDbParameter("@Field9", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(3).Value
cmd.Parameters.Add(New OleDbParameter("@Field10", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(4).Value
cmd.Parameters.Add(New OleDbParameter("@Field11", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(5).Value
Next
cmd.ExecuteNonQuery()
Conne.Close()
MessageBox.Show("تمّت بنجاع العمليّة", "رسالة تأكيد", MessageBoxButtons.OK, MessageBoxIcon.Information)
المشاركات : 2,055
المواضيع 49
الإنتساب : Oct 2017
السمعة :
538
الشكر: 10589
تم شكره 5330 مرات في 2095 مشاركات
السلام عليكم ورحمة الله وبركاته
اخي العيدروس من ناحية برمجية صحيحة هو ان يتم حفظ راس الفاتورة في جدول الفواتير
اما تفاصيل الفاتورة وعادة تكون عدة منتجات(اقلام او اصناف) تحفظ في جدول تفاصيل الفاتورة وفق رقم الفاتورة الذي سيتكرر مع كل سجل مع اختلاف الاي دي لكل سجل ويجب ان تكون هناك علاقة بينهما وعند الاستعلام سيتم الاستعلام برقم الفاتورة عندها يتم جلب كل التفاصيل هذا ما اعرفه رغم اني لم اعمل اي برنامج مبيعات فلربما اكون مخطئا واتمنى ممن عملوا ببرامج المبيعات افادتنا بذلك مشكورين
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات
المشاركات : 370
المواضيع 20
الإنتساب : May 2018
السمعة :
82
الشكر: 32
تم شكره 893 مرات في 353 مشاركات
دائما باي برنامج يحتوي الى فواتير يكون هناك جزئين لهذه الفاتورة
الجزء الاول يتعلق بالبيانات الاساسية للفاتورة مثل رقم الفاتورة , اسم العميل,تاريخ الفاتورة,المبلغ الاجمالي,عدد المواد
وهي بيانات لن تتكرر فيتم حفظها بجدول لوحدها
اما الجزء الثاني فهو محتوى الفاتورة او تفاصيل المواد
وهنا يجب ان تاذكر ان الفاتورة الواحدة من الممكن ان تحتوي
على عدد غير محدد من المواد لذلك نلجأ بهذه الحالة لعمل
جدول يحتوي على تفاصبل الفاتورة ونعني بالتفاصيل هنا : رقم الفاتورة,رقم المادة,السعر,الكمية,القيمة الاجمالية
وبالتالي تكون هناك علاقة بين هذين الجدولين وهي رقم الفاتورة على سبيل المثال بالجدول الاول وهو جدول بيانات
الفاتورة الاساسية سيتم حفظ التالي على سبيل المثال:
1.رقم الفاتورة : 001
2.تاريخ الفاتورة: 12/12/2202
3.رقم العميل : 005
4. المبلغ الاجمالي : 1252.25
5. عدد المواد :3
اما الجدول الاخر وهو جدول تفاصيل الفاتورة ولنفرض انه يحتوي على 3 منتجات سيكون بالشكل التالي :
المنتج الاول
1. رقم تفاصيل الفاتورة : 1 وبالعادة يكون ترقيم تلقائي فلا يلزم اضافته بالكود
2. رقم الفاتورة : 001 وهو نفس رقم البيانات الاساسية للفاتورة
3.رقم المنتج او المادة : 120 على سبيل المثال
4. الكمية : 10
5. السعر : 12
6. الاجمالي : 120
المنتج الثاني
1. رقم تفاصيل الفاتورة : 2 وبالعادة يكون ترقيم تلقائي فلا يلزم اضافته بالكود
2. رقم الفاتورة : 001 وهو نفس رقم البيانات الاساسية للفاتورة
3.رقم المنتج او المادة : 110على سبيل المثال
4. الكمية : 5
5. السعر : 6
6. الاجمالي : 30
المنتج المنتج الثالث
1. رقم تفاصيل الفاتورة : 3 وبالعادة يكون ترقيم تلقائي فلا يلزم اضافته بالكود
2. رقم الفاتورة : 001 وهو نفس رقم البيانات الاساسية للفاتورة
3.رقم المنتج او المادة : 130 على سبيل المثال
4. الكمية : 8
5. السعر : 9
6. الاجمالي : 72
وهكذا
اتمنى ان تكون الفكرة قد وصلت
المشاركات : 314
المواضيع 90
الإنتساب : Oct 2017
السمعة :
11
الشكر: 316
تم شكره 225 مرات في 150 مشاركات
15-05-20, 11:24 PM
(آخر تعديل لهذه المشاركة : 15-05-20, 11:27 PM {2} بواسطة العيدروس.)
شكرا جزيلا اخي ابراهي على الشرح الواضح . الكود السابق مثلته فقط براس الفاتورة و تفاصيل الفاتورة لكن هو ليس لحفظ الفاتورة فقط للتوضيح. انا اضفت حقل آخر اسمو id من نوع ترقيم تلقائي.المشكلة يتم حفظ سطر واحد فقط بارك الله فيك اخي ابراهيم
شكرا جزيلا اخي aljzazy على الشرح الواضح ربنا يبارك فيك و يرحم والديك.الفكرة اخي ان الموضوع ليس له علاقة بالفاتورة انا قلت مثل الفاتورة فقط للتوضيح .عندي مجموعة تاكسات بكس و بعض سطور على الداتاجريد اريد احفظهم مرة واحدة بارك الله فيك
المشاركات : 370
المواضيع 20
الإنتساب : May 2018
السمعة :
82
الشكر: 32
تم شكره 893 مرات في 353 مشاركات
15-05-20, 11:27 PM
(آخر تعديل لهذه المشاركة : 15-05-20, 11:28 PM {2} بواسطة aljzazy.)
الافضل ان تفصل بين الاوامر
ضع كود حفظ البيانات الاساسية بصب لوحده
وكود حفظ تفاصيل الفاتورة بصب اخر
ان تقوم بتنفيذ الحفظ بعد عمل اللوب خارج اللوب
المشاركات : 314
المواضيع 90
الإنتساب : Oct 2017
السمعة :
11
الشكر: 316
تم شكره 225 مرات في 150 مشاركات
كيف يتم عمل كل جزء بصب وحده اخي aljzazy يرحم والديك
المشاركات : 370
المواضيع 20
الإنتساب : May 2018
السمعة :
82
الشكر: 32
تم شكره 893 مرات في 353 مشاركات
16-05-20, 12:51 AM
(آخر تعديل لهذه المشاركة : 16-05-20, 12:54 AM {2} بواسطة aljzazy.)
باختصار ساقوم بطرح بعض الاكواد كامثلة فقط
مثلا هذا الكود سيقوم بحفظ بيانات الفاتورة الاساسية
وارجو ان لا تتقيد بالمسميات بالمثال لاني طرحتها
من امثلة الدورة التي اقوم بعملها على اليوتيوب
كود :
Public Sub Insert_Sale_Tbl(ByVal Sale_ID As Int32, ByVal Sale_Date As Date, ByVal Inv_Type As String, ByVal SalesMan As String, ByVal Cus_ID As Int32, ByVal Item_Count As Int32, ByVal Total As Double, ByVal Tax_Per As Double, ByVal TaxTotal As Double, ByVal Discount_Per As Double, ByVal DiscountTotal As Double, ByVal FinalTotal As Double, ByVal Paid As Double, ByVal UnPaid As Double)
Dim Cmd As New SqlCommand
With Cmd
.Connection = Con
.CommandType = CommandType.Text
.CommandText = "Insert Into Sale_Tbl ( Sale_ID,Sale_Date,Inv_Type,SalesMan,Cus_ID,Item_Count,Total,Tax_Per,TaxTotal,Discount_Per,DiscountTotal,FinalTotal,Paid,UnPaid)values(@Sale_ID,@Sale_Date,@Inv_Type,@SalesMan,@Cus_ID,@Item_Count,@Total,@Tax_Per,@TaxTotal,@Discount_Per,@DiscountTotal,@FinalTotal,@Paid,@UnPaid)"
.Parameters.Clear()
.Parameters.AddWithValue("@Sale_ID", SqlDbType.Int).Value = Sale_ID
.Parameters.AddWithValue("@Sale_Date", SqlDbType.Date).Value = Sale_Date
.Parameters.AddWithValue("@Inv_Type", SqlDbType.VarChar).Value = Inv_Type
.Parameters.AddWithValue("@SalesMan", SqlDbType.VarChar).Value = SalesMan
.Parameters.AddWithValue("@Cus_ID", SqlDbType.Int).Value = Cus_ID
.Parameters.AddWithValue("@Item_Count", SqlDbType.Int).Value = Item_Count
.Parameters.AddWithValue("@Total", SqlDbType.Decimal).Value = Total
.Parameters.AddWithValue("@Tax_Per", SqlDbType.Decimal).Value = Tax_Per
.Parameters.AddWithValue("@TaxTotal", SqlDbType.Decimal).Value = TaxTotal
.Parameters.AddWithValue("@Discount_Per", SqlDbType.Decimal).Value = Discount_Per
.Parameters.AddWithValue("@DiscountTotal", SqlDbType.Decimal).Value = DiscountTotal
.Parameters.AddWithValue("@FinalTotal", SqlDbType.Decimal).Value = FinalTotal
.Parameters.AddWithValue("@Paid", SqlDbType.Decimal).Value = Paid
.Parameters.AddWithValue("@UnPaid", SqlDbType.Decimal).Value = UnPaid
End With
If Con.State = 1 Then Con.Close()
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
'MsgBox("تم إضافة السجل بنجاح", MsgBoxStyle.Information, "حفظ")
Cmd = Nothing
End Sub
وهذا مثال على حفظ تفاصيل الفاتورة
كود :
Public Sub Insert_Sale_Details_Tbl()
For i As Integer = 0 To dgvSale.Rows.Count - 1
Dim Cmd As New SqlCommand
With Cmd
.Connection = Con
.CommandType = CommandType.Text
.CommandText = "Insert Into Sale_Details_Tbl ( Sale_ID,Prd_ID,SalePrice,Qty,TotalAmount)values(@Sale_ID,@Prd_ID,@SalePrice,@Qty,@TotalAmount)"
.Parameters.Clear()
.Parameters.AddWithValue("@Sale_ID", SqlDbType.Int).Value = Sale_ID.Text
.Parameters.AddWithValue("@Prd_ID", SqlDbType.Int).Value = dgvSale.Rows(i).Cells(0).Value
.Parameters.AddWithValue("@SalePrice", SqlDbType.Decimal).Value = dgvSale.Rows(i).Cells(4).Value
.Parameters.AddWithValue("@Qty", SqlDbType.Int).Value = dgvSale.Rows(i).Cells(5).Value
.Parameters.AddWithValue("@TotalAmount", SqlDbType.Decimal).Value = dgvSale.Rows(i).Cells(6).Value
End With
If Con.State = 1 Then Con.Close()
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
Cmd = Nothing
Next
MsgBox("تم إضافة فاتورة المبيعات بنجاح ", MsgBoxStyle.Information, "حفظ")
End Sub
طبعا" في الزر الخاص بالحفظ اقوم باستدعاء الامرين معا
كود :
Private Sub BtnSave_Click(sender As System.Object, e As System.EventArgs) Handles BtnSave.Click
Insert_Sale_Tbl(Sale_ID.Text, Sale_Date.Value, Inv_Type.Text, SalesMan.Text, Cus_ID.Text, Item_Count.Text, Total.Text, TaxValue.Text, TaxTotal.Text, DiscountValue.Text, DiscountTotal.Text, FinalTotal.Text, Paid.Text, UnPaid.Text)
Insert_Sale_Details_Tbl()
End Sub
وهذه صورة عن الجداول بقاعدة البيانات
جدول البيانات الاساسية
جدول تفاصيل الفاتورة
وهذا رابط للدورة يمكنك الاستفادة من الدروس
المشاركات : 813
المواضيع 24
الإنتساب : Oct 2012
السمعة :
230
الشكر: 1133
تم شكره 2180 مرات في 815 مشاركات
يجب أن تجعل الكود بالكامل داخل الجملة For
حتى يتم إدراج كل السجلات في قاعدة البيانات
بالشكل التالي :
كود :
For I As Integer = 0 To DataGridView1.Rows.Count - 1
Dim Sql As String = "Insert Iinto Table1 (Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10,Field11) Values (@Field1,@Field2,@Field3,@Field4,@Field5,@Field6,@Field7,@Field8,@Field9,@Field10,@Field11)"
Dim cmd As New OleDbCommand(Sql, Conne)
cmd.Parameters.Clear()
'-----------------------------------------------
cmd.Parameters.AddWithValue("@Field1", Val(Me.TextBox1.Text))
cmd.Parameters.AddWithValue("@Field2", Me.TextBox2.Text)
cmd.Parameters.AddWithValue("@Field3", Me.TextBox3.Text)
cmd.Parameters.AddWithValue("@Field4", Me.TextBox4.Text)
cmd.Parameters.AddWithValue("@Field5", Val(Me.TextBox5.Text))
cmd.Parameters.AddWithValue("@Field6", Me.TextBox6.Text)
'-----------------------------------------------
cmd.Parameters.Add(New OleDbParameter("@Field7", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(1).Value
cmd.Parameters.Add(New OleDbParameter("@Field8", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(2).Value
cmd.Parameters.Add(New OleDbParameter("@Field9", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(3).Value
cmd.Parameters.Add(New OleDbParameter("@Field10", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(4).Value
cmd.Parameters.Add(New OleDbParameter("@Field11", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(5).Value
'-----------------------------------------------
cmd.ExecuteNonQuery()
Next
Conne.Close()
MessageBox.Show("تمّت بنجاع العمليّة", "رسالة تأكيد", MessageBoxButtons.OK, MessageBoxIcon.Information)
المشاركات : 370
المواضيع 20
الإنتساب : May 2018
السمعة :
82
الشكر: 32
تم شكره 893 مرات في 353 مشاركات
(16-05-20, 01:32 AM)عبدالله الدوسري كتب : يجب أن تجعل الكود بالكامل داخل الجملة For
حتى يتم إدراج كل السجلات في قاعدة البيانات
بالشكل التالي :
كود :
For I As Integer = 0 To DataGridView1.Rows.Count - 1
Dim Sql As String = "Insert Iinto Table1 (Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10,Field11) Values (@Field1,@Field2,@Field3,@Field4,@Field5,@Field6,@Field7,@Field8,@Field9,@Field10,@Field11)"
Dim cmd As New OleDbCommand(Sql, Conne)
cmd.Parameters.Clear()
'-----------------------------------------------
cmd.Parameters.AddWithValue("@Field1", Val(Me.TextBox1.Text))
cmd.Parameters.AddWithValue("@Field2", Me.TextBox2.Text)
cmd.Parameters.AddWithValue("@Field3", Me.TextBox3.Text)
cmd.Parameters.AddWithValue("@Field4", Me.TextBox4.Text)
cmd.Parameters.AddWithValue("@Field5", Val(Me.TextBox5.Text))
cmd.Parameters.AddWithValue("@Field6", Me.TextBox6.Text)
'-----------------------------------------------
cmd.Parameters.Add(New OleDbParameter("@Field7", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(1).Value
cmd.Parameters.Add(New OleDbParameter("@Field8", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(2).Value
cmd.Parameters.Add(New OleDbParameter("@Field9", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(3).Value
cmd.Parameters.Add(New OleDbParameter("@Field10", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(4).Value
cmd.Parameters.Add(New OleDbParameter("@Field11", OleDbType.VarWChar)).Value = Me.DataGridView1.Rows(I).Cells(5).Value
'-----------------------------------------------
cmd.ExecuteNonQuery()
Next
Conne.Close()
MessageBox.Show("تمّت بنجاع العمليّة", "رسالة تأكيد", MessageBoxButtons.OK, MessageBoxIcon.Information)
الاخ عبدالله الدوسري العزيز
كيف سيتم الامرواللوب هنا يحتوي على مفتاح اساسي
هل ستتم عملية الحفظ ونحن نعلم ان المفتاح الاساسي لا يتكرر
بكل تأكيد سيحدث خطأ
الافضل فصل عملية الحفظ بالتأكيد
المشاركات : 813
المواضيع 24
الإنتساب : Oct 2012
السمعة :
230
الشكر: 1133
تم شكره 2180 مرات في 815 مشاركات
(16-05-20, 01:37 AM)aljzazy كتب : الاخ عبدالله الدوسري العزيز
كيف سيتم الامرواللوب هنا يحتوي على مفتاح اساسي
هل ستتم عملية الحفظ ونحن نعلم ان المفتاح الاساسي لا يتكرر
بكل تأكيد سيحدث خطأ
الافضل فصل عملية الحفظ بالتأكيد
إذا كان المفتاح الأساسي ( ترقيم تلقائي ) فلن يحتاج إلى ذكر حقل المفتاح الأساسي في جملة الإستعلام , لأنه من إختصاص قاعدة البيانات وهي من تنشئ هذا الرقم , حتى لو أهملت أسم حقل المفتاح الأساسي من جملة الإستعلام , قاعدة البيانات هي من تنشئ هذا الرقم. حتى لو ذكرت أسم الحقل الأساسي وأعطيته قيمة , فإن قاعدة البيانات تتجاهل القيمة المرسلة لحقل المفتاح الأساسي وتعتمد على إنشاءة بواسطة الترقيم التلقائي.
إذا كان المفتاح الأساسي ( ليس ترقيم تلقائي ) فأكيد أنه سيحتاج إلى تعيين الرقم الجديد في كل لفة من الجملة For , وهو لم يذكر في جملة الإستعلام أي شيء يخص المفتاح الأساسي ولا يوجد أي حقل يدل على أنه مفتاح أساسي.
وذلك كما قال العيدروس : ( لكن بالنسبة للداتاجريد يحفظ فقط السطر الأول ) وهذة هي مشكلتة , يريد حفظ كل السجلات في الـ DataGridView , بدون الدخول في تفاصيل هو ماذا يعمل بالضبط.
(15-05-20, 11:24 PM)العيدروس كتب : شكرا جزيلا اخي ابراهي على الشرح الواضح . الكود السابق مثلته فقط براس الفاتورة و تفاصيل الفاتورة لكن هو ليس لحفظ الفاتورة فقط للتوضيح. انا اضفت حقل آخر اسمو id من نوع ترقيم تلقائي.المشكلة يتم حفظ سطر واحد فقط بارك الله فيك اخي ابراهيم
شكرا جزيلا اخي aljzazy على الشرح الواضح ربنا يبارك فيك و يرحم والديك.الفكرة اخي ان الموضوع ليس له علاقة بالفاتورة انا قلت مثل الفاتورة فقط للتوضيح .عندي مجموعة تاكسات بكس و بعض سطور على الداتاجريد اريد احفظهم مرة واحدة بارك الله فيك
واضح ان المشكلة : يتم حفظ سطر واحد فقط
ومن الرد أيضاً : نفهم أن : id من نوع ترقيم تلقائي
فأكيد أنه لا يحتاج إلى تعيين رقم الـ ID في الجملة For
بنائاً على هذة المعطيات أكيد أنه لن يجد خطاء يخص الترقيم التلقائي.
|