COBOL File Organizations File Naming Using File Status This chapter explains the available COBOL file organizations and gives examples of using them. Using only COBOL syntax, COBOL programs can create, update and read files of four different organizations:. Line sequential Line Sequential files are a special type of sequential file. They correspond to simple text files as produced by the standard editor provided with your operating system. Record sequential Sequential files are the simplest form of COBOL file.
Records are placed in the file in the order they are written, and can only be read back in the same order. Relative Files Every record in a relative file can be accessed directly without having to read through any other records. Each record is identified by a unique ordinal number both when it is written and when it is read back. Indexed Indexed files are the most complex form of COBOL file which can be handled directly by COBOL syntax. Records in an indexed file are identified by a unique user-defined key when written. Each record can contain any number of user-defined keys which can be used to read the record, either directly or in key sequence.
A sequential file is a file in which the records can only be accessed sequentially. Records are always added to the end of the file. In line sequential files, each record in the file is separated from the next by a record delimiter. On DOS, Windows and OS/2 this is a carriage return (x'0D') and a line feed (x'0A') character. On UNIX it is just the line feed (x'0A') character. These characters are inserted after the last non-space character in each record so line sequential files always contain variable-length records. Report files are line sequential, since most PC printers require the carriage return and/or line feed characters at the end of each record.
Most PC editors produce line sequential files, and these files can therefore be edited with almost any PC editor. The primary use of line sequential files is for display-only data. Caution: We recommend that you do not use line sequential files for binary or packed data fields. Line sequential files are also known as text files, or flat ASCII files. When you declare a file as line sequential in COBOL, you do so through the SELECT clause.
Example Creating a line sequential file: file-control. Select lineseq assign to 'line.dat' organization is line sequential. File section. Fd lineseq record contains 80 characters. 01 lineseq-fd-record pic x(80).
Record sequential files are nearly always simply called sequential files, since record sequential is the default for a sequential file. Records in a record sequential file can be either fixed or variable in length. Variable-length records save disk space. There are many applications that can benefit from the use of variable-length records. A common example is where your application generates many small records, with occasional large ones. If you make the record length as long as the largest record, you waste a lot of disk space. The way to prevent this waste is to use variable-length records.
When you declare a file as record sequential in COBOL, you do so through the SELECT clause. Example Creating a record sequential file with fixed-length records. Select recseq assign to 'recseq.dat' organization is record sequential. File section. Fd recseq record contains 80 characters.
01 recseq-fd-record pic x(80). Note: In place of the ORGANIZATION clause above, you could use: organization is sequential Or, you could simply omit the ORGANIZATION clause, as record sequential is the default file organization (if the SEQUENTIAL directive is not set). Example Creating a record sequential file with variable-length records. File control.
Select recseqv assign to 'recseqv.dat' organization is sequential. File section. Fd recseqv recording mode is v record varying from 3 to 80 characters. 01 recseqv-fd-record pic x occurs 3 to 80 times depending on ws-record-length. Working-storage section.
01 ws-record-length pic 99. With relative file organization, you can access records sequentially or randomly.
For sequential access, you simply do a sequential READ to get the next record in the file. For random access, you specify the ordinal number of the record in the file. Relative files have a fixed-length file format. You can declare that you want the records to have a recording mode of 'variable' but even if you do this, the system assumes the maximum record length for all WRITE statements to the file, and pads the unused character positions. So, when you are in a situation where you have a lot to gain by using variable-length records, you should avoid relative files because they are always fixed format. Relative files have the fastest access time of all the file types used by this COBOL system so, if speed of access is the most important consideration, you should consider using relative files.
With relative files, you can have numeric keys, but you cannot key on fields. If you need to access data randomly based on certain fields, you must use indexed files. Example Creating a relative file with a record length of 80 characters: file-control. Select relfil assign to 'relfil.dat' organization is relative access mode is random relative key is relfil-key. File section.
Fd relfil record contains 80 characters. 01 recseq-fd-record pic x(80). Working-storage section.
01 relfil-key pic 9(8) comp-x. Note: The relative key field is relfil-key.
When you are randomly accessing this file, there is no KEY IS field on the READ statement. The number in relfil-key determines which record is read. (For sequential access, a simple READ statement gets the next record.) Indexed file access enables you to access records either randomly or sequentially, using one or more key fields in the individual records. Key comparisons are made on a byte-by-byte basis from right to left using the ASCII collating sequence.
COBOL indexed files are actually made up of two physical files: a data file and an index file. The index file is created automatically, and has an extension of.idx; the data file can have any other extension, although.dat is very common. Records in indexed files can be either fixed or variable in length. Whenever you need to provide users with many different views of a file, you need indexed files.
In your programs, this implies the need for random access, keyed on one or more fields in the records. Example Creating an indexed file with fixed-length 80-byte records keyed on the first five bytes of each record: file-control. Select isamfil assign to 'isamfil.dat' organization is indexed access mode is dynamic record key is isamfil-fd-key. File section. Fd isamfil record contains 80 characters. 01 isamfil-fd-record. 05 isamfil-fd-key pic x(5).
05 isamfil-fd-data pic x(75). Creating an indexed file with variable-length records, varying in length from 5 to 80 bytes: file-control.
Select isamvar assign to 'isamvar.dat' organization is indexed access mode is dynamic record key is isamvar-fd-key. File section. Record is varying in size from 5 to 80 characters depending on ws-record-count. 01 isamvar-fd-record. 05 isamvar-fd-key pic x(5).
05 isamvar-fd-data pic x(75). Working-storage section. 01 ws-record-count pic 99 comp-x. Note: The keys defined for the file must all lie in the fixed part of the record.
When using COBOL, you can open data files in one program, and perform file operations (such as READ and WRITE) in another, as long as all the programs are in the same run unit. This is called using external files.
If I have a file that is 1 line and it has been told to me that it is a Binary Sequential File, how should I take that file and read it's one line into records with a length of 94? I'm thinking. FD BINARY-FILE-IN.
01 BINARY-RECORD PIC X(Huge/variable length unknown) FD SEQ-LINE-OUT. 01 SEQ-RECORD PIC X(94). WS-BINARY-IN PIC X(I have no idea what the length will be of its 1 huge line) WS-LINE-SEQ-OUT PIC X(94) OPEN BINARY-FILE-IN.
OPEN SEQ-LINE-OUT. MOVE 1 TO BINARY-CTR.
![]()
PEFORM UNTIL SW-EOF-BINARY = 'Y' READ BINARY-RECORD AT END MOVE 'Y' TO SW-EOF-BINARY NOT AT END MOVE BINARY-RECORD(BINARY-CTR:94) TO WS-LINE-SEQ-OUT WRITE SEQ-RECORD FROM WS-LINE-SEQ-OUT MOVE SPACES TO SEQ-RECORD, WS-LINE-SEQ-OUT ADD 94 TO BINARY-CTR END-READ END-PERFORM RE: Reading a Binary Sequential File. I was just told that it was a binary file, and I know that it has only 1 line by looking at it in Vi. I'm using RMCOBOL-85 on Linux.
I've never worked with anything but Indexed and Line Sequential files. So, I'm trying to figure out how I'd take this one huge line from this binary file and parse it out into record lengths of 94 and write out to a sequential line file. I know how to write out to a sequential line file. I just don't understand anything about reading a binary file that has only one huge line of data in it and break it down into multiple records of 94. RE: Reading a Binary Sequential File (IS/IT-Management) 4 Mar 04 19:01. IDENTIFICATION DIVISION. ENVIRONMENT DIVISION.
CONFIGURATION SECTION. INPUT-OUTPUT SECTION. SELECT GET-FILE ASSIGN TO 'INPUTFILE' ORGANIZATION IS BINARY SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS SF-FILE-STATUS. DATA DIVISION.
FILE SECTION. REPLACE '999' WITH MAX RECORD LENGTH FD GET-FILE RECORD IS VARYING FROM 1 TO 999. 03 FILLER PIX X(999). WORKING-STORAGE SECTION. 01 SF-FILE-STATUS PIC XX.
88 SF-EOF VALUE '10'. Regards Frederico Fonseca SysSoft Integrated Ltd RE: Reading a Binary Sequential File (Programmer). David, Frederico, As soon as you trigger 'variable length' anything in binary sequential files, RM/COBOL expects a 4-byte record length header and trailer on the record. The first read will fail if the trailer does not match the header. (Note to PH: relative fails for similar reasons.) Therefore, you need to keep it fixed length binary sequential. However, at OPEN time, a fixed length binary sequential file must be a multiple of the record length. The question then returns to, 'What length should my record be?'
The answer is: PIC X(1). You read the file one character at a time. Tom Morrison RE: Reading a Binary Sequential File (Programmer). Now I'm lost, sorry. FD GET-FILE RECORD IS VARYING FROM 1 TO 999.
03 FILLER PIX X(999). Should now be? FD GET-FILE RECORD IS VARYING FROM 1 TO 999. 03 FILLER PIX X. I just want to read this binary file that contains 1 huge line in it and parse it out into records of 94 in length.
In other words, the 1st 94 starting at 1 goes into WS-LINE-SEQ-OUT, then starting at 95 and ending at 188, the 2nd record of 94 characters I write out, etc. RE: Reading a Binary Sequential File (Programmer) 5 Mar 04 12:51.
IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION.
SELECT GET-FILE ASSIGN TO 'INPUTFILE' ORGANIZATION IS BINARY SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS SF-FILE-STATUS. DATA DIVISION. FILE SECTION. FD GET-FILE RECORD IS 94 CHARACTERS. 03 FILLER PIX X(94). WORKING-STORAGE SECTION. 01 SF-FILE-STATUS PIC XX.
88 SF-EOF VALUE '10'. Try this variation. Hopefully this will work for you. Etom RE: Reading a Binary Sequential File (Programmer) 5 Mar 04 13:26. Identification division. Environment division.
Input-output section. Select a assign 'binseq.dat' organization binary sequential. Select b assign 'binseq.dat' organization binary sequential. Data division.
File section. 01 a-rec pic x(999). 01 b-rec pic x(94). Working-storage section.
01 i pic 9(2). Procedure division. Open output a. Write a-rec from all '.
Open input b. Perform 9999 times move all x'00' to b-rec read b at end display 'at end' stop run not at end move 0 to i inspect b-rec tallying i for characters before initial x'00' display 'Length: ', i, '.
Record begins with: ', b-rec (1:40) end-read end-perform. Produces the following output.
Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 94.
Record begins with: Length: 94. Record begins with: Length: 94. Record begins with: Length: 59. Record begins with: at end Tom Morrison RE: Reading a Binary Sequential File (Programmer). I'll try this, but I want my records written back out to be LINE SEQUENTIAL.
So, the file I'm reading with the huge line will break up into records of a length of PIC X(94) each. Characters 1-ninety four record blah blah blah characters 95 through one-eighty-eigth blah blah balah charceters one-eighty-eight through blablbabha etc. So that if I were breaking up the huge line into records of a length of 5 each(for simplicity of illustration) with an example of the 1 line in the Binary Sequential file(Input file) being. Abcdefghijklmnopqrstuvwxyz1234 would yield output line sequential records abcde fghij klmno pqrst uvwxy z1234 -David RE: Reading a Binary Sequential File (MIS) 5 Mar 04 15:32. So, try something like this: SELECT BINARY-FILE-IN ASSIGN 'input.dat' ORGANIZATION BINARY SEQUENTIAL. SELECT SEQ-LINE-OUT ASSIGN 'output.dat' ORGANIZATION LINE SEQUENTIAL. FD BINARY-FILE-IN.
01 BINARY-RECORD PIC X(94) FD SEQ-LINE-OUT. 01 SEQ-RECORD PIC X(94). OPEN BINARY-FILE-IN. OPEN SEQ-LINE-OUT. PEFORM UNTIL EXIT READ BINARY-RECORD AT END EXIT PERFORM END-READ WRITE SEQ-RECORD FROM BINARY-RECORD END-PERFORM Hope This Help, PH.
Want to get great answers to your Tek-Tips questions? Have a look at RE: Reading a Binary Sequential File (Programmer) 5 Mar 04 15:39.
I'm trying to write COBOL Program to read a flat file sequentially and write it to an output file, I'm able to read only one record at a time, not able to read next record what should I do? Here is my code: PROCEDURE DIVISION. OPEN INPUT FILEX. PERFORM READ-PARA THRU END-PARA UNTIL END-OF-FILE = 'Y'. READ FILEX AT END MOVE 'Y' TO END-OF-FILE DISPLAY OFFCODE1 DISPLAY AGCODE1 DISPLAY POLNO1 DISPLAY EFFDATE1 DISPLAY EXPDATE DISPLAY REPCODE DISPLAY POLHOLDER1 DISPLAY LOCATION1 GO TO END-PARA. I, ve tried using the scope terminator, still not able to loop 'm getting S001 ABEND here is my code: IDENTIFICATION DIVISION. ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION. SELECT FILEX ASSIGN TO SYSUT1 FILE STATUS IS FS. DATA DIVISION. FILE SECTION. 02 OFFCODE1 PIC X(3). 02 FILLER PIC X. 02 AGCODE1 PIC X(3).
02 FILLER PIC X. 02 POLNO1 PIC X(6). 02 FILLER PIC X. 02 EFFDATE1 PIC X(8). 02 FILLER PIC X. 02 EXPDATE PIC X(8).
02 FILLER PIC X. 02 REPCODE PIC X(1) 02 FILLER PIC X. 02 POLHOLDER1 PIC X(8). 02 FILLER PIC X. 02 LOCATION1 PIC X(9). 02 FILLER PIC X(87).
WORKING-STORAGE SECTION. 77 FS PIC 9(2). 01 WS-INDICATORS. 10 WS-EOF-IND PIC X(01) VALUE 'N'.
88 WS-END-OF-FILE VALUE 'Y'. PROCEDURE DIVISION. OPEN INPUT FILEX. PERFORM READ-PARA THRU END-PARA UNTIL WS-END-OF-FILE. READ FILEX AT END MOVE 'Y' TO WS-EOF-IND.
DISPLAY OFFCODE1 DISPLAY AGCODE1 DISPLAY POLNO1 DISPLAY EFFDATE1 DISPLAY EXPDATE DISPLAY REPCODE DISPLAY POLHOLDER1 DISPLAY LOCATION1 IF WS-END-OF-FILE GO TO END-PARA. One more method i tried even in this works for only one record, again getting S001 ABEND while running the code.
Here is the code: IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION.
SELECT FILEX ASSIGN TO SYSUT1 DATA DIVISION. FILE SECTION. LABEL RECORDS ARE STANDARD RECORD CONTAINS 140 CHARACTERS BLOCK CONTAINS 00 RECORDS. 02 OFFCODE1 PIC 9(3).
02 FILLER PIC X. 02 AGCODE1 PIC X(3). 02 FILLER PIC X. 02 POLNO1 PIC X(6). 02 FILLER PIC X.
02 EFFDATE1 PIC X(8). 02 FILLER PIC X. 02 EXPDATE1 PIC X(8). 02 FILLER PIC X. 02 REPCODE1 PIC X(1). 02 FILLER PIC X.
02 POLHOLDER1 PIC X(8). 02 FILLER PIC X. 02 LOCATION1 PIC X(9). 02 FILLER PIC X(26). WORKING-STORAGE SECTION.
01 WS-INDICATORS. 10 WS-EOF-IND PIC X(01) VALUE 'N'. 88 WS-END-OF-FILE VALUE 'Y'. 02 OFFCODE2 PIC 9(3).
02 FILLER PIC X. 02 AGCODE2 PIC X(3). 02 FILLER PIC X. 02 POLNO2 PIC X(6). 02 FILLER PIC X. 02 EFFDATE2 PIC X(8). 02 FILLER PIC X.
02 EXPDATE2 PIC X(8). 02 FILLER PIC X. 02 REPCODE2 PIC X(1).
02 FILLER PIC X. 02 POLHOLDER2 PIC X(8). 02 FILLER PIC X. 02 LOCATION2 PIC X(9). 02 FILLER PIC X(26). PROCEDURE DIVISION. OPEN INPUT FILEX.
Examples Of Sequential Files
PERFORM READ-PARA THRU END-PARA UNTIL WS-END-OF-FILE. READ FILEX INTO TEMP1 AT END MOVE 'Y' TO WS-EOF-IND. DISPLAY OFFCODE1 DISPLAY AGCODE1 DISPLAY POLNO1 DISPLAY EFFDATE1 DISPLAY EXPDATE1 DISPLAY REPCODE1 DISPLAY POLHOLDER1 DISPLAY LOCATION1 IF WS-END-OF-FILE GO TO END-PARA. You really should use your END- terminators. END-PERFORM, END-IF, END-READ, etc.
As for you problem, if I were to guess, I'd say you're not reading only the first record, you're reading all records and displaying only the last one. Your READ statement has an AT END, where everything is done, but it doesn't have a NOT AT END to tell it what to do with records it's read successfully. I generally code my READ statements thusly: READ FILE AT END SET FILE-EOF TO TRUE NOT AT END PERFORM PROCESS-RECORD END-READ Wrap that in a perform like this and it works pretty well: SET FILE-NOT-EOF TO TRUE PERFORM UNTIL FILE-EOF READ FILE AT END SET FILE-EOF TO TRUE NOT AT END PERFORM PROCESS-RECORD END-READ END-PERFORM Good luck, hope it works out for you. Writing solid COBOL can be very tough. I guess you're not still waiting:-) In one place file is 140, but definition is only 79.
You use file status, but don't check it. Your file probably does not open successfully, which you would have discovered if you checked the FS field (cunning name, but copied form IBM example maybe).
When you READ and get end-of-file, you set the flag, but still process as though you had got a record. Depending on 'things' this gets you the wrong data, or gets you an abend. There's no point in the GO TO END-PARA because END-PARA is immediately afterwards anyway. Hopefully you went back and looked at the code NealB provided and got the thing going a few months ago.
![]()
COBOL is an endangered language. But it once ran 80% of the world's business systems: thousands of mission-critical applications that still exist today.
Some companies want to upgrade and transition their COBOL applications to more modern frameworks; others want to stick with COBOL's relatively stable platform. In either case, hiring managers are willing to pay a premium for candidates who know how to take on COBOL's challenges. For this reason, programmers are learning COBOL again. This course is designed to help new and experienced programmers alike add COBOL (or add COBOL back) to their skill set. Peggy Fisher shows how to get a COBOL development environment up and running and how to start programming.
She reviews COBOL's data types and constants, control structures, file storage and processing methods, tables, and strings. Challenges issued along the way will help you practice what you've learned.
Instructor. Peggy Fisher is a programmer and full-time staff author at Lynda.com. She is also a strong supporter of women in STEM. Peggy Fisher is a full-time staff author at Lynda.com in the Developer segment.
Sequential Files And Databases
Her main focus is Application Programming in Java, Arduino, and C. She has also worked on courses in COBOL and Discrete Mathematics. Previously she was a faculty member at Penn State University's College of Information Sciences and Technology. She started out as a programmer working for a large insurance company, but after 18 years she left her job as a director of information technology to pursue her true passion teaching. She earned a master's degree in math education, and went on to teach high school math and computer science in Pennsylvania. In 2012, Peggy accepted a position as an instructional designer at Penn State, and shortly thereafter began teaching Intro to Application Programming with Java.
As one of the few female programming teachers, she serves as a mentor to incoming female freshmen who are considering a career in programming. She was also the K–12 outreach coordinator for the college, where she scheduled, ran, and taught summer camps for middle school and high school students. In a PBS NewsHour interview, she expressed that all students should take at least one programming class either in high school or college. Peggy enjoys constantly learning and finding new and exciting ways to bring technology to life in and outside of the classroom, such as using Arduino microcontrollers or Lego Mindstorms, to help make learning hands-on and fun. Related courses.
By: Mike Figliuolo Course. 38m 59s. By: Simon Allardice Course. 3h 1m 16s.
Cobol Write File
By: Mark Niemann-Ross Course. 3h 24m 29s. By: David Gassner Course. 3h 33m 2s. Course Transcript - In addition to reading files programs often write records to a file. For our sample program, we want to write records to produce a report.
As you can see in this program, on line 7, I declare a file called Employee File. That will be my input and on line eleven, I have a file Select Output File which will be my output. My output file will have the name empreport.lpt I have my NotePad in split screen mode so you can see the input file. In order to write records to a file, first format the record in working storage. In this program, I've already defined the heading line, the detail line and two total lines. Let's scroll down and take a look.
The heading line starts on line 64 notice the heading line each variable just says filler but on the right-hand side the value specifies what will get printed. Employee ID, employee name, start date, and salary. On line 76 is the detail line that matches up with the headings.
In the detail line I define variables for each of the items listed. Practice while you learn with exercise files. Watch this course anytime, anywhere. Course Contents. Introduction Introduction.
1. Getting Started 1. Getting Started. 2. Describing Data 2. Describing Data.
3. Control Structures 3. Control Structures. 4. Sequential Files 4. Sequential Files.
5. Advance Sequential Files 5.
Advance Sequential Files. 6. Direct Access Files 6. Direct Access Files.
7. Tables in COBOL 7. Tables in COBOL. 8. String Handling 8. String Handling.
Conclusion Conclusion.
EBCDIC-KSDS to EBCDIC-Sequential, COBOL Source for Sequential Add COBOL, Sequential Add KSDS to Sequential File Table of Contents v-16.01.01 - ksdseq01.htm This is an example of how a COBOL program can read from a VSAM Keyed-Sequential-Data-Set and write to a record sequential file using sequential processing techniques. The COBOL source code was generated using SimoTime technologies.
Refer to the section of this document for additional information. In the world of programming there are many ways to solve a problem. This program is provided as a COBOL example of one of the possible solutions to the problem of changing the contents and structure of data files. We have made a significant effort to ensure the documents and software technologies are correct and accurate. We reserve the right to make changes without notice at any time. The function delivered in this version is based upon the enhancement requests from a specific group of users. The intent is to provide changes as the need arises and in a timeframe that is dependent upon the availability of resources.
Copyright © 1987-2018 SimoTime Technologies and Services All Rights Reserved This program will read from a VSAM Keyed-Sequential-Data-Set and write to an record sequential file. Note: Since this conversion task is only doing a file-format conversion and the record content is not processed but simply copied then the encoding schema of the records is not a consideration. The records may be EBCDIC, ASCII or BINARY and they will be copied without being changed.
The following Process Control File (KSDSEQ01.pcf) contains the specifications for generating a COBOL program that will do a file format conversion by doing a copy of a VSAM, KSDS to a Record Sequential file. KSDSEQ01.pcf - a Process Control File for Numeric Totals. (C) Copyright 1987-2018 All Rights Reserved. Web Site URL:. e-mail: [email protected].
SYSUT1 is a VSAM, KSDS, 512-byte Customer File. SYSUT2 is a Record Sequential, 512-byte, fixed-field format for. the Customer Master file.
&SIMOPREP call. ENV1BASE &USERPREP call USERCONV &CONFORM IBM &DIALECT C2.HEAD34.1.2.3. &HEAD34 Convert KSDS-512 to RSEQ-512 &IOMODNAME KSDSEQC1 &SYSUT1 name=DX512KSD org=Indexed recfm=VARIABLE rmin=12 rmax=512 kpos=1 klen=12 &SYSUT2 name=DX512SEQ org=Sequential recfm=FIXED rlen=512 &TransCOPY from pos 1 len 512 to pos 1 len 512. &END The following is the content of the (KSDSEQX1.cmd) file that was used to create the COBOL source code. This process uses the SimoZAPS utility program to do the actual program generation.
@echo OFF rem. rem. KSDSEQX1.cmd - a Windows Command File. rem. This program is provided by SimoTime Technologies. rem. (C) Copyright 1987-2018 All Rights Reserved.
rem. Web Site URL:.
rem. e-mail: [email protected].
rem. echo. echo. This process will read the KSASQE01.pcf file and create the echo. KSATXAC1.CBL file using the SYSMASK1.TXT as a mask. Echo.
The KSASQE01.pcf file is expected to contains the specifications echo. for reading an INDEXED, 512-byte maximum record length, variable, echo.
ASCII file with the key position at 1 for a key length of 12 and echo. creating a TEXT, 512-byte, variable, ASCII/Text file.
Comments are closed.
|
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |