‏הצגת רשומות עם תוויות string. הצג את כל הרשומות
‏הצגת רשומות עם תוויות string. הצג את כל הרשומות

יום שני, 23 באפריל 2012

סוג שדה משתנה בקליקוויו

קליקוויו הוא פורץ דרך בתחומים רבים. מרבים לדבר על הקישור האסוציאטיבי שלו, על התחקור In-Memory ועל העובדה שהוא משלב ETL ותצוגה בכלי אחד (תכונות שבינתיים אומצו ע"י כלים אחרים ואף נחשבות בחלקן כמיינסטרים העתידי).
אבל ישנם תחומים נוספים שבהם קליקוויו מהווה חידוש. אחד מהם הוא העובדה שקליקוויו תומך באפשרות ששדה מסוים הוא גם מספר וגם טקסט.
זוהי תפיסה מהפכנית, לא רק ביחס לעולם הקשוח של בסיסי-הנתונים, שם הגדרת ה-Data Type חקוקה בסלע, אלא ביחס לעולם התוכנה בכלל. אפילו ב-#C בגרסאותיה המתקדמות (מגרסה 2), הפונקציונליות הנקראת Generics מאפשרת אמנם גמישות בהגדרת סוג המשתנה, אבל הגמישות היא רק ב-Design Time. ב-Run Time ייקבע סוג המשתנה והוא יישאר קבוע למשך כל הריצה.
קליקויו מאחסן כל שדה כ-Collection, כאשר אחד המאפיינים של כל אבר הוא IsNumeric, כלומר האם הערך הבודד בכל שדה הוא מספרי או לא. ארכיטקטורה זאת מאפשרת למפתח ליצור שדות שהם בד"כ מספריים אבל יכולים להכיל גם טקסט, מבלי להפסיד את היכולת להתייחס לערכים המספריים ככאלו. למשל, המיון נשאר מיון מספרי בערכים הללו, ובהתאם לכך, אם יש גרף אשר אחד הצירים שלו בנוי על שדה היברידי שכזה, קליקוויו ידע למיין את המספרים נכון, למרות שישנם גם ערכים טקסטואליים (אלו יופיעו בסוף). כמו-כן ניתן להפעיל על השדה פונקציות מספריות (כגון Sum) - קליקוויו יפעיל את הפונקציה על הערכים המספריים ופשוט יתעלם מערכי הטקסט.
כדי לראות זאת בעיניים, נגדיר בסקריפט את הטבלה הבאה:
Array:
load * Inline [
Value
1
2
3
4
Hello
];
ניצור כפתור אשר יריץ את המאקרו הבא:
sub ShowIsNumeric

set val = ActiveDocument.Fields("Value").GetPossibleValues
for i=0 to val.Count-1
       msgbox val.Item(i).IsNumeric
next

end sub
ניתן לראות שעבור ארבעת המספרים, מוצג True (הערך הוא מספרי), ואילו עבור המילה Hello מוצג False.

יום שני, 5 בדצמבר 2011

מציאת שדה טקסט ב-DataBase ע"פ ערך, בעזרת QlikView

קורה שאנחנו לא יודעים מהו שם השדה שאנו זקוקים לו ב-DataBase, ולא מצליחים למצוא אותו בעזרת שאילתות על הקטלוג.
אפשר לחפש את השדה ע"פ אחד הערכים שבו (בד"כ בשדה טקסט). ניתן להריץ ב-DataBase פונקציה שרצה על כל הטבלאות ומחפשת בכל שדה טקסט את המחרוזת. פונקציות כאלו מסתובבת ברשת (גם ל-Oracle וגם ל-MS-SQL).
הבעיה היא שהרצת פונקציה דורשת הרשאות כתיבה ל-DataBase - משהו שכדאי להימנע ממנו בתור אנשי BI.
ובכן, ניתן להשתמש ב-QlikView כדי לבצע פעולה דומה.

ראשית, כדי לנטרל הודעות שגיאה שעלולות לצוץ, נגדיר:
set errormode = 0;
ניצור את ההתחברות ל-DataBase, את הסכמה הרצויה, ואת המחרוזת שאנו מעוניינים לחפש:
(connect to db);
set vSchema = 'MySchema';
set vString = 'StringToFind';
נביא את כל הטבלאות וכל השדות:
tabs:
sqltables;

cols:
sqlcolumns;
ניצור טבלת עמודות זמנית, הכוללת רק את הסכמה שלנו, ורק עמודות מסוג טקסט. נצרף לה את סוג הטבלה, ונמחק את הטבלאות הקודמות:
Columns_Temp:
load 
     TABLE_NAME,
     COLUMN_NAME
resident
     cols
where
     TABLE_SCHEMA = '$(vSchema)'
     and DATA_TYPE = 129;

left join
load
     TABLE_NAME,
     TABLE_TYPE
resident
     tabs;

drop tables tabs, cols;

ניצור טבלת עמודות סופית, שבה רק עמודות מטבלאות מסוג "טבלה" (ולא Views וכד'), ונמחק את הטבלה הזמנית:

Columns:
load
     TABLE_NAME,
     COLUMN_NAME
resident
     Columns_Temp
where
     TABLE_TYPE = 'TABLE';

drop table Columns_Temp;

לבסוף, ניצור לולאה שרצה על כל עמודה, ומחפשת בה את המחרוזת:
for x = 0 to NoOfRows('Columns')-1
     let vTable = peek('TABLE_NAME',x, 'Columns');
     let vColumn = peek('COLUMN_NAME',x, 'Columns');
     Results:
     sql select
          $(vColumn) as value,
          '$(vColumn)' as column_name,
          '$(vTable)' as table_name
     from
          $(vSchema).$(vTable)
     where
          $(vColumn) = '$(vString)' ;
next
לאחר ריצת המודל, נקבל בשדות table_name ו-column_name את הטבלה והעמודה (או הטבלאות והעמודות) שבהן נמצא הערך.