تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
سؤال في sql
#1
سلام عليكم
عندي جدول (مرفق قاعدة البيانات2019sql) شكل البيانات فيه هكذا
   
وهو عبارة عن قوائم تتالف من عناصر وعند  تنفيذ الاستعلام عن قائمة الميزانية مثلا
PHP كود :
select from ITEM_T where n_meu_ like 'ميزانية' 
ستظهر النتائج كما يلي
   
هنا كل شيئ تمام الا قائمة الدخل ليس لها قيمة وهنا  السؤال كيف لي ان اجد قيمة قائمة الدخل علما 
ان قائمة الدخل قيمتها كما يلي 
مبيعات - خصم مسموح به + قائمة مصروفات(نولون+اكراميات+ قائمة مصروفات اخرى( هدايا + بوفيه))
700+300+600+400+1000-61000=58000

وفكرة من هذا السؤال هو كيفية ايجاد قيمة قائمة داخل  قائمة  داخل قائمة داخل قائمة وهكذا الى عدد غير محدود
ولا يشترط الالتزام بهذا الجدول او بهذا المثال ممكن بفكرة اخرى 
كل ما اريده اجاد حل لهذه المسالة ب sql
بارك الله فيكم


الملفات المرفقة
.rar   DATA_B.rar (الحجم : 312.36 ك ب / التحميلات : 1)
صلى الله على نبينا محمد
اخيكم / محمود صالح
  قال الزهري رحمه الله  
 مــا عُـــبـِد الله بشئ أفضل من العلم 
الرد }}}
تم الشكر بواسطة:
#2
وعليكم السلام أخي محمود

للأمانة جلست أحاول أستوعب أو افهم القصد الي تبي توصلة , لكن ما استطعت
أعتقد لازم تشرح بشكل مفصل اكثر حتى نرى الصورة كاملة
مذاذ تقصد بـ ( قائمة الدخل ليس لها قيمة )
ثم ذكرت ( علما ان قائمة الدخل قيمتها كما يلي )
وديتني البحر ورجعتني عطشان  Big Grin
ثم ذكرت ( وفكرة من هذا السؤال هو كيفية ايجاد قيمة قائمة )
ماذا تعني بـ قيمة قائمة ؟  - هل تقصد السجلات المرتبطة بهذة القائمة أما ماذا بالضبط.
هل تقصد انك تريد القوائم تأتي على شكل شجري Tree
المعادلة هذة كيف تمت ؟ ( 700+300+600+400+1000-61000=58000 )
 
أنا متأكد 100% أن هناك حل لما تريد أن تصل إليه, لكن لم افهم الهدف والطريقة التي تستخدمها.

دمت بود
الرد }}}
#3
(01-02-22, 07:29 PM)عبدالله الدوسري كتب : وعليكم السلام أخي محمود

للأمانة جلست أحاول أستوعب أو افهم القصد الي تبي توصلة , لكن ما استطعت
أعتقد لازم تشرح بشكل مفصل اكثر حتى نرى الصورة كاملة
مذاذ تقصد بـ ( قائمة الدخل ليس لها قيمة )
ثم ذكرت ( علما ان قائمة الدخل قيمتها كما يلي )
وديتني البحر ورجعتني عطشان  Big Grin
ثم ذكرت ( وفكرة من هذا السؤال هو كيفية ايجاد قيمة قائمة )
ماذا تعني بـ قيمة قائمة ؟  - هل تقصد السجلات المرتبطة بهذة القائمة أما ماذا بالضبط.
هل تقصد انك تريد القوائم تأتي على شكل شجري Tree
المعادلة هذة كيف تمت ؟ ( 700+300+600+400+1000-61000=58000 )
 
أنا متأكد 100% أن هناك حل لما تريد أن تصل إليه, لكن لم افهم الهدف والطريقة التي تستخدمها.

دمت بود
اعذرني استاذي فانا لا احسن الشرح
ما اقصده يشبه تماما الاستعلامات المتداخلة 
Select داخلها select داخلها select  وهكذا
او بصورة اكبر
  function داخلها function داخلها function
 المشكلة ان function لها نفس الهيكل فهل ينفع تدور على نفسها

تطبيقا لما ذكرت على مثالى المذكور
عند تنفيذ الاستعلام ليعطيني جدول الميزانية
سوف يعطيني قيمة كل عناصر جدول الميزانية زي اي استعلام عادي 
 الا عنصر واحد سيصتدم به وهو قائمة الدخل لماذا لانها عبارة عن قائمة مثلها مثل الميزانية وليس عنصرا واحد كما انها قد تحتوي على قائمة اخرى داخلها
فهي ستعامل معاملة الميزانية اي نفس الاستعلام الميزانية
اي function داخلها function داخلها   function والاولى والثانية والثالثة لها نفس الهيكل او نكتفي بواحدة وتدور على نفسها لا اعلم
كيف يتم ذلك بنفس المثال المذكور 
function المستخدمة
PHP كود :
ALTER FUNCTION [dbo].[MENUS_MAIN55](@NAME_ NVARCHAR(50))
RETURNS TABLE
AS
RETURN (
 
      WITH DT AS(
     
  --استعلام عن الجدول بدلالة اسم القائمة المطلوبة (وهي الميزانية)
     
  SELECT FROM  ITEM_T WHERE n_meu_ LIKE @NAME_   
       
)
         
SELECT 
         NAME_
,
         
n_meu_,
         --
ال جزء الاهم وهنا باخبرة انه اذا وجد مسمى من مسميات القوائم نفذ اجراء معين (وهي قائمة الدخل(
        (CASE 
         
WHEN  DT.NAME_ in (SELECT distinct n_meu FROM  ITEM_T   
         THEN 
??????????????????????????? END )AS VALUE_,
         --
هنا اريد ان انفذ نفس الاستعلام الى انا فيهMENUS_MAIN55 لمسمة قائمة الدخل
          FROM DT

صلى الله على نبينا محمد
اخيكم / محمود صالح
  قال الزهري رحمه الله  
 مــا عُـــبـِد الله بشئ أفضل من العلم 
الرد }}}
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو
#4
السلام عليكم ورحمة الله وبركاته

الحل هو بطريقة بنائك لدليل الحسابات المؤسسة.
الأفضل أن تجعل هناك مستوى محدد يقف عنده بناء الدليل ولا تجعله مفتوحاً إلى ما لا نهاية..

مثلاً : تضع حقل آخر تحديد فيه أين يكون الحساب الذي تتعامل معه في أي مستوى من شجرة عرض دليل الحسابات. :
الميزانية هي المستوى 0  مثلاً
ثم يوجد حسابات رئيسية 1 
ثم حسابات فرعية 2
ثم حسابات جزئية(نهائية) 3  (يفضل أن تتوقف هنا أو في المستوى الذي قبله)


وعلى أساس وعدد هذه المستويات تقوم بعمل الاستعلامات الخاصة بدليل حسابات المؤسسة:
فيكون على المستوى النهائي(3) عبارة عن الكشف التفصيلي لميزانيتك (أو حساباتك)
والكشف على المستوى (0)   أو المستوى (1)  هو الكشف الاجمالي لحسابات الميزانية ..

---
عندما تريد أن تبحث ضمن برنامجك لتصنع التقرير عليك أن تحدد المستوى الذي تعمل فيه 
يعني أكثر من شرط (ميزانية، مستوى (0 أو 1 أو 2 أو 3))
1- فإذا بحثت بالمستوى النهائي يكون أبسط الاستعلامات هو من تبحث عنه
فيعرض لك اسماء ومجاميع الحسابات في المستوى النهائي كما هو متوفر لديك في قاعدة البيانات

2 - بينما لو بحثت في المستوى الأعلى عليك أن تصنع حلقة لهذا المستوى : 
تقف عند حساب معين ثم تبحث في مجاميع الحسابات الفرعيه له ثم تعطيع المجمجوع النهائي لهذا الحساب، ثم تنتقل للحساب الذي يليه.

3 - وفي المستوى الأعلى تبحث بحلقتين حلقة للمستوى الذي أدنى منه وحلقة للمستوى النهائي.  وهكذا دواليك ..

---

ملاحظة : 
بالنسبة للجدول الذي عرضته في مشاركتك جعلت قيمة العمليات كلها بالموجب وكلها في نفس الحقل وهذا خطأ 
عليك أن تميز بين القيمة التي ستجمعها عن القيمة التي ستطرحها :
- بوضع حقلين : حقل للقيم المدينة وحقل للقيم الدائنة.
- أو حقل وحيد تكون في القيم المدينة موجبة والدائنة سالبة.
 
كي يسهل على البرنامج التمييز بين الحسابات وما سيجمعه وما سيطرحه بطريقة برمجية(تعتمد على نوع الحساب وقيمة حسابه والشرح أحياناً) وليس بطريقة يدوية(تعتمد على نوع الحساب فقط).
قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}}
تم الشكر بواسطة: محمود صالح , ابراهيم ايبو
#5
(01-02-22, 10:08 PM)Taha Okla كتب : السلام عليكم ورحمة الله وبركاته

الحل هو بطريقة بنائك لدليل الحسابات المؤسسة.
الأفضل أن تجعل هناك مستوى محدد يقف عنده بناء الدليل ولا تجعله مفتوحاً إلى ما لا نهاية..

مثلاً : تضع حقل آخر تحديد فيه أين يكون الحساب الذي تتعامل معه في أي مستوى من شجرة عرض دليل الحسابات. :
الميزانية هي المستوى 0  مثلاً
ثم يوجد حسابات رئيسية 1 
ثم حسابات فرعية 2
ثم حسابات جزئية(نهائية) 3  (يفضل أن تتوقف هنا أو في المستوى الذي قبله)


وعلى أساس وعدد هذه المستويات تقوم بعمل الاستعلامات الخاصة بدليل حسابات المؤسسة:
فيكون على المستوى النهائي(3) عبارة عن الكشف التفصيلي لميزانيتك (أو حساباتك)
والكشف على المستوى (0)   أو المستوى (1)  هو الكشف الاجمالي لحسابات الميزانية ..

---
عندما تريد أن تبحث ضمن برنامجك لتصنع التقرير عليك أن تحدد المستوى الذي تعمل فيه 
يعني أكثر من شرط (ميزانية، مستوى (0 أو 1 أو 2 أو 3))
1- فإذا بحثت بالمستوى النهائي يكون أبسط الاستعلامات هو من تبحث عنه
فيعرض لك اسماء ومجاميع الحسابات في المستوى النهائي كما هو متوفر لديك في قاعدة البيانات

2 - بينما لو بحثت في المستوى الأعلى عليك أن تصنع حلقة لهذا المستوى : 
تقف عند حساب معين ثم تبحث في مجاميع الحسابات الفرعيه له ثم تعطيع المجمجوع النهائي لهذا الحساب، ثم تنتقل للحساب الذي يليه.

3 - وفي المستوى الأعلى تبحث بحلقتين حلقة للمستوى الذي أدنى منه وحلقة للمستوى النهائي.  وهكذا دواليك ..

---

ملاحظة : 
بالنسبة للجدول الذي عرضته في مشاركتك جعلت قيمة العمليات كلها بالموجب وكلها في نفس الحقل وهذا خطأ 
عليك أن تميز بين القيمة التي ستجمعها عن القيمة التي ستطرحها :
- بوضع حقلين : حقل للقيم المدينة وحقل للقيم الدائنة.
- أو حقل وحيد تكون في القيم المدينة موجبة والدائنة سالبة.
 
كي يسهل على البرنامج التمييز بين الحسابات وما سيجمعه وما سيطرحه بطريقة برمجية(تعتمد على نوع الحساب وقيمة حسابه والشرح أحياناً) وليس بطريقة يدوية(تعتمد على نوع الحساب فقط).

شكرا استاذي Taha Okla
ساهتم بما قلته
صلى الله على نبينا محمد
اخيكم / محمود صالح
  قال الزهري رحمه الله  
 مــا عُـــبـِد الله بشئ أفضل من العلم 
الرد }}}
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم