سؤال

يجب الاستعلام التالي في مختلف توقيفات ، تذكرني العقد انتهاء الصلاحية 0, 7, 30, 60 و 90 يوما قبل التأكد من تاريخ انتهاء الصلاحية.لي طريقة حساب تاريخ الإخطار لا يعطيني أي مرونة.على سبيل المثال ، يقول لدي 30 عقود تنتهي 12/5 ، السبت عندما مكتبي ليست مفتوحة.سوف أفتقد الإخطار أن العقد منتهية الصلاحية في ذلك اليوم ، و 7 أيام.

SELECT qryAllSold.SoldID, qryAllSold.CompanyName, qryAllSold.Product, qryAllSold.Description, qryAllSold.Quantity, qryAllSold.Price, qryAllSold.ConfirmedExpires, qryAllSold.Note
FROM qryAllSold
WHERE (((qryAllSold.ConfirmedExpires)=DateAdd("d",0,Int(Now()))) AND ((qryAllSold.RenewedToID) Is Null) AND ((qryAllSold.NonOpportunity)=No));

كل هذه الاستفسارات سيتم عرضه على "لوحة القيادة" النموذج بمثابة قائمة المهام اليومية.سيكون أمرا رائعا إذا كنت يمكن أن يكون شكل يمثل التاريخ ، ثم انقر فوق السهم للانتقال إلى الأمام أو الخلف يوم واحد في وقت واحد, ولكن أنا لا أعرف إذا كان لديها تلك القدرة.

إذا كان هذا لا يعمل, ما هي الطرق الأخرى التي يمكن أن أتأكد من أنني لا تفوت الإخطارات على هذه انتهاء الصلاحية?

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

المحلول

[تحرير] إذا لم تكن مبرمجا هنا هو الحل البديل

لماذا لا تستخدم شكل وظيفة في الاستعلام الخاص بك, على سبيل المثال

Format([ConfirmedExpires],"ww",2,1)

"ww" - يحدد أسابيع ، 2 تحدد يوم الاثنين أول يوم من الأسبوع ، 1 يعني الأسبوع 1 على 1 يناير

الآن فمن السهل القيام به حسابات التاريخ في أسابيع مثلا ، العقد تنتهي أكثر من 4 أسابيع إلى المستقبل:

Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1))>4

عقود تنتهي أكثر من 4 أسابيع إلى المستقبل تصل إلى 5 أسابيع في المستقبل

Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1))>4 -
Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1)),=5

هل هذا يساعد ؟


لماذا لا يمكنك فقط استخدام أيام الأسبوع ميزة من الوظائف مثل DateAdd?

بدلا من احتساب 30 يوما تقويميا قبل كنت يمكن حساب 25 ، أو أي عدد آخر من أيام الأسبوع المقبلة.

رمز أدناه يعرض مربع رسالة ولكن هل يمكن بالمثل استخدام وظيفة في استعلام SQL وراء مربع رسالة.

Sub TestWeekDay()
    Dim FirstDate As Date    ' Declare variables.
    Dim IntervalType As String
    Dim Number As Integer
    Dim Msg

    IntervalType = "ww"    ' "ww" specifies weeks as interval.
    FirstDate = InputBox("Enter a date")
    Number = InputBox("Enter number of weekdays to add")
    Msg = "New date: " & DateAdd(IntervalType, Number, FirstDate)
    MsgBox Msg
End Sub

نصائح أخرى

وربما قليلا المضاعفات:

IIf(Weekday(DateAdd("d", 0, Date())) = 7, DateAdd("d", 0, Date()) + 2, IIf(Weekday(DateAdd("d", 0, Date())) = 1, DateAdd("d", 0, Date()) + 1, DateAdd("d", 0, Date())))

ويمكن وضع هذا في حيث بيانكم، كما يلي:

SELECT q.SoldID, q.CompanyName, q.Product, 
       q.Description, q.Quantity, q.Price, 
       q.ConfirmedExpires, q.Note
FROM qryAllSold AS q
WHERE q.ConfirmedExpires=IIf(Weekday(DateAdd("d", 0, Date())) = 7, DateAdd("d", 0, Date()) + 2, IIf(Weekday(DateAdd("d", 0, Date())) = 1, DateAdd("d", 0, Date()) + 1, DateAdd("d", 0, Date())))
AND q.RenewedToID Is Null AND q.NonOpportunity=No

ملحوظة بأنني استخدمت ف الاسم المستعار للqryAllSold لأن هذا يجعل من السهل قراءة الاستعلام:     من qryAllSold AS ف

وربما يكون من الأفضل استخدام خطأ بدلا من لا.

إذا كنت ترغب في ذلك، يجب أن تكون قادرا على استخدام المعلمة:

PARAMETERS NoDays Short;
SELECT q.SoldID, q.CompanyName, q.Product, 
       q.Description, q.Quantity, q.Price, 
       q.ConfirmedExpires, q.Note
FROM qryAllSold AS q
WHERE q.ConfirmedExpires=IIf(Weekday(DateAdd("d",[NoDays],Date()))=7,DateAdd("d",[NoDays],Date())+2,IIf(Weekday(DateAdd("d",[NoDays],Date()))=1,DateAdd("d",[NoDays],Date())+1,DateAdd("d",[NoDays],Date())))
AND q.RenewedToID Is Null AND q.NonOpportunity=No

والمعلمة يسمح لك لاختيار عدد من الأيام. سيكون أفضل إذا كان هذا يشير إلى حقل في نموذج أو تم تعيين في VBA.

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