תחומים
    • הרשמה
    • התחברות
    • חיפוש
    • קטגוריות
    • פוסטים אחרונים
    • משתמשים
    • חיפוש
    1. דף הבית
    2. OdedDvir
    חוקי הפורום
    • פרופיל
    • עוקב אחרי 0
    • עוקבים 14
    • נושאים 55
    • פוסטים 2190
    • הגבוה ביותר 1661
    • שנוי במחלוקת 0
    • קבוצות 0

    OdedDvir

    @OdedDvir

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

    4786
    מוניטין
    663
    צפיות בפרופיל
    2190
    פוסטים
    14
    עוקבים
    0
    עוקב אחרי
    הצטרף ב- התחבר לאחרונה
    כתובת אימייל [email protected]

    OdedDvir הפסק לעקוב עקוב

    הפוסטים הטובים ביותר שנוצרו על ידי OdedDvir

    • אקסס למתחילים: יצירת מערכת לניהול תורמים

      כהמשך לפוסט: https://tchumim.com/topic/10485/מערכת-לניהול-תורמים/11

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

      @בערל השלב הראשון הוא התכנון כמובן. והתכנון הראשון הוא מבנה הנתונים.
      בבסיס הנתונים (להלן db) הנתונים נשמרים כאוסף של טבלאות. כל עמודה בטבלה מציינת "שדה", וכל שורה מציינת "רשומה".

      אבל קודם כל, היכרות פשוטה:

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

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

      לשם כך תפתח את אקסס, ובתפריט תבחר יצירה > עיצוב טבלה, ותקליד את השורות הבאות:

      4cb60cd7-6e2d-4864-8fed-579d747f7c20-תמונה.png

      אחר כך תעמוד על השורה של ה-ID ותלחץ בתפריט למעלה על הסמל של "מפתח ראשי".
      שים לב שנוסף ליד השורה סמל של מפתח:
      e1ff2cef-a3dd-4f75-90df-ce904523db3d-תמונה.png

      סגור את הטבלה ותקרא לה: Donor (תורם)

      היה קל, נכון?
      בוא ניצור עכשיו טופס פשוט שבו נוכל להקליד נתוני תורמים:
      תסמן את הטבלה Donor בפאנל שבצד ימין, ובתפריט למעלה תבחר: יצירה > טופס.
      אקסס תיצור מיד טופס בשבילך:
      af774ad1-e827-4c1e-b53a-8100c7a845cc-תמונה.png
      סגור ושמור בשם frmDonor

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

      בפוסט הבא ניצור טבלה וטופס של תרומות, ונקשר אותו לטופס הזה.

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • דיון ענייני: איך לתמחר פרוייקט תוכנה

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

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

      1. מה הערך של הפרויקט בשוק

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

      אבל זהירות - זו טעות גדולה לעצור כאן. אם המתחרה שלך גובה 100 ₪ עבור המוצר שלו, אל תטעה לחשוב שמספיק אם תציע מוצר דומה ב 80 ₪, זה ממש לא שיקול מספיק.

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

      2. מה ערך הפרויקט עבור הלקוח שלך?

      איזו בעיה התוכנה שלך פותרת? כמה שווה ללקוח לשלם כדי לפתור לו את הבעיה הזו? כמה זמן הפתרון שלך חוסך עבור הלקוח?
      אם הפרויקט שלך חוסך ללקוח שלך 10 שעות בחודש, זה ערך משמעותי.
      אפילו אם הוא חוסך לו שעה בשבוע, יש לזה ערך שאפשר לתרגם לסכום. נניח ששעת עבודה שלו שווה 50 ₪, זה שווה 200 ₪ לחודש. אם הוא ירכוש את המוצר ב 2000 ₪, הוא יכסה את ההשקעה שלו בתוך פחות משנה.

      3. מה ערך הפרויקט עבורך?

      יש שלוש שיטות עיקריות לתמחור: תשלום יחיד מראש, תשלום יחיד + תמיכה חודשית, מנוי חודשי.

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

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

      תחשוב טוב, כיצד נראית התמיכה לטווח ארוך שלך? מה העלות שלך לטווח הארוך?

      נניח שמכרת למישהו תוכנה ב-6000 ₪. נשמע מחיר לא רע למתחיל, לא? אבל - אתה תומך בה למשך שנתיים. זה אומר שבשורה התחתונה הרווחת 250 ₪ בחודש. האם זה עדיין שווה לך?

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

      4. עלויות נוספות

      אם אתה גובה כסף באשראי, הם גובים עמלה על כל רכישה. אם אתה מתחזק שרתים, משלם מיסים כחוק, כל זה יוצא מהכיס שלך, וצריך להיכלל בחישוב הכללי שלך.

      מסקנה

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

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: יצירת מערכת לניהול תורמים

      חלק ד - נקודות למחשבה

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

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

      ב. קיים שדה מזהה לרשומה בשם ID.
      ככלל, לכל טבלה ב-db תמיד יהיה שדה כזה, והוא נקרא מפתח ראשי. סוג הנתונים בו הוא מספר שלם (ארוך), ובדרך כלל הוא יהיה מסוג מספור אוטומטי, זהו שדה לקריאה בלבד וה-db אחראי לטפל בערכים שלו, והוא קובע באופן אוטומטי את הערך שלו בכל יצירת רשומה חדשה (בקפיצות של 1).
      ערך השדה הוא ייחודי ונקבע באופן חד-פעמי, כלומר, אם למשל ברשומה האחרונה ID=4, גם אם נמחק אותה וניצור רשומה חדשה, ה-db יקצה לרשומה החדשה ID=5, למרות שכבר אין רשומה עם ID=4.

      המנגנון הזה מבטיח שתמיד ניגש לרשומה הנכונה.

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

      ג. סוג הנתונים בשאר השדות
      כברירת מחדל, גודל השדה "טקסט קצר" הוא עד 255 תוים.
      אם ודאי לנו שלא נשתמש בכזה אורך, נוכל להקטין את גדול השדה המקסימלי, על מנת לחסוך מקום ולשפר יעילות.
      בואו נגדיר מחדש את אורך השדות שלנו: LastName, FirstName, MobilePhone להיות כל אחד 30 תוים:

      נבחר את השורה LastName, ולמטה במאפיינים, נגדיר גודל שדה 30:
      c75467de-69e5-494f-bc65-0d46ec3eaab8-תמונה.png
      נחזור על הפעולה גם עבור השדות FirstName ו-MobilePhone. נסגור ונשמור את הטבלה, ואז נקבל את תיבת ההתראה הבאה:
      5dda42d5-dc9f-46c9-95b6-0aa51a004af7-תמונה.png
      שדואגת שלא נעשה דבר טיפשי בטעות. במקרה שלנו מסתמא לא הכנסנו שם גדול מ-30 תוים. פשוט נאשר וזהו.
      הערה: אם כבר היה בשדה ערך גדול מ-30 תוים, המחרוזת תיחתך אחרי התו השלושים.

      נעבור לטבלה השניה:

      טבלת התרומות
      גם כאן יש מפתח ראשי בשם ID. אבל יש כאן שדה נוסף:

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

      זה מעלה שתי נקודות חשובות למחשבה:
      איך נוודא שלא שכחנו בטעות למלא את השדה?
      ומה אם ננסה לרשום מספר שלא נמצאת עבורו רשומה בתורמים (=התורם לא קיים)....?

      אל תדאגו.

      תאמינו או לא, את שתי הבעיות האלו כבר פתרנו כשהגדרנו את קשרי הגומלין בין הטבלאות, וסימננו את התיבה "אכוף שלמות הקשרים בין הטבלאות"!

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

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

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

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

      בפוסט הבא ב"ה נמשיך לעבור על הטפסים שעשינו.

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • פרימייר פרו - הדרכה - כיצד לטשטש או לפקסל דמות נעה

      כתגובה לפוסט של @שעטנ-ז-ג-ץ : https://tchumim.com/topic/9451/האם-יש-הדרכה-איך-לפקסל-פנים-או-דמות-בהסרטה/13

      מדריך בסיסי לטשטוש דמות נעה בסרטון

      נפתח את פרימייר, ונייבא את הסרטון. בחרתי בסרטון הנדיר של אגודת ישראל משנת 1923 (בו גם נראה החפץ חיים זצ"ל). אני רוצה לטשטש את פני האיש עם החולצה הלבנה שנראה בדקה 2:19 משמאל:
      151ca087-5170-4ff8-b503-8f51b4b4909f-תמונה.png

      שלב א: יצירת אפקט טשטוש \ פיקסול:
      נבחר למטה משמאל את הלשונית Effects, ואת המסנן Mosaic (פיקסול):
      (אם רוצים טשטוש - צריך לבחור במקומו אחד מאפקטי ה-Blur)
      ונגרור את האפקט לתוך קו-הזמן (מסומן בחץ):
      a8cc4b93-7cff-4f41-ae02-a158c6c50a36-תמונה.png

      שלב ב: הגדרת מסכה לאפקט
      נבחר למעלה משמאל את לשונית Effect Control (מספר 1 בתמונה), נבחר צורת אליפסה (2), נשנה את הגודל כך שיתאים רק לפנים של האיש (3) ואחר כך נגדיר את מספר הריבועים ל100 על 100 כדי שהאפקט ישתלב יותר בסרטון ולא יראה כמו ריבוע אחד גדול (4):
      14a1794f-a18b-4024-bf9e-19aa5d139022-תמונה.png

      שלב ג: הגדרת המסכה לעקוב אחרי האזור הנבחר באופן אוטומטי
      כעת באותה לשונית ניתן להגדיר את אופן המעקב אחר התנועה על ידי לחיצה על המפתח השוודי, בדרך כלל הרצוי הוא האופציה האחרונה, שבה המסכה משנה מיקום, גודל וסיבוב אוטומטית (ברירת מחדל)
      נלחץ על הפליי ▶ וניתן לפלאי התוכנה לעשות את שלה. התוכנה תנסה לעקוב עם תנועת המסכה אחרי האזור שבחרנו, ותתחיל ליצור KeyFrames שמציינים את מאפייני המסיכה (גודל, מיקום, סיבוב). כשהדמות יצאה מהמסך - יש ללחוץ על Stop (אחרת המסיכה תישאר גלוייה גם כשהדמות נעלמה)
      f0c0a1ad-ab31-40c4-b961-637f8aff1c32-תמונה.png

      הערות:

      1. ניתן לכוונן אחר כך את הKeyFrames בנפרד, על ידי לחיצה על האזור המסומן:
        1f390641-945e-4702-9e0e-9e25a297962c-תמונה.png
      2. ניתן לקבל שליטה על תהליך התזוזה וליצור כל KeyFrame בנפרד על ידי הלחצנים מימין או משמאל ללחצן ▶ או לצעוד אחורה במקום קדימה.
      3. יש עוד הרבה אפשרויות כאן, ואידך זיל גמור (או שתשאל כאן...)
      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: איך שואלים שאלות בפורום

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

      לפני שאתה שואל שאלה, תחשוב טוב על השאלה הבאה:
      למה שמישהו יעזור לך?

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

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

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

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

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

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

      בקיצור: הסיכוי שלך לקבל עזרה אמיתית שואף לאפס.

      פורסם במדריך לשימוש בפורום
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: יצירת מערכת לניהול תורמים

      חלק ג: קישור בין הנתונים של התורמים והתרומות

      הכח של בסיס נתונים רלציונאלי (כגון אקסס, SQL) נובע מהגדרת קשרי הגומלין (relationships) בין הנתונים.
      הקשר בין רשומה של תורם לרשומה של תרומה הוא קשר של אחד-להרבה (one-to-many)
      כי לכל תורם יכולות להיות מספר תרומות (לפחות אם אנחנו אופטימיים 🙂 )
      כדי להגדיר את הקשר בין הטבלאות, נבחר בתפריט למעלה: כלי מסד נתונים > קשרי גומלין
      ונוסיף את שתי הטבלאות שיצרנו:
      b9314d60-4527-435c-87f6-31e2769c0e1d-תמונה.png

      עכשיו נבחר את השדה DonorID בטבלת התרומות, ונגרור אותו אל השדה ID בטבלת התורמים.
      אם לא טעינו, נפתח חלון כזה:
      5edb4f2a-ae6c-42f4-90fd-77eab01012f3-תמונה.png

      נסמן את התיבה: "אכוף שלמות הקשרים בין הטבלאות". זה מבטיח שלא יהיו לנו רשומות יתומות, דהיינו רשומות של תרומות שאין להן רשומת תורם תואמת.

      נקליק על "צור". שים לב שעכשיו הטבלאות מחוברות על ידי קו. הסימון 1 - ∞ מציין שהקשר הוא "אחד-להרבה" כנ"ל.
      be8defca-0038-4799-9488-ae02388883a8-תמונה.png
      סגור את חלון קשרי הגומלין ושמור את השינויים.

      עכשיו מתחיל הכיף:
      נפתח את הטופס של התורמים בתצוגת עיצוב, ונרחיב את החלון קצת למטה כדי לעשות חלל פנוי לרשימת התרומות:
      2fe4aaaf-3419-4be1-8a64-7941c59867eb-תמונה.png

      נגרור לתוך החלל שיצרנו את הטופס של התרומות frmDonation, כדי ליצור טופס משנה:
      b3aea687-7ff9-4d53-ba0b-bcf015e0af3d-תמונה.png

      נסגור ונשמור את הטופס של התורם.
      עכשיו נפתח את הטופס של התרומות בתצוגת עריכה, ובגליון המאפיינים של הטופס, נשנה את תצוגת ברירת המחדל ל- גליון נתונים (זה יהפוך את התצוגה לגליון נתונים כמו באקסל)
      bae18698-b57e-4264-9314-39f3f71f37c1-תמונה.png
      כמו כן, נמחק מהטופס את שני השדות הראשונים: ID ו- DonorID:
      e42b9635-2974-4331-aa09-1a1674febe8c-תמונה.png

      נסגור ונשמור.

      שים לב: עכשיו כשנפתח את הטופס הראשי (של התורם) יוצגו עבור כל תורם כל התרומות שלו, ורק שלו:
      75338ea5-6ed2-4a63-a48a-d131183804db-תמונה.png

      f3e7b202-fb75-4f73-be8d-1e104768dc2e-תמונה.png
      הפלא ופלא!
      איך זה קורה?
      הסבר בפוסט הבא!

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: יצירת מערכת לניהול תורמים

      חלק ב: יצירת טבלת התרומות והטופס

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

      504ac6b0-ac53-4f65-a42f-a99f6381a6dd-תמונה.png

      שים לב: השדה השני DonorID הוא המקשר של התרומה לתורם.
      עוד דבר חשוב: בחר את השדה האחרון CreatedOn, ולמטה בחלון המאפיינים של השדה, תחת ערך ברירת מחדל תכניס את הפונקציה (המובנית):

      =Now()
      

      זה יכניס אוטומטית את הזמן הנוכחי ביצירת רשומת תרומה חדשה.

      שמור את הטבלה בשם Donation.

      צור טופס חדש המבוסס על הטבלה הזו, כמו שעשינו למעלה עם התורמים:
      תבחר את הטבלה Donation מצד ימין, ובתפריט: יצירה > טופס:

      שמור את הטופס בשם frmDonation
      קח הפסקה לכוס קפה, ונמשיך בפוסט הבא.

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: יצירת מערכת לניהול תורמים

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

      שלום לכולם! מקווה שנהנתם מהחופש הגדול...

      היום הגענו לחלק די קל ומהנה (יחסית...) והוא בניית התפריטים.

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

      אני רוצה ליצור משהו כזה:
      929e98e0-7562-4e49-a60f-0a3e19ce26ba-תמונה.png

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

      שלב א: יצירת טופס תפריט המשפחות
      נפתח טופס חדש ריק, על ידי יצירה > עיצוב טופס.
      נבחר מתפריט העיצוב את פקד הניווט:
      61ed66c8-6c6a-49f5-8bf9-5a4114bce9a8-תמונה.png

      ואז פשוט נקליק בתוך הטופס קרוב לפינה הימנית העליונה:
      0d5c7b84-09e4-4a24-8d64-f05976996eb5-תמונה.png

      אקסס תיצור עבורנו פקד ניווט:
      779206f3-882f-4bbc-b756-7694ed7498e8-תמונה.png

      לפקד הניווט שני חלקים:

      1. החלק העליון הוא פקד הניווט עצמו, זהו בעצם התפריט, שמכיל את הלחצנים לבחירת הטפסים לתצוגה.
      2. החלק התחתון הוא פקד טופס המשנה לניווט, ותפקידו להציג בתוכו את הטפסים שבחרנו מן התפריט.
        הערה חשובה: כברירת מחדל, שם פקד טופס המשנה הוא "NavigationSubform". למרות שאפשר לשנות את שמו לכל שם שנרצה, לעת עתה נשאיר אותו עם שם זה. פרט זה יתגלה כחשוב בהמשך הדרך.

      נוסיף לחצן לפקד הניווט על ידי לחיצה על המקום שמסומן [הוסף חדש], ונרשום בתוכו "רשימת משפחות". אקסס יצרה עבורנו לחצן חדש:
      a1142b9b-6195-4492-8f19-eaa454574989-תמונה.png

      נגדיל את הלחצן כך שיציג את כל הכיתוב:
      758a4992-e004-4c80-a6b5-d7411662a887-תמונה.png

      נוסיף עוד לחצן עם הכיתוב "כרטיס משפחה":
      cff8531e-602b-4a9d-bb4e-9efaf52ce9d0-תמונה.png

      כעת נותר לנו להגדיר איזה טופס ייפתח על ידי כל לחצן.
      ניכנס למאפיינים של הלחצן הראשון (רשימת המשפחות), ובלשונית הנתונים נבחר את המאפיין "שם יעד ניווט", ונבחר מתיבת הרשימה המשולבת את טופס רשימת המשפחות frmFamilyList:
      51f0751a-69df-48cc-91c1-d5cde737dad6-תמונה.png

      באופן דומה, גם בלחצן השני, נבחר את שם יעד הניווט להיות טופס כרטיס המשפחה frmFamilyCard:
      4da4aa8a-1182-4f17-af7f-856644ad27da-תמונה.png

      לסיום, נסיר מן הטופס את הפקדים המיותרים: בוררי הרשומות, לחצני ניווט ופסי הגלילה: (להלן: "שלשת המעצבנים")
      50efdb0e-dfef-428f-a7ca-f51e02ffd7c0-תמונה.png

      ונצמצם את השוליים המיותרים מסביב לפקד הניווט (מסומנים בכתום):
      d673cde3-9d38-4c66-85f1-cd7651ad2743-תמונה.png
      נסגור את הטופס ונשמור אותו בשם navFamilies.
      כעת פתחו את הטופס שיצרנו ובידקו את לחצני הניווט:
      33298f0e-8cb3-45a3-9509-2ec6ca431b0a-תמונה.png

      1bc0fe86-ab00-4812-8ef3-d9ce8b3dc785-תמונה.png

      שלב ב: יצירת טופס התפריט הראשי
      בדומה לשלב הקודם, נפתח טופס חדש ריק, על ידי יצירה > עיצוב טופס, ונוסיף אליו פקד ניווט, ונוסיף שלושה לחצנים כפי שמופיע בתמונה הבאה:
      b0fefc87-12a4-45e7-a8f3-ed955d07a0ee-תמונה.png

      כעת נהפוך את הכיוון של התפריט לאנכי.
      לשם כך נבחר את פקד הניווט כולו (זוכרים? החלק העליון) על ידי הקלקה במקום הריק (לא על לחצן):
      c79ac8cc-4754-420f-a1d9-59007a192374-תמונה.png

      שימו לב שכל פקד הניווט מסומן כעת.
      מתוך המאפיינים בלשונית התבנית נגדיר את המאפיין "מרחב" ל-"אנכי". שימו לב לשינוי בפריסת הלחצנים, כעת הם מופיעים מלמעלה למטה:
      cc6ce00b-e005-465f-b735-660af708bd7e-תמונה.png

      אך עדיין פקד הניווט מופיע בצמוד לחלק העליון של טופס המשנה, ולא מצידו הימני כמו בתכנון.
      אל דאגה, נשנה זאת מיד: נגרור את כל פקד הניווט, כך שיופיע בצמוד לדופן הימנית של טופס המשנה.
      שימו לב לגרור אותו אל הדופן הימנית ממש, כך שיוצג קו בצבע ורוד חלש בצד ימין:
      240fd155-ddf3-4577-8221-4ba8e4e3a283-תמונה.png

      כעת נקטין את רוחב פקד הניווט לגודל יותר סביר:
      26b9919a-dd02-40f6-b134-528f7af8257e-תמונה.png

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

      להלן התוצאה:
      9d35ed40-74d8-4c8e-9561-7f64ac3fe405-תמונה.png

      נהדר, זה לא היה קשה, נכון?

      קחו אויר, כי החלק הבא קצת יותר מורכב.

      שלב ג: הוספת פונקציונאליות ללחצנים שבטפסים
      נשאר לנו כעת לחבר את הלחצנים שבטפסי המשפחה (אלו שיצרנו בפרק כב). נתחיל עם טופס רשימת המשפחות.

      לחצן תצוגת המשפחה
      פתחו את הטופס בתצוגת עיצוב, ובחרו את לחצן הצגת המשפחה. שנו את שמו ל: cmdViewFamilyCard:
      14cfc6d5-ef64-4b6b-90d5-9bee54fd7eb7-תמונה.png

      כעת נגדיר פונקצית אירוע לחיצה:
      בלשונית אירוע, בחרו את האירוע בעת לחיצה, ופתחו את בונה הקוד על ידי לחיצה על שלושת הנקודות … ובחירה באפשרות בונה הקוד.
      אקסס תיצור תבנית עבור פונקצית הארוע של הלחצן.
      הוסיפו בגוף הפונקציה את השורה הבאה:

       DoCmd.BrowseTo acBrowseToForm, "frmFamilyCard", "navMain.NavigationSubform>navFamilies.NavigationSubform", "ID=" & Me.ID
      

      הסבר הקוד:
      אנו משתמשים כאן באובייקט DoCmd שראינו בעבר, המכיל פונקציות שונות באקסס. מתוכו אנו מפעילים את הפונקציה BrowseTo שתפקידה לנווט אל טופס מסויים. הפונקציה מקבלת כמה פרמטרים:
      65ae142a-605d-4230-9469-b47200ef9bbb-תמונה.png

      • הפרמטר הראשון acBrowseToForm מציין את סוג האובייקט לתצוגה. במקרה שלנו הוא טופס.

      כדי להציג דוח במקום טופס, יש לציין acBrowseToReport במקום acBrowseToForm.

      • הפרמטר השני "frmFamilyCard" מציין את שם הטופס לפתיחה הלא הוא כרטיס המשפחה.
      • הפרמטר השלישי "navMain.NavigationSubform>navFamilies.NavigationSubform" מציין את הנתיב שבו ייפתח הטופס.
        כיוון שבנינו מערכת של תפריטי ניווט מקוננים (תפריט ראשי>תפריט המשפחות) אנו צריכים לציין במפורש את כל המסלול שדרכו נגיע ליעד המבוקש (טופס המשנה של תפריט המשפחות). התחביר הוא כך:
        שם_טופס_הניווט.שם_פקד_טופס_המשנה (כברירת מחדל הוא NavigationSubform)
        אם יש כמה טפסי ניווט אחד בתוך השני (כמו אצלנו), מפרידים ביניהם על ידי הסימן "גדול מ" <.
        כך מתקבלת התוצאה הנ"ל.

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

      • הפרמטר הרביעי "ID=" & Me.ID מציין קריטריון לחיפוש רשומה מבוקשת לתצוגה.
        פרמטר זה הוא אופציונאלי, וכאשר מציינים אותו, אקסס תחפש בטופס שנפתח את הרשומה המתאימה לקריטריון, ותקפוץ אליה בפתיחת הטופס.
        לדוגמא, אם אנו רוצים להציג את המשפחה שהמזהה ID שלה הוא 7, עלינו להעביר לפונקציה את הקריטריון: "ID=7".
        הואיל וברצוננו להציג את המשפחה המתאימה לשורה שבה לחצנו על הלחצן, ואנחנו לא יודעים מה יהיה המזהה שלה, נוכל לקבל את המזהה שלה על ידי האובייקט Me.ID וניצור את הקריטריון המתאים על ידי חיבור מחרוזות.

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

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

      טעות בכתובת
      הניווט של אקסס אינו מושלם.
      נסו לפתוח ישירות את הטופס של רשימת המשפחות frmFamilyList, וללחוץ על הלחצן "הצג".
      למרבה התסכול, במקום להציג את הטופס, אקסס תציג הודעת שגיאה:
      ad51c3b1-8ab4-4465-b976-e8857dd3fd0e-תמונה.png

      מה קרה?
      ההודעה הזו מוצגת מפני שאנו מנסים לגשת לנתיב שאינו קיים.
      הרי בקוד צייננו שהנתיב המבוקש הוא "navMain.NavigationSubform>navFamilies.NavigationSubform". אבל הטפסים של הניווט navMain ו-navFamilies לא פתוחים כעת, ולכן הנתיב שגוי.

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

      לחצן יצירת משפחה חדשה
      בואו ניצור גם את הלחצן של יצירת משפחה חדשה. נבחר את הלחצן, וניצור עבורו פונקצית אירוע בעת לחיצה:
      1e7bf761-05a7-43ec-8dff-e66bf5dbd51e-תמונה.png

      לשמחתנו, הקוד הנדרש דומה לקוד הקודם (נוכל להעתיק ולהדביק, ולשנות כנדרש):

      DoCmd.BrowseTo acBrowseToForm, "frmFamilyCard", "navMain.NavigationSubform>navFamilies.NavigationSubform", , , acFormAdd
      

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

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

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

      לחצן מחיקת המשפחה
      מחיקת משפחה היא תהליך מורכב, הואיל ויש לכל משפחה קשרי גומלין שונים. בנוסף, אני לא בטוח שכדאי לאפשר מחיקת משפחה מתצוגת הרשימה. לכן אני אחזור בי ואסיר את לחצן המחיקה מרשימת המשפחות, כדי לאפשר מחיקת משפחה רק מכרטיס המשפחה:
      8cb6114f-a2b9-4c8e-9a41-ad0ffb38f4c0-תמונה.png

      את הקוד עבור לחצני כרטיס המשפחה (כולל מחיקת משפחה) נשאיר לפעם הבאה אי"ה.

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: יצירת מערכת לניהול תורמים

      חלק ד - תוספת: בקשר למדריך הזה

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

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

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: אקסס למתחילים: תגובות

      @yossiz אמר באקסס למתחילים: תגובות:

      נראה לי שה-S מייצג structured - לא simple.

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

      מאיפה יש לך את הזמן והכוחות להשקיע בזה?!

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

      פורסם בתוכנה
      OdedDvir
      OdedDvir

    פוסטים אחרונים שנוצרו על ידי OdedDvir

    • RE: אחסון ושימוש בדאטה בייס SQL על כונן חיצוני

      @pancake אם אתה מדבר על SqlServer בדווקא, הוא מבוסס שרת, כך שאי אפשר לגשת לקובץ הדאטא בלי מנוע ה-Server. אכן אפשר למקם את קובץ הנתונים שלו במיקום ברצונך, ולהפנות אליו על ידי פרמטר במחרוזת החיבור:

      AttachDbFilename=D:\MyApp\AppData.mdf;
      

      (אפשרות אחרת היא להשתמש ב-DB של SqlLite שהוא SelfContained (לא מצריך התקנת שרת), ומאוחסן כקובץ יחיד. אמנם אין בו את כל האפשרויות שמגיעות עם SqlServer כמו StoredProcedures.)

      לגבי חסימת הגישה, למי שיש גישה ל-ConnectionString תהיה כמובן גם גישה לנתונים. אם תגן על ה-DB בעזרת סיסמה מורכבת, ותשמור את מחרוזת החיבור בצורה מאובטחת, למשתמש הפשוט לא תהיה גישה לנתונים.

      פורסם בתכנות
      OdedDvir
      OdedDvir
    • RE: בטריות GP מול TOSHIBA

      בסוללות נטענות יש שתי בעיות:

      1. הגבלת מחזורי טעינה
      2. וריקון עצמי לאורך זמן גם בלא שימוש.

      אני משתמש יום יום כ-3 שעות במיקרופון עם משדר רדיו כדי שאוכל להתנייד.
      המשדר משתמש בשתי סוללות אצבע, ורציתי לחסוך הטענות רצופות.
      אחרי מחקר קטן, קניתי מחו"ל 2 רביעיות של Panasonc eneloop pro.
      988c90e7-faae-4cec-bd96-5ef4c446bc77-תמונה.png
      הם יקרות, אבל מדהימות...
      פתחתי חבילה אחת והתחלתי להשתמש בשני הזוגות שבה לסירוגין, כשזוג אחד נגמר, אני מטעין אותו ומשתמש בשני. אני משתמש באותה חבילה בערך 5 שנים והחבילה השנייה עדיין סגורה.
      מבחינתי זו הייתה קנייה מוצלחת ביותר, ממליץ למי שצריך שימוש יום יומי, רק להיזהר מחיקויים זולים.

      פורסם בצרכנות
      OdedDvir
      OdedDvir
    • RE: נוסחה שלא רואים אותה

      @A0533057932 אם הכוונה היא שלא תופיע אפילו נוסחא בשורת הנוסחאות, אז אפשר ליצור טריגר בארוע שינוי של תא הקלט, שיכניס את תוצאת הנוסחא לתא הפלט.

      הנה דוגמא כזו, שעוקבת אחר השינויים בטווח A1:A10 ומשנה את הערך בתא הסמוך בעמודה B.
      (יש להדביק את הקוד באובייקט של הגיליון הרצוי)

      Option Explicit
      
      Private Const WatchRangeString As String = "A1:A10"
      
      Private Sub Worksheet_Change(ByVal Target As Range)
          If Not Application.Intersect(Range(WatchRangeString), Range(Target.Address)) Is Nothing Then
             DoSomething Target
          End If
      End Sub
      
      
      Private Sub DoSomething(ByRef ChangedRange As Range)
          Dim oldValue As Variant
          Dim newValue As String
              
          If (IsEmpty(ChangedRange.Value2)) Then
              newValue = ""
          Else
              oldValue = ChangedRange.Value2
              newValue = "Thank you for entering " & CStr(oldValue)
          End If
          Me.Cells(ChangedRange.Row, ChangedRange.Column + 1).Value = newValue
      End Sub
      

      תוצאה:
      5d7f3e22-4ce3-4114-bbaf-b4ffb2e4f7d0-תמונה.png
      כמובן שבמקרה שלך, אתה צריך להחליף את הערך בשורה 20 בקוד לתוצאה הרצויה (התאריך העברי)

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: APP SCRIPT האם שייך meta programming? (קוד JS שמריץ string כקוד JS)

      @Y-Excel-Access נראה שנפלה לך טעות קטנה בהקלדה. צ"ל כך:

      function RunJS() {
        var TEXT = "var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.getRange('a5').setValue('Running!');"
        eval(TEXT);
      }
      
      פורסם בתכנות
      OdedDvir
      OdedDvir
    • RE: APP SCRIPT האם שייך meta programming? (קוד JS שמריץ string כקוד JS)

      @Y-Excel-Access לכאורה אפשר על ידי הפונקציה eval():

      eval("Logger.log('Hello world')")
      
      פורסם בתכנות
      OdedDvir
      OdedDvir
    • RE: טבלת צירופים ב-SQL

      @איש-נחמד כתב בטבלת צירופים ב-SQL:

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

      זו הדרך שבה הייתי בוחר. לגבי יצירת הטבלה, אם כי אפשר ליצור אותה ע"י שאילתת SQL, הייתי מעדיף את דרך הקוד, כי זו פעולה ששיכת לעיצוב יותר מאשר מניפולציה על נתונים, שהרי כל הנתונים זמינים כבר בצורה מנורמלת במבנה הפשוט שציינת (שם1, שם2, ערך)

      פורסם בתכנות
      OdedDvir
      OdedDvir
    • RE: יוטיוב - אודיו בלבד

      @dovid האם גם זה כפוף לפתיחה של נטפרי, או שאין חסימת תוכן אודיו בלבד?

      פורסם באינטרנט
      OdedDvir
      OdedDvir
    • RE: תיבה בשולבת באקסס

      @A0533057932 יש בפוסט הזה דוגמא.

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: קישור נתונים באקסס

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

      • שנה את הצג פקד ל"תיבה משולבת"
      • במקור השורה תבחר את טבלת Address.
      • בעמודה המאוגדת תבחר 1
      • את מונה העמודות תגדיר ל-4.
      • וברוחב העמודות תקליד ;0

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

      פורסם בתוכנה
      OdedDvir
      OdedDvir
    • RE: קישור נתונים באקסס

      @A0533057932 הלוגיקה נכונה.
      הסבר: הקשר שיצרת הוא יחיד(Address)-לרבים(user)
      המשמעות היא שלכל כתובת יכולים להיות משוייכים 0 או יותר משתמשים, אבל לכל משתמש יכולה להיות 0 או כתובת אחת בלבד (שהמזהה שלה נמצא בשדה Address_ID)

      פורסם בתוכנה
      OdedDvir
      OdedDvir