تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[كود] ارجو تصحيح الجملة التالية
#1
جملة الاستعلام التالية فى داتا انفيرونمنت ولكن رفضت ان تعمل مال الخطأ بها 
PHP كود :
SELECT
    bhisab 
AS [اسم الحساب],
    bbian AS [التصنيف],
    SUM(IIF(bml='منه'bcashm0)) AS [اجمالي مدين],
    SUM(IIF(bml='له'bcashl0)) AS [اجمالي دائن],
    SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) AS [الرصيد],
    IIF(
        SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) >= 0,
        'مدين',
        'دائن'
    ) AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN 
('Yes''No')
GROUP BY bhisabbbian
ORDER BY bhisab 
الرد }}}
تم الشكر بواسطة:
#2
(04-04-26, 11:52 PM)مختار الوافي كتب : مثلا عندي ورشة صيانة الكترونيات اعطاني العميل خمس اصناف لاصلاحهم جهزت ثلاثة اصناف وصنفين غير جاهز اريد عمل تقرير في الجدول الاول الاصناف المستلمة  والجدول الثاني الاصناف المتبقية للعميل

(17-05-26, 12:04 PM)hsab كتب : جملة الاستعلام التالية فى داتا انفيرونمنت ولكن رفضت ان تعمل مال الخطأ بها 
PHP كود :
SELECT
    bhisab 
AS [اسم الحساب],
    bbian AS [التصنيف],
    SUM(IIF(bml='منه'bcashm0)) AS [اجمالي مدين],
    SUM(IIF(bml='له'bcashl0)) AS [اجمالي دائن],
    SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) AS [الرصيد],
    IIF(
        SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) >= 0,
        'مدين',
        'دائن'
    ) AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN 
('Yes''No')
GROUP BY bhisabbbian
ORDER BY bhisab 

عن طريق الذكاء الاصطناعي

SQL Code Error Analysis
ما الخطأ في هذا الكود


SELECT
bhisab AS [اسم الحساب],
bbian AS [التصنيف],
SUM(IIF(bml='منه', bcashm, 0)) AS [اجمالي مدين],
SUM(IIF(bml='له', bcashl, 0)) AS [اجمالي دائن],
SUM(IIF(bml='منه', bcashm, 0)) - SUM(IIF(bml='له', bcashl, 0)) AS [الرصيد],
IIF(
SUM(IIF(bml='منه', bcashm, 0)) - SUM(IIF(bml='له', bcashl, 0)) >= 0,
'مدين',
'دائن'
) AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN ('Yes', 'No')
GROUP BY bhisab, bbian
ORDER BY bhisab
أهلاً بك. الكود الذي كتبته يبدو صحيحاً من الناحية التركيبية (Syntactically) بالنسبة لـ SQL Server (أو Access مع تعديلات بسيطة)، ولكنه يحتوي على خطأ منطقي محتمل قد يؤدي إلى نتائج غير دقيقة.

دعني أوضح المشكلة الأساسية ثم أعطيك الحل:

الخطأ: منطق حساب الأرصدة في القيد المزدوج
أنت تستخدم عمودين منفصلين (bcashm و bcashl):

bcashm = المبلغ عندما يكون الحساب "منه" (مدين)

bcashl = المبلغ عندما يكون الحساب "له" (دائن)

المشكلة: في أنظمة القيد المزدوج الصحيحة، يجب أن يحتوي السجل الواحد على حقل مبلغ واحد فقط (مثلاً bcash)، ثم تحدد طبيعة الحركة من خلال حقل آخر (bml). لكن يبدو أن تصميم جدول BALANCE لديك يحتوي على حقلين منفصلين للمبلغ.

إذا كان السجل الواحد يحتوي في نفس الوقت على قيمة في bcashm وقيمة في bcashl (وهو أمر غير طبيعي)، فإن الكود سيعمل بشكل خاطئ.

الحلول المقترحة
الحالة 1: إذا كان كل سجل يحتوي على مبلغ واحد فقط (إما في bcashm أو bcashl) - التصميم السيئ
هذا هو الأرجح. الكود الحالي سيعمل بشكل صحيح في هذه الحالة، لكن يمكن تبسيطه وتحسين أدائه:

sql
SELECT
bhisab AS [اسم الحساب],
bbian AS [التصنيف],
SUM(CASE WHEN bml = 'منه' THEN bcashm ELSE 0 END) AS [اجمالي مدين],
SUM(CASE WHEN bml = 'له' THEN bcashl ELSE 0 END) AS [اجمالي دائن],
SUM(CASE WHEN bml = 'منه' THEN bcashm ELSE -bcashl END) AS [الرصيد],
CASE
WHEN SUM(CASE WHEN bml = 'منه' THEN bcashm ELSE -bcashl END) >= 0
THEN 'مدين'
ELSE 'دائن'
END AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN ('Yes', 'No')
GROUP BY bhisab, bbian
ORDER BY bhisab
الحالة 2: التصميم الصحيح (حقل مبلغ واحد)
إذا كان بإمكانك تعديل هيكل الجدول، فالأفضل أن يكون لديك حقل واحد مثلاً bcash، وحقل bml يحدد نوع الحركة. عندها يصير الكود:

sql
SELECT
bhisab AS [اسم الحساب],
bbian AS [التصنيف],
SUM(CASE WHEN bml = 'منه' THEN bcash ELSE 0 END) AS [اجمالي مدين],
SUM(CASE WHEN bml = 'له' THEN bcash ELSE 0 END) AS [اجمالي دائن],
SUM(CASE WHEN bml = 'منه' THEN bcash ELSE -bcash END) AS [الرصيد],
CASE
WHEN SUM(CASE WHEN bml = 'منه' THEN bcash ELSE -bcash END) >= 0
THEN 'مدين'
ELSE 'دائن'
END AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN ('Yes', 'No')
GROUP BY bhisab, bbian
ORDER BY bhisab
ملاحظات إضافية
دالة IIF: تعمل في SQL Server (2012+) و MS Access، ولكن CASE أفضل للتوافق مع جميع قواعد البيانات.

شرط bchklam: تأكد من أن القيم هي بالضبط 'Yes' و 'No' (حساسية حالة الأحرف تختلف حسب قاعدة البيانات).

أسماء الأعمدة: إذا كانت bcashm تحتوي على قيم NULL، فاستخدم ISNULL(bcashm, 0) لتجنب الأخطاء.

كيف تتحقق من صحة البيانات؟
اختبر على سجل واحد:

sql
SELECT * FROM BALANCE
WHERE bhisab = 'اسم حساب معين'
AND bchklam IN ('Yes', 'No')
تأكد أن كل صف يحتوي على مبلغ في عمود واحد فقط (إما bcashm أو bcashl).

أخبرني بأي قاعدة بيانات تستخدمها (SQL Server، MySQL، Oracle، Access) لأعطيك الحل الأمثل حسب نظامك.

-----
جربت أغلب حلول الذكاء الاصطناعي فوجدت فيها نقص كبيرا وجوهريا؛ وتظل وقتا طويلا تشرح له ما تريد حتى يفهمك هذا إن فهمك.

الخلاصة:
البرمجة تفكير والمبرمج هو محور هذا التفكير.
إذا طُعِنتَ من الخلفِ فاعلمْ أنك في المقدمةِ
الرد }}}
تم الشكر بواسطة: محمدين
#3
مرحبا بك والله تشكر
اكسس 2003 كلامك صحيح استخدمت للدائن والمدين لكل حقل منفصل
مشكلة ال CASE ما بتعمل مع DATAENVIRONMENT
الرد }}}
تم الشكر بواسطة:
#4
(17-05-26, 12:04 PM)hsab كتب : جملة الاستعلام التالية فى داتا انفيرونمنت ولكن رفضت ان تعمل مال الخطأ بها 
PHP كود :
SELECT
    bhisab 
AS [اسم الحساب],
    bbian AS [التصنيف],
    SUM(IIF(bml='منه'bcashm0)) AS [اجمالي مدين],
    SUM(IIF(bml='له'bcashl0)) AS [اجمالي دائن],
    SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) AS [الرصيد],
    IIF(
        SUM(IIF(bml='منه'bcashm0)) - SUM(IIF(bml='له'bcashl0)) >= 0,
        'مدين',
        'دائن'
    ) AS [طبيعة الرصيد]
FROM BALANCE
WHERE bchklam IN 
('Yes''No')
GROUP BY bhisabbbian
ORDER BY bhisab 

انا قمت بتجربة الكود كما هو وفى داتا انفيرونمنت مع اكسس 2003 وقد عمل بدون خطأ

انت لم توضح ما حدث معك او ما هي رسالة او صورة الخطأ التي ظهرت لك
الرد }}}
تم الشكر بواسطة:



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


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