ארכיטקטורת ייצוא נתוני הייפר לשרת SQL

הייפר פועלת על מסד נתונים ייעודי שנכתב עבורה, זה אחד מהיתרונות הטכנולוגיים שלה ועם זאת, היא מערכת פתוחה המציעה שיטות גישה שונות למסד נתונים שלה.
הדרך המומלצת על ידינו לקריאה ועדכון נתונים בזמן אמת היא באמצעות HTTP json API, בדיוק כמו שניגשים למסדי נתונים אינטרנטיים כגון Mongo DB, Google Tables & Azure וכיו"ב.
מסד הנתונים של הייפר מוגדר noSQL כלומר יש לו פקודות משל עצמו, ראה ספרי API בהתאם.
עבור מערכות המבוססות על SQL בלבד כגון BI, לוח שעונים ותוכנות אחרות, אנו מספקים windows service (להלן: "מנוע הייצוא") שמטרתו לסנכרון את טבלאות הייפר מול שרת SQL מקומי.

מסד הנתונים של הייפר מחזיק בשלושה אחסונים (תיקיות נפרדות) לכל טבלה: "NORMAL", "ARCHIVE", "DELETED".
  • NORMAL: אחסון הנתונים בהווה (current data). לרוב הטבלאות מחזיקות את כלל הרשומות כאן.
  • ARCHIVE: אחסון נתונים מהעבר שאינם אמורים להשתנות. בהתאם לאיפיון של כל מודול, נעשית אופטימיזציה אחת לתקופה וחלק מהרשומות עוברות מאחסון ההווה לארכיון.
    לדוגמה: פקודות יומן של הנח"ש לאחר סגירת דוחות כספיים, תנועות מלאי לאחר ספירה רבעונית, רשומות מיומן הפגישות לאחר 6 חודשים ובתנאי שסוכמו (אם צריך).
  • DELETED: אחסון סל מיחזור. רשומות שנמחקות בהייפר עוברות לאחסון זה, עד למחיקתם הסופית ע"י מנהל השרת (נדרשת גישה ישירה למערכת ההפעלה של השרת).


למרות הכתוב בהדרכה זו, אנו שומרים לעצמנו את הזכות לבצע שינויים למנוע הייצוא בכל עת, ככל הנדרש ועל פי שיקול דעתנו.

מבוא

המנוע משתמש באובייקט Microsoft ADO ומסוגל להתחבר לסוגי השרתים הבאים:
  • Microsoft SQL (כולל גם גרסת EXPRESS)
  • mySQL (נדרש להתקין מנהל התקן).
  • Oracle SQL (נדרש להתקין מנהל התקן).

המנוע מריץ 3 תהליכי סנכרון במקביל. כל תהליך אחראי על סנכרון רשימת טבלאות ייעודית משלו כמפורט בהמשך.
המנוע מעדכן מידע באמצעות הפקודות הבאות: Insert, Delete, Update של שפת SQL.
באפשרותכם לייצר אירועים (Events) בשרת ה- SQL עבור כל אחד מאלו לטובת תהליכי המשך ב"מערכת המקבלת".

מגבלות וביצועים

נדגיש שמומלץ להתקין את מנוע הייצוא על שרת מקומי (באותה רשת LAN) ואפילו עדיף על אותה מכונה לטובת ביצועים מקסימליים.
למרות הרצון שלנו לספק כלי ייצוא נתונים ל- SQL, כדאי לדעת שמנוע הייצוא אינו יעיל למסדי נתונים גדולים המחזיקים בטבלאות עם מיליון רשומות ומעלה.
ולמרות זאת, אם אתה חווה בעיות בייצוא, הנך מוזמן לפנות לתמיכה שלנו לצורך בדיקות ואנו ננסה לעזור במידת האפשר.

  • ייצוא של כלל הרשומות מאחסון ההווה (NORMAL) מתבצע לסכימה הראשית בשרת ה- SQL.
  • ייצוא של כלל הרשומות מאחסון הארכיון (ARCHIVE) מתבצע לסכימה בעלת שם זהה בתוספת _Archive.
  • בכל מקרה, אחסון סל מיחזור (DELETED) אינו עובר סנכרון לשרת ה- SQL. רשומות שימחקו בהייפר ימחקו בהתאמה ב- SQL !

חלוקת הסנכרון בין שלושת התהליכים

מנוע הייצוא מפעיל שלושה תתי תהליכים מקבילים המבצעים את ייצוא הנתונים.
ההחלטה על שלושה תתי תהליכים ולא יותר נבעה מניסיון שלנו על מול לקוחות המפעילים את הכלי בשילוב הכרות עם כלל המודולים של המערכת, שיטת העבודה שלה ניהול עומסים וגודל המידע.

שלושת תתי התהליכים אינם מסונכרנים אחד עם השני בכל הקשור למידע שהם מייצאים, ולכן יתכן מצב שבו תהליך ראשון מייצא כרטיס לקוח,
אבל תהליך שני האחראי על ייצוא המידע החשבונאי טרם הגיע לשלב הייצוא המסמכים ופקודות היומן של אותו הלקוח וליהפך.
כאשר תהליך מתחיל לבצע סנכרון לטבלה מתעד התחלה לקובץ לוג מקומי, ומידע מורחב לטבלת "SQL Tables Sync" בהייפר כמוסבר בהמשך.

סנכרון הטבלאות מתבצע במחזוריות מינימלית של 5 דקות. ניתן להגדיל את זמני הסינכרון בקובץ ה- INI.
זמן הסנכרון המינימלי קבוע בקוד התוכנה למקרה שלא הוגדר זמן ב- INI, והוא אינו ניתן לשינוי וזאת בכדי שלא לפגוע בביצועי מסד הנתונים של הייפר.

רשימת הטבלאות של תת תהליך "CRM Que" - ע"פ סדר הייצוא

hyp_Clients
hyp_Suppliers
hyp_Projects
hyp_Client Contacts
hyp_Supplier Contacts
hyp_Project Contacts
hyp_Clients Record Extension
hyp_Entity Credit Line
hyp_Entity Documents Tree
hyp_Entity Tax Settings
hyp_Entity_Banking_and_Credit_Card
hyp_Relationship
hyp_Audio Recordings
hyp_Bad Client Leads
hyp_Sale Opportunity

רשימת הטבלאות של תהליך "ERP Que" - ע"פ סדר הייצוא

hyp_Journal
hyp_Receipts
hyp_Receipt Items
hyp_Refunds
hyp_Refund Items
hyp_Tax Invoice
hyp_Tax Invoice Items
hyp_Credit Invoice
hyp_Credit Invoice Items
hyp_Accounts
hyp_Client Contract
hyp_Client Monthly Billing for Services
hyp_Client Open Billing or Supply
hyp_Client X Statements
hyp_Bank Transfer Interface
hyp_Inventory Log
hyp_Journal Attachments
hyp_Product Header
hyp_Product Media
hyp_Clearing Brands
hyp_Currency Definition
SYE_Currencies Rates by Source

רשימת הטבלאות של תהליך "TPM Que" - ע"פ סדר הייצוא

hyp_Interest Bearing Deposit
hyp_Foreign Exchange Trades
hyp_Interest Bearing Deposit Daily Value

לתשומת ליבך:

השמות הנ"ל הם שמות הטבלאות כפי שהן קיימות בהייפר. בשרת ה- SQL הם יופיעו ללא רווחים. תווי הרווחים מוחלפים ע"י המנוע בקו תחתון ("_") בזמן הסנכרון.
לדוגמה, הטבלה "hyp_Client Monthly Billing for Services" תופיע בשרת ה- SQL בשם "hyp_Client_Monthly_Billing_for_Services".
לנוחיותך, מידע שלם אודות הטבלאות של הייפר (סכימה) נמצא בקישור הזה.

לוגיקת הסנכרון

להלן הסבר של סדר אירועי הסנכרון כפי שהם כתובים בקוד המנוע.
בחרנו להציג לכם במפורט את רצף אירועי הסנכרון על מנת שתבינו: מה מתרחש בתהליך הסנכרון, כיצד הוא מתבצע, אילו נתונים מסונכרנים, וכך תדעו מול מה אתם עובדים ולמה לצפות בצד של ה- SQL המקבל.
אם אתם מתכננים לפתח מערכת שתשען על הנתונים בשרת ה- SQL, קריטי שתלמדו ותבינו את לוגיקת העבודה של המנוע המוסברת להלן.

התהליך המתואר להלן מתבצע בכל תת תהליך (Que) פר טבלה.
עשינו את המיטב על מנת שמנוע הייצוא יפעל בצורה אופטימלית מתוך הסתכלות רחבה על כל מכלולי המערכת ובהתאמה לנפח מסד נתונים של עסק בינוני לכל היותר.
עם זאת בחרנו להשתמש ב- Syntax עם התאימות הרחבה ביותר לגרסאות שרתי ה- SQL השונות ונשמח לקבל עצות לשיפור.

  1. בכל תחילת מחזור ריצה של ה- QUE (תת תהליך) יבוצע חיבור לשרת SQL.
  2. תיעוד התחלת התהליך - מיד עם תחילת תהליך סנכרון של טבלה נכתבים הנתונים הבאים:
    • לוג מקומי אודות התחלת סנכרון. הלוג יכלול את שם התהליך + הודעה + שם הטבלה, ויכתב לקובץ TXT מקומי לצד המנוע.
      לדוגמה:
      2025-02-23 15:35 ----- ERP_Qeue --- starting to sync hyp_Journal
    • עדכון מועד התחלת הסנכרון בשדה "Last Sync Started" בטבלת "SQL Tables Sync" של אותה הטבלה.
    במידה ויתרחשו שגיאות סנכרון לאותה הטבלה, הלוג שלהם ירשם מתחת לרישום של הודעת ההתחלה וגם הם יכילו את שמות הטבלאות.
  3. בדיקה באם הטבלה קיימת ב- SQL באמצעות השאילתה Select TOP 10.
    במידה והטבלה אינה קיימת, מנוע הייצוא יבנה אותה מחדש באמצעות הפקודה "CREATE TABLE".
    במידה והטבלה קיימת מנוע הייצוא מבצע בדיקת התאמה והשוואה של השדות ב- SQL מול הייפר.
    במידה ואין תאימות בין הטבלאות, המנוע מבצע מחיקת טבלה ב- SQL באמצעות הפקודה "DROP TABLE" ויצירתה מחדש.

    אודות בדיקת התאמת השדות
    מנוע הייצוא עורך השוואה של שמות השדות וסידרם שחייב להיות זהה.
    א. השוואה ראשונה תבוצע לפי הגדרת ערך ב- "Json Field Name" בהייפר (אם קיים).
    ב. אם לא הוגדר "Json Field Name" תבוצע השוואה לפי שם שדה מערכת "Field Name" הכולל גם שמות שדות SPARE במידה הוטמעו בחלון ההגדרה בהייפר.
    אלו יבדקו ויסונכרנו בפורמט "Camel-Case" במידה ושמות השדות כוללים מספר מילים.

    מכאן המסקנות הבאות:
    * בכל שינוי של שם שדה בהייפר, מנהל המערכת נדרש לבצע אתחול למנוע הסנכרון!
    * מנוע הייצוא אינו מתאים למסדי נתונים עם נפחים גדולים, מפאת תדירות השימוש ב- Drop Table והעתקה נתוני טבלאות מחדש!

השוואת מפתחות בין מסדי הנתונים

בשלב הנוכחי המנוע משווה מפתחות בין הטבלה בהייפר לבין הטבלה ב- SQL.
לידיעתך: במידה ומי מהשלבים הבאים יכשל, תהליך הסנכרון יעצר וה- Que ידלג לסנכרון של הטבלה הבאה.

  1. בניית טבלת "Hyper Index" בזיכרון וטעינה של מפתחות הטבלה מהייפר לרבות השדה "Last Update" אם קיים בטבלה.
    הטעינה של המפתחות תבוצע ע"פ הלוגיקה הבאה:
    1. במקרה של סנכרון טבלה רגילה יטענו כל המפתחות של אותה הטבלה ללא הגבלה.
    2. במקרה של טבלה גדולה (היכולה להגיע למליוני רשומות) יטענו רק מפתחות שנוצרו ב- 100 ימים אחרונים, או ע"פ הגדרה משותפת עם הלקוח.
      דוגמה לטבלאות גדולות:
      hyp_TPM Positions PnL History
      hyp_TPM Equity History
      hyp_Interest Bearing Deposit Daily Value
      טעינת Index מוגבל, של 100 ימים אחרונים בלבד, תחסוך זמני השוואה של מאות אלפי/מליוני רשומות ותקצר את זמן הסנכרון של הטבלה.
      נציין שיש כאן מקום לשנות את ההגדרה בהתיעצות איתנו ובהתאם לגופו של מקרה.

    מיד לאחר קבלת Hyper Index, נרשם מספר הרשומות שנמצאו בשדה "Hyper Records Count" בטבלת "SQL Tables Sync" בהייפר.

  2. בניית טבלת "SQL Index" בזיכרון וביצוע שאילתת מפתחות קיימים ב- SQL באותה שיטה זהה לסעיף הקודם.
    מיד לאחר קבלת רשומות ה- Index מה- SQL, נרשם מספר הרשומות שנמצאו בשדה "SQL Records Count" בטבלת "SQL Tables Sync" בהייפר.
  3. במידה וטבלת Hyper Index מכילה רשומות וטבלת SQL Index ריקה, המנוע מבצע BULK INSERT של כל טבלת הייפר ל- SQL. סעיף זה יתממש בפרט לאחר פעולת DROP TABLE.
  4. במידה וטבלת Hyper Index ריקה ובטבלה SQL Index קיימות רשומות, תופעל פקודת Truncate Table ל- SQL.

סנכרון נתונים במקרה של טבלאות Index מלאות

  1. במידה ונמצאו מפתחות בטבלת SQL Index שאינן קיימות בטבלת Hyper Index, אלו יקבלו פקודת Delete בקבוצות של עד 200 רשומות פר פקודת מחיקה.
    לדוגמה:  
    DELETE FROM [SQL Table Name] WHERE: (key) OR (key) OR (key)
  2. כל המידע של הרשומות שנמצאו בהייפר ולא נמצאו ב- SQL, יתווספו ל- SQL באמצעות פקודת INSERT INTO
    לדוגמה:  
    INSERT INTO [SQL Table Name] (field names) VALUES: (single record), (single record key)

    מנוע הייצוא יודע לזהות את סוג שרת ה- SQL מולו הוא עובד, ולכן שרתי SQL "ישנים" כגון mySQL 3.5 יקבלו פקודת INSERT עבור כל רשומה.
  3. במידה ונמצאו מפתחות בשתי הטבלאות - Hyper Index/SQL Index מתבצעת פעולת עדכון באמצעות הטבלה "hyp_Forms Modification Log" ע"פ הלוגיקה הבאה:
    - אם זו ריצה ראשונה (או לאחר אתחול) מנוע הייצוא יסנכרן רשומות שעודכנו בשעתיים האחרונות ע"פ טבלת hyp_Forms Modification Log.
    - בכל מחזור בדיקה אחר, המנוע יבקש רשומות Modification Log באופן רציף.

    עליך לדעת כי:
    * כל רשומה שתימצא בטבלת hyp_Form Modification Log לאותה הטבלה, תעודכן ב- SQL.
    * אם מנוע הייצוא לא עבד מעל שעתים יתכן חוסר בנתונים בשלב הסנכרון הנוכחי.
    אנו יודעים שזו לא שיטה יעילה, אבל זו השיטה המתקיימת כרגע ועתידה להשתנות בעתיד.
  4. במידה ולטבלה שעוברת סנכרון קיים השדה Last Update (שכרגע קיים רק במספר טבלאות בודדות) המנוע יסנכרן ל- SQL את כל הרשומות שמועד העדכון האחרון שלהם גדול מזה שב- SQL.
    בעתיד אנחנו נשלב את השדה הזה בכל הטבלאות של הייפר, ואז הסנכרון ע"פ טבלת Modification Log המתואר בסעיף הקודם יתבטל!
  5. במעמד סיום סנכרון מוצלח, יבוצע עדכון לשדה "Last Sync Ended" בטבלת "SQL Tables Sync" של אותה הטבלה וניתוק החיבור של תת התהליך משרת ה- SQL עד למחזור הבא.