DCSIMG
Add row numbers to a matrix in Reporting Services - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

Add row numbers to a matrix in Reporting Services

 

אז כמו שהבטחתי, אני רוצה להדגים איך אפשר להוסיף מספרי שורות למטריצה שמוצגת ב ReportingServices,
 
את הפרויקט תוכלו להוריד מכאן:
 
אז לפני שנתחיל עם איך עושים את זה, נציץ לתוצאה הסופית:
 
הדוגמא עובדת על northwind, כשאנחנו שולפים את כל המוצרים והשנה שבהם הם נקנו, על ידי מי הם נקנו, ומי טיפל בקנייה.
 
 
matrixrs1
 
 
כמו שאפשר לראות, יש לנו עמודה עבור כל עובד
 
יש שורה עבור כל לקוח
 
וה 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 ונקבל את החלון הבא:
 
Properties
 
 
נוסיף לשם את הקוד הבא:
 
 

    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, נקבל את החלון הבא:
 
grouping window
 
 
 
ב 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, נקבל את החלון הבא,
שבו אפשר למיין את סדר העמודות:
 
group2

תוכן התגובה

Ella Maschiach כתב/ה:

Brilliant post Shlomo, thank you for sharing! :)

# February 5, 2009 9:39 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 5 and 7 and type the answer here:


Enter the numbers above: