› פורומים › אפיון ופיתוח פריוריטי › הצגת כניסה אחרונה למלאי במחולל דוחות
- This topic has 9 תגובות, 2 משתתפים, and was last updated לפני 3 שנים by סמי.
- Post
- Replies
-
- אוקטובר 31, 2021 בשעה 2:25 pm
תרשום M בשדה "חישוב עמודה" אשר אמור לתת לך את הערך המירבי לשדה אם כי יכול להיות השפעה על שדות אחרים.הרבה יותר קל ו"בטוח" לחשב את הערך מירבי בשלב פרוצדורה לפני הצגת הנתונים אם זה אפשרי.
- נובמבר 1, 2021 בשעה 8:15 am
טוב כנראה אני הולך על הפתרון השני , אבל אני לא יודע איך רצים על מערך של PAR מסוג FILE בתוך ה SQLI . אולי אתה מכיר איך עושים את זה ?תודה על המענה
- נובמבר 1, 2021 בשעה 1:06 pm
אני רואה שהטעיתי אותך. אם אתה רוצה את תאריך הכניסה האחרונה למלאי כדי שמדווח בכרטיס הפריט, בדו"ח אתה צריך להציג את PARTPARTAM.PURTRANSDATE מבלי להתחכם. למען האמת, אתה בכלל לא צריך פרוצדורה מפני שניתן לחשב ולהציג את סך המכירות לפריט בתוך דו"ח בלי שלב פרוצדורלי מקדים.אבל אם אתה רוצה להציג את תאריך תנועת המלאי האחרונה מסוג מסוים, עליך לעבוד קצת יותר קשה. אני מניח שנעשה LINK בין PART לבין PAR.$: ואתה מחשב את סה"כ המכירות לפריט באמצעות קורסור (אם כי זה מיותר). צריך להוסיף קטע כמו
:MAXDATE = 0;
SELECT MAX (DOCUMENTS.CURDATE) INTO :MAXDATE
FROM DOCUMENTS, TRANSORDER
WHERE DOCUMENTS.DOC = TRANSORDER.DOC
AND DOCUMENTS.TYPE = TRANSORDER.TYPE
AND TRANSORDER.TYPE = 'D'
AND TRANSORDER.PART = :PART;כמובן מחליפים את D בסוג התנועה שאתה רוצה. אחר כך MAXDATE נשמר בטבלת STACK4 (או אחרת) בה שמרת את סה"כ המכירות לפריט.
- נובמבר 2, 2021 בשעה 11:11 am
זה קוד שרץ על כל המקטים שבחרתי בקלט ומעדכן שדה ZMAN_LASTTRANSDATE שהוא תאריך כניסה אחרונה , בינתיים שמתי תאריך היום ומשום מה הוא לא מעדכן (אחרי זה אני שם את הקוד שרשמת למעלה , בינתיים אני מנסה על תאריך היום) , אולי יוצא לך לבדוק מה הבעיה בקוד שלי ::PARTID = 0 ;
LINK PART TO :$.PRT ;
ERRMSG 1 WHERE :RETVAL <= 0;
SELECT PART
INTO :PARTID
FROM PART
WHERE PART > 0 ;
DECLARE BSH_CUR CURSOR FOR
SELECT PART FROM PART
WHERE PART = :PARTID ;
OPEN BSH_CUR ;
GOTO 940 WHERE :RETVAL <= 0 ;
LABEL 140 ;
:BSH_PART = 0 ;
FETCH BSH_CUR INTO :BSH_PART ;
GOTO 840 WHERE :RETVAL <= 0 ;
UPDATE PART SET ZMAN_LASTTRANSDATE = SQL.DATE8
WHERE PART = 1412 ;
LOOP 140 ;
LABEL 840 ;
CLOSE BSH_CUR ;
LABEL 940 ;- התגובה הזו עודכנה לפני לפני 3 שנים ע"י סמי.
- נובמבר 2, 2021 בשעה 11:17 am
רק תתעלם מ WHERE PART = 1412נסיתי WHERE PART = :BSH_PART ולא עבד
- נובמבר 2, 2021 בשעה 11:18 am
אמנם זה לא קשור לשאלה המקורית שלך, אבל השורות SELECT PART
INTO :PARTID
FROM PART
WHERE PART > 0 ;מיותרות. אפשר להשתמש בטבלת PART בקורסור שיציג את כל הפריטים שנבחרו זה אחר זה.
מעבר לכך, פקודת ה-UPDATE בעייתי משלוש סיבות – (א) למה רק פריט 1412? (ב) למה תאריך היום? (ג) הכי חשוב – כיון שבשלב הזה PART היא טבלה מלונקקת, אתה מעדכן אותה ולא את הטבלה האמיתית. צריך לכתוב UPDATE PART ORIG כאשר ORIG הוא כינוי (alias) אשר אומר להשתמש בטבלה האמיתית.
- נובמבר 2, 2021 בשעה 11:19 am
זה הקוד האמיתי ::PARTID = 0 ;
LINK PART TO :$.PRT ;
ERRMSG 1 WHERE :RETVAL <= 0;
SELECT PART
INTO :PARTID
FROM PART
WHERE PART > 0 ;
DECLARE BSH_CUR CURSOR FOR
SELECT PART FROM PART
WHERE PART = :PARTID ;
OPEN BSH_CUR ;
GOTO 940 WHERE :RETVAL <= 0 ;
LABEL 140 ;
:BSH_PART = 0 ;
FETCH BSH_CUR INTO :BSH_PART ;
GOTO 840 WHERE :RETVAL <= 0 ;
UPDATE PART SET ZMAN_LASTTRANSDATE = SQL.DATE8
WHERE PART = :BSH_PART ;
LOOP 140 ;
LABEL 840 ;
CLOSE BSH_CUR ;
LABEL 940 ;- נובמבר 3, 2021 בשעה 7:56 am
אפילו בלי PART = 1412, הקוד מציג אי הבנה לגבי LINK וקורסור. אם יש רק פריט אחד בטבלה המלוננקת, אתה לא צריך את הקורסור. אם יש יותר מפריט אחד בטבלה, הקורסור יפעל על פריט אחד בלבד – בגלל התנאי WHERE PART = :PARTID. בכל מקרה העדכון לא יעשה כלום כי אתה מעדכן את הטבלה המלונקקת, לא את הטבלה האמיתית.להלן קוד נכון, בלי קשר אם יש רק פריט אחד או רבים
LINK PART TO :$.PAR;
ERRMSG 1 WHERE :RETVAL <= 0;
DECLARE BSH_CUR CURSOR FOR
SELECT PART
FROM PART
WHERE PART > 0;
OPEN BSH_CUR;
GOTO 940 WHERE :RETVAL <= 0;
LABEL 140;
FETCH BSH_CUR INTO :BSH_PART;
GOTO 840 WHERE :RETVAL <= 0;
UPDATE PART ORIG
SET ZMAN_LASTTRANSDATE = SQL.DATE8
WHERE PART = :BSH_PART;
LOOP 140;
LABEL 840;
CLOSE BSH_CUR;
LABEL 940;
UNLINK PART;
תגיות: מחולל דוחות
- יש להתחבר למערכת על מנת להגיב.