اذهب إلى المحتوى

السؤال

نشر

السلام عليكم لدي جملة استعلام تالية تعرض بيانات بدون تكرار لماذا في كريستال ريبورت تعرض أكثر من مرة بتكرار

SELECT dbo.BUYBILL.BUYCODE, dbo.BUYBILL.BUYTYPE, dbo.BUYBILL.BUYDATE, dbo.BUYBILL.IMPORTERNAME, dbo.BUYBILL.NOTES, dbo.BUYBILL.TOTAL, 
       dbo.BUY_DET.ITEMCODE, dbo.BUY_DET.ITEMNAME, dbo.BUY_DET.PRICE, dbo.BUY_DET.QTY, dbo.BUY_DET.TOTAL AS Expr1
FROM dbo.BUYBILL 
INNER JOIN dbo.BUY_DET ON dbo.BUYBILL.BUYCODE = dbo.BUY_DET.BUYCODE;

رغم انه   فعلت 

خيار Suppress If Duplicated وقم بوضع علامة بجانبه. لزالت تظهر مشكلة يتكرر سطر ثلاثة مرات لكنه فارغ فقط ما الحل 

سبب انه datagridview تجلب منتجات اخر فاتورة 

 void createdatatable()
        {
           
            dt.Columns.Add("رقم الصنف");
            dt.Columns.Add("اسم الصنف");
            dt.Columns.Add("سعر الشراء");
            dt.Columns.Add("الكمية ");
            dt.Columns.Add(" الاجمالي");
            

            dataGridView1.DataSource = dt;

        }
 try
            {
                if (IMPORTERNAME.SelectedIndex < 0)
                {
                    MessageBox.Show("يرجي اختيار اسم الزبون", "تنبيه");
                    IMPORTERNAME.Select();
                    return;
                }
                if (BUYTYPE.SelectedIndex < 0)
                {
                    MessageBox.Show("يرجي اختيار نوع الفاتورة", "تنبيه");
                    BUYTYPE.Select();
                    return;
                }
                if (dataGridView1.Rows.Count == 0)
                {
                    MessageBox.Show("لاتوجد أصناف لحفظها", "تنبيه");
                    return;
                }
                
                
                    
                    

                
                DataTable dt = new DataTable();
                SqlDataAdapter adp = new SqlDataAdapter("select *from buybill where buycode='" + BUYCODE.Text + "'", Class1.con);
                adp.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    int code = Class1.CODE_GENE("BUYBILL", "ID") + 1;
                    BUYCODE.Text = code.ToString();

                }
                else
                {
                    DataRow dr = dt.NewRow();
                    dr["BUYCODE"] = BUYCODE.Text;
                    dr["BUYTYPE"] = BUYTYPE.Text;
                    dr["IMPORTERNAME"] = IMPORTERNAME.Text;
                    dr["NOTES"] = NOTES.Text;
                    dr["BUYDATE"] = BUYDATE.Value;
                    dr["TOTAL"] = Convert.ToDecimal(total_.Text);
                    dr["TOTAL_ARBIC"] = totalar.Text;
                    dr["TOTALQTY"] = Convert.ToInt32( totalqty.Text);
                    dt.Rows.Add(dr);
                    SqlCommandBuilder save = new SqlCommandBuilder(adp);
                    adp.Update(dt);

                    adp = new SqlDataAdapter("SELECT *FROM BUY_DET", Class1.con);
                    adp.Fill(dt);
                    for(int i=0;i<dataGridView1.Rows.Count;i++)
                    {
                        DataRow dr_ = dt.NewRow();
                        dr_["BUYCODE"]= BUYCODE.Text;
                        dr_["ITEMCODE"] = dataGridView1.Rows[i].Cells[0].Value;
                        dr_["ITEMNAME"] = dataGridView1.Rows[i].Cells[1].Value;
                        dr_["PRICE"]= dataGridView1.Rows[i].Cells[2].Value;
                        dr_["TOTAL"] = total_.Text;
                        dr_["QTY"] = dataGridView1.Rows[i].Cells[3].Value;
                        dt.Rows.Add(dr_);
                        SqlCommandBuilder cmd_ = new SqlCommandBuilder(adp);
                        adp.Update(dt);
                        string itemCode = dataGridView1.Rows[i].Cells[0].Value.ToString();
                        int qty = Convert.ToInt32(dataGridView1.Rows[i].Cells[3].Value);
                        UpdateItemQuantity(itemCode, qty);
                    }
                    MessageBox.Show(" تم حفظ بيانات فاتورة بنجاح وتحديث كمية في المخزن ", "رسالة تأكيد", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    dataGridView1.DataSource = "";
                    button1_Click(null, null);

                   






                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

كود حفظ وتعبئة داتا قريد فيو

Recommended Posts

  • 0
نشر

بالنسبة لمشكلة عدم تجميع البيانات المترابطة يمكنك استخدام Group Expert والتجميع حسب BUYCODE ثم تفعيل "Suppress Blank Section" في Details وأيضا تفعيل "Keep Together" في خصائص المجموعة، كما أنك قد قمت باستخدام نفس DataTable للعمليات المتعددة وحساب TOTAL خاطئ فهو يأخذ الإجمالي الكلي بدل إجمالي السطر وأيضا تكرار Update داخل الحلقة لذا يمكن تعديله ليصبح:

// تعريف DataTable جديد لكل عملية
DataTable dtDetails = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM BUY_DET", Class1.con);
adp.Fill(dtDetails);

for(int i=0; i<dataGridView1.Rows.Count; i++)
{
    DataRow dr_ = dtDetails.NewRow();
    dr_["BUYCODE"] = BUYCODE.Text;
    dr_["ITEMCODE"] = dataGridView1.Rows[i].Cells[0].Value;
    dr_["ITEMNAME"] = dataGridView1.Rows[i].Cells[1].Value;
    dr_["PRICE"] = dataGridView1.Rows[i].Cells[2].Value;
    dr_["QTY"] = dataGridView1.Rows[i].Cells[3].Value;
    // حساب إجمالي السطر
    dr_["TOTAL"] = Convert.ToDecimal(dataGridView1.Rows[i].Cells[2].Value) * 
                   Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value);
    dtDetails.Rows.Add(dr_);
}
// تحديث مرة واحدة خارج الحلقة
SqlCommandBuilder cmd_ = new SqlCommandBuilder(adp);
adp.Update(dtDetails);
  • 0
نشر

لاحظ في في جملة الاستعلام الخاصة بك أنت تقوم بالربط بين جدول BUYBILL وجدول BUY_DET باستخدام العلاقة BUYCODE إذا كانت العلاقة بين الجداول تنتج سجلات مكررة مثلا إذا كان جدول BUY_DET يحتوي على أكثر من سجل مرتبط بنفس الفاتورة فإن التقرير سيعرض التكرار لذا تأكد من أن الجداول المرتبطة لا تحتوي على سجلات مكررة في قاعدة البيانات فإذا كنت تريد عرض بيانات "BUYBILL" فقط مع تجنب التكرار، يمكنك استخدام عبارة SQL مثل:

SELECT DISTINCT dbo.BUYBILL.BUYCODE, dbo.BUYBILL.BUYTYPE, dbo.BUYBILL.BUYDATE, 
       dbo.BUYBILL.IMPORTERNAME, dbo.BUYBILL.NOTES, dbo.BUYBILL.TOTAL
FROM dbo.BUYBILL 
INNER JOIN dbo.BUY_DET ON dbo.BUYBILL.BUYCODE = dbo.BUY_DET.BUYCODE;

وعندما يتم عرض بيانات مكررة في التقرير، عليك التأكد من إعداد خاصية Suppress If Duplicated لكل الحقول المكررة في التقرير من خلال التأكد من أن كل صف في DataGridView يحتوي على بيانات صحيحة قبل الإضافة إلى قاعدة البيانات، وذلك باستخدام شرط قبل الإضافة:

if (dataGridView1.Rows[i].Cells[0].Value != null && 
    dataGridView1.Rows[i].Cells[0].Value.ToString().Trim() != "")
{
    // أضف البيانات
}

وقد يحدث أن يتم إدخال نفس السجل أكثر من مرة في قاعدة البيانات أثناء الحفظ لذا تأكد من أن جملة الحفظ لا تضيف بيانات مكررة يمكنك إجراء التحقق من البيانات الموجودة مسبقا في الجدول BUY_DET قبل الإضافة:

DataTable dtCheck = new DataTable();
SqlDataAdapter adpCheck = new SqlDataAdapter($"SELECT * FROM BUY_DET WHERE BUYCODE='{BUYCODE.Text}' AND ITEMCODE='{dataGridView1.Rows[i].Cells[0].Value}'", Class1.con);
adpCheck.Fill(dtCheck);

if (dtCheck.Rows.Count == 0)
{
    // أضف البيانات الجديدة
}

وتأكد من أنك تستخدم الحقول بشكل صحيح في التقرير إذا كنت تعرض تفاصيل الجدول BUY_DET، فقد يظهر كل سجل في الجدول بغض النظر عن التكرار لذا تأكد من أن الحقول الموجودة في قسم "Details" تتناسب مع المتطلبات وإذا كان التكرار لا يزال موجودا، قم بإضافة شرط للتجميع (Grouping) بناء على حقل BUYCODE.

  • 0
نشر

هادي جملة استعلام تعرض بدون تكرار داخل sql server  

SELECT DISTINCT dbo.BUYBILL.BUYCODE, dbo.BUYBILL.BUYTYPE, dbo.BUYBILL.BUYDATE, 
       dbo.BUYBILL.IMPORTERNAME, dbo.BUYBILL.NOTES,dbo.BUY_DET.ITEMNAME,dbo.BUY_DET.PRICE ,dbo.BUY_DET.QTY,dbo.BUY_DET.TOTAL, dbo.BUYBILL.TOTAL
FROM dbo.BUYBILL 
INNER JOIN dbo.BUY_DET ON dbo.BUYBILL.BUYCODE = dbo.BUY_DET.BUYCODE;

مشكلة تكمن عند حفظ فاتورة وانشاء فاتورة جديدة يجلب بيانات تبع فاتورة سابقة معا جديدة في تقرير بمعني اشتريت بظاعة وبضاعة الي قبلي 

انا اريد اخر فاتورة وعرضها باصنافها فقط هادي جملة استعلام التي استعمله 

لماذا يعرض اصناف فاتورة سابقة معاه اصناف فاتورة حالية واصناف فاتورة حالية وسابقة

SELECT dbo.BUYBILL.BUYCODE, dbo.BUYBILL.BUYTYPE, dbo.BUYBILL.BUYDATE, 
       dbo.BUYBILL.IMPORTERNAME, dbo.BUYBILL.NOTES, 
       dbo.BUY_DET.ITEMNAME, dbo.BUY_DET.PRICE, dbo.BUY_DET.QTY, dbo.BUY_DET.TOTAL, dbo.BUYBILL.TOTAL
FROM dbo.BUYBILL 
INNER JOIN dbo.BUY_DET ON dbo.BUYBILL.BUYCODE = dbo.BUY_DET.BUYCODE
WHERE dbo.BUYBILL.BUYCODE = (SELECT MAX(BUYCODE) FROM dbo.BUYBILL);

 

1.png

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...