› פורומים › אפיון ופיתוח פריוריטי › עדכון דגל כאשר התאריך הוא של היום
- This topic has 13 תגובות, 4 משתתפים, and was last updated לפני 8 שנים by
123.
- Post
-
- ספטמבר 10, 2017 בשעה 3:36 pm
יש לי טבלה – 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כרגע זה לא עובד, אני אשמח לעזרה
- Replies
-
- ספטמבר 10, 2017 בשעה 5:07 pm
מתי את רוצה שהמערכת תוסיף את הדגל?
האם את הולכת לבצע ריצה כל יום על מסך \ טבלה \ דרך פרוצדורה ?או שמדובר במסך וזה לאחר עדכון במסך או בכניסה (לאחר שליפת הנתונים) ….
- ספטמבר 10, 2017 בשעה 5:30 pm
האם את יודעת שהמשפט שכתבת למעלה יעדכן את כל הרשומות שבטבלה? זה אולי נכון כרגע אבל לא כהפעלה. לא רק זה, נניח ש"היום" (דהיינו 10/09) סימנתי את כל השורות המתאימות. כאשר אני מריץ את התכנית "מחר" (דהיינו 11/09), אסמן שורות חדשות, אבל השורות שסימנתי היום נשארות מסומנות!מוטב לא ליצור שדה בתוך טבלה אלא שדה מחושב במסך בלבד שמתעדכן כל פעם מבלי לשמור כלום.
- ספטמבר 10, 2017 בשעה 9:56 pm
הסיבה שאני רוצה לסמן רשומות הוא משום שיש לי 2 מסכים שמתבססים על אותה הטבלה –מסך 1 – מוסיפים בו רשומות
מסך 2 – מסך שאמור להציג רק רשומות עם תאריך של אותו היוםנועם – לפי מה שאתה אומר בכלל לא כדאי לי להשתמש במקרה זה בדגל? (בגלל שרשומות שכבר סימנתי בתאריך מסוים יישארו מסומנות…)
ניסיתי בעוד דרך –
במחולל מסכים -> בשדה STARTDATE -> ביטוי/תנאיSQL.DATE =
לא עוזר לי כי מתייחס גם לתאריך וגם לשעה, אני צריכה רק תאריךSQL.DATE8 =
בכלל לא עובד- ספטמבר 10, 2017 בשעה 10:42 pm
אז מה הבעיה להציג במסך השני רק תאריכים שאת רוצה?
אם בשדה התאריך יש לך DATE14 וזה מה שאת רוצה, אז צרי שדה נוסף עם DATE8 מוסתר (עם פוסט-פילד על שדה תאריך המקורי שיעדכן את השדה המוסתר),
ובהרחבות של השדה המוסתר תגדירי שיציג רק את הרשומות של היום.- ספטמבר 10, 2017 בשעה 10:45 pm
אני בטוח שיש פקודה שאת יכולה לעשות גם על השדה תאריך DATE14 שיציג את כל הרשומות של התאריך של היום מבלי להתייחס לחלק של השעה.נועם בטוח ישלוף לך את הקוד המתאים 🙂
- ספטמבר 10, 2017 בשעה 11:12 pm
בדיוק מה שעשיתי בהתחלה –הוספתי לטבלה ולמסך עמודה TODAY מסוג DATE באורך 8 והוספתי ביטוי STARTDATE =
וזה לא עובד.
ניסיתי גם ב-POST-FILED
(INSERT INTO SCHEDULE (TODAY
SELECT STARTDATE
FROM SCHEDULE
;WHERE STARTDATE = : $.STARTDATE- ספטמבר 10, 2017 בשעה 11:14 pm
מיותר להוסיף עמודה לבסיס הנתונים רק עבור שליפה, מה גם שנדרש לתחזק אותה ברמה יומית.
במסך השליפה שלך תוסיפי את את עמודה מוסתרת DUMMY.DUMMY
ותוסיפי בתנאי חיתוך ל DUMMY.DUMMY AND
ואת הביטוי הבא (נניח שהשדה שלך הוא X)
X BETWEEN SQL.DATE8 + 00:01 AND SQL.DATE8 +23:59- ספטמבר 10, 2017 בשעה 11:35 pm
תודה רבה על ההכוונה 🙂סוף סוף זה עובד :
הוספתי עמודה TODAY מסוג DATE באורך 8
ב – POST-FIELD של STARTDATE עשיתי –
;SRIT_TODAY = :$.SRIT_STARTDATE:$.
ובתנאי של SRIT_TODAY
SQL.DATE8 =- ספטמבר 11, 2017 בשעה 2:08 am
שלוםהגעתי בסוף היום וראיתי את הדיון הזה
לא כ"כ נעים לי לבא אם תיקונים והערות אבל היות וכאן לכאורה אנחנו רוצים ללמוד וללמד (לפי המקרה) אני מניח שיהיה מקובל אם אני אגיד על מה אני מסכים ועל מה לא.
אני אעבור על זה בסדר של הפוסטים.
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 אבל במצבים מסוימים אפשר בקלות לטעות. הגישה של "פחות מהערך הראשון שאני לא רוצה" יכולה להיות בטוחה יותר.אני מקווה שזה לתועלת.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- ספטמבר 11, 2017 בשעה 1:05 pm
תודה,
משום מה הביטוי:
(SCHEDULE.STARTDATE BETWEEN SQL.DATE8 AND SQL.DATE8 + 23:59)לא עובר סינטקס DATE14 ללא הוספת 00:01.
- ספטמבר 11, 2017 בשעה 3:42 pm
חברים תודה רבה על ההתעניינות וההתייחסות, קראתי והשכלתי 🙂- ספטמבר 11, 2017 בשעה 3:52 pm
Yanai כתב:תודה,
משום מה הביטוי:
(SCHEDULE.STARTDATE BETWEEN SQL.DATE8 AND SQL.DATE8 + 23:59)לא עובר סינטקס DATE14 ללא הוספת 00:01.
ואם היית מוסיף 00:00 במקום 00:01 זה גם לא היה עובד?
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
- יש להתחבר למערכת על מנת להגיב.