עדכון דגל כאשר התאריך הוא של היום

פורומים אפיון ופיתוח פריוריטי עדכון דגל כאשר התאריך הוא של היום

  • Post
    שרית
    משתתף
    יש לי טבלה – SCHEDULE
    עם עמודות – STARTDATE (תאריך ושעה אורך 14) ו – TODAY (בוליאני – CHAR , 1)

    אני רוצה לעדכן את הדגל 'Y' כאשר התאריך הוא של היום,

    עשיתי WINDBI כדי לבדוק (יותר מאוחר אני רוצה להשתמש בטריגר POST-INSERT של עמודה STARTDATE) –

    (INSERT INTO SCHEDULE(TODAY
    'SELECT 'Y
    FROM SCHEDULE
    ;WHERE (STARTDATE – STARTDATE MOD 24:00) = SQL.DATE8

    כרגע זה לא עובד, אני אשמח לעזרה

מוצגות 13 תגובות – 1 עד 13 (מתוך 13 סה״כ)
  • Replies
    Interlligent
    משתתף
    מתי את רוצה שהמערכת תוסיף את הדגל?
    האם את הולכת לבצע ריצה כל יום על מסך \ טבלה \ דרך פרוצדורה ?

    או שמדובר במסך וזה לאחר עדכון במסך או בכניסה (לאחר שליפת הנתונים) ….

    אלמוני
    אורח
    האם את יודעת שהמשפט שכתבת למעלה יעדכן את כל הרשומות שבטבלה? זה אולי נכון כרגע אבל לא כהפעלה. לא רק זה, נניח ש"היום" (דהיינו 10/09) סימנתי את כל השורות המתאימות. כאשר אני מריץ את התכנית "מחר" (דהיינו 11/09), אסמן שורות חדשות, אבל השורות שסימנתי היום נשארות מסומנות!

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

    שרית
    משתתף
    הסיבה שאני רוצה לסמן רשומות הוא משום שיש לי 2 מסכים שמתבססים על אותה הטבלה –

    מסך 1 – מוסיפים בו רשומות
    מסך 2 – מסך שאמור להציג רק רשומות עם תאריך של אותו היום

    נועם – לפי מה שאתה אומר בכלל לא כדאי לי להשתמש במקרה זה בדגל? (בגלל שרשומות שכבר סימנתי בתאריך מסוים יישארו מסומנות…)

    ניסיתי בעוד דרך –
    במחולל מסכים -> בשדה STARTDATE -> ביטוי/תנאי

    SQL.DATE =
    לא עוזר לי כי מתייחס גם לתאריך וגם לשעה, אני צריכה רק תאריך

    SQL.DATE8 =
    בכלל לא עובד

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

    נועם בטוח ישלוף לך את הקוד המתאים 🙂

    שרית
    משתתף
    בדיוק מה שעשיתי בהתחלה –

    הוספתי לטבלה ולמסך עמודה TODAY מסוג DATE באורך 8 והוספתי ביטוי STARTDATE =

    וזה לא עובד.

    ניסיתי גם ב-POST-FILED

    (INSERT INTO SCHEDULE (TODAY
    SELECT STARTDATE
    FROM SCHEDULE
    ;WHERE STARTDATE = : $.STARTDATE

    123
    משתתף
    מיותר להוסיף עמודה לבסיס הנתונים רק עבור שליפה, מה גם שנדרש לתחזק אותה ברמה יומית.
    במסך השליפה שלך תוסיפי את את עמודה מוסתרת DUMMY.DUMMY
    ותוסיפי בתנאי חיתוך ל DUMMY.DUMMY AND
    ואת הביטוי הבא (נניח שהשדה שלך הוא X)
    X BETWEEN SQL.DATE8 + 00:01 AND SQL.DATE8 +23:59
    שרית
    משתתף
    תודה רבה על ההכוונה 🙂

    סוף סוף זה עובד :

    הוספתי עמודה TODAY מסוג DATE באורך 8

    ב – POST-FIELD של STARTDATE עשיתי –

    ;SRIT_TODAY = :$.SRIT_STARTDATE:$.

    ובתנאי של SRIT_TODAY
    SQL.DATE8 =

    yitzchok
    משתתף
    IL
    שלום

    הגעתי בסוף היום וראיתי את הדיון הזה

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

    אני אעבור על זה בסדר של הפוסטים.

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

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

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

    4. "X BETWEEN SQL.DATE8 + 00:01 AND SQL.DATE8 +23:59"
    מה אם X שווה בדיוק ל-SQL.DATE8 (זאת אומרת בדיוק חצות לילה)?
    צריכים להזהר ממקרי קצה (שהם לא בהכרח קיצוניים)

    5. בילבלו את השואלת עם כל השיחה של עמודה מסוג DATE8. עכשיו יש לה עמודה שניה בטבלה (אם אני מבין נכון) ששמה TODAY ותוכנה משהו אחר לגמרי (הערך של STARTDATE אבל רק התאריך ולא השעה).
    חבל.
    אוקיי, זה עושה שבשליפה ניתן לעשות WHERE TODAY = SQL.DATE8 (אבל SQL.DATE8 זה תמיד היום, וזה מדגיש כמה השם לא נכון) ולא צריכים לעדכן את העמודה כל יום כדי לסמן מה זה "היום".
    אבל מנגד, חבל על המקום באחסון, גם אם זניח. ויותר מזה, אם מישהו יאפשר שינוי של STARTDATE במסך אחר ולא ישים הפעלה זהה שמה, יתכן אי-התאמה בין התאריכים של STARTDATE ו-TODAY. אחד הכללים שבדטהבייסים זה להמנע כמה שאפשר לשמור את אותו נתון פעמיים, כי בשלב מסוים הם עלולים להספיק להיות אותו נתון. כאן זה לא אחת מהיוצאים מן הכלל שמצדיקים את זה.

    לדעתי הדבר הנכון היה צריך להיות לא להוסיף שום עמודה לטבלה.
    במסך שאמור לסנן ולהציג רק את רשומות של היום הנוכחי היה צריך לשים את העמודה STARTDATE פעמיים ובתנאי של אחד מהם "גדול שווה SQL.DATE8" ובתנאי של השני "פחות מ-SQL.DATE8 + 24:00" וזהו. אפשר לאחד בעמודה אחת, זה עניין של טעם – מה לדעתכם יותר ברור.
    במסך של הכנסת הנתונים (שמציג את כל הרשומות) אפשר בכל מקרה לשים/לקבל עמודת דגל שמסמנת אם מדובר ברשומה של היום – שמים עמודת ביטוי (קריאה בלבד, סוג בוליאני) עם הביטוי הבא
    (SCHEDULE.STARTDATE >= SQL.DATE8 AND SCHEDULE.STARTDATE < SQL.DATE8 + 24:00 ? 'Y' : '' )
    למי שרוצה לנסח ב-BETWEEN אפשר גם
    (SCHEDULE.STARTDATE BETWEEN SQL.DATE8 AND SQL.DATE8 + 23:59)
    אבל אני מרגיש שגישה זאת פחות בריאה כי צריכים להגדיר את הגבול העליון כמשהו סצפיפי שפחות מ"מחר". במקרה הזה אנחנו סומכים על זה שאין בפריוריטי שעה אפשרית בין 23:59 ו-00:00 אבל במצבים מסוימים אפשר בקלות לטעות. הגישה של "פחות מהערך הראשון שאני לא רוצה" יכולה להיות בטוחה יותר.

    אני מקווה שזה לתועלת.

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    123
    משתתף
    תודה,
    משום מה הביטוי:
    (SCHEDULE.STARTDATE BETWEEN SQL.DATE8 AND SQL.DATE8 + 23:59)

    לא עובר סינטקס DATE14 ללא הוספת 00:01.

    שרית
    משתתף
    חברים תודה רבה על ההתעניינות וההתייחסות, קראתי והשכלתי 🙂
    yitzchok
    משתתף
    IL
    Yanai כתב:

    תודה,
    משום מה הביטוי:
    (SCHEDULE.STARTDATE BETWEEN SQL.DATE8 AND SQL.DATE8 + 23:59)

    לא עובר סינטקס DATE14 ללא הוספת 00:01.

    ואם היית מוסיף 00:00 במקום 00:01 זה גם לא היה עובד?

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    123
    משתתף
    לא …
    אחרת לא הייתי מוסיף דקה .
    כפי שציינת נכון יותר יהיה לוותר על ה BETWEEN ולהשתמש באופרטורים
    כאשר הגבול התחתון יהיה גדול מתאריך של היום פחות דקה.
מוצגות 13 תגובות – 1 עד 13 (מתוך 13 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.