銀行のATMシステムのプログラム
COBOLを使用して銀行のATMシステムのバックエンドを実装するためのサンプルプログラムを以下に示します。この例では、COBOLを使用して基本的なATM操作(残高照会、入金、出金、振込)を実装し、Oracle Databaseと連携します。
### 1. Oracle Databaseのセットアップ
まず、Oracle Databaseに必要なテーブルを作成します。以下は、ユーザー情報と取引履歴を管理するためのテーブルの例です。
```sql
CREATE TABLE users (
user_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
balance NUMBER(10, 2) DEFAULT 0
);
CREATE TABLE transactions (
transaction_id NUMBER PRIMARY KEY,
user_id NUMBER,
transaction_type VARCHAR2(10),
amount NUMBER(10, 2),
transaction_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
```
### 2. COBOLプログラム
次に、COBOLプログラムを作成します。このプログラムは、ユーザー認証、残高照会、入金、出金、振込の操作を実装します。
#### 2.1. COBOLの環境設定
COBOLプログラムを実行するためには、Oracleのプロシージャライブラリを使用してデータベースに接続します。以下は、必要な環境設定の例です。
```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. ATMSystem.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT USER-FILE ASSIGN TO "users.dat"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT TRANSACTION-FILE ASSIGN TO "transactions.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD USER-FILE.
01 USER-RECORD.
05 USER-ID PIC 9(5).
05 USER-NAME PIC X(100).
05 USER-BALANCE PIC 9(10)V99.
FD TRANSACTION-FILE.
01 TRANSACTION-RECORD.
05 TRANSACTION-ID PIC 9(5).
05 USER-ID-T PIC 9(5).
05 TRANSACTION-TYPE PIC X(10).
05 AMOUNT PIC 9(10)V99.
05 TRANSACTION-TIME PIC X(26).
WORKING-STORAGE SECTION.
01 WS-USER-ID PIC 9(5).
01 WS-AMOUNT PIC 9(10)V99.
01 WS-TRANSACTION-TYPE PIC X(10).
01 WS-BALANCE PIC 9(10)V99.
01 WS-TRANSACTION-ID PIC 9(5).
01 WS-RESPONSE PIC X(100).
PROCEDURE DIVISION.
DISPLAY "ATM System".
PERFORM UNTIL WS-RESPONSE = "EXIT"
DISPLAY "1. Check Balance"
DISPLAY "2. Deposit"
DISPLAY "3. Withdraw"
DISPLAY "4. Transfer"
DISPLAY "5. Exit"
ACCEPT WS-RESPONSE
EVALUATE WS-RESPONSE
WHEN "1" PERFORM CHECK-BALANCE
WHEN "2" PERFORM DEPOSIT
WHEN "3" PERFORM WITHDRAW
WHEN "4" PERFORM TRANSFER
WHEN "5" CONTINUE
WHEN OTHER DISPLAY "Invalid choice."
END-EVALUATE
END-PERFORM.
STOP RUN.
CHECK-BALANCE.
DISPLAY "Enter User ID: " WITH NO ADVANCING.
ACCEPT WS-USER-ID.
READ USER-FILE
KEY IS WS-USER-ID
INTO USER-RECORD
AT END
DISPLAY "User not found."
EXIT PARAGRAPH
END-READ.
DISPLAY "Balance: " USER-BALANCE.
DEPOSIT.
DISPLAY "Enter User ID: " WITH NO ADVANCING.
ACCEPT WS-USER-ID.
DISPLAY "Enter Amount: " WITH NO ADVANCING.
ACCEPT WS-AMOUNT.
READ USER-FILE
KEY IS WS-USER-ID
INTO USER-RECORD
AT END
DISPLAY "User not found."
EXIT PARAGRAPH
END-READ.
ADD WS-AMOUNT TO USER-BALANCE.
REWRITE USER-RECORD.
MOVE "DEPOSIT" TO WS-TRANSACTION-TYPE.
PERFORM WRITE-TRANSACTION.
WITHDRAW.
DISPLAY "Enter User ID: " WITH NO ADVANCING.
ACCEPT WS-USER-ID.
DISPLAY "Enter Amount: " WITH NO ADVANCING.
ACCEPT WS-AMOUNT.
READ USER-FILE
KEY IS WS-USER-ID
INTO USER-RECORD
AT END
DISPLAY "User not found."
EXIT PARAGRAPH
END-READ.
IF USER-BALANCE < WS-AMOUNT
DISPLAY "Insufficient balance."
EXIT PARAGRAPH
END-IF.
SUBTRACT WS-AMOUNT FROM USER-BALANCE.
REWRITE USER-RECORD.
MOVE "WITHDRAW" TO WS-TRANSACTION-TYPE.
PERFORM WRITE-TRANSACTION.
TRANSFER.
DISPLAY "Enter From User ID: " WITH NO ADVANCING.
ACCEPT WS-USER-ID.
DISPLAY "Enter To User ID: " WITH NO ADVANCING.
ACCEPT WS-TRANSACTION-ID.
DISPLAY "Enter Amount: " WITH NO ADVANCING.
ACCEPT WS-AMOUNT.
READ USER-FILE
KEY IS WS-USER-ID
INTO USER-RECORD
AT END
DISPLAY "From User not found."
EXIT PARAGRAPH
END-READ.
IF USER-BALANCE < WS-AMOUNT
DISPLAY "Insufficient balance."
EXIT PARAGRAPH
END-IF.
SUBTRACT WS-AMOUNT FROM USER-BALANCE.
REWRITE USER-RECORD.
MOVE "TRANSFER" TO WS-TRANSACTION-TYPE.
PERFORM WRITE-TRANSACTION.
READ USER-FILE
KEY IS WS-TRANSACTION-ID
INTO USER-RECORD
AT END
DISPLAY "To User not found."
EXIT PARAGRAPH
END-READ.
ADD WS-AMOUNT TO USER-BALANCE.
REWRITE USER-RECORD.
MOVE "RECEIVE" TO WS-TRANSACTION-TYPE.
PERFORM WRITE-TRANSACTION.
WRITE-TRANSACTION.
ADD 1 TO WS-TRANSACTION-ID GIVING WS-TRANSACTION-ID.
MOVE WS-TRANSACTION-ID TO TRANSACTION-ID.
MOVE WS-USER-ID TO USER-ID-T.
MOVE WS-TRANSACTION-TYPE TO TRANSACTION-TYPE.
MOVE WS-AMOUNT TO AMOUNT.
MOVE FUNCTION CURRENT-DATE TO TRANSACTION-TIME.
WRITE TRANSACTION-RECORD.
```
### 3. フロントエンドのGUI
Java Swingを使用して簡単なGUIを作成します。このGUIは、ユーザーが残高を照会したり、入金や出金、振込を行ったりするためのインターフェースを提供します。
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ATMGUI extends JFrame {
private JTextField userIdField;
private JTextField amountField;
private JTextField toUserIdField;
private JTextArea outputArea;
public ATMGUI() {
setTitle("ATM System");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(6, 2));
userIdField = new JTextField();
amountField = new JTextField();
toUserIdField = new JTextField();
outputArea = new JTextArea();
outputArea.setEditable(false);
panel.add(new JLabel("User ID:"));
panel.add(userIdField);
panel.add(new JLabel("Amount:"));
panel.add(amountField);
panel.add(new JLabel("To User ID:"));
panel.add(toUserIdField);
JButton checkBalanceButton = new JButton("Check Balance");
JButton depositButton = new JButton("Deposit");
JButton withdrawButton = new JButton("Withdraw");
JButton transferButton = new JButton("Transfer");
checkBalanceButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int userId = Integer.parseInt(userIdField.getText());
String response = executeCobolProgram("1", String.valueOf(userId));
outputArea.append("Response: " + response + "\n");
} catch (NumberFormatException ex) {
outputArea.append("Error: " + ex.getMessage() + "\n");
}
}
});
depositButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int userId = Integer.parseInt(userIdField.getText());
double amount = Double.parseDouble(amountField.getText());
String response = executeCobolProgram("2", String.valueOf(userId), String.valueOf(amount));
outputArea.append("Response: " + response + "\n");
} catch (NumberFormatException ex) {
outputArea.append("Error: " + ex.getMessage() + "\n");
}
}
});
withdrawButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int userId = Integer.parseInt(userIdField.getText());
double amount = Double.parseDouble(amountField.getText());
String response = executeCobolProgram("3", String.valueOf(userId), String.valueOf(amount));
outputArea.append("Response: " + response + "\n");
} catch (NumberFormatException ex) {
outputArea.append("Error: " + ex.getMessage() + "\n");
}
}
});
transferButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int fromUserId = Integer.parseInt(userIdField.getText());
int toUserId = Integer.parseInt(toUserIdField.getText());
double amount = Double.parseDouble(amountField.getText());
String response = executeCobolProgram("4", String.valueOf(fromUserId), String.valueOf(toUserId), String.valueOf(amount));
outputArea.append("Response: " + response + "\n");
} catch (NumberFormatException ex) {
outputArea.append("Error: " + ex.getMessage() + "\n");
}
}
});
panel.add(checkBalanceButton);
panel.add(depositButton);
panel.add(withdrawButton);
panel.add(transferButton);
add(new JScrollPane(outputArea), BorderLayout.SOUTH);
add(panel, BorderLayout.NORTH);
}
private String executeCobolProgram(String action, String... params) {
try {
ProcessBuilder pb = new ProcessBuilder("cobc", "-x", "-o", "ATMSystem.exe", "ATMSystem.cob");
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
StringBuilder output = new StringBuilder();
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
int exitCode = process.waitFor();
return output.toString();
} catch (Exception ex) {
return "Error: " + ex.getMessage();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ATMGUI().setVisible(true);
}
});
}
}
```
このプログラムは、Java Swingを使用して簡単なATMシステムのGUIを作成し、COBOLプログラムを呼び出して基本的なATM操作を実装しています。ユーザーはこのインターフェースを通じて、残高照会、入金、出金、振込を行うことができます。
コメント
コメントを投稿