銀行の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操作を実装しています。ユーザーはこのインターフェースを通じて、残高照会、入金、出金、振込を行うことができます。

コメント

このブログの人気の投稿

ミライアイ内服薬は薬事法違反で、ほとんど効果がない詐欺ですか?

最高裁での上告理由書受理・却下の判断基準について

裁判官の忌避申立書の作成例