3.4دوال النصوص والتواريخ والمنطق الشرطي (If/Select)
الأساسي في 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) والمرشحات : إنها المفردات التي تجعل التقارير مفصلة على المقاس.
🔎 مثال ملموس — تقسيم الزبائن وتأخر الدفع
فارس يكتب صيغتي القيادة ببنية 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 في أول سطر لكل صيغة محفوفة بالخطر.
في التطبيق — استعمال الدوال والمنطق الشرطي
- جرّب دوال النص : UpperCase وLeft (الاستخراج) وTrim (التنظيف)، وركّب تسمية بـ ToText.
- جرّب دوال التاريخ : Year({Date}) لاستخراج السنة، وDateDiff لأجل بالأيام.
- اكتب صيغة If…Then…Else (تصنيف مبلغ) ؛ وسلسل لحالات عدة أو استعمل Select…Case للرموز.
- دبّر الفارغ بـ 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.
أسئلة شائعة
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 → موقوف…)، الأوضح هو…