منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : عمل فيوز في sqlserver
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
بسم الله الرحمن الرحيم

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

منذ أكثر من شهر وأنا احاول أعمل فيوز في sql server لثلاثة جداول بس ما قدرت Angry

1.جدول العملاء
رقم العميل| اسم العميل| وباقي بيانات العميل

2. جدول الفواتير:
رقم الفاتورة | نوع الفاتورة | طريقة الدفع | رقم العميل| المبلغ الإجمالي | وباقي بيانات الفاتورة

3.جدول السندات:
رقم السند | نوع السند| طريقة الدفع | رقم العميل | رقم الفاتورة المراد دفع السند لحسابها (للفواتير الآجلة) | وباقي بيانات السند

((((طبعا العميل يقدر يقول ابغى ادفع المبلغ عن (الفاتورة رقم) فيتم إدخاله في حقل رقم الفاتورة في جدول السندات وإلا يتم إدخال 0 عوضا عن ذلك في حالة كان السند لغرض غير سداد قيمة فاتورة))))

المشكلة اني عندما عملت الفيوز اظهر لي فقط البيانات اللي مسجلة في جميع الجداول
يعني اذا فيه سند ومسجل في حقل رقم الفاتورة حقه رقم فاتورة يظهر معي في الفيو
لكن إذا فيه سند وحقل رقم الفاتورة حقه مسجل فيه (0) عندها لا يظهر في الفيو
بينما السندات التي رقم العميل فيها 0 (أي غير مرتبطة بعميل محدد) تظهر في الفيو

((((((تلخيص المشكلة))))))
جدول العملاء

الرقم | الاسم

  1    | محمد

  2    |  علي

  3    |  خالد



جدول الفواتير:

رقم الفاتورة | رقم العميل

        1         |         1

        2         |         2

        3         |         3

        4         |         1



جدول السندات

رقم السند | رقم العميل | رقم الفاتورة

     1         |       2         |       2

     2         |       1         |       0



هذه الجداول باختصار

جميع البيانات في الجداول تظهر إلا في الحالة الأخيرة في جدول السندات لأن رقم الفاتورة (0)
(المفروض تطلع عدد السجلات في الفيو=6 سجلات لكن في هذه الحالة تطلع فقط 5)

يارب أكون قدرت أوصل مشكلتي
وبعد محاولات واستشارات الاخوة الاعضاء توصلنا إلى هذا الكود عوضا عن استخدام الفيو لكن لا يزال (يحتاج تعديل)
كود :
select * from vouchers full join bills on vouchers.bill_id=bills.bill_id full join suppliers on  bills.supplier_id = suppliers.supplier_no and suppliers.supplier_no = vouchers.supplier_no
 

وللجميع شكري وتقديري
أولاً: تعبك في  تلوين الخط للايضاح ومحاولة الشرح اصعب بكثير من اللي مطلوب من الاستعلام يعني امر الاستعلام ابسط من اعداد السؤال
ثانيا لا نحتاج لعمل استعلام في قاعدة البيانات في مثل هذه الحالة الامر بسيط فقط جملة استعلام عند الحاجة
لنأخذ رقم العميل من جدول العملاء مع رقم العميل في  جدول الفواتير ونأخذ رقم الفاتور الاساسي مع رقم الفاتورة الفرعي في جدول السندات.
السطر السابق يعتبر استعلام Viewer
لمعرفة سندات العميل فقط سنأخذ رقم العميل من جدول العملاء مع رقم العميل في جدول السندات وسنهمل الفواتير
الان لو استعرض بيانات من الثلاث جداول
PHP كود :
SELECT 
FROM 
(t1 INNER JOIN t2 ON t1.ID t2.CidINNER JOIN t3 ON t2.IDb t3.Bid

ولو من الجدول والثاني فقط
PHP كود :
SELECT 
FROM t1 INNER JOIN t2 ON t1
.ID t2.Cid

من الثاني والثالث
PHP كود :
SELECT 
FROM t2 INNER JOIN t3 ON t2
.IDb t3.Bid

من الاول والثالث
PHP كود :
SELECT 
FROM t1 INNER JOIN t3 ON t1
.ID t3.Cid


طبعا في كل جمل Select السابقة لم اذكر اي حقول مختارة لانك ستضع او تختار ما يهمك من الحقول
Cid مفتاح ثانوي للعميل
Bid مفتاح ثانوي للفواتير
الجدول t1 للعملاء\
t2 للفواتير
t3 للسندات
ومن البديهي ان السند الذي يحمل رقم فاتور 0 فانه لن يتبع لاي فاتورة وبالتالي الفاتورة لن تتبع لاي عميل
نصيحة: في المرات القادمة اعمل مثال بسيط للمشكلة افضل من محاولة التوضيح بالكتابة
بالتوفيق
(31-10-16, 04:55 AM)أبو عمر كتب : [ -> ]أولاً: تعبك في  تلوين الخط للايضاح ومحاولة الشرح اصعب بكثير من اللي مطلوب من الاستعلام يعني امر الاستعلام ابسط من اعداد السؤال
ثانيا لا نحتاج لعمل استعلام في قاعدة البيانات في مثل هذه الحالة الامر بسيط فقط جملة استعلام عند الحاجة
لنأخذ رقم العميل من جدول العملاء مع رقم العميل في  جدول الفواتير ونأخذ رقم الفاتور الاساسي مع رقم الفاتورة الفرعي في جدول السندات.
السطر السابق يعتبر استعلام Viewer
لمعرفة سندات العميل فقط سنأخذ رقم العميل من جدول العملاء مع رقم العميل في جدول السندات وسنهمل الفواتير
الان لو استعرض بيانات من الثلاث جداول
PHP كود :
SELECT 
FROM 
(t1 INNER JOIN t2 ON t1.ID t2.CidINNER JOIN t3 ON t2.IDb t3.Bid

ولو من الجدول والثاني فقط
PHP كود :
SELECT 
FROM t1 INNER JOIN t2 ON t1
.ID t2.Cid

من الثاني والثالث
PHP كود :
SELECT 
FROM t2 INNER JOIN t3 ON t2
.IDb t3.Bid

من الاول والثالث
PHP كود :
SELECT 
FROM t1 INNER JOIN t3 ON t1
.ID t3.Cid


طبعا في كل جمل Select السابقة لم اذكر اي حقول مختارة لانك ستضع او تختار ما يهمك من الحقول
Cid مفتاح ثانوي للعميل
Bid مفتاح ثانوي للفواتير
الجدول t1 للعملاء\
t2 للفواتير
t3 للسندات
ومن البديهي ان السند الذي يحمل رقم فاتور 0 فانه لن يتبع لاي فاتورة وبالتالي الفاتورة لن تتبع لاي عميل
نصيحة: في المرات القادمة اعمل مثال بسيط للمشكلة افضل من محاولة التوضيح بالكتابة
بالتوفيق

الأستاذ الفاضل أبو عمر أشكر لك تجاوبك معي وبارك الله فيك وفي علمك
للأسف الاستعلام لم يحل مشكلتي
مشكلتي تتلخص في أن السندات التي لا يوجد لها فواتير ولكن لها عملاء

جدول العملاء
الرقم | الاسم
  1    | محمد
  2    |  علي
  3    |  خالد

جدول الفواتير:
رقم الفاتورة | رقم العميل
        1         |         1
        2         |         2
        3         |         3
        4         |         1

جدول السندات
رقم السند | رقم العميل | رقم الفاتورة
     1         |       2         |       2
     2         |       1         |       0

هذه الجداول باختصار
جميع البيانات في الجداول تظهر إلا في الحالة الأخيرة في جدول السندات لأن رقم الفاتورة (0)
(المفروض تطلع عدد السجلات في الفيو=6 سجلات لكن في هذه الحالة تطلع فقط 5)
الواجب ان لا يكون رقم الفاتورة صفر اساسااااااااااا
كيف يتم كتابة سند لفاتورة ليس لها وجوووود
ماهو هذا سبب المشكلة
اعتقد ان كلام الاخ عمر في محله في خصوص الترقيم و لكن لنأخذ المنحنى الخاص بك و نتجاهل القوانين و نحاول حل المشكله ، لدينا هنا ثلاثة جداول الجدول الاساسي منها هنا هو جدول العملاء و هذا شيء جيد اي مضمون تظهر نتائج بناءاً على بيانات هذا الجدول ، ننتقل الى الجزء الاخر وهو كيف سنقوم في حالة ان الفاتوره رقم السند بها هو صفر لنجعلها تظهر في نتائج الاستعلام !! ، نصل الى استنتاج وهو أن نطلب من الكويري المنفذه ان لا تهتم بجدول السندات الا اذا كانت قيمته اعلى من الصفر ، بمعنى أخر اذا كان رقم السند أكبر من الصفر فأتي بمعلومات السند ، غير ذلك أرجع لي قيمه فارغه و لا تلغي الفاتوره لانه ليس لها سند ، طبعا هذه المشكله تحل باستخدام LEFT JOIN ومعناها اعتمد بشكل الاساسي على الجدول الذي بيسار الاستعلام ، بدلاً عن INNER JOIN التي لابد من توفر البيانات في الجدولين ، في هذا الموضوع يتضح لك الفرق بين هذين النوعين :
- LEFT JOIN
http://www.w3schools.com/sql/sql_join_left.asp
-INNER JOIN
http://www.w3schools.com/sql/sql_join_inner.asp

انظري الى الصورة التي بالروابط و ان شاء الله ستفهمي الفرق بينها
(31-10-16, 07:21 AM)أبو عمر كتب : [ -> ]الواجب ان لا يكون رقم الفاتورة صفر اساسااااااااااا
كيف يتم كتابة سند لفاتورة ليس لها وجوووود
ماهو هذا سبب المشكلة

يمكن أن يكون السند مرتبط بفاتورة (في حال كان دفعة من فاتورة آجلة)
ويمكن أن يكون السند غير مرتبط بفاتورة (لأي غرض آخر غير بيع وشراء المنتجات)

(31-10-16, 09:32 AM)myalsailamy كتب : [ -> ]اعتقد ان كلام الاخ عمر في محله في خصوص الترقيم  و لكن  لنأخذ المنحنى الخاص بك و نتجاهل القوانين و نحاول حل المشكله  ،  لدينا هنا  ثلاثة جداول الجدول الاساسي منها هنا هو  جدول العملاء  و هذا شيء جيد اي مضمون تظهر نتائج  بناءاً على بيانات  هذا الجدول  ،  ننتقل الى الجزء الاخر وهو  كيف سنقوم في حالة  ان الفاتوره رقم السند بها  هو  صفر  لنجعلها تظهر في نتائج الاستعلام !! ،  نصل الى استنتاج وهو أن نطلب من الكويري المنفذه ان لا تهتم  بجدول السندات الا اذا  كانت  قيمته اعلى من  الصفر ، بمعنى أخر اذا  كان رقم السند أكبر من الصفر فأتي بمعلومات السند ، غير ذلك أرجع لي قيمه فارغه و لا تلغي الفاتوره لانه ليس لها سند  ،  طبعا هذه المشكله تحل باستخدام  LEFT JOIN  ومعناها اعتمد بشكل الاساسي على الجدول الذي بيسار الاستعلام  ، بدلاً عن  INNER JOIN التي لابد من توفر البيانات في الجدولين  ،  في هذا الموضوع يتضح لك الفرق بين هذين النوعين  :
- LEFT JOIN
http://www.w3schools.com/sql/sql_join_left.asp
-INNER JOIN
http://www.w3schools.com/sql/sql_join_inner.asp

انظري الى الصورة التي بالروابط و ان شاء الله ستفهمي الفرق بينها

جربت left join وما عطتني النتيجة اللي ابغاها
لكن بالصدفة وجدت شي اسمه full join وقربني جدددا من النتيجة اللي ابغاها

كود :
select * from vouchers full join bills on vouchers.bill_id=bills.bill_id full join suppliers on  bills.supplier_id = suppliers.supplier_no and suppliers.supplier_no = vouchers.supplier_no

هذا الكود اللي وصلت له بعد محاولات عديدة وطوييييييييييلة بس ما عطاني الغرض اللي ابغاه تماما

اتمنى لو احد يساعدني ويعدله
ممكن تضعي قاعدة البيانات ولو تكون Script بالبيانات يكون أفضل عشان نتلاشي اختلاف الاصدار
وممكن تضعي صورة للنتائج المراد إظهارها ولو بشكل ورقة اكسل عشان المطابقة

لأن بالشكل اللي بيدور فيه الموضوع بدول مثال أو قاعدة بيانات مرفقة اعتقد المسألة حتطول
استخدميها بهذا الشكل  

كود :
SELECT     suppliers.supplier_no, vouchers.bill_id, vouchers.supplier_no AS supplier_no2
, bills.bill_id AS bill_id2, bills.supplier_id
FROM         vouchers left JOIN
                      bills ON vouchers.bill_id = bills.bill_id INNER JOIN
                      suppliers ON vouchers.supplier_no = suppliers.supplier_no

ومعناه اظهر جميع  السندات التي تحوي  فواتير  و التي بدون الفواتير  


Full  Join  أو  Outer Join   لا تحل مشكلتك لانها راح تظهر كل  شيء  في كلا الجدولين  و لكن في حالتك  هناك جدول فقط اريده ان يظهر اجباري (السندات) و الجدول الاخر (الفواتير) اختياري ، اي ان وجد بيانات في الفواتير قام بعرضها  وان لم يجد لا يعرضها
(01-11-16, 01:22 AM)ممدوح كتب : [ -> ]ممكن تضعي قاعدة البيانات ولو تكون Script بالبيانات يكون أفضل عشان نتلاشي اختلاف الاصدار
وممكن تضعي صورة للنتائج المراد إظهارها ولو بشكل ورقة اكسل عشان المطابقة

لأن بالشكل اللي بيدور فيه الموضوع بدول مثال أو قاعدة بيانات مرفقة اعتقد المسألة حتطول

لا اعرف كيف ارفق قاعدة البيانات ولا اعرف كيف اضيف صورة في الرد

(01-11-16, 01:46 AM)myalsailamy كتب : [ -> ]استخدميها بهذا الشكل  

كود :
SELECT     suppliers.supplier_no, vouchers.bill_id, vouchers.supplier_no AS supplier_no2
, bills.bill_id AS bill_id2, bills.supplier_id
FROM         vouchers left JOIN
                      bills ON vouchers.bill_id = bills.bill_id INNER JOIN
                      suppliers ON vouchers.supplier_no = suppliers.supplier_no

ومعناه اظهر جميع  السندات التي تحوي  فواتير  و التي بدون الفواتير  


Full  Join  أو  Outer Join   لا تحل مشكلتك لانها راح تظهر كل  شيء  في كلا الجدولين  و لكن في حالتك  هناك جدول فقط اريده ان يظهر اجباري (السندات) و الجدول الاخر (الفواتير) اختياري ، اي ان وجد بيانات في الفواتير قام بعرضها  وان لم يجد لا يعرضها

للأسف ما ضبط معي الكود !!!
ابسط الحلول اجعلي جدول لسندات الفواتير
وجدول سندات اخر للسندات التي لا تتعلق بالفواتير
وهنا ترتاحين من همّ جمل الاستعلام وربكتها