NoamN

Forum Replies Created

מוצגות 15 תגובות – 106 עד 120 (מתוך 447 סה״כ)
  • Replies
  • NoamN
    משתתף
    none
    עלי להזהיר מראש ששינוי כותרת במסך סטנדרטי אינו פעולה שקיבלה "הכשר" מפריוריטי.

    משנים במסך מנהל המערכת > מחוללים > מסכים > מחולל מסכים, או על ידי לחיצת F6 בתפריט. מגיעים אל השדה ורושמים את התאור החדש בשדה "כותרת חדשה".

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

    NoamN
    משתתף
    none
    אני משער שהבעיה נמצאת בשורה FROM ZZZ_ALINE: האם את יודעת בוודאות שיש רשומה מתאימה בטבלה הזו? אני משער שאין. יהיה יותר פשוט לכתוב

    :TTIME = SQL.DATE MOD 24:00

    בלי ה-SELECT ו-FROM. אפשר לבצע SELECT מטבלת DUMMY שאמור להצליח אבל לא צריך ללכת כל כך רחוק.

    אפשר גם לבטל את כל ה-GOTO למיניהם באמצעות תנאי משולש שלא יוצא טוב כאן.

    :$.SHIFT = (:TTIME BETWEEN 06:00 AND 17:59 ? 1 : 2);

    NoamN
    משתתף
    none
    בשדה "תעודה" (זאת אומרת, איפה שמוצג מספר הזמנה, מספר תעודה וכו') את אמורה להגדיר מסך יעד ZOOM1 ואז מסך היעד נפתח עם התעודה המתאימה. אולי הגדרת את ה"מסך" הזה בשדה אחר?
    NoamN
    משתתף
    none
    הגישה של IVTYPES/DOCTYPES לא עוזרת ברגע שיש משהו בנוסף.

    יש לך ביטוי כלשהו שמבדיל בין הזמנות לבין תעודות משלוח (נניח שיש רק שתי טבלאות). לצורך הענין נגיד שהמבדיל נמצא בשדה :$.A. אם כך, את צריכה כך:

    עמודת המסך :$.ENAME. עמודת טבלה ENAME, שם טבלה EXEC. ביטוי

    = (:$.A = 1 ? 'ORDERS' : (:$.A = 2 ? 'DOCUMENTS_D' ?
    (:$.A = 3 ? 'CINVOICES' : 'NULL')))

    כמוכן נדרש שורה EXEC.TYPE = 'F'. בביטוי למעלה, רושמים את שם מסך היעד. תסתכלי על הבלוג שכתבתי בהתחלה, https://progpitfalls.blogspot.com/2021/08/defining-dynamic-target-form-name-for.html

    NoamN
    משתתף
    none
    אפילו בלי 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;

    NoamN
    משתתף
    none
    מצאתי איך לעשות זאת

    לני שמתעניין –

    SELECT EXTMSG.MESSAGE
    FROM PRINTFORMAT, EXTMSG
    WHERE EXTMSG.EXEC = PRINTFORMAT.EXEC
    AND EXTMSG.NUM = PRINTFORMAT.VALUE
    AND EXTMSG.EXEC = (SELECT EXEC FROM EXEC
    WHERE TYPE = 'P' AND ENAME = '$')
    AND PRINTFORMAT.USER = SQL.USER

    $ הוא קיצור לשם הפרוצדורה הנוכחית, לכן מחפשים את ערכו של EXEC כאשר ENAME = $. כך ניתן להשתמש בקוד במסמכים רבים, בשלב SQLI של המסמך.

    NoamN
    משתתף
    none
    בדקתי כמה תכניות שלי שמדפיסות מדבקות והן כולן מפעילות את LABELS בשלב פרוצדורלי נפרד, לא באמצעות EXECUTE. זה לא עוזר לך אם אכן הקוד מופעל מתוך טריגר.

    יש לי הצעה אחרת: תבנה פרוצדורה רגילה שמקבלת מספר מזהה (לא ציינת מאיזה מסך אתה מדפיס, אבל זה יכול להיות מספר הזמנה או משהו דומה) בפרמטר PAR ומבצעת את כל מה שנדרש, כולל הפעלת LABELS בשלב נפרד. בטריגר המסך, תפעיל את הפרוצדורה הזו בשיטה הבאה

    SELECT SQL.TMPFILE INTO :TMPORDERS FROM DUMMY;
    LINK ORDERS TO :TMPORDERS;
    GOTO 999 WHERE :RETVAL <= 0;
    INSERT INTO ORDERS
    SELECT * FROM ORDERS ORIG
    WHERE ORD = :$.ORD;
    EXECUTE WINACTIV '-P', 'your procedure name', 'ORDERS',
    :TMPORDERS;
    UNLINK ORDERS;

    NoamN
    משתתף
    none
    אמנם זה לא קשור לשאלה המקורית שלך, אבל השורות SELECT PART
    INTO :PARTID
    FROM PART
    WHERE PART > 0 ;

    מיותרות. אפשר להשתמש בטבלת PART בקורסור שיציג את כל הפריטים שנבחרו זה אחר זה.

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

    NoamN
    משתתף
    none
    אני רואה שהטעיתי אותך. אם אתה רוצה את תאריך הכניסה האחרונה למלאי כדי שמדווח בכרטיס הפריט, בדו"ח אתה צריך להציג את 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 (או אחרת) בה שמרת את סה"כ המכירות לפריט.

    NoamN
    משתתף
    none
    תרשום M בשדה "חישוב עמודה" אשר אמור לתת לך את הערך המירבי לשדה אם כי יכול להיות השפעה על שדות אחרים.

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

    NoamN
    משתתף
    none
    יש לפריוריטי שני מסכים לחיפוש, כאשר הבחירה ביניהם תלויה באם מדובר בישות "אינסופית" (כמו לקוחות, פריטים וספקים) או "סופית" (כמו סוגי הזמנה או סניפים). ניתן לקבוע את המספר המירבי לערכים שיופיעו במסך השני ע"י קבוע מערכת.

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

    באיזה שדה באיזה מסך את מחפשת? באיזו גרסה?

    NoamN
    משתתף
    none
    בחלון חיפוש יש בדרך כלל שאלה לגבי אותיות גדולות וקטנות – זה אמור לענות לך על הצורך.
    NoamN
    משתתף
    none
    בדרך כלל דו"ח כזה צריך להכיל כמה שפחות שדות וכנראה יש לך משהו שמשתנה באמצע.

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

    אם רוצים דו"ח שמציג רק סיכומים, צריך להוציא את מספר ותאריך ההזמנה ואת מספר הלקוח מהדו"ח. במקביל צריך להסיר את ה-S מ"חישוב קבוצתי" (אלא אם רוצים סה"כ לכל הדו"ח) ולהוסיף S בשדה "חישוב עמודה" עבור כמות וסכום.

    NoamN
    משתתף
    none
    לא נראה לי שיש "מחולל דו'חות לוקח" כך כתיבת דו"ח שמציג מספר/שם לקוח + ח.פ. תדרוש פיתוח – חמש דקות עבור מישהו שיודע מה הוא עושה אך בלתי אפשרי למי שלא מכיר איך לכתוב דו"חות.

    יותר קל לשלוף את הלקוחות שיש להם ח.פ. יותר גדול מ-0 ולייצא את התוצאות לאקסל.

    NoamN
    משתתף
    none
    לגבי ימים בהם אין תעודת מלאי, הייתי משתמש בגישה תכנותית (לולאה) ולא גישה SQLית (בניית טבלה של תאריכים ושאילת NOT EXISTS מול הטבלה הזו.
מוצגות 15 תגובות – 106 עד 120 (מתוך 447 סה״כ)