Pemrograman COBOL Standar
Penulis | : | AJ Marston |
Tanggal Dibuat | : | September, 1984 |
Tanggal Revisi | : | Februari, 1993 |
Versi | : | 01.006.000 |
ISI
- 1. Pengantar
- 2. Dokumentasi Kode Sumber
- 3. Program Identifikasi
- 4. Data Program
- 5. Kode Program
- 5.1 Pendahuluan
- 5.2 Struktur Program
- 5.3 Bagian
- 5.4 Paragraf
- 5.5 Kalimat dan Laporan
- 5.6 Pengolahan Bersyarat
- 5.7 Petunjuk, Catatan dan Peringatan
- 5.7.1 PERFORM <section>>
- 5.7.2 PERFORM ... MELALUI ...
- 5.7.3 Pernyataan EXIT
- 5.7.4 Para GO TO Pernyataan
- 5.7.5 Pernyataan ALTER
- 5.7.6 Sesuai PINDAH ..
- 5.7.7 Pernyataan menghitung
- 5.7.8 AUTOREADS di VPLUS ..
- 5.7.9 Pernyataan SORT
- 5.7.10 Mendefinisikan dan menggunakan File Cetak
- Pernyataan MENERIMA 5.7.11
- 6. Contoh Prosedur online
- 7. Contoh Batch Prosedur
- 8. Petunjuk pemrograman
1. Pengantar
Saat itu adalah praktek umum untuk menggunakan metode tertentu Desain Terstruktur sebelum menghasilkan kode yang akan memenuhi fungsi tertentu. Tidak peduli apa Metodologi Desain yang digunakan, seluruh objek menggunakan teknik pemrograman terstruktur adalah hilang jika kode aktual yang dihasilkan buruk tertulis. Tidak hanya harus memenuhi fungsi kode yang diinginkan, dan melakukan secara efisien, juga harus dipelihara oleh semua orang programmer yang mengikuti di belakangnya Anda. Dalam kehidupan dari setiap program lebih banyak waktu dihabiskan untuk pemeliharaan dan peningkatan dari yang pernah dihabiskan pada pelaksanaan asli.COBOL adalah fleksibel, bebas format bahasa yang memiliki kendala internal sangat sedikit. Ini tidak menerapkan metode struktural tertentu, melainkan memungkinkan individu untuk mengadopsi struktur apa pun tingkat tertentu mereka bisa membayangkan mentalitas.
Penulis dokumen ini memiliki lebih bernilai dekade pengalaman dalam menulis program COBOL, dan telah mengalami banyak standar yang berbeda, masing-masing dengan mengatur sendiri kuat serta titik lemah. Beberapa terlalu kaku dan tidak perlu membatasi, sementara yang lain terlalu fleksibel dan terbuka untuk interpretasi. Mereka yang tidak mendorong atau mempromosikan kode efisien, dibaca dan dipelihara telah dibuang, dan sisanya telah ditinjau dan dimodifikasi dalam terang pengalaman, akal sehat dan logika.
Dalam instalasi di mana programmer diperbolehkan untuk mengadopsi apapun gaya mewah mereka mengambil kadang-kadang diperlukan untuk menjadi akrab dengan gaya individu sebelum adalah mungkin untuk bekerja di salah satu program mereka. Jika program telah bekerja pada oleh programmer yang berbeda dalam gaya campuran kadang-kadang bisa sangat membingungkan. Namun, dalam instalasi di mana standar yang tepat dan gaya pengkodean umum telah diadopsi itu harus mungkin bagi setiap programmer untuk bekerja pada program apapun tanpa mengetahui identitas penulis sebelumnya.
Ini dikenal sebagai "ego-kurang pemrograman", dan adalah sesuatu yang dokumen ini dimaksudkan untuk mendorong dan mempromosikan. Standar-standar ini dimaksudkan untuk menunjukkan bagaimana kode dapat ditulis sedemikian rupa untuk menjadi lebih mudah dibaca, lebih mudah untuk memahami dan karena itu lebih maintainable. Sebuah program yang ditulis dengan baik harus membaca seperti sepotong prosa, bukan sekelompok omong kosong.
2. Dokumentasi Kode Sumber
Saya percaya besar dalam memiliki kode sumber saya bertaburan dengan dokumentasi dalam bentuk baris komentar (mereka yang memiliki tanda bintang di kolom tujuh). Setiap program yang tidak mengandung komentar segera menduga - itu benar-benar dapat bekerja, tapi bagaimana mudah untuk mempertahankan atau memodifikasi? Mungkin ada dokumentasi tertulis yang terpisah, tetapi ada keuntungan yang berbeda kembali dalam memproduksi kode mendokumentasikan diri:- Dokumentasi terpisah (jika ada sama sekali!) Memiliki kebiasaan menjadi `salah ', sedangkan kode sumber program selalu tersedia, baik pada disk magnetik atau tape, atau dalam daftar yang diajukan.
- Dokumentasi yang terpisah memiliki kebiasaan tidak diperbarui untuk mencerminkan perubahan yang dibuat ke kode sumber. Semua update dokumentasi terlalu sering dibiarkan sampai terakhir, atau tidak dilakukan sama sekali.
- Hal ini kadang-kadang cukup sulit untuk mengidentifikasi potongan kode bertanggung jawab untuk melakukan fungsi tertentu yang diuraikan dalam dokumentasi.
- Berarti data yang nama di divisi data.
- Berarti bagian / paragraf nama di divisi prosedur.
- Banyak baris komentar untuk menjelaskan kepada pembaca apa yang terjadi, dan mengapa.
Ada satu asam uji untuk membuktikan bahwa program Anda cukup didokumentasikan - dapat Anda merekonstruksi semua dokumentasi tertulis dari kode sumber Anda? Jika jawabannya adalah TIDAK, maka Anda telah gagal. Ada beberapa produk saat ini tersedia yang akan melakukan pekerjaan untuk Anda - mereka membaca kode sumber Anda dan menghasilkan semua dokumen yang terpisah yang Anda butuhkan. Ini harus jelas, karena itu, bahwa produk seperti ini tidak dapat mengekstrak informasi yang tidak ada untuk mulai dengan.
3. Program Identifikasi
Para DIVISI IDENTIFIKASI dari setiap program COBOL harus mengandung setidaknya nama program. Ini juga merupakan tempat terbaik di mana untuk merekam informasi berguna lainnya yang akan berfungsi sebagai pengantar untuk program secara keseluruhan. Seperti `informasi yang berguna" dapat diringkas sebagai berikut:- NAMA PROGRAM - ini harus mengikuti konvensi penamaan perusahaan itu, itu harus unik untuk setiap program, dan juga harus dikaitkan dengan nama file sumber.
- PENULIS - jadi kita akan tahu siapa yang harus disalahkan jika ada sesuatu yang salah!
- TANGGAL-TERTULIS - ini memberi kita umur versi asli.
- TANGGAL-compiled - ini secara otomatis dimasukkan oleh COBOL compiler, dan menunjukkan usia dari versi saat ini dari program ini.
- Fungsi program - apa tujuannya? Apakah program yang berdiri sendiri, atau bagian dari rangkaian program? Ketika itu dijalankan?
- Akses database - database apa yang digunakan, dan dalam apa mode?
- Dataset akses - apa dataset yang digunakan, dan bagaimana mereka diakses (membaca, menulis, memperbarui atau menghapus)?
- Non-file database akses (MPE, KSAM) - mengidentifikasi file mana yang diakses, dan bagaimana.
- Mencetak file - apa laporan diproduksi, dan apa alat tulis khusus yang diperlukan?
- VPLUS pengolahan - apa adalah nama dari file bentuk, dan apa nama bentuk individu?
- Penggunaan subroutine - mengidentifikasi setiap subrutin dipanggil oleh program ini, memberi nama dan deskripsi singkat.
- Perubahan sejarah - setiap kali program berubah Anda harus memasukkan catatan memberikan tanggal amandemen, penjelasan singkat dari amandemen, plus nama Anda.
Meskipun semua informasi di atas dapat diperoleh dengan pemeriksaan dekat kode, menghemat banyak waktu (dan waktu adalah uang!) Oleh karena itu ditata pada awal tiap daftar program.
4. Data Program
4.1 Definisi Rekam
Para DIVISI DATA dari setiap program adalah campuran dari nama catatan individu dibagi ke nama item yang banyak, yang pada gilirannya dapat dibagi lagi menjadi berbagai sub-item.Item yang tidak dibagi dikenal sebagai barang dasar. Item yang dibagi dikenal sebagai kelompok barang, dengan nama record yang sedang setara dengan tingkat tertinggi dari item kelompok.
Dalam COBOL semua item data didefinisikan dengan cara berikut:
<level-number> <data-name> <picture clause>
mana <level-number> | adalah nomor dua-digit yang dimulai pada 01 untuk nama merekam dan naik sampai dengan 49 untuk semua item data yang harus dianggap sebagai bagian dari definisi rekaman. |
<data-name> | adalah nama dimana bahwa daerah data tertentu dapat dirujuk dari dalam program. |
<picture clause> | menggambarkan format data nama tertentu (abjad, angka, dll). |
Oleh karena itu mungkin untuk membangun definisi catatan sebagai berikut:
01 RECORD-NAM E. 02 DATA-NAME- 1-ALPHA PIC X (2). 02 DATA-NAME- 2. 03 DATA-NAME- 3-NUMERIC PIC 99. 03 DATA-NAME- 4. 04 DATA-NAME- 5-ALPHA PIC X (2). 04 DATA-NAME- 6-NUMERIC PIC 9 (5). 02 DATA-NAME- 7-ALPHA PIC X (6).Tata letak ini, bagaimanapun, adalah benar-benar tidak dapat diterima dalam program terstruktur karena tidak mudah untuk menentukan item SD pergi dengan item mana kelompok. Ini akan lebih mudah untuk dibaca jika semacam lekukan digunakan untuk membedakan antara angka-angka berbagai tingkat, dan jika ada beberapa ruang antara nama data dan klausa gambar.
Contoh ini menunjukkan efek dari Indentasi data nama tetapi bukan nomor tingkat: -
01 RECORD-NAM E. 05 DATA-NAME- 1-ALPHA PIC X (2). 05 DATA-NAME- 2. 10 DATA-NAME- 3-NUMERIC PIC 99. 10 DATA-NAME- 4. 15 DATA-NAME- 5-ALPHA PIC X (2). 15 DATA-NAME- 6-NUMERIC PIC 9 (5). 05 DATA-NAME- 7-ALPHA PIC X (6).Contoh ini menunjukkan efek dari Indentasi angka tingkat, tetapi bukan data nama: -
01 RECORD-NAM E. 05 DATA-NAME- 1-ALPHA PIC X (2). 05 DATA-NAME- 2. 10 DATA-NAME- 3-NUMERIC PIC 99. 10 DATA-NAME- 4. 15 DATA-NAME- 5-ALPHA PIC X (2). 15 DATA-NAME- 6-NUMERIC PIC 9 (5). 05 DATA-NAME- 7-ALPHA PIC X (6).Contoh berikut adalah yang terbaik karena indentasi baik jumlah tingkat dan dataname yang terkait. Perhatikan bahwa setiap nomor tingkat yang berbeda adalah sejajar dalam kolom terpisah, sehingga lebih mudah untuk menemukan kesalahan.
01 RECORD-NAM E. 05 DATA-NAME- 1-ALPHA PIC X (2). 05 DATA-NAME- 2. 10 DATA-NAME- 3-NUMERIC PIC 99. 10 DATA-NAME- 4. 15 DATA-NAME- 5-ALPHA PIC X (2). 15 DATA-NAME- 6-NUMERIC PIC 9 (5). 05 DATA-NAME- 7-ALPHA PIC X (6).Perhatikan bahwa semua klausul gambar sejajar di tempat yang sama, biasanya pada kolom 40. Dimana nama arus data ke dalam kolom ini praktek yang paling umum adalah untuk menempatkan klausul gambar di baris berikut, sehingga menjaga keselarasan yang konsisten, misalnya:
05 DATA-NAME- 2. 10 DATA-NAME- 2A. 15 THIS-IS-AN LAIN-PANJANG-DATANAME PIC X (2). 15 THIS-IS-YE T-LAIN-PANJANG-DATANAME PIC 9 (5).Pedoman untuk layout catatan dapat diringkas sebagai berikut: -
- Tingkat angka harus bertambah oleh lebih dari satu dalam rangka untuk meninggalkan ruang untuk penambahan masa depan kelompok barang tanpa harus nomor baru seluruh bagian (penambahan sebesar 01, 03, 05, dll dapat diterima, tetapi 01, 05, 10, dll bahkan lebih baik).
- Tingkat 01 harus mulai dalam kolom 8, dan semua nomor berikut harus indentasi sehingga setiap jumlah tingkat yang berbeda adalah sejajar dalam kolom yang berbeda.
- Lekukan antara satu nomor tingkat dan berikutnya harus 4 kolom.
- Harus ada 2 ruang antara sejumlah nama yang terkait tingkat dan datanya.
Jalur Cetak Definisi 4.2
Sekarang untuk beberapa saran tentang bagaimana untuk menggambarkan judul untuk laporan batch. Berikut adalah tiga cara menggambarkan garis cetak yang sama:Contoh 1:
01 HEADING PIC X (132) NILAI "ITEM DESCRIPTION KUANTITAS UNIT pric - "E PPN HARGA TOTAL".Contoh 2:
01 HEADING. 05 FILLER PIC X (4) NILAI "ITEM". 05 FILLER PIC X (6) NILAI RUANG. 05 FILLER PIC X (11) NILAI "URAIAN". 05 FILLER PIC X (19) NILAI RUANG. 05 FILLER PIC X (8) NILAI "KUANTITAS". 05 FILLER PIC X (2) NILAI RUANG. 05 FILLER PIC X (10) NILAI "UNIT HARGA". 05 FILLER PIC X (2) NILAI RUANG. 05 FILLER PIC X (11) NILAI "TOTAL HARGA". 05 FILLER PIC X (1) NILAI SPACE. 05 FILLER PIC X (3) NILAI "PPN".Contoh 3:
01 HEADING. 05 FILLER PIC X (10) NILAI "ITEM". 05 FILLER PIC X (30) NILAI "DESCRIPTION". 05 FILLER PIC X (10) NILAI "KUANTITAS". 05 FILLER PIC X (12) NILAI "HARGA SATUAN". 05 FILLER PIC X (12) NILAI "HARGA TOTAL". 05 FILLER PIC X (03) NILAI "PPN".Dari ketiga contoh Anda akan melihat bahwa ketiga adalah lebih `dibaca 'dan karenanya lebih mudah untuk mempertahankan.
4.3 Merekam Mnemonik
Meskipun COBOL memungkinkan data yang sama-nama yang akan digunakan lebih dari sekali dalam definisi catatan yang berbeda (setiap kejadian dapat diatasi oleh unik membangun<data-name> OF <record-name>
) itu adalah praktek umum untuk membuat setiap kejadian unik dengan menambahkan catatan mnemonik baik sebagai awalan atau akhiran. Setiap definisi harus dialokasikan catatan mnemonik sendiri yang kemudian harus melekat pada semua item data dalam rekor itu. Silakan lihat bagian tentang Standar Penamaan di manual pada Proyek Pengembangan Standar untuk rincian lebih lanjut tentang cara menetapkan nilai awalan untuk dataset IMAGE dan penyangga layar VPLUS.
Jika akhiran yang digunakan menghasilkan kode yang terlihat seperti berikut: -
01 ACCOUNT-RE KABEL. 05 ACCOUNT-TY PE-ACC PIC X (2). 05 ACCOUNT-NU mber-ACC. 10 GROUP-ACC PIC 99. 10 klasifikasi SI-ACC. 15 CLASS-CODE-ACC PIC X (2). 15 CLASS-NUMB ER-ACC PIC 9 (5). 05 CLIENT-NAM E-ACC PIC X (6).Namun, saya pikir awalan menghasilkan kode yang lebih baik, sebagai berikut: -
01 ACCOUNT-RE KABEL. 05 ACC-ACCOUN T-JENIS PIC X (2). 05 ACC-ACCOUN T-NOMOR. 10 ACC-GROUP PIC 99. 10 ACC-CLASSI fikasi. 15 ACC-CLASS- KODE PIC X (2). 15 ACC-CLASS- NOMOR PIC 9 (5). 05 ACC-CLIENT-NAMA PIC X (6).Pada divisi prosedur ini akan menghasilkan kode yang mirip dengan ini: -
PINDAHKAN ACC-REKENING-JENIS-JENIS KE REKENING PRT-. PINDAHKAN ACC-REKENING-NOMOR KE-NOMOR REKENING PRT-. PINDAHKAN KE ACC-GROUP-GROUP PRT. PINDAHKAN KE ACC-<etc> PRT-<etc>Penggunaan awalan juga membuat lebih mudah untuk mencari melalui kode sumber Anda (dengan editor teks tertentu Anda) ke daftar semua tempat di sebuah program di mana sebuah record direferensikan:
DAFTAR "ACC-" DAFTAR "PINDAHKAN-ACC" DAFTAR "UNTUK ACC-"
4.4 Nama Barang
COBOL memungkinkan nama data yang akan sampai dengan 30 karakter panjangnya. Namun, kebanyakan program yang berjalan pada HP3000 cenderung memiliki semacam akses ke database baik IMAGE atau layar VPLUS, di mana panjang item data terbatas untuk 16 dan 15 karakter masing-masing.Nama item yang harus menyampaikan semacam deskripsi untuk konten mereka, dan agar tidak melebihi batas ini 15-karakter kadang-kadang perlu untuk menggunakan istilah disingkat. Apapun singkatan yang dipilih adalah penting bahwa orang yang sama digunakan di seluruh sistem. Sebagai contoh, kombinasi berikut nama barang dalam sistem yang sama sangat ceroboh: -
LINE-NOMOR AKUN-NBR FAKTUR-NUM DOC-NOMana item yang sama muncul dalam lebih dari satu tempat dalam sistem (misalnya: dalam dataset IMAGE, atau layar VPLUS) itu adalah ide yang sangat baik untuk menjaga ejaan yang sama.
Mana item tersebut kemudian didefinisikan dalam divisi data suatu program (misalnya: dalam buffer dataset, buffer layar, atau buffer cetak) juga merupakan ide yang sangat baik untuk menjaga ejaan yang sama. Satu-satunya perbedaan harus dalam awalan, yang bertindak sebagai pengidentifikasi untuk buffer tertentu.
Satu-satunya pengecualian untuk aturan ini di mana item yang terjadi lebih dari sekali pada layar VPLUS. Sebagai TERJADI klausul tidak ada dalam FORMSPEC perlu untuk memberikan setiap kemunculan item nama yang unik. Hal ini dilakukan dengan menambahkan nomor urut 2 digit (dimulai dengan "01") untuk setiap kejadian yang nama item. Akhiran ini dapat dijatuhkan dalam definisi COBOL sebagai TERJADI klausa dapat digunakan sebagai pengganti. Kemudian harus ada hubungan langsung antara jumlah keras-kode dalam file bentuk dan jumlah kejadian dalam array COBOL, seperti yang ditunjukkan dalam contoh berikut:
VPLUS: ITEM-NAME01, ITEM-ITEM-NAME02 ,,,,,,, NAME09, ITEM-NAME10 COBOL: (?) ITEM-NAMA PIC X TERJADI 10.Jika diperlukan dalam program Anda untuk mengidentifikasi salah satu dari nama field (misalnya: untuk lolos ke rutinitas SCVSETERROR setelah kegagalan dalam validasi tertentu) dapat dibangun sebagai
ITEM-NAMEnn
dimana nn
adalah nomor terjadinya. 4.5 Definisi Penyimpanan Kerja
Definisi data dalam PENYIMPANAN KERJA-bagian sebuah program bisa menjadi campuran buffer dataset, buffer layar, dan area kerja umum.Setiap nama item harus diawali oleh sebuah mnemonic yang berbeda tergantung pada definisi catatan yang muncul. Buffer dataset IMAGE dan penyangga layar VPLUS seharusnya dialokasikan mnemonik mereka sendiri yang unik, tapi apa dari wilayah kerja umum?
Beberapa standar mengatakan bahwa semua KERJA-PENYIMPANAN definisi harus diawali dengan huruf `W ', tetapi dalam bagian yang sangat besar itu bisa menjadi proses yang bertele-tele untuk menemukan definisi individu.
Standar lain mengatakan bahwa awalan harus dua karakter dalam rangka untuk menunjukkan penggunaan umum, seperti berikut:
WA-akumulator WC-konstanta WI-indikator / bendera / switch WM-pengubah / subskrip WT-tabel / arrayNamun, saya lebih memilih untuk melihat pengelompokan item yang berhubungan secara logis, bukan fungsional, seperti berikut:
01 T01-KOMPONEN-TABEL. 05 T01-99 NILAI MAX PIC 20. <constant> 05 T01-Curr PIC S9 (4) COMP. <subscript> 05 T01-TERAKHIR PIC S9 (4) COMP. <subscript> T01-05-ENTRY TABEL TERJADI 20. 10 T01-KODE PIC X (6). T01-10 DESKRIPSI PIC X (30). 10 T01-NILAI PIC S9 (7) V99 COMP. 05 T01-TOTAL-NILAI PIC S9 (7) V99 COMP. <accumulator>Meskipun setiap item memiliki fungsi yang berbeda, mereka semua logika terkait, karena mereka prihatin dengan tabel tertentu dan tidak ada lainnya. Hal ini juga membuat lebih mudah untuk mencari melalui kode sumber untuk menemukan referensi untuk daerah ini data hanya dengan menentukan string pencarian "T01".
Definisi berikut ini juga dapat diterima, tetapi memiliki keunggulan yang berbeda ketika menggunakan compiler COBOL'85, yang memungkinkan sekelompok item data yang akan ulang ke kosong atau ruang dengan pernyataan tunggal.
01 T01-MAX PIC S9 (4) COMP NILAI 20. 01 T01-KOMPONEN-TABEL. 05 T01-Curr PIC S9 (4) COMP. 05 T01-TERAKHIR PIC S9 (4) COMP. T01-05-ENTRY TABEL TERJADI 20. 10 T01-KODE PIC X (6). T01-10 DESKRIPSI PIC X (30). 10 T01-NILAI PIC S9 (7) V99 COMP. 05 T01-TOTAL-NILAI PIC S9 (7) V99 COMP.Meskipun item
T01-MAX
telah diambil keluar dari tata letak asli dan berubah dari tingkat 05 ke tingkat 01 itu masih mempertahankan T01-
awalan untuk menunjukkan bahwa itu masih terkait secara logis. Jadi, pernyataan INITIALIZE T01-COMPONENT-TABLE
benar akan reset ke nol / ruang nilai-nilai dari semua T01-
item kecuali untuk T01-MAX
, yang harus tetap pada 20. Sebagai aturan umum, maka, bagian KERJA-PENYIMPANAN harus ditata dalam kelompok logis dengan awalan sebagai berikut:
TNN-tabel / array Wnn-lainIni harus didefinisikan dalam urutan yang tepat mereka sehingga mudah untuk menemukan setiap item data individu ketika mencari melalui daftar program. Setiap anggota perpustakaan copy untuk Dataset / file buffer harus benar diurutkan dengan nilai masing-masing awalan. Hal ini menghindari kebutuhan untuk menghasilkan daftar referensi silang yang menimbulkan overhead yang cukup besar, baik dalam waktu kompilasi dan waktu pencetakan.
4,6 subskrip dan Indeks
Beberapa orang ingin mendefinisikan subskrip global / indeks dalam, bentuk Sub1 SUB2 .... SUBn (atau INDX1, INDX2,,, INDXn). Ini adalah praktek yang buruk karena tidak ada hubungan logis dengan meja tertentu / array, dan nama-nama tidak menyampaikan apapun makna.Ini dapat mengambil waktu lama untuk men-debug program jika subskrip yang sama sengaja digunakan untuk referensi dua tabel yang berbeda pada saat yang sama, atau dua subskrip yang berbeda sengaja digunakan untuk referensi tabel yang sama pada waktu yang sama.
Hal ini tidak masalah jika nama dari item subskrip / indeks dibangun dalam format
<prefix>-<usage>
mana: - <prefix> | menunjukkan tabel yang telah dikaitkan, |
<usage> | menunjukkan bagaimana hal ini item tertentu digunakan. |
T01-TABLE-ENTRY
bernama T01-CURR
. Hal ini tidak dapat dengan mudah bingung dengan T01-MAX
, yang digunakan untuk menunjukkan jumlah maksimum entri tabel mungkin berisi, dan T01-LAST
yang menunjukkan jumlah aktual entri dalam tabel saat ini. 4.7 Kondisi Nama
Kondisi nama yang digunakan untuk menunjukkan kisaran yang diharapkan nilai untuk item data tertentu. Setelah kondisi-nama telah ditetapkan, bahwa nama tertentu dapat digunakan sebagai pengganti pengujian item data untuk nilai tertentu (atau kisaran nilai). Ambil definisi berikut dalam bekerja-satu bagian penyimpanan program:05 IMAGE-STAT US PIC S9 (4) COMP. 88 IMAGE-OK ZERO NILAI. 88 IMAGE-ERRO R NILAI MELALUI -9999 -1, 9999 +1 MELALUI. 88 IMAGE-BEG- FILE DARI-NILAI 10 12. 88 IMAGE-END- FILE DARI-NILAI 11 13. 88 IMAGE-BEG- RANTAI NILAI DARI-14. 88 IMAGE-END- RANTAI NILAI DARI-15. 88 IMAGE-DSET-LENGKAP NILAI 16. 88 IMAGE-NO-E nCoba NILAI 17. 88 KEGAGALAN IMAGE-LOCK-NILAI MELALUI 20 25Isi GAMBAR-STATUS dapat ditentukan dengan dua cara:
IF IMAGE-STATUS = ZERO | menjadi | IF IMAGE-OK |
IF IMAGE-STATUS NOT = ZERO | menjadi atau | IF NOT IMAGE-OK IF IMAGE-ERROR |
PINDAHKAN KE GAMBAR-0 STATUS
adalah sama dengan SET IMAGE-OK UNTUK BENAR
Hanya ada 2 pedoman sederhana untuk mengikuti ketika mendefinisikan kondisi-nama: - Gunakan deskripsi yang berarti untuk setiap kondisi;
- Gunakan awalan yang menghubungkan kondisi-nama dengan item data tertentu untuk yang didefinisikan. Hal ini membuat lebih mudah untuk mencari referensi di bagian kerja penyimpanan, dan dalam kebanyakan kasus harus membuat kondisi yang sedang diuji benar-benar jelas (misalnya
IMAGE-OK
,KSAM-OK
atauVPLUS-OK
).
4,8 Flags / Indikator / Switch
Sebagai aturan umum program apapun yang menggunakan menetapkan sendiri switch atau indikator yang ditulis dengan buruk. Kondisi yang paling dapat ditangani oleh daerah data yang telah didefinisikan (misalnya: status daerah untuk VPLUS, IMAGE dan KSAM).Jika tidak menjadi perlu untuk menggunakan indikator terpisah maka silakan ikuti panduan sederhana: -
- Gunakan nama yang berarti data (bukan SW1, SW2, SW3, dll).
- Jangan menggunakan indikator untuk lebih dari satu tujuan.
- Dalam program online adalah tidak perlu untuk mendefinisikan suatu flag yang menunjukkan keberhasilan atau kegagalan dari rutinitas validasi sebagai item
VIEW-NUMERRS
sudah tersedia untuk tujuan ini. Ini memiliki nama kondisiVEDIT-ERRORS
danNO-VEDIT-ERRORS
. - Jangan menggunakan bendera untuk menguji kondisi, jika kondisi yang dapat diperoleh dari cara lain, seperti dalam contoh berikut:
JIKA LINE-COUNT> LINE-MAX (yaitu: halaman saat ini sudah penuh) PINDAHKAN KE NEW 1-PAGE-DIBUTUHKAN. ........ JIKA BARU-PAGE-DIBUTUHKAN = 1 PERFORM XA-START-BARU-PAGE.
dapat digantikan oleh:JIKA LINE-COUNT> LINE-MAX PERFORM XA-START-BARU-PAGE.
- Ketika membaca sebuah file serial mana ia tidak perlu untuk mendefinisikan bendera untuk menunjukkan ketika akhir-of-file telah ditemukan, sebagai hasil yang sama dapat dicapai dengan menetapkan kawasan catatan file untuk TINGGI NILAI-NILAI, seperti dalam contoh berikut: -
PINDAHKAN KE NILAI RENDAH ABC-REC. LAKUKAN SAMPAI ABC-REC = TINGGI-NILAI READ ABC AKHIR PINDAHKAN KE NILAI TINGGI-ABC-REC TIDAK AKHIR PERFORM CA-PROSES-ABC-REC AKHIR-BACA AKHIR-PERFORM.
5. Kode Program
5.1 Pendahuluan
Para DIVISI PROSEDUR dalam setiap program COBOL berisi satu atau lebih BAGIAN. BAGIAN masing-masing berisi satu atau lebih paragraf; PARAGRAF masing-masing berisi satu atau lebih KALIMAT; dan KALIMAT masing-masing berisi satu atau lebih LAPORAN.- BAGIAN A diidentifikasi dengan memiliki nama yang unik mulai di kolom 8 diikuti oleh BAGIAN dicadangkan-kata `'. Hal ini berakhir dengan awal bagian berikutnya, dan TIDAK ketika sebuah ` KELUAR 'pernyataan ditemui.
- PARAGRAF Sebuah diidentifikasi dengan memiliki nama yang unik mulai di kolom 8 (nama harus unik dalam seksi, tetapi mungkin diduplikasi di bagian lain). Hal ini berakhir dengan awal paragraf berikutnya. Tidak perlu ada hubungan antara nama dan terkait PARAGRAF BAGIAN namanya (s).
- KALIMAT dimulai dalam kolom 12, dapat terus lebih dari beberapa baris, dan diakhiri oleh berhenti penuh.
- PERNYATAAN berisi kata kerja COBOL tunggal, nama subjek, dan sebuah nama objek opsional (misalnya: PINDAHKAN KE B A sampai E, C UNTUK MENAMBAHKAN D, PERFORM).
PERFORM <section>. PERFORM <paragraph>. PERFORM <paragraph1> MELALUI <paragraph2>. GO TO <paragraph>.Pedoman ini sangat fleksibel, tapi tanpa pedoman tambahan kode yang dihasilkan dapat dikelola sebagai sebagai sepiring spaghetti lemas - silakan baca terus untuk penjelasan Anda dan membangunnya.
5.2 Struktur Program
5.2.1 Modul Hirarki
Ini adalah praktek umum dalam pemrograman modern untuk membagi kode ke bagian logis atau modul. Setiap bagian / modul melakukan fungsi tertentu, dan dipanggil oleh pernyataan: PERFORM <section-name>.
Setiap bagian / modul dapat, pada gilirannya, meminta bagian lain untuk melakukan fungsi tingkat yang lebih rendah. Hal ini menghasilkan hirarki modular atau struktur, maka istilah `pemrograman terstruktur '. Hal ini biasa untuk merencanakan struktur dari sebuah program pada tahap desain sebelum menulis kode apapun, dalam rangka untuk menghasilkan struktur yang mirip dengan yang ditunjukkan dalam Gambar 1: Setiap kotak mewakili modul yang terpisah, dan di mana dua kotak yang bergabung bersama-sama itu menunjukkan bahwa kotak di tingkat yang lebih rendah dilakukan oleh kotak di tingkat yang lebih tinggi.
Dalam contoh khusus ini menunjukkan bahwa modul Q hanya dapat diproses dengan melewati kontrol melalui modul A, D, J, O ke Q.
Hal ini dimungkinkan untuk modul apapun yang akan dipanggil dari lebih dari satu lebih tinggi tingkat modul, dan ini harus ditunjukkan pada tabel.
Jika Anda memiliki modul tingkat rendah yang dapat dipanggil dari berbagai tempat (misalnya: rutin kesalahan) diperbolehkan untuk meninggalkan keluar dari grafik sepenuhnya, seperti halnya apa-apa selain menyulitkan gambaran keseluruhan. Rutinitas seperti ini disebut 'transparan'. Harus ditekankan bahwa hanya rutinitas umum yang umum untuk SEMUA program harus dianggap sebagai transparan - mereka yang melakukan fungsi khusus untuk program individu harus muncul pada hirarki modul.
Metodologi desain Beberapa ingin Anda tampilkan pada grafik bagaimana berbagai modul dipanggil, menggunakan terminologi URUTAN, iterasi, dan SELEKSI, dilambangkan dengan simbol di sudut kanan atas kotak masing-masing.
- URUTAN adalah tempat modul selalu dilakukan, dan dalam urutan yang ditunjukkan. (Simbol `+').
- Iterasi adalah di mana modul dilakukan beberapa kali, dari nol ke atas. (Simbol `*').
- SELEKSI adalah di mana modul dilakukan hanya jika kondisi terpenuhi. (Simbol adalah `O ').
5.2.2 Modul Penamaan
Ini adalah praktek umum untuk memberikan masing-masing modul semacam mnemonik untuk menunjukkan posisinya dalam hirarki modul, baik horisontal dan vertikal. Dalam contoh yang diberikan dalam bagian 5.2.1 setiap modul adalah nama dari kiri-ke-kanan dan atas-ke-bawah, tetapi tidak ada hubungan antara mnemonik modul yang memiliki semacam kaitan yang logis.Ada dua metode lain untuk tiba di nama mnemonik, dan ini dibahas di bawah ini:
- Posisi - mnemonic memiliki dua karakter abjad, yang pertama menunjukkan LEVEL (atas ke bawah) sedangkan yang kedua menunjukkan URUTAN (kiri ke kanan). Menggunakan hirarki yang sama seperti yang ditunjukkan pada Gambar 1 ini ditunjukkan dalam Gambar 2:
- FUNGSIONAL - karakter pertama menunjukkan urutan dari fungsi tingkat atas, sementara karakter kedua dan selanjutnya menunjukkan kombinasi tingkat-dalam-fungsi dan urutan-dalam-tingkat. Hal ini ditunjukkan dalam Gambar 3:
Ini adalah akal sehat ketika coding divisi prosedur untuk menempatkan bagian-bagian dalam urutan mnemonic - ini membuat lebih mudah untuk menemukan jalan Anda melalui daftar. Dalam metode (b) ini berarti bahwa setiap kaki dalam bentuk struktur program yang berdekatan, sedangkan dalam metode (a) bagian yang sama tersebar di seluruh tempat. Hal ini ditunjukkan dengan lebih jelas pada Gambar 4:
Posisi | Fungsional | |
---|---|---|
Keuntungan lain dari metode (b) adalah bahwa ketika sebuah program menjadi terlalu besar untuk satu unit dan perlu tersegmentasi atau dipecah menjadi subprogram mudah untuk mengidentifikasi modul yang secara logis terkait dan karena itu memenuhi syarat untuk pemisahan. Bandingkan modul tersebut ditandai di atas dalam metode (b) dengan modul yang sesuai dari metode (a) .
Dalam program, besar kompleks dengan banyak modul metode (b) dapat menghasilkan mnemonik yang besar dan rumit - bagaimana ini bisa diatasi? Akal sehat untuk menyelamatkan - mengidentifikasi fungsi sub-dengan sejumlah besar modul dan mulai menamai mereka menggunakan huruf yang berbeda dari alfabet, seperti yang ditunjukkan pada Gambar 5:
Untuk laporan diurutkan yang memiliki sejumlah besar istirahat kontrol itu dapat diterima untuk memperkenalkan nomor ke mnemonic, dan untuk kenaikan jumlah ini untuk setiap tingkat yang lebih rendah daripada meningkatkan panjang mnemonic dengan menambahkan karakter lain. Ini akan menghasilkan sesuatu struktur tabel seperti pada Gambar 6:
Dengan metode ini semua proses untuk tingkat jenis tertentu akan diadakan di bagian yang berdekatan sebagai urutan akan menjadi sebagai berikut: -
R, R1, R1A, R1B, R2, R2A, R2B, R3, R3A, R3B, R4, R4A, R4B, R5
Beberapa standar memiliki aturan bahwa jika bagian memiliki lebih dari satu orang tua (yaitu: dapat dipanggil dari lebih dari satu bagian pada tingkat yang lebih tinggi) maka harus dialokasikan prefiks yang merupakan rutinitas tujuan umum, biasanya di bagian bawah alfabet (misalnya: X, Y atau Z). Ini bagus jika itu adalah bagian kecil dengan pengolahan terbatas, tetapi bagaimana jika itu hanya awal dari sepotong signifikan coding? Ambil contoh berikut - Sebuah database terdiri dari pelanggan yang dikelompokkan ke dalam negara, yang pada gilirannya dikelompokkan ke daerah. Sebuah program memproses rincian untuk pelanggan pada akhir setiap bulan, tetapi kriteria seleksi dapat menjadi salah satu dari berikut ini:
- Seorang pelanggan tunggal,
- Sebuah negara tunggal, bagi semua pelanggan di negara tersebut,
- Sebuah wilayah tunggal, bagi semua negara dalam wilayah tersebut,
- Semua daerah (yaitu: semua pelanggan).
Perhatikan bahwa proses seleksi ditangani oleh modul yang memiliki "C" awalan, sedangkan pengolahan pelanggan yang sebenarnya (terlepas dari metode seleksi) memiliki awalan yang terpisah. Hal ini membuat pelacakan jalan Anda melalui kode sumber jauh lebih mudah, yang lebih penting daripada sesuai dengan aturan yang tidak fleksibel dengan pembatasan buatan mereka.
5.3 Bagian
Pedoman untuk bagian dapat diringkas sebagai berikut: -- Setiap bagian harus mulai pada halaman baru.
- Setiap nama bagian harus diawali oleh sebuah mnemonic yang unik yang mengandung satu atau lebih karakter alfanumerik untuk menunjukkan posisi bahwa bagian dalam hirarki program bagian.
- Setiap nama bagian harus menjadi deskripsi singkat tapi bermakna fungsi bagian tersebut (misalnya:
CA-SELECT-COMPONENT
,DEA-UPDATE-COMPONENT
). - Para DIVISI PROSEDUR keseluruhan harus diatur dalam urutan mnemonic sehingga masing-masing bagian dapat ditemukan lebih mudah.
- Kontrol harus lulus dari satu bagian ke bagian lain dengan menggunakan
PERFORM <section>
pernyataan, dan bukanGO TO <paragraph>
pernyataan, maupunPERFORM <para1> THRU <para2>
pernyataan. - Setiap bagian harus memiliki titik masuk tunggal (paragraf pertama) dan titik keluar tunggal (paragraf terakhir).
- Setiap bagian harus dibatasi untuk melakukan satu fungsi dasar, apakah itu TINGKAT TINGGI (misalnya: memutuskan prosedur pemilihan tingkat yang lebih rendah untuk melakukan) atau TINGKAT RENDAH (misalnya: membaca dari atau menambahkan ke file data).
- Setiap bagian harus cukup pendek yang dimuat pada satu halaman kertas daftar. Apa pun lebih lama dari ini harus dipecah menjadi serangkaian sub-bagian, masing-masing dengan fungsi yang terpisah.
- Antara
section-name
dan pertamaparagraph-name
harus ada komentar singkat untuk fungsi keseluruhan bagian tertentu (meninggalkan komentar lebih rinci sampai Anda mendapatkan kode aktual). Ini membantu untuk membuat deskripsi ini lebih khas jika tertutup oleh garis tanda bintang segera sebelum dan setelah, menghasilkan `kotak 'efek.
5.4 Paragraf
Pedoman untuk paragraf dapat diringkas sebagai berikut: -- Setiap nama paragraf harus menjadi deskripsi singkat tapi bermakna fungsi ayat tersebut.
- Setiap nama paragraf harus diawali oleh mnemonic yang sebelumnya telah ditugaskan ke bagian itu, ditambah dengan nomor urut ascending, (misalnya:
BA-10-READ-NEXT
,BA-20-UPDATE
). - Ini urutan nomor harus dalam penambahan sebesar sepuluh, mulai dari sepuluh untuk setiap bagian baru. Hal ini menyisakan ruang yang memadai untuk penambahan masa depan tanpa harus paragraf nomor baru yang ada.
- Dua digit yang memadai untuk nomor urut - jika ada lebih banyak dibutuhkan itu berarti bahwa Anda telah melanggar pedoman mengenai ukuran bagian Anda.
- Paragraf terakhir harus berisi apa-apa tetapi EXIT pernyataan, dan tidak perlu memiliki nomor urut (misalnya:
BA-99-EXIT
atauBA-EXIT
). - Jika Anda perlu untuk melewati kontrol ke titik lain dalam bagian yang sama menggunakan
GO TO <paragraph-name>
pernyataan. JANGAN gunakanPERFORM <paragraph-name>
pernyataan. - Jika Anda perlu untuk melewati kontrol ke bagian lain menggunakan
PERFORM <section-name>
pernyataan. JANGAN gunakanGO TO
pernyataan pada apa pun selain nama-ayat dalam bagian ini. - Jika Anda merasa perlu untuk menyisipkan komentar (atau dua) tentang paragraf, silakan taruh SETELAH nama ayat dan SEBELUM baris pertama dari kode.
5.5 Kalimat dan Laporan
Pedoman untuk kalimat dan pernyataan dapat diringkas sebagai berikut: -- Setiap kalimat harus mulai pada kolom 12.
- Setiap pernyataan dalam kalimat (jika ada lebih dari satu) harus mulai pada baris terpisah. Ini berarti bahwa pernyataan dapat ditambahkan atau dihapus dengan mudah, tanpa harus mengubah jalur lainnya tidak perlu.
- Jika pernyataan terlalu panjang untuk muat pada satu baris JANGAN membagi data-nama di dua baris - bukan memindahkan seluruh nama (bersama dengan
TO
,FROM
,BY
atauGIVING
bagian dari verba) ke baris berikutnya, Indentasi oleh empat karakter posisi. - Jangan gunakan spasi aneh antara setiap kata - satu adalah cukup! Hanya ada satu pengecualian untuk aturan ini yang saya temukan diterima, dan bahwa adalah ketika ada sekelompok
MOVE ..... TO .....
MOVE ..... TO .....
pernyataan. Dalam hal ini membuat kode lebih mudah dibaca jika semuaTO
bagian diselaraskan bawah kolom umum, seperti dalam contoh berikut:PINDAHKAN "AA" UNTUK ACC-JENIS REKENING-. PINDAHKAN KE GROUP ABC-ACC-GROUP. PINDAHKAN ABC-KLASIFIKASI UNTUK ACC-KLASIFIKASI. PINDAHKAN KE ABC-NAMA-NAMA ACC.
pedoman (c) dan (d) berguna ketika mencari file sumber untuk referensi tertentu untuk nama data, seperti dengan:DAFTAR "PINDAHKAN ABC-GROUP" DAFTAR "UNTUK ACC-GROUP"
Hal ini tidak begitu mudah untuk dilakukan jika data-nama dibagi dalam dua, atau jika lebih dari satu ruang yang digunakan antara kata. - Jangan meletakkan spasi antara pernyataan individu. Hal ini diperbolehkan, namun, untuk memiliki garis ruang antara kelompok pernyataan untuk menunjukkan pemisahan logis.
- Meskipun harus jelas APA sepotong kode tidak, itu mungkin tidak jelas MENGAPA itu, atau MENGAPA perlu untuk melakukannya di titik tertentu dalam program ini. Untuk membantu programmer pemeliharaan semacam komentar mungkin bernilai berat emas. Jangan khawatir jika komentar membentang beberapa baris - komentar single-line tidak ada gunanya jika tidak lengkap.
5.6 Pengolahan Bersyarat
Ini adalah di mana banyak programmer tidak berpendidikan datang jalan buntu! Meskipun COBOL memungkinkan sebagai berikut: JIKA MAKA} {<condition> <statement-1> ELSE {<statement-2> AKHIR-JIKA}.
Ada beberapa pedoman dasar yang dapat diterapkan dalam rangka untuk membuat kode lebih mudah dibaca dan lebih mudah untuk mempertahankan. Ini adalah: - Setiap bagian (kondisi,
ELSE
, pernyataan-1, pernyataan-2,END-IF
) harus berada pada baris terpisah. Hal ini memungkinkan untuk penambahan masa depan atau penghapusan tanpa harus memodifikasi baris lebih dari yang diperlukan. - Kata
ELSE
harus sejajar dalam kolom yang sama persis sepertiIF
untuk yang terkait. Hal ini membuat asosiasi lebih jelas dalam daftar, terutama dengan beberapa atau bersarangIFs
. - COBOL'85 memungkinkan setiap kondisi harus diakhiri dengan
END-IF
. Penggunaannya harus didorong karena membuat itu benar-benar jelas di mana kondisi masing-masing seharusnya berakhir, sehingga menghindari kemungkinan kebingungan dan kesalahan. SepertiELSE
, yangEND-IF
harus sejajar dalam kolom yang sama persis sepertiIF
dengan yang terkait. - Pernyataan-1 dan pernyataan-2 harus indentasi, biasanya dengan empat posisi karakter. Hal ini memungkinkan
IF
,ELSE
danEND-IF
untuk lebih khas dalam daftar. Ini sekarang memberi kita konstruksi sebagai berikut:
JIKA <condition> <statement-1> ELSE <statement-2> AKHIR-JIKA.
Berikut adalah beberapa panduan tambahan untuk bersarangIFs
: - Untuk setiap tingkat bersarang
IF
indent semua lini yang terkait dengan empat karakter. Hal ini memberikan sebagai berikut:JIKA <condition-1> JIKA <condition-2> <statement-1> ELSE <statement-2> AKHIR-JIKA ELSE <statement-3> AKHIR-JIKA.
- Jangan pernah menggunakan lebih dari tiga tingkat bersarang
IF
- mereka sangat sulit untuk debug dan memelihara. - Ingat bahwa setiap
ELSE
dipasangkan denganIF
yang segera mendahului dalam kode, belum tentu satu di bawah yang selaras. Ambil contoh berikut:JIKA <condition-1> JIKA <condition-2> <statement-2> ELSE <statement-1>.
Menurut indentasi<statement-1>
seharusnya dieksekusi jika<condition-1>
adalah palsu, tetapi COBOL mengikuti aturan sendiri dan mengeksekusi<statement1>
jika<condition-1>
adalah benar dan<condition-2>
adalah palsu . Ini jenis kesalahan ini lebih dihindari jikaEND-IF
digunakan, seperti dalam contoh berikut:
JIKA <condition-1> JIKA <condition-2> <statement-2> AKHIR-JIKA ELSE <statement-1> AKHIR-JIKA.
atau ... JIKA <condition1> JIKA <condition2> <statement-2> ELSE <statement-1> AKHIR-JIKA AKHIR-JIKA.
- Dalam kasus di mana suatu
ELSE
segera diikuti olehIF
pernyataan tanpa intervensi (yaitu: di mana hanya satu dari serangkaian kondisi akan BENAR) tidak perlu untuk indent pada setiap baruIF
jika tidak, anda dengan cepat akan jatuh halaman . Perhatikan contoh berikut:
JIKA X-NILAI = 1 <statememt-1> ELSE JIKA X-NILAI = 2 <statement-2> ELSE JIKA X-NILAI = 3 <statement-3> ELSE JIKA X-NILAI = 4 <statement-4> ELSE JIKA X-NILAI = 5 <statement-5> dll
JIKA X-NILAI = 1 <statememt-1> ELSE JIKA X-NILAI = 2 <statement-2> ELSE JIKA X-NILAI = 3 <statement-3> ELSE JIKA X-NILAI = 4 <statement-4> ELSE JIKA X-NILAI = 5 <statement-5> dll
EVALUASI NILAI X- SAAT 1 <statement-1> KAPAN 2 <statement-2> KAPAN 3 <statement-3> KAPAN 4 <statement-4> KAPAN 5 <statement-5> SAAT LAINNYA ..... AKHIR-MENGEVALUASI.
Berikut adalah pedoman bahkan lebih untuk kondisi kompleks: - Lampirkan setiap kondisi individu dalam tanda kurung.
- Jika beberapa kondisi bergabung untuk membentuk kondisi kelompok, (mis. semua kondisi harus benar dalam rangka untuk membuat kondisi kelompok yang benar) maka menyertakan seluruh kelompok dalam tanda kurung juga.
- Dengan memiliki kondisi masing-masing pada baris terpisah, dan dengan hati-hati keselarasan AND dan OR, adalah mungkin untuk membuat benar-benar jelas bahwa kondisi yang terkait atau alternatif. Pedoman ini harus menghasilkan sesuatu seperti ini:
JIKA ((A = 1 ATAU 2 ATAU 3) DAN (B TIDAK = 4)) ATAU ((C = "A" ATAU "Z") ATAU (D <E)) <statement> Endif.
Contoh ini, bagaimanapun, adalah cepat mendekati tahap di mana ia menjadi terlalu berat untuk dipertahankan. Jangan takut untuk membagi sebuah kondisi yang kompleks menjadi beberapa bagian, bahkan jika itu melibatkan penggunaanGO TO
pernyataan. Jangan mencoba untuk membuktikan seberapa pintar Anda dapat - tetap sederhana dan mudah.
5.7 Petunjuk, Catatan dan Peringatan
5.7.1 PERFORM <section>
Meskipun COBOL memungkinkanPERFORM
perintah yang akan digunakan pada paragraf serta bagian, penggunaannya harus dibatasi untuk bagian saja. Jika perlu membuat ayat menyinggung menjadi bagian mandiri, atau in-line PERFORM
(jika cukup kecil). Pedoman ini kemudian menghindari kemungkinan bahwa seseorang mungkin membagi paragraf dua, sehingga menyebabkan PERFORM
untuk mengakhiri pada nama paragraf baru. Harap dicatat bahwa jika kata
SECTION
yang tidak terjawab keluar pada nama bagian itu akan diperlakukan sebagai sebuah paragraf. Seperti biasanya ada apa-apa tapi komentar antara nama bagian dan paragraf berikutnya berarti kode tidak benar-benar akan dieksekusi oleh PERFORM
pernyataan. Sayangnya kode AKAN dimasukkan dalam PERFORM
dari bagian sebelumnya. Hal ini biasanya menyebabkan banyak kebingungan. 5.7.2 PERFORM ... MELALUI ...
Hindari penggunaanPERFORM <procedure-A> THROUGH <procedure-Z>
. Ini adalah praktik yang baik untuk setiap nama prosedur (bagian) secara eksplisit - ini membuat lebih mudah untuk mencari file sumber untuk semua kejadian dari PERFORM <sectionname>
, dan juga menghindari kemungkinan bahwa seseorang mungkin menambahkan bagian baru antara bagian yang ada tanpa menyadari bahwa sekarang jatuh dalam batas-batas dari PERFORM <A> THROUGH <C>
pernyataan. Suatu program dapat menghasilkan beberapa hasil yang sangat aneh jika bagian adalah `sengaja 'dilakukan di luar urutan, dan tidak mudah untuk debug. 5.7.3 Pernyataan EXIT
ParaEXIT
kata kerja dalam COBOL tidak menghasilkan sebuah instruksi EXIT dalam program objek - itu diabaikan, namun dipertahankan untuk tujuan dokumentasi saja. Setiap kali suatu bagian PERFORM
ed COBOL akan menghasilkan sendiri (tersembunyi) instruksi EXIT ketika bagian-nama berikutnya yang dihadapi. Jika bagian-nama dalam file sumber Anda memiliki kata SECTION
hilang, COBOL akan memperlakukannya sebagai kelanjutan dari bagian sebelumnya - ini dapat menyebabkan beberapa hasil yang sangat aneh (lihat PERFORM <section> ). 5.7.4 Para GO TO Pernyataan
Jangan gunakanGO TO
kerja untuk mentransfer kontrol ke suatu titik yang berada di luar bagian saat ini sebagai poin EXIT tersirat akan diabaikan. Ini berarti bahwa program akan pergi ke mana ia berpikir ia harus pergi, yang mungkin TIDAK mana ia harus pergi. 5.7.5 Pernyataan ALTER
JANGAN MENGGUNAKAN PERNYATAAN ALTER Jika Anda perlu mengubah urutan pengolahan karena kondisi tertentu, kemudian menggunakan satu set alternatif!PERFORM
atau GO TO
pernyataan - mencoba untuk debug program di mana instruksi seperti yang muncul dalam daftar mungkin tidak instruksi yang sebenarnya dihadapi oleh program pada saat dijalankan adalah pengalaman yang sangat frustasi. Jika itu membuat pekerjaan programmer lebih sulit pemeliharaan, maka JANGAN MENGGUNAKANNYA! 5.7.6 Sesuai PINDAHKAN
Hal ini mungkin tampaknya menjadi cara yang ekonomis untuk menulis kode sumber sebagai pernyataan tunggal akan mewakili beberapa aktualMOVE
's. Namun, dalam hal suatu kesalahan yang disebabkan oleh digit ASCII ilegal (atau serupa) jejak diagnostik ini tidak akan mampu mengidentifikasi item mana dasar dalam kelompok barang yang dihasilkan benar-benar kesalahan, yang berarti bahwa itu akan memakan waktu lebih lama untuk mengidentifikasi dan memecahkan masalah. 5.7.7 Pernyataan menghitung
ParaCOMPUTE
kata kerja harus digunakan hanya untuk operasi aritmatika yang kompleks, dan tidak untuk penambahan sederhana atau pengurangan yang. Misalnya, gunakan ADD 1 TO VALUE
bukan COMPUTE VALUE = VALUE + 1
karena lebih efisien dalam sumber daya mesin. Item data dalam
COMPUTE
pernyataan harus, jika mungkin, semua memiliki tipe data yang sama. Jika ada campuran COMP
, COMP-3
dan DISPLAY
bidang mereka akan dikonversi (untuk durasi COMPUTE
operasi) untuk jenis umum sebelum perhitungan dapat terjadi. Sadarilah bahwa jumlah tempat desimal yang digunakan dalam mengevaluasi sebuah ekspresi aritmatika ditentukan oleh jumlah maksimal tempat desimal dalam ekspresi. Hal ini memiliki implikasi ketika melakukan setiap divisi, terutama ketika menghitung persentase yang memiliki divisi tersirat dengan 100. Misalnya, untuk menerapkan tingkat 17,25% Anda memiliki pilihan baik:
- Termasuk pembagian dengan 100 dalam perhitungan dengan menetapkan
* 17.25 / 100
, atau - Melakukan pembagian dengan 100 secara terpisah dan menetapkan
* 0.1725
dalam perhitungan.
5.7.8 AUTOREADS di VPLUS
Ini selalu menjadi standar dalam blok-modus pengolahan layar Hewlett-Packard bahwa pengguna baik menekan tombol ENTER untuk memproses layar saat ini data, atau menekan salah satu tombol fungsi lain untuk melakukan sesuatu yang lain.Fasilitas AUTOREAD diberikan untuk memenuhi keadaan khusus di mana perlu untuk menangkap isi layar saat ini tanpa pengguna bisa menekan tombol ENTER - misalnya, bila menggunakan subsistem BANTUAN.
Fasilitas ini TIDAK disediakan sehingga pengguna bisa bypass tombol ENTER sama sekali, dan tidak boleh digunakan seperti itu.
5.7.9 Pernyataan SORT
Sebuah SORT dapat dilakukan dalam salah satu cara berikut:- Secara internal, dengan menggunakan membangun:
SORT .... PROSEDUR INPUT IS ..... PROSEDUR OUTPUT ADALAH ....
- Secara internal, dengan menggunakan membangun:
SORT .... MENGGUNAKAN <file> PEMBERIAN <file>
- Eksternal, dengan melakukan ekstrak / jenis / Laporan fase sebagai proses terpisah.
Metode (b) memastikan bahwa prosedur masukan (digunakan untuk mengambil data ke file intermediate) selesai sebelum semacam ini dimulai, dan yang semacam selesai sebelum prosedur output (yang proses file diurutkan) ini dimulai. Ini sedikit lebih lambat dibandingkan metode (a), tetapi mengurangi risiko stack overflow.
Metode (c) adalah perbaikan lebih lanjut pada metode (b) sepanjang masing-masing prosedur adalah program yang terpisah. Hal ini berguna jika salah satu dari prosedur input atau output sangat kompleks sebagai kode disimpan sepenuhnya terpisah. Jika terjadi kesalahan maka setiap langkah nantinya bisa menjalankan kembali tanpa harus memproses ulang semua langkah sebelumnya. Jika pilihan yang berbeda diperlukan dalam prosedur output maka mereka harus disediakan dalam program terpisah daripada kode tambahan dan opsional dalam satu program.
5.7.10 Mendefinisikan dan menggunakan File Cetak
Masalah dapat terjadi dengan file mencetak jika mereka tidak didefinisikan dengan benar dalam divisi lingkungan suatu program COBOL. Sebuah contoh dari definisi yang benar adalah sebagai berikut: - PILIH UNTUK ASSIGN <internal-name> "eksternal-nama,,, LP (CCTL)"
Para LP(CCTL)
akhiran menyebabkan file yang akan dibuat dengan perangkat kelas default dari "LP" dan dengan pilihan kereta kontrol dihidupkan. Tanpa itu file akan dibuat sebagai file disk sementara dan tidak akan dicetak, dan akan hilang pada akhir pekerjaan / sesi. Ini telah diketahui menyebabkan kebingungan klien besar ketika ia aliran pekerjaan dan file cetak diharapkan tidak muncul. Jalan keluar dari keadaan ini adalah untuk mengubah jobstream (s) untuk menyertakan file menyamakan yang mengubah karakteristik file dari sebuah file disk sementara ke file spool. Program harus menggunakan
WRITE <record> AFTER/BEFORE n/TOP-OF-PAGE
pernyataan untuk menambahkan catatan ke file cetak yang secara otomatis akan menyisipkan kereta-kontrol instruksi yang tepat. Praktek mendefinisikan file sebagai file disk serial dengan karakter ekstra di awal mengandung hard-kode kontrol kereta-nilai harus dihindari. Pernyataan MENERIMA 5.7.11
Jika sebuah program membutuhkan nilai parameter sebelum dapat melanjutkan dengan pengolahan adalah praktek yang normal untuk mendapatkan ini dari file STDIN $ dengan menggunakanACCEPT <dataname>
verba. Sebelum setiap
ACCEPT
pernyataan harus ada yang sesuai DISPLAY
pernyataan dalam rangka untuk mengidentifikasi bahwa beberapa data masukan yang diperlukan, dan untuk menunjukkan format / konten yang harus mengambil. Sebagai contoh: DISPLAY "Masukkan tanggal pemilihan (DDMMYY):" Memajukan NO. MENERIMA W01-RUN-DATE. DISPLAY W01-RUN-DATE.Ini harus mencegah situasi di mana program menunggu input dari pengguna sementara pengguna menunggu instruksi dari program ini.
Jika program ini bertanggung jawab untuk dijalankan dalam jobstream maka itu akan menjadi ide yang baik untuk mengikuti
ACCEPT <dataname>
dengan DISPLAY <dataname>
. Output $ STDLIST kemudian akan menunjukkan tidak hanya apa nilai parameter yang diminta, tetapi juga nilai yang disertakan. 6. Contoh Prosedur online
6.1 Pendahuluan
Ini prosedur standar COBOL menggunakan area komunikasi VPLUS yang didefinisikan dalam COMAREA di perpustakaan salinan standar (STANDARD.LIB.STANDARD).Definisi makro dapat ditemukan dalam berkas STDMACRO.LIB.STANDARD makro.
Dalam kebanyakan situasi prosedur ini menggantikan kebutuhan untuk memanggil semua orang intrinsik VPLUS individual - semua panggilan umum dikelompokkan bersama dan diproses dalam urutan yang benar, sebagaimana dan ketika diperlukan. Para intrinsik hanya tidak termasuk adalah VPUTBUFFER dan VGETBUFFER, karena mereka membutuhkan alamat buffer data yang unik untuk setiap bentuk yang berbeda.
Prosedur ini mengasumsikan standar pemrograman berikut:
- Tidak ada formulir menambahkan digunakan, hanya bentuk-bentuk keluarga.
- Setiap form akan berisi standar pos pada dua baris atas, untuk diisi dengan berbagai data pada saat dijalankan.
- Identitas bentuk yang akan diambil dan diproses sulit-kode dalam setiap program, dan tidak diambil dari pengaturan di formsfile tersebut. Jika bentuk apapun memiliki nilai dalam NFNAME akan diabaikan.
- Hanya mereka terminal yang mendukung fungsi utama label akan digunakan. Fungsi label tombol akan sulit-kode, dan tidak diambil dari definisi formsfile.
- Tombol fungsi 6,7 dan 8 memiliki nilai preset, sebagai berikut:
- F6 = PRINT (untuk mencetak bentuk saat ini)
- f7 = BANTUAN (lihat subrutin UHELP)
- f8 = EXIT (menghentikan transaksi berjalan).
- Semua tombol fungsi lain dapat digunakan untuk memilih opsi pengolahan yang berbeda sebagai dan ketika mereka menjadi tersedia - Namun, deskripsi yang berarti harus ditempatkan di area label yang sesuai.
- Setiap tombol fungsi TANPA label dianggap tidak valid, dan akan menampilkan pesan kesalahan jika dipilih.
- Garis jendela tidak pernah kosong - selalu harus mengandung semacam instruksi atau pesan informatif. Sebuah pesan default akan digunakan jika tidak ada yang diberikan.
6.2 Standar VPLUS Macro
Makro berikut adalah yang paling sering digunakan untuk pengolahan layar VPLUS. Macro diperoleh dari file STDMACRO [NM]. LIB, dan didokumentasikan dalam manual berjudul Perpustakaan Macros Standar COBOL . Subrutin yang mereka sebut didokumentasikan dalam panduan berjudul Perpustakaan Utilitas Standar .% VGETBUFFER (Para #, Buffer #) | Transfer penyangga layar untuk buffer data program. |
% VPUTBUFFER (Para #, Buffer #) | Program transfer data buffer ke buffer layar. |
% SAVINITFORM (Para #, Formulir #) | Menginisialisasi beban dan bentuk baru. |
% ACCEPTENTER (Para #) | Menampilkan bentuk saat ini, jendela baris dan label fungsi kunci, kemudian menunggu pengguna untuk tekan salah satu tombol ENTER atau salah satu tombol fungsi berlabel. |
% ACCEPTFUNCTION (Para #) | Mirip dengan ACCEPTENTER%, tapi akan menolak tombol ENTER. |
% SCVSETERROR (Para #) | Lapangan bendera VIEW-BIDANG-NAMA dalam kesalahan, menggunakan pesan dalam VIEW-WINDOW. |
% SDVPUTFIELD (Para #) | Update nilai dari sebuah field dalam buffer layar saat ini tanpa mempengaruhi data dalam salah satu bidang lainnya. |
% BLINKMSG (Para #) | Menampilkan pesan di garis jendela dengan menetapkan pilihan berkedip, dan kunci keyboard sampai ACCEPTENTER% berikutnya atau ACCEPTFUNCTION%. |
6.3 Contoh
6.3.1 Contoh layar pengolahan
Setiap layar harus diproses secara terpisah, sebagai berikut:C-LAYAR-MA01 BAGIAN. ************************************************** ********** * <<Description masuk sini .... ************************************************** ********** C-10-INIT. SAVINITFORM% (C-10 #, MA01 #). C-20-LOAD-BUFFER. <<Ada 2 cara pembebanan nilai ke layar: baik:% VGETBUFFER (C-20 #, MA01-BUFFER #). PINDAHKAN KE <value> MA01-<item>. VPUTBUFFER% (C-20 #, MA01-BUFFER #). atau: PINDAHKAN <value> UNTUK MELIHAT DATA-BIDANG-. PINDAHKAN <item-name> UNTUK MELIHAT-NAMA BIDANG-. SDVPUTFIELD% (C-20 #). <<Jika Anda ingin menggunakan fungsi f1 kunci F5 itu perlu <<Untuk memuat nilai ke label yang sesuai: C-30-ACCEPT. PINDAHKAN "<label>" UNTUK MELIHAT-LABEL (n). PINDAHKAN "PILIHAN LAIN" UNTUK MELIHAT-LABEL (5). ACCEPTENTER% (C-30 #). C-40-KUNCI. EVALUASI BENAR KETIKA F0 PERFORM CA-ENTER-KUNCI JIKA VEDIT-KESALAHAN GO TO C-30-ACCEPT AKHIR-JIKA KETIKA <process tombol fungsi Fn n> KETIKA F5% USELECT (C-30-ACCEPT #, C-EXIT #) KAPAN LAIN GO TO C-EXIT AKHIR-MENGEVALUASI. C-EXIT. EXIT.Berikut adalah bagian sampel yang dipanggil ketika pengguna menekan tombol ENTER. Jika data tersebut valid pengguna harus menekan kunci lain untuk menambahkan data ini untuk database, atau ia dapat mengubah salah satu data dan memilikinya divalidasi lagi.
CA-ENTER-KUNCI BAGIAN. ************************************************** **************** * ENTER telah ditekan - memvalidasi data dan memprosesnya. ************************************************** **************** CA-10-memvalidasi. VGETBUFFER% (CA-10 #, MA01-BUFFER #). PERFORM CAA-memvalidasi-MA01. JIKA VEDIT-KESALAHAN GO TO CA-EXIT. CA-20-CONFIRM. PINDAHKAN "BATAL" UNTUK MELIHAT-LABEL (4). * Pengguna menegaskan data ini dengan menekan tombol fungsi 5 CONFIRMDATA% (CA-20 #, 5 #, CA-10-memvalidasi #). JIKA TIDAK F5 PINDAHKAN RUANG UNTUK MELIHAT-LABEL (4) GO TO CA-EXIT. CA-30-PROSES. * Pengolahan - harap tunggu BLINKMSG% (CA-30 #). PERFORM CAB-PROSES-DATA. JIKA GAMBAR-LOCK-KEGAGALAN GO TO CA-20-CONFIRM AKHIR-JIKA. CA-EXIT. EXIT.Berikut adalah bagian validasi sampel. Perhatikan bahwa proses berhenti pada kesalahan pertama, jika tidak isi dari garis jendela mungkin tidak berhubungan dengan bidang di mana kursor diposisikan.
CAA-memvalidasi-MA01 BAGIAN. CAA-10-ITEM-1. % DBGET7 (CAA-10 #, BASE #, SET #, ARG #). JIKA GAMBAR-NO-ENTRY PINDAHKAN "<message number>" UNTUK MELIHAT-WINDOW PINDAHKAN "<item-name>" UNTUK MELIHAT-NAMA BIDANG- % SCVSETERROR (CAA-10 #) GO TO CAA-EXIT AKHIR-JIKA. PINDAHKAN KE item> <database MA01-<item>. CAA-20-ITEM-2. <Serupa dengan CAA-10 < CAA-99-PUTBUFFER. % VPUTBUFFER (CAA-99 #, MA01-BUFFER #). CAA-EXIT. EXIT.
6.3.2 array layar Memvalidasi
Karena bentuk menambahkan tidak digunakan mungkin ada kesempatan ketika layar berisi berbagai barang yang program ini untuk memvalidasi individual. Jika salah satu item tidak valid adalah penting untuk bendera bidang yang benar dalam kesalahan di layar. Masing-masing bidang harus diidentifikasi dengan nomor lapangan sebenarnya untuk digunakan olehVSETERROR
intrinsik. Namun, rutinitas layar standar penanganan memungkinkan lapangan untuk diidentifikasi dengan namanya sebagai VGETFIELDINFO
intrinsik digunakan untuk mengkonversi ini menjadi nomor. Hal ini memungkinkan kode berikut akan digunakan untuk memvalidasi array item:
- Tambahkan jumlah kejadian untuk setiap nama item dalam definisi bentuk: misalnya:
ITEM01
,ITEM02
,...
,ITEM13
dll - Gunakan subscript dalam format
PIC 99
. - Validasi sebagai berikut:
JIKA ITEM (subskrip) tidak valid PINDAHKAN "<message number>" UNTUK MELIHAT-WINDOW STRING "ITEM" <subscript> dibatasi oleh UKURAN VIEW KE-BIDANG-NAMA % SCVSETERROR (Para #) GO TO <exit paragraph>.
6.3.3 Penanganan nilai numerik
Menampilkan nilai numerik:
- Semua layar-hanya kolom harus memiliki jenis mereka diatur untuk
CHAR
untuk menghindari menyebabkanVFIELDEDIT
kesalahan pada nilai-nilai yang tidak dapat diubah. - Item dalam buffer layar harus didefinisikan sebagai berikut:
01 MA01-BUFFER. 03 MA01-HDG PIC X (??). 03 MA01-Item1 PIC X (??). 03 MA01-nilai1 PIC Z (5) 9,99-. 03 MA01-nilai2 PIC Z (4) 9,999-BLANK ZERO. dll
- Prosedur laporan pembagian harus:
PINDAHKAN nilai1 <PIC S9(7)V99 COMP> UNTUK MA01-nilai1. PINDAHKAN value2 <PIC S9(6)V999 COMP> UNTUK MA01-nilai2.
MENERIMA nilai numerik:
- Semua bidang input numerik harus memiliki jenis yang tepat, misalnya:
NUM2
untuk dua tempat desimal,NUM3
untuk 3 tempat desimal, dll Ada juga harus menjadiFINISH
pernyataan untukSET
lapangan untuk dirinya sendiri dalam rangka untuk strip nol terkemuka, koma strip, menyesuaikan untuk jumlah tempat desimal yang benar, dan ke kanan-membenarkan nilai. - Definisi penyangga seperti di atas.
- Gunakan rutinitas UNUMBER untuk memindahkan nilai dari buffer layar untuk daerah internal, misalnya:
% UNUMBER2 (MA01-nilai1 #, nilai1 #). % UNUMBER2 (MA01-value2 #, value2 #).
7. Contoh Batch Prosedur
7.1 Laporan Percetakan
Memproduksi laporan bets dari program COBOL tidak seperti tugas yang membosankan jika Anda mengikuti prosedur seperti ini:- Mengatur bidang berikut di KERJA-PENYIMPANAN:
01 PAGE-COUNT PIC 9 (4) COMP NILAI NOL. MAX-LINES 01 PIC 9 (4) COMP NILAI 60. 01 LINE-COUNT PIC 9 (4) COMP NILAI 99. 01 LINE-ADVAN CE PIC 9 (4) COMP NILAI NOL. 01 LINE-GROUP PIC 9 (4) COMP NILAI NOL. 01 PRINT-LINE PIC X (132).
- HALAMAN-COUNT memberi Anda berjalan total jumlah halaman yang dihasilkan sejauh ini - selalu dimulai dengan nol.
- MAX-GARIS menunjukkan jumlah maksimum baris yang akan digunakan pada setiap halaman - ini tidak termasuk margin atas dan bawah, tapi mencakup semua judul halaman. Jika Anda merasa perlu untuk mengubah ukuran halaman maka ini adalah satu-satunya bidang yang perlu amandemen.
- LINE-COUNT digunakan untuk menunjukkan berapa banyak baris benar-benar telah digunakan pada halaman saat ini. Itu dimulai pada 99 untuk mensimulasikan kondisi bahwa halaman saat ini penuh dan baris berikutnya harus dimulai pada halaman baru.
- LINE-ADVANCE digunakan untuk menunjukkan apa yang harus digunakan spasi antara baris terakhir dicetak dan baris saat ini.
- LINE-GROUP adalah digunakan untuk menunjukkan bahwa Anda ingin mencetak jumlah baris sebagai kelompok pada halaman yang sama, bukan split lebih dari dua halaman.
- PRINT-LINE adalah tempat penyimpanan sementara yang digunakan oleh modul cetak standar.
- Membentuk bagian-bagian DIVISI PROSEDUR serupa dengan berikut ini:
ZA-PRINT-LINE BAGIAN. ************************************************** ************ * Modul Standar untuk mencetak baris. ************************************************** ************ ZA-10-HAL-LENGKAP. * Jika tidak ada cukup ruang pada halaman saat ini * Line (atau kelompok garis) kemudian memulai halaman baru. IF (COUNT + LINE-LINE-ADVANCE + LINE GROUP)> MAX-LINES PERFORM ZAA-PRINT-HEADING. * Sekarang mencetak baris saat ini. CETAK-REC MENULIS DARI SETELAH PRINT-LINE LINE-ADVANCE. * Increment LINE-COUNT dan reset LINE-GROUP ADD TO ADVANCE LINE-LINE-COUNT. PINDAHKAN KE ZERO LINE-GROUP. ZA-EXIT. EXIT. $ HALAMAN ZAA-PRINT-BAGIAN HEADING. ************************************************** ************ * Modul Standar untuk mencetak judul halaman. ************************************************** ************ ZAA-10-NEW-PAGE. Masukkan 1 KE HALAMAN-COUNT. PINDAHKAN KE HALAMAN-COUNT H1-PAGE-NO. JIKA HAL-COUNT = 1 * Jangan meletakkan sebuah halaman kosong pada awal file CETAK-REC MENULIS DARI HDG-1 SETELAH 0 ELSE CETAK-REC MENULIS DARI HDG-1 SETELAH TOP-OF-HALAMAN AKHIR-JIKA. CETAK-REC MENULIS DARI HDG-2 SETELAH 1. CETAK-REC MENULIS DARI HDG-3 SETELAH 2. CETAK-REC MENULIS DARI HDG-4 SETELAH 2. PINDAHKAN KE 6 LINE-COUNT. <Ini adalah posisi setelah HDG-4> PINDAHKAN KE 3 LINE-ADVANCE. <1 garis rinci akan selalu> <Menjadi 3 baris dibawah judul> ZAA-EXIT. EXIT.
- Gunakan mereka dengan cara berikut:
- Anda tidak perlu untuk mencetak judul pada halaman 1 setelah membuka file cetak, hal ini dilakukan secara otomatis ketika baris pertama dicetak (ini adalah mengapa
LINE-COUNT
dimulai dengan nilai 99). - Jika mungkin untuk program untuk menghasilkan laporan nol (yaitu: tidak ada garis laporan yang dihasilkan) ini dapat dideteksi dalam modul terminasi oleh kenyataan bahwa
PAGE-COUNT
masih nol. Sebuah bendera terpisah tidak diperlukan. - Ketika mencetak garis detail di tingkat terendah (dengan spasi tunggal, misalnya) menggunakan perintah berikut:
PINDAHKAN KE <detail-line> PRINT-LINE. PERFORM ZA-PRINT-LINE. PINDAHKAN KE LINE-1 ADVANCE.
Perhatikan bahwaLINE-ADVANCE
diatur SETELAH panggilan ke modul ZA - ini adalah untuk memungkinkan kasus-kasus di mana detil 1 baris dalam seri saat ini tidak segera mengikuti baris sebelumnya (kelompok pos, misalnya). - Dalam kasus di mana sebuah kelompok menuju perlu dicetak baris <n1> setelah baris terakhir, dan dengan garis-garis <n2> sebelum detail 1, gunakan perintah berikut:
PINDAHKAN KE <group-heading> PRINT-LINE. PINDAHKAN KE <n1> LINE-ADVANCE. PERFORM ZA-PRINT-LINE. PINDAHKAN KE <n2> LINE-ADVANCE.
- Dalam kasus-kasus di mana sebuah kelompok pos harus mulai di halaman baru Anda tidak perlu memanggil modul ZAA - itu sudah cukup untuk mengatur LINE-COUNT untuk 99 sebelum menelepon ZA modul.
- Anda tidak perlu untuk mencetak judul pada halaman 1 setelah membuka file cetak, hal ini dilakukan secara otomatis ketika baris pertama dicetak (ini adalah mengapa
7.2 Kontrol Breaks dengan file diurutkan
Berikut adalah metode terstruktur untuk memproses file diurutkan yang memiliki tiga tingkat data. Ada bagian yang terpisah untuk setiap tingkat (atau menghancurkan kontrol). Dengan struktur ini relatif mudah untuk menangani sejumlah istirahat kontrol.BAGIAN FILE. * SD SORT-FILE. 01 SORT-REC. 03 SR-LEVEL- 1 PIC X (20). 03 SR-LEVEL- 2 PIC X (10). 03 SR-LEVEL- 3 PIC XX. 03 SR-AMOUNT PIC S9 (7) V99 COMP. * KERJA-PENYIMPANAN BAGIAN. * 01 W01-TINGKAT-1 PIC X (20). 01 W01-TINGKAT-1-TOTAL PIC S9 (16) V99 COMP. 01 W02-TINGKAT-2 PIC X (10). 01 W02-TINGKAT-2-TOTAL PIC S9 (16) V99 COMP. 01 W03-TINGKAT-3 PIC XX. 01 W03-TINGKAT-3-TOTAL PIC S9 (16) V99 COMP. 01 W04-LAPORAN-TOTAL PIC S9 (16) V99 COMP.Perhatikan bahwa dalam kode contoh berikut awalan bagian dimulai dengan satu huruf daripada kelompok 4 atau 5 huruf. Hal ini karena prosedur laporan biasanya merupakan langkah benar-benar terpisah (seperti ekstrak data yang dibangun file diurutkan) dan tidak benar-benar bawahan ke pengolahan lainnya. Bagian selanjutnya memperluas awalan ini dengan penambahan jumlah tingkat daripada set terus meningkat dari karakter abjad. Jadi tingkat 4 memiliki awalan
F4-
daripada FABCD-
. Setiap bagian lain yang dilakukan pada tingkat tertentu maka harus mengikuti metode normal menambahkan karakter alpha untuk awalan, misalnya: F2A-
, F2B-
, dll F-BAGIAN LAPORAN. ************************************************** ************ * Laporan diekstrak catatan dalam LEVEL1/2/3 berurutan. ************************************************** ************ F-10-BACA-PERTAMA. RETURN SORT-FILE AKHIR PINDAHKAN KE NILAI TINGGI-SORT-REC. F-20-PROSES-level1. PINDAHKAN KE ZERO W04-LAPORAN-TOTAL. PERFORM F1-LAPORAN-level1 SAMPAI SORT-REC = TINGGI-NILAI. <<Akhir file>> F-30-LAPORAN-AKHIR. <Total cetak <laporan>> F-EXIT. EXIT. $ HALAMAN F1-LAPORAN-level1 BAGIAN. ************************************************** ************ * Proses perubahan TINGKAT-1. ************************************************** ************ F1-10-MULAI-level1. * Mulailah setiap TINGKAT-1 pada halaman baru PINDAHKAN KE 99 LINE-COUNT. PERFORM F1A-TINGKAT-1-MULAI. F1-20-PROSES-level2. PINDAHKAN KE ZERO W01-TINGKAT-1-TOTAL. PINDAHKAN SR-TINGKAT-1 KE W01-TINGKAT-1. PERFORM F2-LAPORAN-level2 SAMPAI SORT-REC = TINGGI-NILAI <<akhir file>> ATAU SR-TINGKAT-1 TIDAK = W01-TINGKAT-1. F1-30-END-DEPOT. PERFORM F1B-TINGKAT-1-END. ADD W01-TINGKAT-1-TOTAL TOTAL UNTUK W04-LAPORAN-. F1-EXIT. EXIT. $ HALAMAN F2-LAPORAN-level2 BAGIAN. ************************************************** ************ * Proses perubahan TINGKAT-2. ************************************************** ************ F2-10-MULAI-level2. <<Melakukan pengolahan untuk memulai LEVEL-2>> F2-20-PROSES-Level3. PINDAHKAN KE ZERO W02-TINGKAT-2-TOTAL. PINDAHKAN SR-TINGKAT-2 KE W02-TINGKAT-2. PERFORM F3-LAPORAN-Level3 SAMPAI SORT-REC = TINGGI-NILAI <<akhir file>> ATAU SR-TINGKAT-1 TIDAK = W01-TINGKAT-1 ATAU SR-TINGKAT-2 TIDAK = W02-TINGKAT-2. F2-30-END-level2. << perform any processing for end of LEVEL-2 >> ADD W02-LEVEL-2-TOTAL TO W01-LEVEL-1-TOTAL. F2-EXIT. EXIT. $PAGE F3-REPORT-LEVEL3 SECTION. ************************************************************** * Process change of LEVEL-3. ************************************************************** F3-10-START-LEVEL3. << perform processing for start of LEVEL-3 >> F3-20-PROCESS-LEVEL3. MOVE ZERO TO W03-LEVEL-3-TOTAL. MOVE SR-LEVEL-3 TO W03-LEVEL-3. PERFORM F4-ACCUMULATE-LEVEL4 UNTIL SORT-REC = HIGH-VALUES << end of file >> OR SR-LEVEL-1 NOT = W01-LEVEL-1 OR SR-LEVEL-2 NOT = W02-LEVEL-2 OR SR-LEVEL-3 NOT = W03-LEVEL-3. F3-30-END-LEVEL3. << perform any processing for end of LEVEL-3 >> ADD W03-LEVEL-3-TOTAL TO W02-LEVEL-2-TOTAL. F3-EXIT. EXIT. $PAGE F4-ACCUMULATE-LEVEL4 SECTION. ************************************************************** * Accumulate all amounts into W03-LEVEL-3-TOTAL. ************************************************************** F4-10-ACCUMULATE. ADD SR-AMOUNT TO W03-LEVEL-3-TOTAL. F4-20-READ-NEXT. RETURN SORT-FILE AT END MOVE HIGH-VALUES TO SORT-REC. F4-EXIT. EXIT.
8. Petunjuk pemrograman
8.1 Multi-line Enquiry screens
It is quite common for some enquiry screens to be constructed using repeating data, eg: to list all invoices for a customer, or to list lines within an invoice. In these cases multiple records are accessed (usually from a detail chain on an IMAGE database), and each record is loaded into one line on the screen. Here are some tips that may prove useful:FORMSPEC definition
Each detail line on the screen will contain several items of data, and it would seem logical to define each data item as a separate field on the screen. However, this could lead to the form containing a very large number of fields, as in the following example:DOCNO_01 DATE_01. DESCRIPTION_01................ VALUE_01.... VAT_01. DOCNO_02 DATE_02. DESCRIPTION_02................ VALUE_02.... VAT_02. " " " " " " " " " " DOCNO_10 DATE_10. DESCRIPTION_10................ VALUE_10.... VAT_10.An easier option would be to define each line as a single field on the screen and have the program split each line down into its component parts, as in the following example:
LINE_01.............................................................. LINE_02.............................................................. " " " " " " " " " " LINE_10..............................................................This cuts down the time used to build and maintain the screen as the 10 lines contain just 10 fields instead of 50, and also cuts down the size of the form within the formsfile as there are fewer fields that require start/end delimiters. The only overhead is within the program as the definition for each line must now contain the spaces between each data item.
Overflow data
It has been known that the amount of data available for each entity is too large to fit onto a single 80-column line on the screen. One way around this problem would be to take up two lines for each entity, but this would cut in half the number of entities that could be shown on a single screen.Another option would be to stick to the single line per entity and split the amount of data to be displayed for each entity into two or more sets. By providing the user with a special function key he can then "toggle" between the different sets of data. By changing the column headings from hard-coded text on the form into a data field it would then be possible for the program to change the headings to suit the data being displayed.
When the program reads the data for each entity it should load it into an intermediate storage area and not directly into the screen buffer. There should then be a separate section to transfer each different set of data from this intermediate area into the screen buffer depending on the setting of the "toggle" switch.
Paging between screens
As it is only possible to display one screenfull of data at a time it is usual practice to supply function keys which allow the user to move forwards to the next page or backwards to the previous page. This is easily done when reading from an IMAGE detail dataset as it is possible to read both forward and backwards, and to reposition at any record within the chain.Various methods have been used to implement the paging functions, but the most successful one follows these lines:
- When reading from the detail chain into a program array additional areas are required to store the addresses of the first and last records on the current screen.
- The section which loads the next page should do the following:
- Reposition the chain pointer (using
%DBGET4
) to the address of the last record on the current screen. - Do a forward chained read (
%DBGET5
). - Load details into the screen buffer from the top down.
- Reposition the chain pointer (using
- The section which loads the previous page should do the following:
- Reposition the chain pointer to the address of the first record on the current screen.
- Do a backward chained read (
%DBGET6
). - Load details into the screen buffer from the bottom up.
8.2 Multi-line Input/Update screens
Where an input/update function has room for an array of entities on the screen it can be quite complicated to allow the user to access the whole of the array to add, amend or delete different records. One very versatile method is to make the bulk of the array into display-only fields (similar to the enquiry function in the previous section) and to restrict all modifications to the last line on the screen (known as the "action" line).Two additional fields will be normally be required on this "action" line - one to identify the record to be manipulated, and another to identify the mode (Add, Change or Delete).
This means that only one record at a time can me manipulated, but the display-only block above the "action" line would have room to show the details of other records, with function key options to load the previous or next page of records as in the enquiry function.
The program code to handle each action mode would be as follows:
Tambahkan | Validate for a new record, add to database, transfer details to next available blank line in the display area, or scroll the existing details up to make room on the last display line. |
Memperbarui | Load details of the selected record into the action line, allow the user to make amendments, then overwrite details in the screen area with the new values. |
Hapus | Load details of the selected record into the action line, and if confirmed delete the record from the database and blank out the corresponding line in the display area. |
%DBGET4
) before they could be updated or deleted. If either of the first/last records in the current screen were deleted the stored record addresses used for the next/previous page functions would have to be modified to reflect the actual first/last records after the deletion has taken place, otherwise the
%DBGET4
would be given a record address that does not exist, and would cause the program to abort. - END -
Tidak ada komentar:
Posting Komentar