עלה אצלנו הצורך לאפשר למשתמשים לבחור עבור איזו תקופה להריץ דוחות - לבחור אם על אתמול, שבוע שעבר, הרבעון הנוכחי וכו'. פתרתי את זה באמצעות בניית שני האובייקטים הבאים, ותיארתי לעצמי שהם עשויים להיות שימושיים גם עבורכם. אשמח לקבל משוב עליהם.
האובייקט "תקופה - התחלה":
CASE @Prompt('תקופה','A',{'היום','אתמול','שבוע נוכחי','שבוע שעבר','חודש נוכחי','חודש שעבר','רבעון נוכחי','רבעון שעבר','שנה נוכחית','שנה שעברה','תאריכים'},mono,constrained,persistent,)
WHEN 'היום' THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
WHEN 'אתמול' THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()-1))
WHEN 'שבוע נוכחי' THEN DATEADD(wk,DATEDIFF(wk,6,GETDATE()),6)
WHEN 'שבוע שעבר' THEN DATEADD(wk,DATEDIFF(wk,6,GETDATE()-7),6)
WHEN 'חודש נוכחי' THEN DATEADD(mm, DATEDIFF(mm,0, GETDATE()),0)
WHEN 'חודש שעבר' THEN DATEADD(mm, DATEDIFF(mm,0, GETDATE())-1,0)
WHEN 'רבעון נוכחי' THEN DATEADD(qq, DATEDIFF(qq,0, GETDATE()),0)
WHEN 'רבעון שעבר' THEN DATEADD(qq, DATEDIFF(qq,0, GETDATE())-1,0)
WHEN 'שנה נוכחית' THEN DATEADD(yy, DATEDIFF(yy,0, GETDATE()),0)
WHEN 'שנה שעברה' THEN DATEADD(yy, DATEDIFF(yy,0, GETDATE())-1,0)
WHEN 'תאריכים' THEN @Prompt('מתאריך','D',,mono,,persistent,)
END
האובייקט "תקופה - סיום":
CASE @Prompt('תקופה','A',{'היום','אתמול','שבוע נוכחי','שבוע שעבר','חודש נוכחי','חודש שעבר','רבעון נוכחי','רבעון שעבר','שנה נוכחית','שנה שעברה','תאריכים'},mono,constrained,persistent,)
WHEN 'היום' THEN GETDATE()
WHEN 'אתמול' THEN DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
WHEN 'שבוע נוכחי' THEN GETDATE()
WHEN 'שבוע שעבר' THEN DATEADD(wk,DATEDIFF(wk,6,GETDATE()),6)
WHEN 'חודש נוכחי' THEN GETDATE()
WHEN 'חודש שעבר' THEN DATEADD(mm, DATEDIFF(mm,0, GETDATE()),0)
WHEN 'רבעון נוכחי' THEN GETDATE()
WHEN 'רבעון שעבר' THEN DATEADD(qq, DATEDIFF(qq,0, GETDATE()),0)
WHEN 'שנה נוכחית' THEN GETDATE()
WHEN 'שנה שעברה' THEN DATEADD(yy, DATEDIFF(yy,0, GETDATE()),0)
WHEN 'תאריכים' THEN @Prompt('עד תאריך','D',,mono,,persistent,)
END
בנו תנאי בדוח בסגנון של
SaleDate Between [תקופה - התחלה] AND [תקופה - סיום]
שני האובייקטים האלה מציגים PROMPT עם אותו שם, ולכן המשתמש יתבקש להזין רק שדה אחד. כל אחד מהאובייקטים האלה מתרגם את הערך האחד הזה באופן אחר. ההתחלה מביא את תחילת התקופה, והסיום - את סופו.
שימו לב שאחת התקופות האפשרויות היא "תאריכים". אפשרות זו תציג בפני המשתמש שני PROMPT-ים נוספים - מתאריך ועד תאריך, ומאפשרים למשתמש להריץ את הדוח על תאריכים ספציפיים לבחירתו. התאריכים שיוזנו בשדות אלה יבואו לידי ביטוי אך ורק אם נבחר הערך "תאריכים" בPROMPT הראשון. אחרת BO יתעלם מהערכים שיוזנו שם.
אני מוצא שזה שימושי להביא את האובייקטים האלה גם לתוך תוצאות הדוח, כך שיש לי שם את התאריכים המדוייקים שעליהם רץ הדוח, בנוסף לשם התקופה ("חודש שעבר") שאני מביא באמצעות UserResponse.
שימו לב שהתחביר של האובייקטים מתאים ל-SQL Server (ולא מבצע המרות לSTRING או אסונות טבע אחרים), אבל ניתן בקלות להסב למסדי נתונים אחרים.