3.4 · دوال النصوص والتواريخ والمنطق الشرطي (If/Select)

المستوى 3 · متقدم : الصيغ والتنسيق الشرطي

3.4دوال النصوص والتواريخ والمنطق الشرطي (If/Select)

الهدف: معالجة النصوص والتواريخ بصيغة وكتابة منطق شرطي (If متسلسلة وSelect…Case وIsNull).
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • النص + التواريخ = 80 % من الحاجات : الاستخراج والتنظيف بـ UpperCase وLeft وTrim وToText ؛ واستخراج الفترات والآجال بـ Year وDateDiff وDateAdd وToday.
  • If للعتبات وSelect للرموز : If…Then…Else متسلسلة للشرائح، وSelect…Case لترجمة قيمة واحدة إلى تسميات — أوضح.
  • IsNull أولا : حقل فارغ غير مُختبَر يُفشل الصيغة أو يرجع فارغا — اختبر IsNull قبل استعمال كل حقل قد يكون فارغا.

mini-cas filé — فارس يصنّف زبائنه ويراقب التأخرات

فارس، مراقب التسيير في الجزائر، يصنّف زبائنه يدويا (مميز، عادي، للمتابعة) ويحسب تأخرات الدفع بالآلة الحاسبة. يكتب صيغة شرائح — If {Clients.CA} >= 500000 Then "VIP" Else If {Clients.CA} >= 100000 Then "Standard" Else "À suivre" — وتأخرا بالأيام بـ DateDiff("d", {Factures.Echeance}, CurrentDate)، محميا باختبار IsNull على تاريخ الدفع. فيصنّف التقرير ويُنبه تلقائيا : فتتم التقسيمة عند كل تحديث، دون جدول.

الحالة نفسها تعود في الدرس، والرسم، والنص الجاهز وتحدّي 48 ساعة.

1. دوال النصوص والتواريخ : يوميات الصيغ

يقدم Crystal Reports مئات الدوال ؛ وفي اليوميات تكفي عائلتان. دوال النص : UpperCase / LowerCase (حالة الأحرف)، وLeft / Right / Mid (استخراج جزء)، وLen (الطول)، وTrim (إزالة الفراغات)، وReplace (الاستبدال)، وToText (تحويل رقم/تاريخ إلى نص). فهي تنظف وتستخرج وتركّب : الحرف الأول من اسم (Left({Client.Nom}, 1))، ورمز منتج، وتسمية منسقة. ودوال التاريخ : Year / Month / Day (الاستخراج — أساسي للتجميع حسب الفترة)، وDateDiff (الفرق بين تاريخين : أجل بالأيام)، وDateAdd (إضافة مدة : استحقاق)، وToday / CurrentDate (تاريخ اليوم). والتأخر = DateDiff("d", {Factures.Echeance}, CurrentDate).

وتغطي هذه الدوال معالجة الاستحقاقات والأقدميات والتجميعات الشهرية — الخبز اليومي لتقارير التسيير. والمنعكس : التحويل صراحة (ToText للعرض، وCDate لتحويل نص إلى تاريخ) بدل خلط الأنواع.

2. المنطق الشرطي : If…Then…Else وSelect…Case وIsNull

قلب الصيغ الذكية. فـ If…Then…Else ترجع قيمة حسب شرط : If {Montant} > 1000 Then "Gros" Else "Standard" — وقابلة للتسلسل لشرائح عدة (اختبر من الأكثر تقييدا إلى الأعم، فأول شرط صحيح يفوز). وSelect…Case تختبر قيمة واحدة مقابل حالات دقيقة عدة، بأوضح : Select {Clients.Statut} Case "A" : "Actif" Case "S" : "Suspendu" Default : "Inconnu". وقاعدة الاختيار : العتبات والمجالات → If متسلسلة ؛ وقيمة واحدة تقارَن بحالات ثابتة (رموز، أصناف) → Select…Case. والعوامل And وOr وNot تجمع الشروط.

والمنعكس الذي يجنّب الأعطال : اختبار IsNull قبل استعمال حقل قد يكون فارغا — فتاريخ فارغ في DateDiff، أو مبلغ فارغ في حساب، يُفشل الصيغة أو يرجعها فارغة. وتغذي هذه الصيغ بعدها العرض والتجميعات (3-5) والتنسيق الشرطي (3-2) والمرشحات : إنها المفردات التي تجعل التقارير مفصلة على المقاس.

خطأ شائع في الفهم: «Select…Case وIf المتسلسلة شيء واحد — والقيم الفارغة سنرى إن عطّلت». خطأ مرتين. فـ Select…Case لا تُقرأ إلا لقيمة واحدة تُختبَر بمساويات ؛ وللعتبات والتراكيب تبقى If هي الأداة — وعكس الاثنين يجعل الصيغ غير مقروءة. والفارغ غير المُختبَر لا «يمر» أبدا : بل يُفشل بصمت. IsNull أولا، دوما.
جعل الصيغة ذكية المعالجة والقرار والحماية المعالجةالنص (Left وTrim) والتواريخ (Year وDateDiff)+القرارIf للعتبات وSelect للرموز+الحمايةIsNull قبل كل حقل مشكوك ترتيب If : من الأكثر تقييدا إلى الأعم.
المعالجة والقرار والحماية
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) المعالجة : فارس يستخرج السنة بـ Year والتأخر بـ DateDiff بدل الحساب يدويا. 2) القرار : If متسلسلة لشرائح رقم الأعمال، وSelect…Case لترجمة رموز الحالة. 3) الحماية : IsNull على تاريخ الدفع قبل أي حساب — فلا فارغ يعبر الصيغة. الدرس : عالج وقرر واحم — بهذا الترتيب.

🔎 مثال ملموس — تقسيم الزبائن وتأخر الدفع

فارس يكتب صيغتي القيادة ببنية Crystal.

التقسيم : If {Clients.CA} >= 500000 Then "VIP"
  Else If {Clients.CA} >= 100000 Then "Standard" Else "À suivre"
التأخر : If IsNull({Factures.DatePaiement}) Then
  DateDiff("d", {Factures.Echeance}, CurrentDate) Else 0

القراءة : العتبات → If متسلسلة ؛ والفارغ الممكن → اختبار IsNull أولا.

الدرس : هذه الأصناف ستُستعمل بعدها للتجميع (3-5).

مفردات القسم

دوال النص (السلاسل)
UpperCase/LowerCase وLeft/Right/Mid (الاستخراج) وLen وTrim (التنظيف) وReplace وToText — لتنظيف النص واستخراجه وتركيبه.

مثال بسيط: الحرف الأول Left({Client.Nom}, 1) عند فارس.

ما ليس كذلك: رموز تُعاد كتابتها يدويا في جدول.

رد فعل: استخرج ونظف بصيغة، ولا تفعل يدويا أبدا.

دوال التاريخ
Year/Month/Day (استخراج فترة) وDateDiff (الأجل بين تاريخين) وDateAdd (إضافة مدة) وToday/CurrentDate.

مثال بسيط: التأخر DateDiff("d", الاستحقاق, CurrentDate).

ما ليس كذلك: آجال محسوبة بالآلة الحاسبة.

رد فعل: Year للتجميع وDateDiff للآجال.

If…Then…Else
ترجع قيمة حسب شرط ؛ وقابلة للتسلسل لشرائح عدة (أول شرط صحيح = الفائز).

مثال بسيط: التقسيم مميز / عادي / للمتابعة.

ما ليس كذلك: Select…Case لعتبات المبالغ.

رد فعل: العتبات والمجالات → If متسلسلة.

Select…Case
توجيه : يختبر قيمة واحدة مقابل حالات دقيقة عدة + افتراضي ؛ أوضح من If للمساويات.

مثال بسيط: رمز الحالة مترجما إلى تسمية (نشط، موقوف…).

ما ليس كذلك: If متسلسلة لترجمة عشرة رموز ثابتة.

رد فعل: قيمة واحدة وحالات ثابتة → Select…Case.

تدبير الفارغ (IsNull)
اختبار IsNull قبل استعمال حقل قد يكون فارغا : فالفارغ غير المُدبَّر يُفشل الصيغة أو يرجعها فارغة.

مثال بسيط: الاختبار على {Factures.DatePaiement} قبل DateDiff.

ما ليس كذلك: DateDiff مباشر على تاريخ فارغ أحيانا.

رد فعل: IsNull في أول سطر لكل صيغة محفوفة بالخطر.

في التطبيق — استعمال الدوال والمنطق الشرطي

  1. جرّب دوال النص : UpperCase وLeft (الاستخراج) وTrim (التنظيف)، وركّب تسمية بـ ToText.
  2. جرّب دوال التاريخ : Year({Date}) لاستخراج السنة، وDateDiff لأجل بالأيام.
  3. اكتب صيغة If…Then…Else (تصنيف مبلغ) ؛ وسلسل لحالات عدة أو استعمل Select…Case للرموز.
  4. دبّر الفارغ بـ IsNull قبل استعمال أي حقل ؛ وتحقق من البنية واختبر في المعاينة.
تعالج النصوص والتواريخ وتكتب منطقا شرطيا : فتبني تقريبا أي قيمة محسوبة.

نص جاهز للقول — اشرح التقسيم التلقائي (30 ثانية)

«لم تعد التقسيمة يدوية : فصيغة تصنّف كل زبون — مميز أو عادي أو للمتابعة — حسب رقم أعماله، ويُحسب التأخر تلقائيا من الاستحقاق، متجاهلا الفواتير المدفوعة أصلا. وعند كل تحديث يكون الترتيب محيَّنا.»

يُقال في لجنة القيادة ؛ اعرض عتبات الصيغة.

نموذج جاهز للنسخ — If وSelect والتواريخ (بنية Crystal)

// الشرائح (If متسلسلة)
If {Clients.CA} >= 500000 Then "VIP"
Else If {Clients.CA} >= 100000 Then "Standard"
Else "À suivre"
// الرموز (Select…Case)
Select {Clients.Statut}
Case "A" : "Actif"
Case "S" : "Suspendu"
Default : "Inconnu"
// تأخر محمي من الفارغ
If IsNull({Factures.DatePaiement}) Then
    DateDiff("d", {Factures.Echeance}, CurrentDate)
Else 0

مستقل

صيغتان (واحدة شرائح وواحدة تواريخ) وتقريرك يفكر تلقائيا.

شركة صغيرة في الجزائر

فارس يصنّف زبائنه ويتابع التأخرات دون آلة حاسبة.

فريق مشروع

وثّق العتبات (مميز، تنبيهات) بجانب كل صيغة لتجدها.

مبتدئ

هذا الأسبوع : If بمخرجين + DateDiff محمي بـ IsNull.

✓ ممارسات جيدة

  • اختبر الشروط من الأكثر تقييدا إلى الأعم (فأول صحيح يفوز).
  • فضّل Select…Case كلما قورنت قيمة واحدة بحالات ثابتة.
  • ضع اختبار IsNull في أول سطر لكل صيغة تمس حقلا مشكوكا.

✗ أخطاء شائعة

  • تسلسل If بترتيب خاطئ : شرط عام يبتلع الحالات الخاصة.
  • استعمال Select…Case للعتبات (أو If لعشرة رموز ثابتة) : غير مقروء.
  • نسيان IsNull : تفشل الصيغة بصمت على السجلات فارغة الحقل.

النقاط الأساسية

  • النص : UpperCase/LowerCase وLeft/Right/Mid وLen وTrim وReplace وToText — الاستخراج والتنظيف والتركيب.
  • التواريخ : Year/Month (الفترات) وDateDiff (الآجال) وDateAdd (الاستحقاقات) وToday — الآجال والأقدمية والتجميعات.
  • الشروط : If…Then…Else (العتبات، قابلة للتسلسل) وSelect…Case (قيمة واحدة وحالات ثابتة) + And/Or/Not.
  • حذر الأنواع والفارغ : حوّل صراحة، واختبر IsNull قبل الاستعمال.

تحدّي 48 ساعة — طبّق غدا

اكتب صيغة شرائح واحدة على بياناتك الحقيقية + حساب أجل واحدا محميا بـ IsNull، مُختبَرين في المعاينة.

قائمة الخروج من القسم
  • أعالج النصوص والتواريخ بصيغة دون أداة خارجية.
  • أختار If أو Select حسب الحالة (عتبات مقابل رموز).
  • لا حقل مشكوك يدخل صيغي دون اختبار IsNull.
تقييم ذاتي 1-5 : هل أصنافي محسوبة أم مُعاد إدخالها ؟كم من صيغي يحمي حقوله من الفارغ ؟

أسئلة شائعة

If…Then…Else أم Select…Case : كيف تختار للتصنيف ؟

الاثنان يرجعان قيمة مختلفة حسب البيانات، لكن ليس لنفس الحالات. فـ If…Then…Else : مخرجان (« If {Montant} > 1000 Then « Gros » Else « Standard » ») أو شرائح متسلسلة (« >= 5000 : كبير جدا »، « >= 1000 : كبير »، « >= 100 : متوسط »، وإلا « صغير ») — بترتيب تنازلي، وأول شرط صحيح يفوز. ومثالية للعتبات والمجالات والتراكيب. وSelect…Case : قيمة واحدة مقابل حالات دقيقة (« Select {Statut} Case « A » : « نشط » Case « S » : « موقوف » Default : « مجهول » ») — ومثالية لترجمة الرموز والأصناف الثابتة، وأوضح من If. وتُستعمل هذه الأصناف المحسوبة بعدها للتجميع (3-5) : التجميع حسب الشريحة، وحسب الحالة المترجمة، وحسب الفترة.

كيف تعالج التواريخ وتدبّر القيم الفارغة ؟

التواريخ : الاستخراج بـ Year/Month/Day ({Date}) — للتجميع حسب الفترة (كشف سنوي، شهري) ؛ والأجل بـ DateDiff (أيام بين الطلب والتسليم، والتأخر مقابل الاستحقاق، والأقدمية) ؛ والإضافة بـ DateAdd (الاستحقاق = التاريخ + 30 يوما) ؛ واليوم بـ Today/CurrentDate (التأخر «حتى اليوم») ؛ والمقارنة مباشرة (التاريخ > #2026-01-01#) ؛ والتحويل بـ ToText/CDate. والفارغ : قد يكون الحقل فارغا (خاليا — يختلف عن الصفر) ؛ وتعبير مع فارغ قد يفشل أو يرجع فارغا. والمنعكس : If IsNull({champ}) Then … أولا — قيمة بديلة، أو حساب بديل. ويُختبر دوما على تواريخ الدفع والمبالغ الاختيارية والحقول غير الإلزامية.

تحقّق من فهمك

لترجمة رمز حالة واحد إلى تسميات (A → نشط، S → موقوف…)، الأوضح هو…

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 3أسئلة جديدة وأصعب للتحقق من مكتسباتك