text maarque kanan

INGATKAN DIRIMU UNTUK MENGATUR SEGALA SESUATU SUDAH DI ATUR ALLOH

salju

Selasa, 27 Desember 2011

cobol standar

Pemrograman COBOL Standar


Penulis : AJ Marston
Tanggal Dibuat : September, 1984
Tanggal Revisi : Februari, 1993
Versi : 01.006.000

ISI


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.
Bagaimana kode mendokumentasikan diri diproduksi?
  • 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.
Ini membantu jika semua komentar dalam huruf kecil, untuk membedakan dari perintah yang sebenarnya yang harus selalu di atas-kasus. Meninggalkan hanya satu ruang antara tanda bintang di kolom tujuh dan awal dari komentar - ruang lebih banyak tenaga untuk masuk di tempat pertama, dan tentu saja tidak membuat komentar lebih mudah dibaca.
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:
  1. NAMA PROGRAM - ini harus mengikuti konvensi penamaan perusahaan itu, itu harus unik untuk setiap program, dan juga harus dikaitkan dengan nama file sumber.
  2. PENULIS - jadi kita akan tahu siapa yang harus disalahkan jika ada sesuatu yang salah!
  3. TANGGAL-TERTULIS - ini memberi kita umur versi asli.
  4. TANGGAL-compiled - ini secara otomatis dimasukkan oleh COBOL compiler, dan menunjukkan usia dari versi saat ini dari program ini.
  5. Fungsi program - apa tujuannya? Apakah program yang berdiri sendiri, atau bagian dari rangkaian program? Ketika itu dijalankan?
  6. Akses database - database apa yang digunakan, dan dalam apa mode?
  7. Dataset akses - apa dataset yang digunakan, dan bagaimana mereka diakses (membaca, menulis, memperbarui atau menghapus)?
  8. Non-file database akses (MPE, KSAM) - mengidentifikasi file mana yang diakses, dan bagaimana.
  9. Mencetak file - apa laporan diproduksi, dan apa alat tulis khusus yang diperlukan?
  10. VPLUS pengolahan - apa adalah nama dari file bentuk, dan apa nama bentuk individu?
  11. Penggunaan subroutine - mengidentifikasi setiap subrutin dipanggil oleh program ini, memberi nama dan deskripsi singkat.
  12. Perubahan sejarah - setiap kali program berubah Anda harus memasukkan catatan memberikan tanggal amandemen, penjelasan singkat dari amandemen, plus nama Anda.
Butir (a) (b) (c) dan (d) dapat ditentukan dengan menggunakan pernyataan Divisi Identifikasi standar COBOL. Sisanya harus dimasukkan sebagai baris komentar.
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).
Klausa gambar diperlukan hanya untuk item SD - merekam nama dan item kelompok mengasumsikan gambar dari PIC X (n) di mana `n 'adalah panjang gabungan dari semua item bawahan dalam definisi kelompok.
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: -
  1. 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).
  2. 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.
  3. Lekukan antara satu nomor tingkat dan berikutnya harus 4 kolom.
  4. Harus ada 2 ruang antara sejumlah nama yang terkait tingkat dan datanya.
Efek dari item (c) dan (d) adalah bahwa data nama untuk satu tingkat selaras dalam kolom yang sama sebagai nomor level untuk tingkat berikutnya. Hal ini mungkin tampak tidak relevan, tapi saya berpikir bahwa itu terlihat lebih baik. Bila menggunakan editor teks QEDIT dalam modus layar penuh adalah mungkin untuk menentukan tab berhenti di kolom 8,12,16,20,24,28 dll, oleh karena itu pengaturan tab yang sama dapat digunakan untuk kedua nomor tingkat dan data nama.

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-NO
Mana 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 / array
Namun, 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-lain
Ini 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.
Seperti dapat dilihat pada bagian sebelumnya item subskrip digunakan untuk mengakses 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 25
Isi 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
Dengan COBOL'85 sekarang mungkin untuk mengatur kondisi dengan mengacu pada nama bukan dari nilai sebenarnya, misalnya:
 PINDAHKAN KE GAMBAR-0 STATUS
adalah sama dengan
 SET IMAGE-OK UNTUK BENAR
Hanya ada 2 pedoman sederhana untuk mengikuti ketika mendefinisikan kondisi-nama:
  1. Gunakan deskripsi yang berarti untuk setiap kondisi;
  2. 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 atau VPLUS-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: -
  1. Gunakan nama yang berarti data (bukan SW1, SW2, SW3, dll).
  2. Jangan menggunakan indikator untuk lebih dari satu tujuan.
Berikut adalah beberapa pengamatan yang lebih tentang bendera dan switch: -
  • 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 kondisi VEDIT-ERRORS dan NO-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).
Kontrol dapat ditularkan dari satu titik dalam sebuah program lain dengan menggunakan pernyataan berikut:
 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:
cobolstandards-01 (1K)
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 ').
Dimana desain awal menghasilkan sebuah kotak yang merupakan kombinasi dari iterasi / URUTAN atau iterasi / SELEKSI metodologi yang paling bersikeras bahwa struktur dipertahankan dengan memisahkan dua bagian dan melakukan iterasi pada tingkat yang lebih rendah.

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:
  1. 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:
    cobolstandards-02 (1K)
  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:
    cobolstandards-03 (1K)
Sekarang mari kita membahas manfaat relatif dari kedua metode.
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



cobolstandards-04a (1K)
cobolstandards-04B (1K)
Menggunakan metode (b) adalah mungkin untuk menambah atau mengurangi jumlah bagian dalam kaki pengolahan tertentu tanpa harus merubah nama bagian lain dalam rangka mempertahankan urutan penamaan. Lihat betapa mudahnya adalah dalam metode (b) untuk memisahkan bagian "DA" menjadi "daa" dan "DAB", kemudian mencoba dan membuat perubahan yang sesuai pada metode (a) .
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:
cobolstandards-05 (2K)
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:
cobolstandards-06 (6K)
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:
  1. Seorang pelanggan tunggal,
  2. Sebuah negara tunggal, bagi semua pelanggan di negara tersebut,
  3. Sebuah wilayah tunggal, bagi semua negara dalam wilayah tersebut,
  4. Semua daerah (yaitu: semua pelanggan).
Ini akan menghasilkan sesuatu struktur tabel seperti yang ditunjukkan pada Gambar 7:
cobolstandards-07 (2K)
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: -
  1. Setiap bagian harus mulai pada halaman baru.
  2. 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.
  3. Setiap nama bagian harus menjadi deskripsi singkat tapi bermakna fungsi bagian tersebut (misalnya: CA-SELECT-COMPONENT , DEA-UPDATE-COMPONENT ).
  4. Para DIVISI PROSEDUR keseluruhan harus diatur dalam urutan mnemonic sehingga masing-masing bagian dapat ditemukan lebih mudah.
  5. Kontrol harus lulus dari satu bagian ke bagian lain dengan menggunakan PERFORM <section> pernyataan, dan bukan GO TO <paragraph> pernyataan, maupun PERFORM <para1> THRU <para2> pernyataan.
  6. Setiap bagian harus memiliki titik masuk tunggal (paragraf pertama) dan titik keluar tunggal (paragraf terakhir).
  7. 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).
  8. 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.
  9. Antara section-name dan pertama paragraph-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: -
  1. Setiap nama paragraf harus menjadi deskripsi singkat tapi bermakna fungsi ayat tersebut.
  2. 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 ).
  3. 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.
  4. Dua digit yang memadai untuk nomor urut - jika ada lebih banyak dibutuhkan itu berarti bahwa Anda telah melanggar pedoman mengenai ukuran bagian Anda.
  5. Paragraf terakhir harus berisi apa-apa tetapi EXIT pernyataan, dan tidak perlu memiliki nomor urut (misalnya: BA-99-EXIT atau BA-EXIT ).
  6. Jika Anda perlu untuk melewati kontrol ke titik lain dalam bagian yang sama menggunakan GO TO <paragraph-name> pernyataan. JANGAN gunakan PERFORM <paragraph-name> pernyataan.
  7. Jika Anda perlu untuk melewati kontrol ke bagian lain menggunakan PERFORM <section-name> pernyataan. JANGAN gunakan GO TO pernyataan pada apa pun selain nama-ayat dalam bagian ini.
  8. 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: -
  1. Setiap kalimat harus mulai pada kolom 12.
  2. 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.
  3. 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 atau GIVING bagian dari verba) ke baris berikutnya, Indentasi oleh empat karakter posisi.
  4. 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 semua TO 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.
  5. Jangan meletakkan spasi antara pernyataan individu. Hal ini diperbolehkan, namun, untuk memiliki garis ruang antara kelompok pernyataan untuk menunjukkan pemisahan logis.
  6. 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:
  1. 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.
  2. Kata ELSE harus sejajar dalam kolom yang sama persis seperti IF untuk yang terkait. Hal ini membuat asosiasi lebih jelas dalam daftar, terutama dengan beberapa atau bersarang IFs .
  3. 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. Seperti ELSE , yang END-IF harus sejajar dalam kolom yang sama persis seperti IF dengan yang terkait.
  4. Pernyataan-1 dan pernyataan-2 harus indentasi, biasanya dengan empat posisi karakter. Hal ini memungkinkan IF , ELSE dan END-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 bersarang IFs :
  5. 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.
    
  6. Jangan pernah menggunakan lebih dari tiga tingkat bersarang IF - mereka sangat sulit untuk debug dan memelihara.
  7. Ingat bahwa setiap ELSE dipasangkan dengan IF 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 jika END-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.
    
  8. Dalam kasus di mana suatu ELSE segera diikuti oleh IF pernyataan tanpa intervensi (yaitu: di mana hanya satu dari serangkaian kondisi akan BENAR) tidak perlu untuk indent pada setiap baru IF 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
    
    Dengan kedatangan COBOL'85 ini harus ditulis sebagai berikut:
     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:
  9. Lampirkan setiap kondisi individu dalam tanda kurung.
  10. 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.
  11. 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 penggunaan GO 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 memungkinkan PERFORM 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 penggunaan PERFORM <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

Para EXIT 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 gunakan GO 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 aktual MOVE '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

Para COMPUTE 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:
  1. Termasuk pembagian dengan 100 dalam perhitungan dengan menetapkan * 17.25 / 100 , atau
  2. Melakukan pembagian dengan 100 secara terpisah dan menetapkan * 0.1725 dalam perhitungan.
Jika tidak ada item dalam perhitungan setidaknya memiliki 4 tempat desimal maka hasil antara dari (a) di atas tidak akan akurat, sedangkan metode (b) menghindari masalah ini dengan memastikan bahwa hasil pembagian disimpan dalam field yang memiliki nomor yang benar dari tempat desimal.

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:
  1. Secara internal, dengan menggunakan membangun:
     SORT ....  PROSEDUR INPUT IS .....
               PROSEDUR OUTPUT ADALAH ....
    
  2. Secara internal, dengan menggunakan membangun:
     SORT ....  MENGGUNAKAN <file> PEMBERIAN <file>
    
  3. Eksternal, dengan melakukan ekstrak / jenis / Laporan fase sebagai proses terpisah.
Metode (a) dapat menjadi yang tercepat, tetapi membutuhkan memori paling sebagai persyaratan data input, dan output semacam prosedur semua dibuat tersedia pada saat yang sama, yang kadang-kadang dapat menyebabkan stack overflow. Membangun ini karena itu harus dihindari.
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 menggunakan ACCEPT <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:
  1. Tidak ada formulir menambahkan digunakan, hanya bentuk-bentuk keluarga.
  2. Setiap form akan berisi standar pos pada dua baris atas, untuk diisi dengan berbagai data pada saat dijalankan.
  3. 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.
  4. Hanya mereka terminal yang mendukung fungsi utama label akan digunakan. Fungsi label tombol akan sulit-kode, dan tidak diambil dari definisi formsfile.
  5. 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).
  6. 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.
  7. Setiap tombol fungsi TANPA label dianggap tidak valid, dan akan menampilkan pesan kesalahan jika dipilih.
  8. 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 oleh VSETERROR 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:
  1. Tambahkan jumlah kejadian untuk setiap nama item dalam definisi bentuk: misalnya: ITEM01 , ITEM02 , ... , ITEM13 dll
  2. Gunakan subscript dalam format PIC 99 .
  3. 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:
  1. Semua layar-hanya kolom harus memiliki jenis mereka diatur untuk CHAR untuk menghindari menyebabkan VFIELDEDIT kesalahan pada nilai-nilai yang tidak dapat diubah.
  2. 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
    
  3. 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:
  1. Semua bidang input numerik harus memiliki jenis yang tepat, misalnya: NUM2 untuk dua tempat desimal, NUM3 untuk 3 tempat desimal, dll Ada juga harus menjadi FINISH pernyataan untuk SET lapangan untuk dirinya sendiri dalam rangka untuk strip nol terkemuka, koma strip, menyesuaikan untuk jumlah tempat desimal yang benar, dan ke kanan-membenarkan nilai.
  2. Definisi penyangga seperti di atas.
  3. 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:
  1. 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.
  2. 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.
    
  3. 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 bahwa LINE-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.

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:
  1. 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.
  2. 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.
  3. 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.
It would be necessary to store the IMAGE record addresses for all the records in the current screen, as well as the first and last records, as the Update and Delete procedures would be required to re-read the selected records (using %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