الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في ناتج الجمع "غير سليم"

بدأه محمد فؤاد تركي في 13 أكتوبر 2012 · 6 رد · 786 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الزملاء

السلام عليكم ورحمة الله وبركاتة

اريد ان اصمم تقرير يسترجع كشف حساب المورد بحيث التقرير يعرض

أولاً : - بيانات الفاتورة

- رقم الفاتورة (dbo.AddDoc.HAdd_Doc)

- تاريخ الفاتورة (dbo.AddDoc.ZDate)

-كود المورد (dbo.AddDoc.Supid)

-اسم المورد (dbo.AddDoc.Supplier)

- صافي الفاتورة (dbo.Transactions.GrandTotal)

ثانياً : - المبالغ المسددة

- المبالغ المسددة ( SUM(DISTINCT dbo.AccountPayable.LE)

- المبلغ المتبقي (Remain)

SELECT     dbo.AddDoc.HAdd_Doc, dbo.AddDoc.ZDate, dbo.AddDoc.Supid, dbo.AddDoc.Supplier, SUM(DISTINCT dbo.Transactions.GrandTotal) AS GrandTotal, 
                      SUM(DISTINCT dbo.AccountPayable.LE) AS Paid, SUM(DISTINCT dbo.Transactions.GrandTotal) - SUM(DISTINCT dbo.AccountPayable.LE) AS Remain
FROM         dbo.Transactions INNER JOIN
                      dbo.AddDoc ON dbo.Transactions.DAdd_Doc = dbo.AddDoc.HAdd_Doc INNER JOIN
                      dbo.AccountPayable ON dbo.AddDoc.HAdd_Doc = dbo.AccountPayable.Invno
GROUP BY dbo.AddDoc.HAdd_Doc, dbo.AddDoc.ZDate, dbo.AddDoc.Supid, dbo.AddDoc.Supplier, dbo.AccountPayable.Remain

المشكلة عندي عندما تكون القيمة في حقل LE متشابهه .. لا يقوم بعمل Sum يشكل سليم ... نفس المشكلة في حقل Grand Total

post-46243-026185100 1350113453_thumb.jp

والاستعلام الصحيح يجب ان تكون نتيجته كالتالي مع العلم ان حقل المبالغ المسددة (LE) في الفاتورة رقم 2 مسدد علي دفعتين 10 + 10 = 20

post-46243-034170100 1350113893_thumb.jp

نتيجة الاستعلام ظهرت صحيحة عندما قمت بتصميم 2 view وكل view تقوم باسترجاع البيانات بشكل سليم ثم قمت بتجميعهم في View ثالث كالتالي

SELECT     dbo.View_1.HAdd_Doc, dbo.View_1.ZDate, dbo.View_1.Supid, dbo.View_1.Supplier, dbo.View_1.GrandTotal, dbo.View_2.Paid, 
                      dbo.View_1.GrandTotal - dbo.View_2.Paid AS Remain
FROM         dbo.View_1 INNER JOIN
                      dbo.View_2 ON dbo.View_1.HAdd_Doc = dbo.View_2.Invno

وأنا أريد ان اصل لنفس النتيجة لكن ليس عند طريق الـ View

المرفقات
1.jpg2.jpg

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 13 أكتوبر 2012 في 10:42

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#2

أخي للإستيضاح هل هذه شكل العلاقه ( علامه المعين تعني MANY)

TRANSACTION = الفاتوره

ADD DOC = المورد

ACCOUNT PAYABLE = الدفعات

post-126189-080176300 1350133220_thumb.p

المرفقات
GGG.PNG

تم تعديل هذه المشاركة بواسطة MS_SQL في 13 أكتوبر 2012 في 16:02

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

#3

مرفق شكل العلاقة

post-46243-023850300 1350134527_thumb.jp

المرفقات
1.jpg

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#4
اقتباس
المشكلة عندي عندما تكون القيمة في حقل LE متشابهه .. لا يقوم بعمل Sum يشكل سليم ... نفس المشكلة في حقل Grand Total

والسبب انك تستخدم DISTINCT

#5

بارك الله فيك أخي الفاضل

أنا أعرف ذلك لكن عندما أستخدم Sum بدون DISTINCT لا يسترجع الاستعلام عمليات الجمع بشكل سليم فهل من طريقة لاسترجاع عمليات الجمع بشكل سليم مع العلم وكما أشرت في المشاركة أعلاه أنني قمت بحل المشكلة عن طريق Views فهل من تصميم نفس الفكرة التي نفذتها في الــ {Views لكن عن طريق الاجراءات المخزنة

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#6

السلام عليكم ...

  1. SELECT  AddDoc.HAdd_Doc, AddDoc.ZDate,  AddDoc.Supid,  AddDoc.Supplier , T.MyTotal , T2.Paid , IsNull(T.MyTotal , 0 ) - IsNull(T2.Paid, 0) As Remaining
    FROM	AddDoc LEFT Outer Join 
    (SELECT DAdd_Doc , IsNULL(SUM(Transactions.GrandTotal) , 0) AS MyTotal FROM Transactions GROUP BY DAdd_Doc) AS T   On  (AddDoc.HAdd_Doc = T.DAdd_Doc) 
    Left Outer Join (SELECT Invno , IsNULL(SUM(AccountPayable.LE) , 0) AS Paid FROM AccountPayable GROUP BY Invno) AS T2  on  (AddDoc.HAdd_Doc = T2.Invno);

  2. محاولة سابقة
    SELECT   	AddDoc.HAdd_Doc, AddDoc.ZDate,  AddDoc.Supid,  AddDoc.Supplier,
     	(SELECT IsNULL(SUM(Transactions.GrandTotal) , 0) FROM Transactions WHERE Transactions.DAdd_Doc = AddDoc.HAdd_Doc) As MyTotal,  
    	(SELECT IsNull(SUM(AccountPayable.LE) , 0)  FROM AccountPayable WHERE AddDoc.HAdd_Doc = AccountPayable.Invno) AS Paid,
      	((SELECT IsNULL(SUM(Transactions.GrandTotal) , 0) As MyGrandTotal FROM Transactions WHERE Transactions.DAdd_Doc = AddDoc.HAdd_Doc) -   
    	(SELECT IsNull(SUM(AccountPayable.LE) , 0)  FROM AccountPayable WHERE AddDoc.HAdd_Doc = AccountPayable.Invno)) As Remaining
    
    FROM 		AddDoc;

    مشكلته تقنيا أنه يقوم بعمليات الجمع مرتين , لأن العبارة

    MyTotal - Paid

    لم تعمل مباشرة ..

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 14 أكتوبر 2012 في 22:53

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

ممتاز

بارك الله فيك يا أستاذنا

:thumb_up:

certifiedj.jpg

 

 

Image Hosted by ImageShack.us

مواضيع مشابهة