פיצוץ עץ מוצר לשימוש בדוח – SONRAW או PARTTREE

פורומים אפיון ופיתוח פריוריטי פיצוץ עץ מוצר לשימוש בדוח – SONRAW או PARTTREE

  • Post
    snoof123
    משתתף
    היי,
    אני צריך שמשתמש יזין קלט:
    מוצר אב וכמות שצריך לייצר ממוצר אב (עבור יותר ממוצר אב 1).
    לצורך זה בניתי טבלה זמנית שאפשר להזין בה מוצר אב וכמות.
    בנוסף בניתי לזה מסך.
    אחרי שהמשתמש בפרוצדורה מזין קלטים של אבות וכמויות אני רוצה להשתמש בתכנית מקומפלת לפיצוץ העץ אבל שתשתמש בקלטים שהמשתמש הזין.

    האם מישהו יכול להסביר לי כיצד אני עושה את זה?
    ניסיתי להשתמש בSONRAW כשאני עושה SQLI:
    LINK PART TO PRT
    אח"כ בתוך לולאה הכנסתי לPART את הPARTים שהמשתמש הזין קודם לכן.
    הבעיה שהדוח יוצא ריק כל הזמן…

מוצגות 15 תגובות – 1 עד 15 (מתוך 19 סה״כ)
  • Replies
    אלמוני
    אורח
    להלן קוד אשר לוקח פריטים אשר נמצאים בשורות הזמנה ומפוצץ אותם


    LINK ORDERS TO :$.ORD;
    ERRMSG 1 WHERE :RETVAL 0
    GROUP BY ORIG.PART, ORIG.PARTNAME;
    EXECUTE SONRAW :PRT, SQL.DATE8, :ARC, 5;
    INSERT INTO STACK4 (KEY, INTDATA, REALDATA)
    SELECT PARTARC.SON, PARTPARAM.WARHS,
    SUM (PARTARC.COEF * PART.FATQUANT)
    FROM PARTARC, PART, PARTPARAM, WAREHOUSES
    WHERE PARTARC.PART = PART.PART
    AND PARTARC.SON = PARTPARAM.PART
    AND PARTPARAM.WARHS = WAREHOUSES.WARHS
    GROUP BY PARTARC.SON, PARTPARAM.WARHS;
    UNLINK PARTARC;
    UNLINK PART;
    UNLINK ORDERS;
    UNLINK STACK4;

    יש שני מפתחות לשימוש ב-SONRAW: טבלה מלונקקת PARTARC וטבלה מלונקקת שמכילה את הפריטים אותם יש לפוצץ. בדוגמא לעיל השתמשתי בטבלאות שהוגדרו בתוך הפרוצדורה במצעות SELECT SQL.TMPFILE אולם אפשר להשתמש בפרמטר שהוא חיצוני לפרוצדורה.

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

    רוב הנסתר על הגלוי, אך בסוף מתרגלים לשימוש ב-SONRAW

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

    LINK INTL_BOMSIM TO :$.ORD;
    ERRMSG 1 WHERE :RETVAL 0
    AND ORIG.TYPE = 'P'
    AND ORIG.PART > 0;
    /*GROUP BY ORIG.PART, ORIG.PARTNAME*/
    EXECUTE SONRAW :PRT, SQL.DATE8, :ARC, 5;
    INSERT INTO STACK4 (KEY, INTDATA, REALDATA)
    SELECT PARTARC.SON, PARTPARAM.WARHS,
    SUM (PARTARC.COEF * PART.FATQUANT)
    FROM PARTARC, PART, PARTPARAM, WAREHOUSES
    WHERE PARTARC.PART = PART.PART
    AND PARTARC.SON = PARTPARAM.PART
    AND PARTPARAM.WARHS = WAREHOUSES.WARHS
    GROUP BY PARTARC.SON, PARTPARAM.WARHS;
    UNLINK PARTARC;
    UNLINK PART;
    UNLINK INTL_BOMSIM;
    UNLINK STACK4;

    snoof123
    משתתף
    עוד משהו..
    האם אני עדיין צריך להריץ את התכנית SONRAW בשלב אחרי?
    והאם הדוח שאני משתמש בו (שהוא כעת הדוח המקורי SONRAW) אמור להכיל את המידע שיוצא מהקוד הזה בסוף..
    אלמוני
    אורח
    צריך לוודא שהפרטמר :$.ORD אכן מכיל נתונים של INTL_BOMSIM. אני חושש שהתעקת מבלי לבדוק לכן השורה הזו חשודה כמיותרת.

    בשורה אחרי INSERT INTO PART, מוטב לכתוב SELECT INTL_BOMSIM.FPART, ORIG.PARTNAME, SUM (INTL_BOMSIM.RQTY) ולסיים עם GROUP BY. יכול להיות שדווקא השורה שנכנסת לטבלה ללא כמות. כאן אתה צריך לכתוב כמו שכתבת במשפט SELECT – INTL_BOMSIM.FPART, ORIG.PARTNAME ולא כפי שכתבת בהערה.

    אגב, כל מה שקשור ל-WAREHOUSES מיותר – אפשר למחוק.

    אלמוני
    אורח
    במקום לכתוב פרוצדורה עם שלושה שלבים (SQLI, SONRAW, SQLI), הקוד שהצגתי "עושה את הכל" בשלב אחד בלבד. לכן אין צורך בשלב SONRAW בפני עצמה.
    snoof123
    משתתף
    קודם כל, תודה רבה על המענה המהיר והמפורט.
    איך אני משתמש בדוח שמציג את הנתונים אחרי הדבר הזה?
    ראיתי שעשית UNLINK לכל הטבלאות בסוף, לאן המידע הזה הולך אם ארצה להשתמש בו?
    snoof123
    משתתף
    וצדקת, ORD לא מכיל נתונים.
    הוצאתי את זה לקובץ והקובץ מכיל רק שמות עמודות.
    שזה מוזר, כי בתכלס אני יודע שאם לא עושים דליט אחרי הלינק אז הקובץ בלינק מכיל את כל הרשומות שיש בטבלה לפני הלינק.. אולי אני טועה (?)
    אלמוני
    אורח
    הכנסת לתוך טבלת STACK4 מצביע אל פריט והכמות הדרשת. הפרוצדורה מניחה שאחרי שלב SQLI יבוא שלב של דו"ח אשר משתמש בנתונים האלה, תוך כדי שימוש ב-STACK4. כמובן צריך להעביר פרמטר STK אל הדו"ח ולציין שמדובר ב-STACK4 (תסתכל בשלבים 22 ו-30 של פרוצדורה FAULTFRQ).

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

    אלמוני
    אורח
    כאשר כותבים SELECT SQL.TMPFILE INTO :PRT FROM DUMMY, LINK PART TO :PRT
    אז הטבלה המקומית PART תכיל את כל השדות של טבלת PART האמיתית, אך תהיה ריקה. אותו הדבר אם יש פרטמטר PRT לפרוצדורה, כאשר אין שאלה לגביו (שוב, שלב 22 בפרוצדורה FAULTFRQ : כל הטבלאות הזמניות מלבד MALFUNCTIONS תהיינה ריקות.

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

    אם אתה צריך את *כל* הרשומות שבטבלה, אז לא משתמשים ב-LINK.

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


    INSERT INTO STACK4 (KEY,INTDATA2,REALDATA,INTDATA)
    SELECT SQL.LINE,
    PARTARC.SON, SUM (PARTARC.COEF * PART.FATQUANT), PARTARC.PART
    FROM PARTARC, PART
    WHERE PARTARC.PART = PART.PART
    GROUP BY PARTARC.SON,PARTARC.PART;

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

    האם יש למישהו רעיון איך לטפל בנושא הזה?

    תודה לכל העוזרים 🙂

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

    דרך אחרת: במקום לשמור את PARTARC.PART ב-STACK4.INTDATA, שמור אותו ב-STACK4.KEY בצורה

    INSERT INTO STACK4 (KEY, INTDATA, REALDATA)
    SELECT PARTARC.PART, PARTARC.SON, SUM (PARTARC.COEF * PART.FATQUANT)
    FROM PARTARC, PART
    WHERE PARTARC.PART = PART.PART
    GROUP BY PARTARC.PART, PARTARC.SON;

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

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

    אלמוני
    אורח
    טעות שלי – צריך להשתמש ב-STACK8, כאשר KEY1 = PARTARC.PART ו-KEY2 = PARTARC.SON
    עדיף אם כך להשתמש ב-PARTARC
    snoof123
    משתתף
    זה מה שעשיתי בעצם, אבל הכנסתי לתוך טבלה STACK10
    U אחד לאבא
    U אחד לבן
    אבל עדיין זה מציג לי חלק מהמוצרים פעמיים בפיבוט
    ז"א הוא מציג לי שורה לבן עבור אב אחד ועוד שורה עבור אב שני..
    אני צריך שורה אחת לשני האבות ובתוך הגרף יהיה כתוב כמה צריך עבור כל אב.

    נניח:
    כמות, אבא1, אבא2
    ילד1 50 15
    ילד2 20 10

    ולא מצב כזה:,
    כמות, אבא1, אבא2
    ילד1 50
    ילד1 15

מוצגות 15 תגובות – 1 עד 15 (מתוך 19 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.