יום שני, 26 במרץ 2012

שימוש ב-Power Tools כדי ליצור קובץ טקסט של רישיונות קליקויו

זה לא חידוש שאפשר לבנות מודל המנתח את השימוש בקליקויו, בעזרת קובץ הלוג שמייצר השרת - Sessions_servername.
כידוע, מודל כזה מגיע מוכן - QlikView Server Performance. אבל המודל הזה בסיסי מאוד ואיננו מספק - הן בגלל שאין בו ניתוח מפורט יותר של השימוש (סינונים, לשוניות), אשר אפשרי מגרסה 10 בעזרת הקובץ Audit_servername, והן כי חסרים בו נתונים אדמינסטרטיביים כמו מצאי רישיונות והרשאות על המודלים.
לגבי מצאי הרישיונות - איך ניתן לייצר קובץ טקסט כזה (לאלו משתמשים יש רישיון, ואיזה סוג רישיון), כדי שנוכל לנתח בקליקויו את מצב הרישיונות במודל, ולא רק לצפות בו ב-Management console?
QlikTech הוציאה סדרת כלים שימושיים לאדמיניסטרציה בשם Power Tools for Qlikview. ניתן להוריד אותה מכאן.
אחד הכלים - qv-user-manager, מאפשר בין השאר לשלוח פקודה, שהפלט שלה מייצר רשימה מלאה של הרישיונות - מי המשתמש המורשה, תחילת הרישיון וסוג הרישיון. אנו נוסיף לפקודה אופרטור < ושם הקובץ הרצוי, כדי שהפלט יישמר כקובץ:
התוצאה תהיה כאמור, קובץ המכיל את פירוט רישיונות הקליקויו:
 מכאן נוכל כמובן לנתח אותו בעזרת מודל קליקויו.



יום רביעי, 14 במרץ 2012

מקבילה בקליקוויו ל-row_number() over (partition by

נניח שיש לי במערכת טבלת הזמנות, ולידה טבלת פעולות, שבה מתועדות הפעולות השונות שנעשו בהזמנה. למשל עבור הזמנה מסוימת: בתאריך א' ההזמנה התקבלה, בתאריך ב' היא עברה לגורם מטפל, ובתאריך ג' היא נסגרה.
אני מעוניין למספר כל פעולה בסדר עולה, לפי תאריך השלב, וכמובן - המספור צריך להתחיל מחדש עבור כל הזמנה.
באורקל ניתן לעשות זאת כך:
row_number()  over (partition by OrderID order by ActionDate) as ActionNum

האם ניתן לעשות גם בקליקויו? ובכן, כן. המומחה John Witherspoon פרסם כאן את הקוד הבא (בהתאמות לדוגמה שלנו):
left Join (Actions)
LOAD
       ActionID,
       if(OrderID<>previous(OrderID),1,peek('ActionNum')+1) as ActionNum
RESIDENT 
       ActionID
ORDER BY 
       OrderID, ActionDate
;
הסבר: הקוד ממיין את טבלת הפעולות לפי מספר הזמנה, ואח"כ לפי תאריך הפעולה. ע"פ המיון הזה הוא בודק האם ההזמנה הנוכחית שונה מהזמנה הקודמת. אם כן - כלומר אנחנו בפעולה הראשונה של ההזמנה, אזי יוגדר המספר 1. אחרת - כלומר אנחנו בפעולה השנייה והלאה, יוגדר המספר מהשורה הקודמת + 1.

אגב, ניתן להתקדם שלב נוסף, ועל בסיס השדה החדש ActionNum לחשב ערך מצטבר כלשהו. נניח שבטבלת פעולות ישנו שדה ActionCost אשר מכיל את העלות הכספית של כל פעולה, ואני מעוניין לחשב עלות מצטברת לאורך הפעולות (עבור כל הזמנה). אמנם בגרפים ניתן להשתמש ב-Accumulate, אבל למשל ב-Trellis זה לא עובד, וכמו"כ לפעמים נרצה להציג זאת באובייקט Tablebox שבו זה לא אפשרי.
ובכן, לאחר שיצרנו את השדה ActionNum, נוכל להוסיף את הקוד הבא:
left Join (Actions)
LOAD
       ActionID,
       ActionCost + if(ActionNum>1, Peek('AccCost',-1),0) as AccCost
RESIDENT 
       ActionID
ORDER BY 
       OrderID, ActionDate
;