מועתק התוכן של FIELDA
, , אל FIELDB,
כפי שהוסבר בקטע הקודם.
למרות שהדבר פחות ברור מאליו, עובר התוכן
המדוייק של השדה השולח אל השדה
המקבל. שדה זה מתפרש כ-12.34 (זכור,
כי הנקודה העשרונית אינה מופיעה, למעשה,
בזיכרון.) במילים אחרות: הוראת
MOVE זו
ערוכה בצורה עשרונית (דצימלית, עם נקודה
עשרונית).
לפי
כלל 1 , ההעברה
תתבצע מימין לשמאל:
א)
הספרה 3 מ FIELD1
מחליפה את ה-7 ב- FIELD2
ב)
הספרה 2 מ-FIELD1
מחליפה את ה-6 ב-FIELD2.
ג)
הספרה 1מ-FIELD1 מחליפה את ה-5 ב-FIELD2.
כל
המקומות מסדד גבוה יותר מקבלים ערך אפס;
ד)
ה-4 ב-FIELD2
יוחלף ב-0.
בצורה
זו, יתקבל לאחר הביצוע המספר0123
ב FIELD2
שום חלק מתוכנו המקורי של השדה אינו נשמר
לאחר הביצוע.
א)
ה-2 שב-FIELD3
יחליף את ה-4 ב- FILED4.
ב)
ה-1ש ב- FIELD3
יחליף את ה-3 ב-FIELD4.
הביצוע
מסתיים בנקודה זו, כי השדה המקבל התמלא.
התוכן של FIELD4 הוא כעת 12,
בעוד FIELD3 נשאר
ללא שינוי.
בדוגמה
זו, השדה המקבל הוא בן 3 תווים בלבד. מאחר
שתווים של מספרים משמאל לנקודה מועברים
מימין לשמאל, התוכן שמוכנס ל-AMT-OF-CHECK
יהיה 000. ברור, שמקבל המחאה בסכום זה לא
יהיה מרוצה. כדי למנוע קושי מסוג זה, יש
לוודא, כי השדה המקבל יהיה לפחות בגודלו
של השדה השולח.
החלק
השלם של FLDA
מחליף את זה של FLDB,
לפי כלל 1 שלעיל. החלק העשרוני של השדות
לפני ההוראה הוא:
FLDA:
34
FLDB:
789
לפי
כלל 2, העברת חלק זה תתבצע מן הספרה
השמאלית לימנית:
א)
הספרה 3 מ-
FLDA תחליף
את הספרה 7 מ-FLDB.
ב)
הספרה 4 מ-
FLDA תחליף
את הספרה 8 מ-FLDB.
הספרות
הפחות משמעותיות (מימין) בשדה המקבל, שלא
התמלאו, תוחלפנה באפסים:
ג)
הספרה 0 תחליף .את ה-9ב-FLDB.
נקבל,
אם כן:
FLDB:
12.340
בדוגמא
7ההצבה, החל מהנקודה העשרונית,
נעשית משמאל לימין; כך תחליף הספרה 1 של FLDC
את הספרה 3 של FLDD.
הביצוע יסתיים בנקודה זו, כי ל-FLDD
יש רק תו אחד אחרי הנקודה.
העברת
החלק השלם היא מימין לשמאל, ולכן ה-3 מ-FLDE
יחליף את ה-0 הימני ב-FLDF,
ובאופן דומה יחליף 2 את ה-0
השמאלי. מאחר שאין תווים שלמים נוספים
בשדה המקבל, תעצור הפעולה בנקודה זו. כל
פעולת ההצבה תיפסק אף היא, מאחר שאין
תווים עשרוניים לשדה FLDF תוכנו
של FLDF
יהיה אזי 23.
מאחר
שבדוגמא זו אנו עוסקים במספרים שלמים,
ההעברה היא מימין לשמאל, והתווים
השמאליים של השדה המקבל, שלא התמלאו,
מתחלפים באפסים. כך מתקבל 0123 ב-FLD1.
ניתן לראות את הקבוע 123 כאילו היה משתנה FLDZ
עם 999 PIC
ותוכן 123
, ולהמשיך כמו במקרה זה, כלומר, כביכול
מתבצעת
ההוראה:
MOVEFLDZTOFLD1.
ניתן
ליישם כלל זה לכל הצבה של קבוע מספרי.
במקרה
זה ייקטע המספר, הואיל והשדה המקבל אינו
יכול להכיל את כל הספרות של השדה השולח.
היות וההעברה מתבצעת מימין לשמאל. יקבל FLD2
את הערך 23. אותה תוצאה היתה מתקבלת, אילו
היתה ניתנת ההוראה MOVEFLDZTOFLD2.,
בעוד ש-FLDZ
היה מוגדר עם PIC 999
ותוכן 123. קטיעה
זו היא בלתי-רצויה, הואיל והספרה
המשמעותית ביותר, במקרה זה ספרת המאות,
אינה עוברת לשדה המקבל.
שים
לב, כי קבוע מספרי נכתב עם נקודה עשרונית
במקום המתאים, בעוד שבשדה הנתונים FLD3
הנקודה היא משתמעת. ספרות השלמים בשדה
השולח מועברות ויוצרות 12במקומות המתאימים ב-FLD3. החל
מהנקודה העשרונית שנקבעה, ההעברה היא
משמאל לימין, ותוצאתה תהיה 34 בשני
המקומות העשרוניים הראשוניים של FLD3.
הספרות הימניות (הפחות משמעותיות), שלא התמלאו, מתאפסות,
ונקבל:12340
ב-FLD3. שים לב שוב, שהתוצאה היתה זהה, לו
ביצענו את ההוראה MOVEFLDZTOFLD3.,
בעוד של-FLDZ
היו PIC99V99
ותוכן 1234 . יש להבהיר בנקודה זו, כי
הוראת-MOVE
מספרית פועלת באותה דרך בדיוק, בין אם
השדה השולח הוא קבוע או משתנה. יש להתייחס
לקבוע מספרי כאילו היה שדה נתונים
המאוחסן בזיכרון, ולהמשיך בהתאם לכללים 1,2 .
פרק 7 -
הוראת MOVE.
ג.
הצבה מספרית
מורכבותה
היחסית של הוראת MOVE
מחייבת חלוקה לשני סוגים: הוראות MOVE
מספריות, והוראות MOVE
אלפאנומריות. הדיון בהוראות - MOVE
אלפאנומריות יבוצע בפרק הבא.
הוראת
MOVE
מספרית ניתנת לביצוע בשני אופנים
הצבת
שדה מספרי, בעל משפט PICTURE
של ספרות- 9, לשדה מספרי אחר.
הצבת
קבוע מספרי בשדה מספרי.
בהוראה:(משתנה-2) TO(משתנה-1) MOVE
לשני השדות משפטי PICTURE
מספריים. בהנחה ששני השדות הם בעלי אורך
זהה, יוחלף תוכנו של משתנה-2 בתוכן של משתנה-1,
מבלי שישתנה תוכן השדה השולה (משתנה-1).
דוגמא
1
FIELDAPICTURE999
תוכן:
123
FIELDBPICTURE999
תוכן:456
ההוראה:
.MOVEFIELDATO FIELDB
'
= DISPLAY '
FIELDA
DISPLAY
FIELDA
'
= DISPLAY '
FIELDB
DISPLAY
FIELDB
דוגמא
2
FIELDCPICTURE99V99.
(נקודה
עשרונית אחרי שתי הספרות הראשונות)
תוכן:
12.34
FIELDDPICTURE99V99.
תוכן:
45.67
ההוראה:
.MOVEFIELDCTOFIELDD
'
= DISPLAY '
FIELDC
DISPLAY
FIELDC
'
= DISPLAY '
FIELDD
DISPLAY
FIELDD
לעתים
קרובות יש להעביר בתכנית COBOL
תוכנו של שדה מספרי אחד לשדה מספרי אחר,
כאשר לשני השדות אין הגדרת PICTURE
זהה. ייתכן, שנרצה להעביר שדה קטן אל גדול
ממנו, כדי לבצע עליו פעולה חשבונית, או
שנרצה להעביר תוצאה, המופיעה בשטח עבודה,
בדיוק של 3 ספרות אחרי הנקודה (999V),
אל שדה פלט בעל דיוק דרוש של 2 ספרות בלבד
לאחר הנקודה (99V). בשני מקרים אלה, לא תיצור הוראתMOVE
העתקה מדויקת של תוכן השדה השולח בשדה
המקבל, וזאת עקב השוני בהגדרת השדות.
בכל
הוראות ההצבה MOVE
המספריות מתקיימים שני כללים - אחד להעברת
החלק השלם של המספר המועבר, והשני להעברת
החלק העשרוני (זה שלאחר הנקודה).
כלל
1: . העברת, מספר שלם, או חלק שלם של מספר,
תתפצע מימין לשמאל. " כל התווים מסדר גבוה
(שמאליים), שלא התמלאו, יקבלו ערך אפס.
דוגמא
3
FIELD1PICTURE999
תוכן:
123
FILED2PICTURE9(4)
תוכן:
4567
נתבונן.
בהוראה:
MOVEFIELD1TO FIELD2.
'
= DISPLAY '
FIELD1
DISPLAY
FIELD1
'
= DISPLAY '
FIELD2
DISPLAY
FIELD2
דוגמא
4
FIELD3PICTURE999
תוכן:
012
FIELD4PICTURE999
תוכן:34
ההוראה:
MOVEFIELD3TO
FIELD4.
'
= DISPLAY '
FIELD3
DISPLAY
FIELD3
'
= DISPLAY '
FIELD4
DISPLAY
FIELD4
להלן
כלל פשוט, שכדאי להשתמש בו ברוב המקרים
בהצבות מספריות: וודא, כי השדה המקבל מכיל
לפחות
אותו מספר של תווים לפני הנקודה העשרונית
כמו השדה השולח. אם השדה המקבל גדול יותר
מהשולח, התווים השמאליים ביותר (הספרות
מסדר גבוה) שלו יוחלפו באפסים, אשר לא
ישפיעו על התוצאות. לעומת זאת, אם השדה
המקבל קטן יותר מהשולח, עלולות דווקא
הספרות המשמעותיות ביותר להיקטע.
דוגמא
5
TAKE-HOME-PAYPICTURE9(4)
תוכן:1000
AMT-OF-CHECKPICTURE9(3)
ההוראה:
MOVETAKE-HOME-PAYTOAMT-OF-CHECK.
'
= DISPLAY '
TAKE-HOME-PAY
DISPLAY
TAKE-HOME-PAY
'
= DISPLAY '
AMT-OF-CHECK
DISPLAY
AMT-OF-CHECK
נדון
כעת בהצבת שדות, המכילים חלק עשרוני.
כלל
2: העברת החלק העשרוני (החלק מימין לנקודה)
של השדה השולח לשדה המקבל - נעשית משמאל
לימין, החל מהנקודה העשרונית, שהוגדרה
בתכנית, התווים הימניים ביותר אחרי הנקודה
שלא התמלאו - יקבלו ערך אפס.
דוגמא
6
FLDAPIC99V99
תוכן:12.34
FLDBPIC99V999
תוכן:56.789
ההוראה:
MOVEFLDATO FLDB.
'
= DISPLAY '
FLDA
DISPLAY
FLDA
'
= DISPLAY '
FLDB
DISPLAY
FLDB
דוגמא
7
FLDCPICV99
תוכן:0.12
FLDDPICV9
תוכן:0.3
ההוראה:
.MOVEFLDCTOFLDD
'
= DISPLAY '
FLDC
DISPLAY
FLDC
'
= DISPLAY '
FLDD
DISPLAY
FLDD
דוגמא
8
FLDEPIC9(3)V9
תוכן:23.41
FLDFPIC99
תוכן:00
ההוראה:
MOVEFLDETO FLDF.
'
= DISPLAY '
FLDE
DISPLAY
FLDE
'
= DISPLAY '
FLDF
DISPLAY
FLDF
הצורה
השנייה של הוראת MOVE
- מספרית היא:
(משתנה)
TO (קבוע)MOVE
הקבוע
והמשתנה - שניהם מספרים. שני הכללים שפורטו
לעיל תקפים גם בסוג זה של הוראת-MOVE
.