Add row numbers to a matrix in Reporting Services
אז כמו שהבטחתי, אני רוצה להדגים איך אפשר להוסיף מספרי שורות למטריצה שמוצגת ב ReportingServices,
את הפרויקט תוכלו להוריד
מכאן:
אז לפני שנתחיל עם איך עושים את זה, נציץ לתוצאה הסופית:
הדוגמא עובדת על northwind, כשאנחנו שולפים את כל המוצרים והשנה שבהם הם נקנו, על ידי מי הם נקנו, ומי טיפל בקנייה.
כמו שאפשר לראות, יש לנו עמודה עבור כל עובד
יש שורה עבור כל לקוח
וה data הוא, המוצר שנמכר.
אבל כמו שאפשר לראות, השורות ממוספרות, ומעבר לכך, גם השורות הפנימיות (השנים שבהם הלקוח קנה) ממוספרות במיספור נפרד.
אז איך עושים את זה ?
שלב ראשון יש לנו שאילתא, היא פשוטה ושולפת את המידע,
SELECT LastName + ' ' + FirstName AS name,
ContactName,
ProductName,
YEAR(OrderDate) AS YEAR
FROM dbo.Employees
INNER JOIN dbo.Orders ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN [Order Details] ON [Order Details].OrderID = Orders.OrderId
INNER JOIN Products ON [Order Details].ProductId = Products.ProductId
GROUP BY LastName + ' ' + FirstName, ContactName, ProductName, YEAR(OrderDate)
שלב שני נגרור מטריצה לתוך ה body של ה report
נוסיף לשורות את עמודת ה name
נוסיף לעמודות עת עמודת ה ContactName
ול data נוסיף את עמודת ProductName.
עד כאן יצרנו מטריצה רגילה.
עכשיו נתחיל לעבוד על מספרי השורות.
קיימת פונקציה שנקראת RowNumber, שלעיתים אפשר לעבוד איתה, אני לא אדגים אותה כרגע, אפילו שלפעמים אפשר להשתמש בה, במקרה שלנו אי אפשר.
אז כדי שיהיו לנו מספרי שורות, אנחנו צריכים לייצר פונקצייה משלנו, שבכל פעם שנקרא לה, היא תדע להחזיר מספר יותר גדול באחד מהפעם הקודמת.
תחת תפריט Report, נבחר ב ReportProperties, נבחר בטאב של Code ונקבל את החלון הבא:
נוסיף לשם את הקוד הבא:
1 Public Shared MyNum As Integer = 0
2 Public Shared MyNum2 As Integer = 0
3
4 Public Shared Function GetNum() As String
5 MyNum = MyNum + 1
6 Return MyNum.ToString
7 End Function
8
9
10 Public Shared Function GetNum2() As String
11 MyNum2 = MyNum2 + 1
12 Return MyNum2.ToString
13 End Function
14
15 Public Shared Function ResetNum() As String
16 MyNum2 = 0
17 End Function
נעבור על הקוד:
מוגדרים שני משתנים גלובליים (עבור המיספור)
פונקצייה ראשונה שמקדמת את המספר ומחזירה אותו.
פונקצייה שנייה שמקדמת את המספר השני ומחזירה אותו.
פונקצייה שלישית שעושה reset למשתנה השני. (כי המיספור השני, הוא עבור המיספור הפנימי של השנים, ועבור כל לקוח המיספור צריך להתחיל באחד)
כעת נבחר את המטריצה שלנו, נלחץ קליק ימין עם העכבר, ונבחר ב AddRowGroup, נקבל את החלון הבא:
ב expression נוסיף את ה ContactName, (מאחר ואנחנו לא באמת רוצים להוסיף group חדש, אלא רק להוסיף עוד עמודה לכל שורה, ואנחנו רוצים שה groupt יהיה כמו העמודה שמציגה את ה ContactName)
נאשר את הוספת ה group החדש.
כעת נבחר בתיבת הטקסט החדשה שנוצרה, (שכרגע כמובן זהה לזה שמציג את ה ContactName).
ונשנה את המאפיין Value ל:
=Code.GetNum() + Code.ResetNum()
המשמעות של זה:
בכל פעם שצריכים להציג ערך עבור העמודה הזאת,
נפעיל את הפונקצייה GetNum, כדי לקבל את המספר הבא,
וכמובן נפעיל את הפונקצייה ResetNum כדי לאפס את המיספור של השנים, שזה מיספור פנימי עבור כל אחד מה Contacts.
נחזור על התהליך ונוסיף עוד RowGroup כשב expression נוסיף לפי ה year
ונחזור שוב על התהליך ונוסיף עוד RowGroup כשב expression נוסיף לפי ה year וב value נכתוב:
=Code.GetNum2()
כדי לסדר את המיקום של ה RowsGroup, ליצה ימנית על המטריצה, בחירה ב Properties, נקבל את החלון הבא,
שבו אפשר למיין את סדר העמודות: