קבלת תאריך מקסימלי

פורומים אפיון ופיתוח פריוריטי קבלת תאריך מקסימלי

  • Post
    sayo
    משתתף
    היי, בניתי דוח שבתוכו אני רוצה להציג את המחיר מהזמנת הרכש האחרונה שהוקמה במערכת לפי פריט.
    כשאני שמה MAX, הוא מביא לי את כל הזמנות הרכש שיש להם מחירים שונים לאותו פריט.
    ז"א שאם יש כמה הזמנות רכש עם מחירים זהים, רק אז הוא יביא לי את המקסימום.
    עזרה…
מוצגות 7 תגובות – 1 עד 7 (מתוך 7 סה״כ)
  • Replies
    yitzchok
    משתתף
    IL
    בבקשה להעלות פרטים

    עדיף משהו שהוא טוב חוץ מעניין המקסימום

    לדעתי עדיף לעשות ככה

    בסביבת פיתוח sql לבחור מהתפריט dump ושם report ולהכניס את שם הדו"ח שלך ולהדביק כאן את התוצאה

    הוצאת עמודות ממחולל דו"חות דרך אקסל יכול לעזור בנוסף אבל לבד פחות טוב מהנ"ל

    בבקשה ללמוד איך לעשות את זה כי יחסוך לנו המון זמן של חטטה כדי להבין את הדו"ח

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    אלמוני
    אורח
    צריך לבצע שתי שליפות: אחת כדי לקבל את תאריך ההזמנה האחרונה ואחת כדי לקבל את מחיר הפריט בהזמנת הרכש שהופקה בתאריך הזה.

    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
    ;

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

    yitzchok
    משתתף
    IL

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

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

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

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

    אבל

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

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

    כל זה תיאורטית ועדיף לראות את השאילתא של sayo כדי לתת תשובה נקודתית.

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    אלמוני
    אורח
    אני מודה שמה שכתבתי בא לא מפריוריטי אלא ממערכת SQL רגילה ותכנית CLIENT. במודל הזה, מוטב לבצע את מרבית החישובים בשרת, להעביר כמה שפחות נתונים בתקשורת ולבצע כמה שפחות ב-CLIENT.

    יתכן שהצבת נתונים ישירות לתוך משתנים (הדוגמא השניה) אינה גורמת לתעבורה מיותרת. אין לנו דרך לדעת מה יותר מהר – לשלוף MAX של ערך מסוים מתוך טבלה (תקווה שיש אינדקס על השדה) או לשלוף את כל הערכים ולמיין. לכאורה MAX אמור להיות יותר מהר.

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

    sayo
    משתתף
    תודה לכם, אבל חשבתי אולי יש דרך לעשות את זה בדו"ח מבלי להפוך אותו לפרוצדורה…
    אלמוני
    אורח
    מה רע בפרוצדורה? יש הרבה דברים שיחסית קל לבצע בפרוצדורה שקשה מאד עד בלתי אפשרי לבצע בדו"ח.
    זה כנראה אחד מהם.
    sayo
    משתתף
    צודק ולכן אני עושה פרוצדורה
    אכניס את הקוד הראשון שרשמת
    תודה לך!
מוצגות 7 תגובות – 1 עד 7 (מתוך 7 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.