سؤال

لدي تقرير خدمات التقارير (SQL 2008) مع معلمتين للتاريخ/الوقت - تاريخ البدء وتاريخ الانتهاء.أحتاج إلى تقييد تاريخ الانتهاء بنفس الشهر والسنة مثل تاريخ البدء.يبدو أن هذا يجب أن يكون أمرًا سهلاً للقيام به، لكن لا يمكنني معرفة ذلك.

حاليًا، أقوم بالتحقق من المعلمات التي تم تمريرها إلى الإجراء المخزن وأظهر خطأ إذا لم تكن معلمتي التاريخ والوقت في نفس الشهر والسنة.أنا أبحث عن طريقة أكثر أناقة لتحقيق ذلك.

هل كانت مفيدة؟

المحلول

يمكنك التحقق من قيمة EndDate في تعبير المعلمة، وإذا كانت غير صحيحة، فاضبطها على StartDate + 1 Month.
شيء مثل:

= IIF(DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) = 0, Parameters!EndDate.Value, AddDate(DateInterval.Month, 1, Parameters!StartDate.Value))

إذا كنت تريد فقط إعلام المستخدم، فيمكنك وضع بعض مربعات النص المخفية بالتنسيق المناسب (الخط الأحمر الكبير) ورسالة حول نطاق غير صحيح لمعلمات التاريخ.في مجموعة التعبير المخفية

= (DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) <> 0)

يمكنك أيضًا دمج كلا الإجراءين مع التعليمات البرمجية المخصصة:

Public DateMessage As String

Public Function ValidateDate(StartDate As DateTime, EndDate As DateTime) As DateTime
  Dim ResultDate As DateTime
  If (DateDiff(DateInterval.Month, StartDate, EndDate) <> 0) Then
    ResultDate = AddDate(DateInterval.Month, 1, StartDate)
    DateMessage = String.Format("End Date parameter value {0} 
      was out of range and was changed to {1}", EndDate, ResultDate)
  Else
    ResultDate = EndDate
  End If
End Function

ثم، في تعبير قيمة المعلمة:

= Code.ValidateDate(Parameters!StartDate.Value, Parameters!EndDate.Value)

في خاصية القيمة لمربع النص tbDateParameterMessage:

= Code.DateMessage

وفي تعبير الخاصية المخفية:

= String.IsNullOrEmpty(Code.DateMessage)

يحررولكن إذا كنت تريد إيقاف تشغيل التقرير، فاستخدم هذا الرمز المخصص:

Public Function CheckDate(SDate as Date, EDate as Date) as Integer
    Dim msg as String
    msg = ""
    If (SDate > EDate)  Then
        msg="Start Date should not be later than End Date"
    End If
    If msg <> "" Then
        MsgBox(msg, 16, "Parameter Validation Error")
        Err.Raise(6,Report) 'Raise an overflow
    End If
End Function

انها مأخوذة من منتدى SQLServerCentral.

نصائح أخرى

في كثير من الأحيان، توجد مشكلات في النشر تتعلق باستخدام وظيفة Msgbox في تقرير SSRS.إنها تعمل بشكل جيد على أجهزة التطوير الخاصة بنا، ولكن قد يكون من الصعب بدء العمل عند نشرها فعليًا.وإليكم رابطين يوضحان المشكلة:

من ام اس دي ان

من SQLDev

كان الحل الذي توصلت إليه هو تنفيذ مبسط للغاية حيث تم إيقاف التقرير، ولكنه يظهر ببساطة خطأ في التقرير مع الرسالة المعروضة للمستخدم من عارض التقارير.

  1. قم بإنشاء معلمة نص/سلسلة جديدة (أطلق عليها اسم CheckDateRange)
  2. السماح بالقيم الفارغة وجعلها مخفية
  3. القيم المتاحة = لا شيء
  4. متقدم = استخدم القيم الافتراضية
  5. القيم الافتراضية = تحديد القيم - في القيمة، استخدم زر الوظيفة واستخدم ما يلي:=CODE.CheckDateParameters(Parameters!BeginDate.Value,Parameters!EndDate.Value) - لاحظ أنه يمكنك رؤية أسماء المعلمات الخاصة بي للتواريخ المحددة وهي BeginDate وEndDate
  6. أخيرًا، بالنسبة لرمز التقرير، أدخل مقتطف الكود التالي:

    Function CheckDateParameters(StartDate as Date, EndDate as Date) as Integer
    Dim msg as String
    msg = ""
    If (StartDate > EndDate) Then
      msg="Start Date should not be later than End Date"
      Err.Raise(22000, "VBCore.Utility", msg)
    End If
    End Function
    

لا شيء يتوهم، ولكن ينجز ما تحتاجه.

حظ سعيد!

ولقد استخدمت الخفية فكرة مربع النص لأنه كان أفضل من السماح للتحطم التقرير. ما كنت آمل أن إنجاز كان لإجبار المستخدم لتغيير المعلمات الخاصة بهم في خط الهجوم قبل صدور التقرير تنفيذها.

وراجع للشغل، بناء الجملة لم تنجح. أنا استخدم هذا بدلا من ذلك:

= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value)

وبفضل coldice لهذه الفكرة.

>     Public Function CheckDate(SDate as Date, EDate as Date) as Integer Dim msg as String
>      msg = ""
>      If (SDate > EDate)  Then msg="Start Date should not be later than End Date"
>      End If
>      If msg <> "" Then MsgBox(msg, 16, "Parameter Validation Error") Err.Raise(6,Report)                    'Raise an overflow
>      End If End Function

ما لم تكن قد قدمت التغييرات سوف الدالة MsgBox () لا يعمل على SSRS. أنها لا تعمل على SSRS 2010. وأعتقد أنه من وظيفة النوافذ بحيث لا يمكن استخدامها على صفحة الويب المقدمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top