› פורומים › אפיון ופיתוח פריוריטי › קבלת תאריך מקסימלי
- This topic has 7 תגובות, 2 משתתפים, and was last updated לפני 8 שנים, 7 חודשים by
sayo.
- Post
- Replies
-
- פברואר 13, 2017 בשעה 11:31 pm
בבקשה להעלות פרטיםעדיף משהו שהוא טוב חוץ מעניין המקסימום
לדעתי עדיף לעשות ככה
בסביבת פיתוח sql לבחור מהתפריט dump ושם report ולהכניס את שם הדו"ח שלך ולהדביק כאן את התוצאה
הוצאת עמודות ממחולל דו"חות דרך אקסל יכול לעזור בנוסף אבל לבד פחות טוב מהנ"ל
בבקשה ללמוד איך לעשות את זה כי יחסוך לנו המון זמן של חטטה כדי להבין את הדו"ח
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- פברואר 14, 2017 בשעה 9:54 am
צריך לבצע שתי שליפות: אחת כדי לקבל את תאריך ההזמנה האחרונה ואחת כדי לקבל את מחיר הפריט בהזמנת הרכש שהופקה בתאריך הזה.
SELECT MAX (PORDERS.CURDATE) INTO :DATE
FROM PORDERS, PORDERITEMS
WHERE PORDERS.ORD = PORDERITEMS.ORD
AND PORDERITEMS.PART = :PART
;
SELECT PORDERITEMS.PRICE INTO :PRICE
FROM PORDERS, PORDERITEMS
WHERE PORDERS.ORD = PORDERITEMS.ORD
AND PORDERITEMS.PART = :PART
AND PORDERS.CURDATE = :DATE
;
יש דרך אחרת, פחות אלגנטית, בה שולפים את כל הזמנות הרכש יחד עם מחירי הפריטים תוך כדי מיון הפוך לפי תאריך ההזמנה.
SELECT PORDERS.CURDATE, PORDERITEMS.PRICE INTO :DATE, :PRICE
FROM PORDERS, PORDERITEMS
WHERE PORDERS.ORD = PORDERITEMS.ORD
AND PORDERITEMS.PART = :PART
ORDER BY PORDERS.CURDATE DESC
;
הקוד הזה פחות יעיל מאחר והוא צריך להעביר שני נתונים מכל הרשומות מהשרת אל המחשב שלך, בעוד בשיטה הראשונה שני נתונים בלבד מועברים – התאריך המירבי והמחיר בעת התאריך הזה. יש פחות נתונים לכן יש פחות תעבורה לכן זה עובד יותר מהר. תמיד מומלץ לבצע כמה שיותר חישובים/מיונים בשרת וכמה שפחות בתחנה כדי לחסוך בתעבורה.
- פברואר 14, 2017 בשעה 11:26 am
הקוד הזה פחות יעיל מאחר והוא צריך להעביר שני נתונים מכל הרשומות מהשרת אל המחשב שלך, בעוד בשיטה הראשונה שני נתונים בלבד מועברים – התאריך המירבי והמחיר בעת התאריך הזה. יש פחות נתונים לכן יש פחות תעבורה לכן זה עובד יותר מהר. תמיד מומלץ לבצע כמה שיותר חישובים/מיונים בשרת וכמה שפחות בתחנה כדי לחסוך בתעבורה.
אני רוצה להסביר את מה שנעם כתב, לטובת מי שלא מכיר את כל הפרטים הקטנים האלה.
וזה במיוחד כי אני בעצמי לא הבנתי למה הוא התכוון עד שהתחלתי לכתוב תגובה עם תיקון וקראתי פעם שניה.
נעם מתייחס למה שקורה מאחורי הקלעים: מצד אחד כל שאילתא שאנחנו עושים רץ בשרת ואנחנו מקבלים רק את התוצאה. מצד שני במקרה של הדוגמה של נעם יש העברת תוצאות למשתנים. כשעושים את זה רק הערכים שברשומה הראשונה שבתוצאות נכנסות למשתנים וכל השאר הולך לאיבוד. מסתבר שנעם סובר שכשעושים כזה דבר השרת מוציא את כל הרשומות אלינו בתחנה והתוכנה בתחנה תופסת את התוצאה הראשונה וזורקת את כל השאר. אני מסתייג קצת בזה כי אפשר להגביל את התוצאות לשורה הראשונה בלבד אבל עד שאני אאמת שזה לא ככה אני מגבה את האזהרה של נעם.
אבל
יש צד שני שאומר שיכול להיות שהמחיר של לקבל יותר תוצאות זה פחות מזה של לבצע הלוך-ושוב של שאלתא שני. קשה להכריע.
אוסיף עוד אזהרה:
על אף האמור לעיל שאפשר לראות את האופציה השניה כיעילה יותר צריך לקחת בחשבון שהדוגמאות מתייחסות למוצר אחד.
אם הדרישה היא להכין דו"ח על רשימת מוצרים הגישה השניה לא רלוונטית ויש להכין טבלת לינק עם ה max עבור כל שורה ולשלב אותה בדו"ח שמבוסס על מקור שהוא שורה למוצר.כל זה תיאורטית ועדיף לראות את השאילתא של sayo כדי לתת תשובה נקודתית.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- פברואר 14, 2017 בשעה 11:44 am
אני מודה שמה שכתבתי בא לא מפריוריטי אלא ממערכת SQL רגילה ותכנית CLIENT. במודל הזה, מוטב לבצע את מרבית החישובים בשרת, להעביר כמה שפחות נתונים בתקשורת ולבצע כמה שפחות ב-CLIENT.יתכן שהצבת נתונים ישירות לתוך משתנים (הדוגמא השניה) אינה גורמת לתעבורה מיותרת. אין לנו דרך לדעת מה יותר מהר – לשלוף MAX של ערך מסוים מתוך טבלה (תקווה שיש אינדקס על השדה) או לשלוף את כל הערכים ולמיין. לכאורה MAX אמור להיות יותר מהר.
בסופו של דבר, כל ההתפלספות קצת מיותרת, מפני שהקוד שאנחנו כותבים אינו מה שרץ על השרת: אנחנו כותבים בשפה מפורשת (INTERPRETED) שעוברת כמה עיבודים עד שמגיעה למנוע SQL עצמו. מספר הנתונים הגולמיים תמיד יקבע את המהירות, לכן צריך לחתוך כמה שיותר – באמצעות פריט, תאריך וכד'.
- פברואר 14, 2017 בשעה 2:18 pm
תודה לכם, אבל חשבתי אולי יש דרך לעשות את זה בדו"ח מבלי להפוך אותו לפרוצדורה…- פברואר 14, 2017 בשעה 2:24 pm
- יש להתחבר למערכת על מנת להגיב.