Forum Replies Created
- Replies
-
כעת הפקודה נראית כך
X:\BIN.95\WINRUN "" tabula 123456 x:\system\prep demo WINACTIV -P TEST_UPDCONST set TABULAINI=x:\1\tabula.ini set tabulainiorig=x:\1\tabula.ini
כאשר לקחתי את tabula.ini מהשרת עצמו, כך שם המשתמש בפנים tabula. זה לא עזר.
האם צריך להיות SET באמצע הפקודה? אם או בלי, זה לא עזר.
- נובמבר 10, 2021 בשעה 3:23 pm
- in reply to: שמירת קוד משותף לכמה פרוצדורות
דרך אגב, $ פירושו "שם התכנית הנוכחית". לפעמים אפשר לנצל את העובדה הזו ולפעמים זה יוצר בעיות. פעם נדרשתי להכין ברקוד שהכיל את כתובת החברה, אבל אין בגופן הברקוד אפשרות להדפיס את @, לכן זה הוחלף ב-$. בהתחלה כמובן תוכן הברקוד הכיל את שם התכנית באמצע הכתובת.לקח לי קצת זמן למצוא שיטה להתגבר על זה – בסוף הגדרתי הודעה לפרוצדורה שהמלל שלו $ והטענתי אותו באמצעות SELECT ENTMESSAGE שבעצמו משתמש ב-$.
- נובמבר 10, 2021 בשעה 1:51 pm
- in reply to: שמירת קוד משותף לכמה פרוצדורות
היה עוזר לו היינו רואים את הקוד כי אחרת אנחנו מגששים באפלה. אתה כותב שיש לינק לטבלת SUPPLIERS. אפשר לכתוב משהו שנראה מוזר אבל יכול לעבוד – במקום לכתובLINK SUPPLIERS TO :$.SUP
תכתוב :MYSUP = :$.SUP בפרוצדורה שלך, ובקוד המשותף תכתוב LINK SUPPLIERS TO :MYSUP
הרי בפנים :$.SUP מכיל שם של קובץ במערכת הקבצים וניתן להעתיק אותו.
כמה נתונים נוספים: אנחנו עובדים עם הממשק הקלאסי, עם טרמינל סרברים. פקודת ה-WINRUN עובדת נכון כאשר אני מריץ אותה מהטרמינל.בניתי את המחרוזת הנדרשת ל-WINRUN, כולל שם משתמש tabula וסיסמא. אני מריץ את הפקודה ומקבל את תיבת השיחה LOG ON TO PRIORITY עם שדות לשם משתמש וסיסמא. זאת אומרת, אפילו שאני רושם את הנתונים האלה כפרמטרים, יש התעלמות. הפקודה נראית משהו כזהx:\bin.95\winrun "" tabula 123456 x:\system\prep WINACTIV -P TEST_PROCEDURE
(הסיסמא של טבולה לא באמת 123456!). אולי צריך להגדיר tabula.ini? ואם כן, של מי? הפקודה מופעלת מתחנה שמחוברת לרשת אבל אינה מפעילה את פריוריטי (כל הרעיון של התכנית הינו לא להפעיל את הממשק של פריוריטי).
זה בדיוק מה שאני מחפש (WINRUN). לא הכרתי את הקטע הזה ב-SDK.- נובמבר 9, 2021 בשעה 1:58 pm
- in reply to: שמירת קוד משותף לכמה פרוצדורות
אני לא מסכים אתך: יש קוד מסוים ששמרתי כהפעלה מתוך מסך func אשר משתמש בקורסור עם הפקודה DECLARE @NCRC1 CURSOR ואין בעיה בפרוצדורה שקוראת להפעלה הזו באמצעות #INCLUDE func/TEST_NEWCALCRELCOST.אני לא כל כך אוהב את הטכניקה הזו מפני שהקוד נמצא במסך: לאחר עריכה, עלי להריץ בניית מסכים מחדש, וזה גורם להודעה מסוימת אצל המשתמשים (לכן אני מוסיף/מתקן/משפר מסכים רק בערב או בסוף השבוע). לעומת זאת, פיתחתי טכניקה של קריאת פרוצדורה נוספת לבצע עבודה משותפת. לדוגמא, אפשר לכתוב קוד כמו
LINK ORDERS TO :$.ORD;
ERRMSG 1 WHERE :RETVAL <= 0;
INSERT INTO ORDERS (ORD, ORDNAME)
SELECT ORIG.ORD, ORIG.ORDNAME
FROM ORDERS ORIG, STACK
WHERE ORIG.ORD = STACK.ELEMENT
AND ORIG.ORD > 0;
EXECUTE WINACTIV '-P', 'TEST_MUTUALCODE', 'ORDERS',
:$.ORD;
UNLINK ORDERS;אחרי ששאלתי את השאלה (בפעם השניה – הפעם הראשונה לא נקלטה), הבנתי שמדובר בהפעלת התכנית "בסביבת" פריוריטי, כאשר מפעיל התכנית כבר מחובר (לכן אין צורך בשם משתמש או סיסמא). זה לא עוזר לי בכלום.בסופו של דבר, התפשרתי על המצב בו תכנית חיצונית שומרת קובץ בתיקיה ידועה כאשר פרוצדורה בתוך פריוריטי סורקת את אותה התיקיה בתדירות הדומה לתדירות הפקת הקובץ. אבל זה לא מה שרציתי. המצב האידיאלי היה שהתכנית החיצונית יוצרת את הקובץ ומפעילה בעצמה את התכנית לקליטה בפריוריטי. יש לכך השלכות לגבי הנתונים הכלולים בתוך הקובץ.
לעומת זאת, אני יודע שהפעלה מרחוק אפשרית מפני שאנחנו מפעילים את מערכת סמדר, אשר סורקת מסמכים ובאמצעות הברקוד יודעת לשייך את הסריקה לנספחים של התעודה עצמה (המסמך בדרך תעודת משלוח חתומה ע"י הלקוח וכך התעודה החתומה נשמרת בנספחים של התעודה). אני זוכר שהגדרתי שם את הסיסמא של טבולה.
- נובמבר 7, 2021 בשעה 5:47 pm
- in reply to: דוח מלאי מצטבר והזמנות לקוח פתוחות לפריטים
INSERT INTO STACK4 (KEY, REALDATA)
SELECT WARHSBAL.PART, REALQUANT (SUM (WARHSBAL.BALANCE))
FROM WARHSBAL, WAREHOUSES
WHERE WARHSBAL.WARHS = WAREHOUSES.WARHS
AND WAREHOUSES.WARHSNAME IN (‘Main’, ‘WHS2’, ‘WH3’)
AND WARHSBAL.BALANCE > 0
AND WARHSBAL.CUST = -1 /* Goods */
GROUP BY 1;
INSERT INTO STACK2 (ELEMENT, TYPE)
SELECT PART, SUM (REALQUANT (TBALANCE))
FROM ORDERITEMS
AND TBALANCE > 0
AND CLOSED <> ‘C’
GROUP BY 1;נניח שביצענו את ה-LINKS הנדרשים בהתחלה. בדו"ח צריך להשתמש בחיתוך מותנה – STACK4.KEY = STACK2.ELEMENT ? כדי שיהיו כל הפריטים שיש להם מלאי אפילו אם אין להם הזמנות פתוחות.
אולי יותר מהר בביצוע אבל פחות ברור לתכנות וגם קצת "שביר". ומה קורה כאשר רוצים להציג נתן נוסף כמו שימוש ממוצע (גריעות במלאי) על פני תקופה נוספת? במקרים כאלה, הפתרון הראשון שלי עדיף כי בגוף הקורסור ניתן לאסוף כל מיני נתונים שאינם קשורים אחד לשני, מלבד הפריט.
- נובמבר 7, 2021 בשעה 2:02 pm
- in reply to: דוח מלאי מצטבר והזמנות לקוח פתוחות לפריטים
למדתי מאד מוקדם בקרירה שאין לכתוב דו"ח שמסוכם שני דברים לא קשורים אלא צריך לכתוב פרוצדורה שתעשה זאת. נניח שיש קורסור שעובר על פריטים: בתוך הלולאה אתה סוכם את המלאי בשאילתא אחת, סוכם את ההזמנות בשאילתא ואז כותב את הנתונים לבטלת מעבר. אפשר להקל קצת אם אתה רוצה רק פריטים שנמצאים במלאי כלהלןDECLARE CUR CURSOR FOR
SELECT WARHSBAL.PART, REALQUANT (SUM (WARHSBAL.BALANCE))
FROM WARHSBAL, WAREHOUSES
WHERE WARHSBAL.WARHS = WAREHOUSES.WARHS
AND WAREHOUSES.WARHSNAME IN ('Main', 'WHS2', 'WH3')
AND WARHSBAL.BALANCE > 0
AND WARHSBAL.CUST = -1 /* Goods */
GROUP BY 1;
OPEN CUR;
GOTO 300 WHERE :RETVAL <= 0;
LABEL 100;
FETCH CUR INTO :PART, :STOCK;
GOTO 200 WHERE :RETVAL <= 0;
:ORD = 0.0;
SELECT SUM (REALQUANT (TBALANCE)) INTO :ORD
FROM ORDERITEMS
WHERE PART = :PART
AND TBALANCE > 0
AND CLOSED <> 'C';
INSERT INTO STACK4 (KEY, REALDATA, REALDATA2)
VALUES (:PART, :STOCK, :ORD);
LOOP 100;
LABEL 200;
CLOSE CUR;
LABEL 300;בקורסור אתה סוכם את הכמות במלאי. אחר כך אתה סוכם את הכמות בהזמנות ושומר אותה במשתנה שאופס בכל סיבוב בלולאה, כך לפריט שאין הזמנות פתוחות תהיה כמות 0.
- נובמבר 4, 2021 בשעה 1:48 pm
- in reply to: שינוי שם בכותרת עמודה
עלי להזהיר מראש ששינוי כותרת במסך סטנדרטי אינו פעולה שקיבלה "הכשר" מפריוריטי.משנים במסך מנהל המערכת > מחוללים > מסכים > מחולל מסכים, או על ידי לחיצת F6 בתפריט. מגיעים אל השדה ורושמים את התאור החדש בשדה "כותרת חדשה".
יחד עם זאת, יש כמה רמות של שינוי. השינוי הזה יבוא לידי ביטוי במסך "כרטיס פריט" בלבד, לא במסך "מוצרים" ולא בדו"חות שמציגים את השדה. כדי לשנות באופן גורף, צריך להפעיל את מנהל המערכת > מחוללים > טבלאות > מחולל עמודות > שנוי כותרת עמודה.
- נובמבר 4, 2021 בשעה 1:01 pm
- in reply to: ניהול משמרות
אני משער שהבעיה נמצאת בשורה FROM ZZZ_ALINE: האם את יודעת בוודאות שיש רשומה מתאימה בטבלה הזו? אני משער שאין. יהיה יותר פשוט לכתוב:TTIME = SQL.DATE MOD 24:00
בלי ה-SELECT ו-FROM. אפשר לבצע SELECT מטבלת DUMMY שאמור להצליח אבל לא צריך ללכת כל כך רחוק.
אפשר גם לבטל את כל ה-GOTO למיניהם באמצעות תנאי משולש שלא יוצא טוב כאן.
:$.SHIFT = (:TTIME BETWEEN 06:00 AND 17:59 ? 1 : 2);
- נובמבר 4, 2021 בשעה 10:55 am
- in reply to: כמה מסכי יעד לשדה אחד
בשדה "תעודה" (זאת אומרת, איפה שמוצג מספר הזמנה, מספר תעודה וכו') את אמורה להגדיר מסך יעד ZOOM1 ואז מסך היעד נפתח עם התעודה המתאימה. אולי הגדרת את ה"מסך" הזה בשדה אחר?- נובמבר 3, 2021 בשעה 12:57 pm
- in reply to: כמה מסכי יעד לשדה אחד
הגישה של 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
- נובמבר 3, 2021 בשעה 7:56 am
- in reply to: הצגת כניסה אחרונה למלאי במחולל דוחות
אפילו בלי 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;