העברת DB מ- Access על Sql Server באמצעות SSMA

בפוסט הזה אני מציין מספר נקודות מעניינות לגבי העברה של DB מסביבת Access אל Sql Server ( במקרה שלי גירסת Exrpress )

1- מיקרוסופט הסירו מאקסס את האפשרות  לייצא ישירות ל- SQL SERVER

הם ממליצים להשתמש בכלי שלהם שנקרא Sql Server Migration Assitant

יש גירסאות שלו עבור כמה סוגי DB נפוצים ( MySQL ועוד )

 

2- הכלי עובד יפה, אם כי לא אינטואיטיבי כל כך – ועל כך הפוסט הזה.

דברים שצריך לשים לב אליהם :

שלב 1  – יצוא הטבלאות מ- Access אל Sql Server

 

  • עוד לפני שמפעילים את הכלי – צריך להיות מודעים להתאים גירסת האופיס לגירסת הכלי ( ה=SSMA)
    אם ה-Access הוא בגירסת 32 ביט, צריך להפעיל את ה-SSMA 32 Bit  ( כי ה-Default הוא 64  ביט )
    שימו לב שההתקנה הרגילה מתקינה אצלכם ברשימת התוכניות – 2 גירסאות (32+64 )
    אם לא מפעילים את הגירסה שתואמת ל-Office שמותקן על המכונה, מקבלים בהמשך הודעת שגיאה שה-DB שניסיתם לטעון בלתי ניתן לקריאה…מה שכמובן לא נכון.
  • יצירת DB – לפני שמפעילים את הכלי, יש לייצור DB ב-SQL Server  שיקבל את הטבלאות שנייצא.
  • יצירת USER עבור ה-DB – שרת ה-Sql server מציע 2 צורות של אוטנטיקציה.
    אם משתמשים ב-Windows Auth… על אותה מכונה, לרוב לא תהיה בעיה.
    אם זה תחת שרתים אירגוניים, צריך לוודא שליוזרים יש הרשאות ל-DB,
    חשוב  לתת ליוזרים הרשאות , גם תחת "Security" של ה-Sql Server (=הכללי בעץ)
    וגם תחת Security של ה-DB הספציפי.
    אפשרות קצת פשוטה יותר -היא שימוש ב-Sql Auth, וגם שם צריך לוודא שהיוזר שיצרתם, מורשה הן לגישה ל-Server והן ל-DB הספציפי.
  • כאשר סף סוף מפעילים את הכלי – עדיף לא להשתמש ב-wizard שקופץ בכניסה – הוא אומנם מוביל שלב אחרי שלב, אך מדלג  על חלק מהשלבים, ולכן לא כל כך עוזר…
  • הגדרה שכדאי, ואפילו חובה לבצע עוד בהתחלה, היא להיכנס למקום שבו מוגדר לאיזה סוג שדה הופך כל אחד מהשדות ( למשל :  שדה TEXT של Access הופך ל- nvarchar של Sql Server וכדומה )
    זה נעשה תחת Tools < Default Project Settings > Type Mapping
    כל ההגדרות תקינות …חוץ מאשר….Date של Access  – שמועבר בצורה שגויה אל Datetime(2) של Sql Server , הבעיה היא, שכאשר נסיים את תהליך העברת הטבלאות, ונקשור את הטבלאות בחזרה אל פרוייקט ה-Access שלנו, תהיה לנו בעיה – ש-Access לא יודע לקרוא את סוג השדה הזה , ולכן ממיר אותו אל Text …וזה כבר יוצר שגיאות וולידציה, ובעיות בקוד ה-VBA שמצפה ל- Datetime.
    הפתרון הוא להגדיר את השדות כ- Datetime רגיל ( בלי ה-2 )
    במקרה זה – ההמרה עוברת תקין.
  • השלב הראשון, הוא "יצירת פרוייקט" (דרך התפריט או דרך כפתור למעלה)
    חשוב לשים לב – לבחור במסך יצירת הפרוייקט את גירסת ה- Sql Server שלכם
    ה-DropDown הוא כמעט מוסתר, וברירת המחדל היא Azure….מה שלא בטוח שהתכוונתם.

    • נקודה נוספת באותו עניין – יש אפשרות להגדיר את זה תחת Tools > Defailt project settings  (גם כאן ה-Dropdown נסתר מהעין)
  • לאחר שמוסיפים את ה-DB של Access באמצעות Add Databases , יש לבצע שמירה של הפרויקט – השמירה גורמת ל-SSMA לטעון את ה-Metadata של הטבלאות.
    למה…ככה (מיקרוסופט ? )
  • השלב הבא הוא חיבור ל-SQL SERVER,  אם לא בחרתם מראש בגירסת ה-SQL SERVER הנכונה, אזי לא תוכלו להתחבר ל-SQL שלכם.
  • בסוף אחרי שהכל מוגדר , כדי לגרום לכפתור ה- Convert-Load_AND-MIGRATE לעבוד , חייבים ללחוץ ללחוץ על ה-Access DB הרלוונטי – ורק אז הכפתור הופך ל-Enabled
  • לאחר לחיצה על כפתור המרה ( Convert..load..and migrate )
    הכלי עובד די מהר וחלק, טוען את כל הטבלאות , ובונה אותן, כולל את המפתחות הזרים והאינדקסים.  אפשר לומר שזה החלק הטוב בכלי הזה, שבסופו של דבר הוא באמת מבצע את העבודה.

שלב 2 – חיבור של קובץ ה-Access אל הטבלאות ב-Sql Server

זה תהליך די מוכר לכל מתכנת Access, ואכתוב אותו בקצרה :

  • מוחקים ( בלי לפחד 🙂 ) את הטבלאות המקוריות ( בין אם הם מקושרות, ובין אם מאוחסנות בקובץ הזה )
  • תחת "נתונים חיצוניים" > יבוא וקישור >  מסד נתונים של ODBC > ניצור Connection חדש או בקובץ, או של מערכת ההפעלה  ולאחר יצירת ה-Connection נבחר בו כדי לקשור את הטבלאות.
    • בשלב יצירת ה-Connection יש לבחור בדרייבר של Sql Server , או Sql Server ODBC Driver
    • באחד ממסכי יצירת ה-Connection יש לשים לב לאפשרות של בחירת ה-Default Database – ולהפעיל אותה רק על ה-DB הרלוונטי ב-SQL Server
  • לאחר שנבחר ב-Connection שיצרנו – נסמן את הטבלאות לקישור, יש לשים לב לא לסמן גם את טבלאות המערכת של Sql server , אלא רק את הטבלאות המקוריות ששיכות לפרויקט שלנו ( זה לא משנה, אבל חבל סתם להעמיס טבלאות מקושרות שלא נחוצות על הפרוייקט)
  • אם אתם לא רוצים לשגע את היוזרים – כדאי לסמן את האפשרות לשמור את הסיסמה ( ואז ללחוץ על אישור בנפרד לכל אחת מהטבלאות….מיקרוסופט …!!!! )
  • זה עוד לא נגמר …בשלב זה, כיוון שהטבלאות ב-Sql Server מתחילות תחת "איזור" שנקרא לרוב dbo. אז בקישור ל-Access, פתאום מתווסף לכל הטבלאות בתחילת השם, הביטוי dbo_ , צריך לעבור טבלה-טבלה, ולשנות את השם בחזרה לשם המקורי. (או לכתוב\למצוא סקריפט שעושה זאת …)
    אחרת – אם לא נעשה זאת, השאילתות שלנו לא יעבדו.
  • וכאן הגיע הזמן לבדוק שהכל תקין.

בהצלחה.

 

נקודה אחרונה, אך ממש לא קשורה – למי שמפתח Web על אותה מכונה שעליה מותקן ה-Sql Server.

אחד ה-Services שמופעלים בהתקנת ה-Sql Server, נקרא Sql Server Reporting Service

ולמרבה הפלא …הוא תופס את Port 80  ….

כך שאם רוצים להמשיך לעבוד , צריך : או להשבית אותו ( services.msc וכו' )  או להמשיך לעבוד בפורט אחר עבור ה-localhost על המכונה.

פתרון לבעית – לא רואים עברית בעורך ה-VBA

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

אבל יש לזה יתרון אחד – המהירות העצומה של זמן הפיתוח ( בוא נגיד, שלפתח דבר כזה בכל שפת תכנות היה אורך פי 10-15 זמן לפחות )

על כל פנים, במסגרת זו השתמשתי בשרתים ב-Azure ובעוד סביבות, ופעמים רבות ה-VBA לא מציג עברית.

הנחת יסוד : התקנתם לכל הפחות תמיכה עברית ב-Windows

הפתרון לזה פשוט מאוד :

נלחץ על הגדרות השפה  ( דרך השפה לייד השעון, או דרך Lang…Pref. )

נבחר ב-Location

נבחר ב-Administrative

ובאפשרות Lang for non-unicode נבחר באפשרות Hebrew

 

וזהו.

התמודדות עם התקנת קובץ MSI על Windows Server שמחזירה הודעת שגיאה

בהתקנה רגילה על Windows Server של קובץ MSI תקין לגמרי, קיבלתי את ההודעה הבאה :

The System Administrator Has Set Policies to Prevent This Installation

חיפוש בהגדרות ה-Policy, לא עזר, לא הייתה שום מגבלה והרצתי את זה בתור Admin.

בסופו של דבר הפתרון הוא כזה :

להפעיל CMD בתור Admin

לנווט אל התיקיה הרלוונטית

להפעיל את הקובץ כך msiexec /i install.msi

זה עובד…

מקור: http://serverfault.com/questions/580972/why-is-this-preventing-me-installing-an-msi-the-system-administrator-has-set-po 

איך לכבות את Explorer enhanced security על Windows Server

שלום,

 

כשמקבלים VPS של Windows Server

אחד הדברים המעצבנים הוא ה- enhanced security שמופעל על אקספלורר.

כדי לכבות אותו יש לעשות כך :

מפעילים את Server Manager

לוחצים בצד שמאל על Local Server

במסך שמופיע מחפשים את הביטוי Explorer enhanced security

ולוחצים על ה-On ומגדירים את זה כ-Off (לכולם )

 

יש פה מדריך בתמונות למתקשים.

התקנת MongoDB על Windows + דרייבר ל-Php

שלום,

רן בר זיק כתב כאן שהתקנה על ווינדוס יכולה להיות סיפור ואכן הוא צודק.

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

אני מתעד פה, את התהליך בקצרה , תוך ציון מקורות רלוונטים :

נתחיל בהתקנת מנוע ה-MongoDB בעצמו.

  1. מורידים את הגירסה הרלוונטית מהאתר של MongoDB
  2. נכנסים לתיקיה שבה זה הותקן
    C:\Program Files\MongoDB\Server\3.2\bin
    שימו לב שאם התקנתם גירסת 32 ביט, אז התיקיה תתחיל ב-Program Files(x86
  3. במידה ואתם עובדים עם Win 7 או win server 2008 R2 אז צריך להתקין hotfix
    למי שעדין לא התקין hotfix אף פעם – זה תיקון של מיקרוסופט שצריך לבקש אותו בקישור הזה , נכנסים לקישור, מכניסים כתובת מייל, ומקבלים אימייל עם קישור להורדת ה-Hotfix
    ואז מחלצים אותו, ומפעילים את הקובץ שחולץ, ובסוף התהליך restart
  4. בתיקיה שבה הותקן MongoDB ( סעיף 2 )
    נפתח CMD ונכתוב פקודה שתיצור תיקיית ברירת מחדל עבור הדאטאבייסים
    md \data\db
  5. סוף סוף – נפעיל בתוך ה-CMD את ה-Listener של MongoDB באמצעות הפקודה mongod.exe
    ולא נסגור את החלון של ה-CMD
    למי שרוצה להתקין את Mongo כ-Service שרץ ברקע , אז יש הוראות בתחתית הדף הזה 
  6. כדי להריץ את ה-Console של MongoDB , צריך לפתוח CMD חדשנפרד , ולהיכנס לתיקיה של מונגו, ושם להפעיל את mongo.exe

עכשיו לחלק של התקנה על PHP שיושב על Windows

אני עובד עם EasyPHP שמריץ גירסה 5.6 / 7 עם כל ה-LAMP מלא וכו'.

  1. דבר ראשון נבדוק האם גירסת ה-PHP שלנו היא Theard Safe או Non Theard Safe
    לצורך כך צריך ליצור קובץ עם הפקודה phpinfo() ולהריץ בדפדפן ( או דרך ה-CMD )
    עכשיו נחפש בתוכן את הביטוי Theard  – אם השורה הזו מסומנת כ-enabled , זאת אומרת שאנחנו עובדים על גירסה TS ( Theard Safe, אחרת – NTS
  2. עכשיו צריך לאתר את תיקית ברירת המחדל שבה מאוחסנים קבצי ההרחבות של php. ההרחבות הן קבצי dll ובדרך כלל, הן "לייד" התיקיה שבה יושב php.exe , תחפשו קצת ( השלב הזה אינו חובה, כי ניתן אומנם לשים את קובץ ההרחבה בתיקיה שונה, אבל זה עדיף מבחינת הסדר הטוב שכל ההרחבות יהיו מרוכזות באותו מקום ) .
    תשמרו את התיקיה פתוחה בשביל השלב הבא.
  3. עכשיו נוריד את ההרחבה ( driver ) של MongoDB עבור PHP מהאתר של PECL בקישור הזה https://pecl.php.net/package/mongodb
    תלחצו על הגירסה האחרונה, ותורידו את הקובץ DLL עבור גירסת ה-PHP שאצלכם ( לפי מה שבדקתם בסעיף 1 )
  4. תאחסנו את הקובץ בתיקית ההרחבות של php
  5. תוסיפו הפניה להרחבה בקובץ php.ini
    אצלי זה נראה כך  extension=php_mongodb.dll
  6. תעשו Restart לשרת ה-Apache
    ותבדקו שהכל תקין באמצעות phpinfo או php -v
    אם הכל תקין, אתם אמורים לראות ב-phpinfo שורות חדשות שעוסקות ב-MongoDB
  7. אפשר לעבוד סוף סוף – רק לזכור לא לכבות את ה-CMD שמפעיל את ה-MongoDB Server כל עוד לא סיימתם ( לחלופין – אפשר פשוט להגדיר את מונגו כסרוויס ברקע)

בהצלחה

שאילתא שמוצאת רשומות שבהן המפתח הזר לא קיים בטבלת המקור

יש כמה צורות למצוא רשומות "בעיתיות" שבהם יש מפתח זר, אך מסיבה כלשהיא , אין את רשומת המקור בטבלה הזרה .

הצורה הכי פשוטה ( בעיני ) היא כך

SELECT * FROM doc_recive where dr_id not in (SELECT dr_id from doctors where doctors.dr_id=doc_recive.dr_id)

יש כל מיני טכניקות לעשות את השאילתות האלו יותר יעילות

אפשר להשתמש ב-Not Exists , או ב Is null

ולמי שרוצה להתעמק – יש בקישור הזה השוואה

 

להוציא את המשתמש אוטומטית לאחר זמן מה ללא פעילות ( jquery plugin inactivity )

באפליקציות אינטרנט שמצריכות כניסה – יש עניין שבצד השרת – מנוהל לרוב Session

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

כדי לתת מענה לכך – אז בפריימוורקים של צד שרת , בדרך כלל אפשר לזהות אם פג תוקף ה- Session ואז לעשות redirect למשתמש.

אבל במקרה של שימוש ב- Ajax או אפליקציה שבנויה עם פרייוורק JS, צריך פתרון גם ברמת צד הלקוח.

יש הרבה פתרונות JS

אני מצאתי שהתוסף הבא ל- Jquery הכי נוח.

קישור לתוסף ב- Githut

קוד להמחשה ( במצב פרודקשיין, אולי כדאי לעשות קריאת אגקס לשרת, לבדוק אם ה Session בתוקף, אבל הקוד יעבוד היטב גם בלי זה )

הערה : השורה הראשונה מושכת את הסקריפט, אני עובד עם Laravel בצד שרת, ולכן הפקודה asset – וסימני הסוגרים המסולסלים ( כנ"ל בשורה האחרונה ) .

<!-- jquery inactivity -->
<script src="{{ asset('js/jquery-inactivity/jquery.inactivity.min.js') }}">



</script>
<script>
    // https://github.com/afklondon/jquery.inactivity
    $(document).inactivity( {
        interval: 1800000, // the timeout until the inactivity event fire [default: 3000]
        mouse: true, // listen for mouse inactivity [default: true]
        keyboard: true, // listen for keyboard inactivity [default: true]
        touch: true, // listen for touch inactivity [default: true]
        customEvents: "", // listen for custom events [default: ""]
        triggerAll: false , // if set to false only the first "activity" event will be fired [default: false]
    });
    $(document).on("inactivity", function(){
        // function that fires on inactivity
        console.log('loged out beacuse of inactivity');
        window.location = "{{ route('logout') }}";
    });


</script>

 

איך לעשות כפתור "שמור וסגור" בטופס scriptcase ?

הבעיה

בטופס של scriptcase אין אפשרות מובנה לשמור וסגור ביחד

אלא כל אחת מהאפשרויות מופיעה בנפרד.

העניין נהיה אקוטי יותר, כאשר משנים דברים מתוך טופס-משנה אל טופס-אב (יש מאקרו מובנה עבור זה ) .

הפתרון

באירוע של AfterUpdate

להכניס 2 פקודות

אחת ששומרת את הנתונים

והשניה שיוצאת אל הטופס הרצוי

דוגמא :

sc_commit_trans();
sc_redir(grid_leads.php);

 

בהצלחה

 

איך ב-ScriptCase לשים ערך ברירת מחדל מתוך Session אל שדה בשורה חדשה ב-Editable grid view ?

הבעיה

כאשר משתמשים ב Editable grid view של scriptcase , אז בהוספת שורה – נניח ונרצה ערך ברירת מחדל מתוך session או מתוך global variable

הבעיה היא שגם האירועים OnLoad וגם OnRecordLoad  נטענים לגבי כל השורות

הפתרון

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

למשל – האם המפתח הראשי קיים או שהוא empty ?

זה תנאי שמאפשר להשים ערך רק עבור רשומות חדשות.

בהצלחה.

נגישות אתרים

נגישות אתרים – שימוש ב aria-label

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

מבחינת נגישות – אנחנו אמורים לתת תויות עם כיתוב , אלא שלא תמיד זה מתאים למה שרוצים לעשות. במקרה כזה באה לעזרתנו ה ARIA API ובאופן ספציפי ה aria-label .

אם מוסיפים את המאפיין aria-label אל אלמנט מסוים בדף , אז קורא-מסך ידע במקרים כאלו להקריא את תוכן המאפיין.

בקורס של גוגל על נגישות אתרים, מביאים דוגמא של חלון מודאלי שיש בו כפתור סגירה (האיקס הקטן למעלה) – במקרה כזה, אם לא נשים aria-label עם הכיתוב "סגירה" אז מי שמשתמש בקורא מסך לא יוכל להשתמש בחלון המודאלי, אך לעומת זאת ברקע שמשתמשים במאפיין aria-label אז קורא מסך כמובן מתייחס לזה.