CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

GoとCOBOL、Cockroach DBを用いた勘定系システムに日本語全文検索機能を搭載、日本語表示できるように依頼してみた

2025-03-02 03:57:23 | COBOL
以下は、**フロントエンドをGo言語**、**バックエンドをCOBOL**、**データベースをCockroachDB**で実装し、外部プログラムもGo言語で実装した完全なプログラムです。Go言語の`fyne`ライブラリを使用してGUIを構築し、COBOLプログラムを呼び出してバックエンドのロジックを実行します。COBOLプログラムはGo言語の外部プログラムを呼び出し、CockroachDBに接続してデータを操作します。

---

### 1. データベースの準備
CockroachDBに`accounts`テーブルを作成します。日本語のデータはUTF-8エンコーディングで保存されます。

```sql
CREATE TABLE accounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
card_number TEXT NOT NULL UNIQUE,
pin TEXT NOT NULL,
balance DECIMAL(10, 2) NOT NULL,
name TEXT -- 日本語の名前を保存するためのカラム
);
```

---

### 2. COBOLプログラムの実装
COBOLプログラムは、Go言語から呼び出され、Go言語の外部プログラムを呼び出してCockroachDBに接続し、データを操作します。

#### COBOLプログラム (account_backend.cbl)
```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCOUNT-BACKEND.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CARD-NUMBER PIC X(16).
01 PIN PIC X(4).
01 BALANCE PIC 9(7)V99.
01 AMOUNT PIC 9(7)V99.
01 CHOICE PIC 9.
01 RESPONSE PIC X.
01 AUTHENTICATE-CMD PIC X(100).
01 UPDATE-BALANCE-CMD PIC X(100).

PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Welcome to the Account Management System".
DISPLAY "Please insert your card number: ".
ACCEPT CARD-NUMBER.
DISPLAY "Please enter your 4-digit PIN: ".
ACCEPT PIN.

MOVE SPACES TO AUTHENTICATE-CMD.
STRING "go run authenticate.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
PIN DELIMITED BY SPACE
INTO AUTHENTICATE-CMD.
CALL "SYSTEM" USING AUTHENTICATE-CMD.
ACCEPT BALANCE FROM COMMAND-LINE.

IF BALANCE = -1 THEN
DISPLAY "Authentication failed. Please try again."
STOP RUN
END-IF.

PERFORM UNTIL CHOICE = 0
DISPLAY "Main Menu"
DISPLAY "1. Check Balance"
DISPLAY "2. Deposit"
DISPLAY "3. Withdraw"
DISPLAY "4. Transfer"
DISPLAY "0. Exit"
DISPLAY "Enter your choice: "
ACCEPT CHOICE

EVALUATE CHOICE
WHEN 1 PERFORM CHECK-BALANCE
WHEN 2 PERFORM DEPOSIT
WHEN 3 PERFORM WITHDRAW
WHEN 4 PERFORM TRANSFER
WHEN 0 DISPLAY "Thank you for using our service."
WHEN OTHER DISPLAY "Invalid choice. Please try again."
END-EVALUATE
END-PERFORM.

STOP RUN.

CHECK-BALANCE.
DISPLAY "Your current balance is: ", BALANCE.
DISPLAY "Do you want to print the statement? (Y/N): ".
ACCEPT RESPONSE.
IF RESPONSE = 'Y' OR RESPONSE = 'y' THEN
DISPLAY "Statement printed successfully."
ELSE
DISPLAY "Thank you for using our service."
END-IF.

DEPOSIT.
DISPLAY "Enter deposit amount: ".
ACCEPT AMOUNT.
ADD AMOUNT TO BALANCE.
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Deposit successful. New balance: ", BALANCE.

WITHDRAW.
DISPLAY "Enter withdrawal amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Withdrawal successful. New balance: ", BALANCE
END-IF.

TRANSFER.
DISPLAY "Enter transfer amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Transfer successful. New balance: ", BALANCE
END-IF.
```

---

### 3. Go言語外部プログラムの実装
COBOLから呼び出されるGo言語プログラムを実装します。このプログラムはCockroachDBに接続し、認証や残高更新を行います。

#### Goプログラム (authenticate.go)
```go
package main

import (
"database/sql"
"fmt"
"os"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
fmt.Println(-1)
return
}

cardNumber := os.Args[1]
pin := os.Args[2]

db, err := sql.Open("postgres", "postgresql://root@localhost:26257/bank?sslmode=disable")
if err != nil {
fmt.Println(-1)
return
}
defer db.Close()

var balance float64
err = db.QueryRow("SELECT balance FROM accounts WHERE card_number = $1 AND pin = $2", cardNumber, pin).Scan(&balance)
if err != nil {
fmt.Println(-1)
return
}

fmt.Println(balance)
}
```

#### Goプログラム (update_balance.go)
```go
package main

import (
"database/sql"
"fmt"
"os"
"strconv"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
return
}

cardNumber := os.Args[1]
balance, err := strconv.ParseFloat(os.Args[2], 64)
if err != nil {
return
}

db, err := sql.Open("postgres", "postgresql://root@localhost:26257/bank?sslmode=disable")
if err != nil {
return
}
defer db.Close()

_, err = db.Exec("UPDATE accounts SET balance = $1 WHERE card_number = $2", balance, cardNumber)
if err != nil {
return
}
}
```

---

### 4. Go言語フロントエンドの実装
Go言語の`fyne`ライブラリを使用してGUIを構築し、COBOLプログラムを呼び出します。

#### Goプログラム (account_system.go)
```go
package main

import (
"fmt"
"os/exec"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)

func main() {
a := app.New()
w := a.NewWindow("口座管理システム")
w.Resize(fyne.NewSize(400, 300))

cardNumberEntry := widget.NewEntry()
pinEntry := widget.NewPasswordEntry()

loginButton := widget.NewButton("ログイン", func() {
cardNumber := cardNumberEntry.Text
pin := pinEntry.Text

cmd := exec.Command("./account_backend", cardNumber, pin)
output, err := cmd.CombinedOutput()
if err != nil {
dialog.ShowError(fmt.Errorf("認証に失敗しました"), w)
return
}

dialog.ShowInformation("ログイン成功", string(output), w)
})

loginContainer := container.NewVBox(
widget.NewLabel("カード番号:"),
cardNumberEntry,
widget.NewLabel("PIN:"),
pinEntry,
loginButton,
)

w.SetContent(loginContainer)
w.ShowAndRun()
}
```

---

### 5. 実行方法
1. CockroachDBを起動し、`accounts`テーブルを作成します。
2. Goプログラムをビルドします。
```bash
go build authenticate.go
go build update_balance.go
go build account_system.go
```
3. COBOLプログラムをコンパイルします。
```bash
cobc -x account_backend.cbl
```
4. Goプログラムを実行します。
```bash
./account_system
```

---

### 6. 動作確認
1. **ログイン画面**でカード番号とPINを入力します。
2. COBOLプログラムが呼び出され、Go言語の外部プログラムを介してCockroachDBに接続し、認証や残高更新が行われます。
3. 結果がGoプログラムに返され、適切に表示されます。

---

このプログラムにより、Go言語のフロントエンド、COBOLのバックエンド、CockroachDBのデータベースを連携させた勘定系システムを実現できます。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。