› פורומים › אפיון ופיתוח פריוריטי › בעיה בטעינת נתונים למסך – ממשק מסכי
- This topic has 15 תגובות, 2 משתתפים, and was last updated לפני 5 שנים, חודש 1 by dandan.
- Post
-
- אוקטובר 3, 2019 בשעה 2:10 pm
שלום רב,יצרתי ממשק מסכי – למסך אריזות ללקוח.
יש SQLI לפני שאוסף נתוני הזמנות.
הנתונים נשלחים בהצלחה לטבלה (נבדק ע"י ייצוא לקובץ TXT)
בממשק, הנתון של מספר הזמנה מוגדר לעמודת מסך הזמנה
מסיבה שאינה ברורה, הנתונים אינם נטענים למסך.
חשוב לציין כי מדובר בהזמנות מאושרות שניתן לפתוח להן תעודות אריזה כאשר מזינים ידנית למסך.
מתקבלת הודעה בדוח השגיאות – חסר מספר לקוח. – לא מובן, מספר הלקוח מתמלא אוטומטית עם הזנת ההזמנה.
ניסיתי לטעון גם את מספר הלקוח, אך עדיין מתקבלת אותה הודעה השגיאה
ניסיתי גם לטעון לשדה KEY1 בטבלת GENERALLOAD, ואז מתקבלת הודעה אחרת, הערך הוא המפתח של הלקוח.
בנוסף,
לא מובן למה יש הודעה רק על שורה אחת, כאשר מסומן להתעלם מאזהרות ולדלג על שורות.
אודה לעזרתכם.
בברכה,
דן.
עבור הזמנה 204315: ערך '204315' לא קיים בעמודה 'עבור הזמנה' בטבלת 'הזמנות לקוח'.
- Replies
-
- אוקטובר 4, 2019 בשעה 1:29 pm
לעניות דעתי, הודעת השגיאה כן אומרת מה הבעיה. בדרך כלל יש קידומת להזמנות, כמו SO19, מה שאין בהודעה. נראה שאתה מנסה להכניס את הערך של ORDERS.ORD לתוך השדה במקום ORDERS.ORDNAME. יש לך שתי חלופות: או להכניס את ORDNAME לתוך השדה ולהשאיר את הממשק כמושהו, או לא לשנות את GENERALLOAD אך לשנות את הממשק כדי להשתמש בשדה הנסתר ORD.- אוקטובר 6, 2019 בשעה 8:36 am
אהלן,כפי שציינתי, ההודעות מתקבלות כאשר אני מנסה לטעון את מספר ההזמנה – כלומר ORDNAME.
ניסיתי גם לטעון את ORD, אך עדיין מתקבלת הודעת שגיאה.
אשמח לעזרתכם הדחופה.
תודה,
דן.
- אוקטובר 6, 2019 בשעה 8:49 am
מוטב להציג את הקוד ואת הגדרת הממשק – אחרת אנחנו רק מקשקשים באפלהפעם כתבתי תכנית להקמת תעודת אריזה. הממשק מקושר לשני מכסים: DOCUMENTS_A ו-TRANSORDER_A. אין בכלל התיחסות למספר הזמנת לקוח. בשורות, התכנית מעבירה את ORDERITEMS.ORDI אל TRANSORDER_A.
- אוקטובר 6, 2019 בשעה 10:41 am
התוכנית מזינה נתונים לטבלת GENERALLOAD.מדובר על רקורסיה שמושכת את כל ההזמנות עם תאריך האספקה של היום.
המהות של ממשק מסכי היא לדמות שימוש משתמש, בהתאם לכך, השדה המתאים הוא מספר הזמנה(בהנחה שהאריזה מבוססת על הזמנה).
עם הזנת מספר ההזמנה כאסמכתא, קיים טריגר מובנה במסך שטוען את שורות ההזמנה – עם כמות 0 כמובן.
הנתונים נכנסים לטבלה, אך לא נטענים.
אשמח לראות את הקוד שרשמת.
יש למישהו רעיון איך ניתן לפתור את העניין?
- אוקטובר 6, 2019 בשעה 11:05 am
INSERT INTO GENERALLOAD (RECORDTYPE,LINE,TEXT1,TEXT2, TEXT3,KEY1)
VALUES ('1', :LINE,:ORDNAME, 'LUMN',:CUSTNAME,:ORDNAME);טעינת הנתונים למסך אריזות DOCUMENTS_A
מזהה רשומה 1
עמודת טבלת טעינה – TEXT1
עמודת מסך- ORDNAME
- אוקטובר 6, 2019 בשעה 11:07 am
אני לא יודע מה הכוונה לרקורסיה כאן.הנה קוד פשוט אשר אמור לבצע את הנדרש לפי התאור שלך (לא בדקתי את הקוד אבל נראה לי תקין)
<p style="text-align: left;">:LINE = 0;
LINK GENERALLOAD …
DECLARE CUR CURSOR FOR
SELECT ORDERS.CUST, ORDERITEMS.ORDI
FROM ORDERS, ORDERITEMS
WHERE ORDERS.ORD = ORDERITEMS.ORD
AND ORDERITEMS.DUEDATE = SQL.DATE8
AND NOT EXISTS (SELECT 1 FROM TRANSORDER</p>
<p style="text-align: left;">WHERE TRANSORDER.ORDI = ORDERITEMS.ORDI</p>
<p style="text-align: left;">AND ORDERITEMS.CLOSED <> 'C'
AND TRANSORDER.TYPE IN ('A', 'D'))
AND ORDERITEMS.ORDI > 0
ORDER BY 1, 2;
OPEN CUR;
GOTO 300 WHERE :RETVAL <= 0;
:OLDCUST = 0;
LABEL 100;
FETCH CUR INTO :CUST, :ORDI;
GOTO 200 WHERE :RETVAL <= 0;
GOTO 110 WHERE :CUST = :OLDCUST;
:OLDCUST = :CUST;
:LINE = :LINE + 1;
INSERT INTO GENERALLOAD (LINE, RECORDTYPE, INT1)
VALUES (:LINE, '1', :CUST);
LABEL 110;
:LINE = :LINE + 1;
INSERT INTO GENERALLOAD (LINE, RECORDTYPE, INT1)
VALUES (:LINE, '2', :ORDI);
LOOP 100;
LABEL 200;
CLOSE CUR;
EXECUTE INTERFACE ……
SELECT MESSAGE INTO :PAR1 FROM ERRMSGS
WHERE USER = SQL.USER AND TYPE = 'i';
WRNMSG 99 WHERE :RETVAL > 0;
LABEL 300;
UNLINK GENERALLOAD;</p>
<p style="text-align: right;">אפשר להתחכם ולבצע INSERT INTO/SELECT, דהיינו משיכת כל שורות ההזמנות השייכות ללקוח נתון עם תאריך אספקה היום.</p>- אוקטובר 6, 2019 בשעה 11:36 am
הצגתי רק את שורת הטעינה, מדובר על קוד ארוך.לפי הקוד שלך, אתה מדלג על טריגרים של המערכת וטוען ישירות למסך הבן, לא?
הרי כאשר משתמש מבסס אריזה על הזמנה, מזינים את מספר ההזמנה כאסמכתא.
דרך אגב, ניסיתי גם לטעון את מספר הלקוח והתקבלה אותה הודעת שגיאה.
ניסיתי בנוסף לטעון לטבלאות אחרות, אך הבעיה לא שם.
משהו מאוד מוזר..
- אוקטובר 6, 2019 בשעה 11:45 am
מצ"ב הקוד.LINK DISTRLINES TO :$.LIN;
LINK STACK9 TO :$.STK;
LINK GENERALLOAD TO :$.GEN;
DELETE FROM GENERALLOAD;
:DISTRLINE = :LINE = :ORD = 0;
:ORDNAME = :RECORDTYPE = :CUSTNAME = :KEY = ";
SELECT DISTRLINE INTO :DISTRLINE FROM DISTRLINES
WHERE DISTRLINE <> 0;
DECLARE CUR CURSOR FOR SELECT ORDNAME,CUSTNAME, O.ORD
FROM ORDERS O, ORDERSB OB,CUSTOMERS C
WHERE O.ORD = OB.ORD
AND OB.DISTRLINE = :DISTRLINE
AND OB.DUEDATE = :$.DAT
AND O.CUST = C.CUST
AND ORDSTATUS = 1;
OPEN CUR;
GOTO 200 WHERE :RETVAL <= 0;
LABEL 10;
FETCH CUR INTO :ORDNAME,:CUSTNAME, :ORD;
GOTO 200 WHERE :RETVAL <= 0;
:LINE = :LINE + 1;
INSERT INTO GENERALLOAD (RECORDTYPE,LINE,KEY1,TEXT1,TEXT2,
TEXT3,INT1)
VALUES ('1', :LINE,:ORDNAME,:ORDNAME, 'LUMN',:CUSTNAME,:ORD);
LOOP 10;
LABEL 200;
CLOSE CUR;
EXECUTE INTERFACE 'PANL_PACK', '-L',:$.GEN;
SELECT RECORDTYPE,LINE, KEY1,TEXT1,TEXT2,TEXT3 FROM GENERALLOAD
FORMAT 'D:/TMP/TEST1212.TXT';
UNLINK ORDERSB;
UNLINK GENERALLOAD;- אוקטובר 6, 2019 בשעה 1:11 pm
יש כמה בעיות עם הקוד – לא ברור עד כמה הן משפיעות.לגבי DISTRLINES – הייתי חולץ את הערך היחיד לתוך משתנה (ולבדוק שקיים ערך!) בתחילת הפרוצדורה ולבצע UNLINK ישר לאחר מכן.
אתה מבצע UNLINK לטבלה שלא "לונקקה" אך לא מבצע על טבלאות שכן "לונקקו".
אל תכניס ערכים לשדה KEY1 – השדה הזה מתמלא לאחר הממשק עם מספר ההזמנה (דהיינו ORD, לא ORDNAME). אני חושש שזו הבעיה העיקרית.
לגבי הקוד שלי – הטריגרים המובנים של המסך עובדים, אין עקיפה.
- אוקטובר 6, 2019 בשעה 4:30 pm
נמחקו כנראה כמה שורות בהעתקה,כל טבלה עוברת לינק ו unlink.
לגבי KEY1, מדובר על מספר ניסיונות לבצע טעינה.
גם בלי השדה הזה, הנתונים לא נטענים מטבלת GENERALLOAD למסך אריזות.
הקוד עובד ותקין, הנתונים מוזנים בהצלחה לטבלת GENERALLOAD, נראה שיש איזו בעיה עם הממשק עצמו.
- אוקטובר 7, 2019 בשעה 11:41 am
חסר פרמטר ל-INTERFACE. תנסה כךEXECUTE INTERFACE 'PANL_PACK', SQL.TMPFILE, '-L',:$.GEN
בנוסף, לא יודעים איך הגדרת את הממשק. לעניות דעתי, צריך להעביר רק את ORD ולתת למסך לבצע את כל העבודה.
- אוקטובר 15, 2019 בשעה 8:20 am
אהלן,ניסיתי גם עם הפרמטר וזה לא עובד.
טעינה בכל מקרה אמורה להיות לשדה שאינו מוסתר, ORDNAME זה השדה המרכזי לאסמכתא באריזות ללקוח.
מישהו יכול לעזור עם הנושא???
תודה,
דן.
- אוקטובר 15, 2019 בשעה 8:32 am
"טעינה בכל מקרה אמורה להיות לשדה שאינו מוסתר" – לא נכון. אתה יכול להגדיר בממשק שדה ORD – תקבל הודעה שהשדה נסתר אבל אפשר להמשיך הלאה.אני מודה שלא צריך להיות הבדל בין ממשק עם ORDNAME בלבד לעומת ממשק עם ORD בלבד. מה שכן, לא נדרשים שדות מעבר לכך.
האם אתה מנסה לקלוט את אותה ההזמנה כל הזמן או שמא ניסית עם הזמנות אחרות? מה קורה כאשר אתה נכנס למסך תעודות אריזה ורושם את מספר ההזמנה – האם נפתחת תעודה או יש הודעה כלשהי? אני מנסה לבודד את הבעיה – לא נראה לי שהממשק לא תקין אז אולי ההזמנה עצמה לא תקינה או שיש הפעלה מוזרה בתוך המסך.
- יש להתחבר למערכת על מנת להגיב.