
第 3 回では、PowerBuilder (PB) の核となる「データウィンドウ」の技術について解説しました。SQL と UI が密結合しているからこそ可能な、驚異的な開発スピードを感じていただけたかと思います。
しかし、画面があるだけではシステムは動きません。ボタンを押したときの挙動、複雑なバリデーション、外部 API との連携など、システムのロジックを実装するのがプログラミング言語「PowerScript」です。
Web エンジニア (特に JavaScript / TypeScript 使い) が PowerScript に触れると、最初は「厳格な型定義や記述の制約が多く、どこか堅苦しい言語だ」と感じるでしょう。しかし、その厳格さや特有の構文規則を正しくマスターすれば、型安全でバグが混入しにくい、極めて堅牢な業務ロジックを効率的に組み上げることが可能になります。
一見すると堅苦しく、モダンフロントエンドの常識とは異なる「癖」のように思える仕様も、業務システムの安定性を支えるための強力な武器となります。
本記事では、JavaScript / TypeScript エンジニアがスムーズに PowerScript の堅牢性を活かせるよう、両言語の決定的な違いを紐解いていきます。
JavaScript では let、const、var を使い分けますが、PowerScript は静的型付け言語です。変数宣言は「型 変数名」の順で行います。
// PowerScript の変数宣言 Long ll_count String ls_name DateTime ldt_now ll_count = 10 ls_name = "PowerBuilder" ldt_now = DateTime(Today(), Now())
PowerBuilder には Web 開発における「コンポーネントの状態 (State)」や「グローバルなストア (Redux 等)」に相当する、明確なスコープ階層があります。
PowerBuilder 開発では、ついつい便利な「グローバル変数」を多用しがちですが、これはモダン開発における「グローバル汚染」と同じ災厄を招きます。可能な限りローカル / インスタンス変数を活用してカプセル化を意識するのが、エンジニアとしての腕の見せ所です。
なお、関数 / イベント内をスコープとするローカル変数が最も狭い範囲に限定された変数であり、IF 文や FOR…LOOP 文などのブロック内にスコープを限定した変数は宣言できません。「ブロック内で宣言したのに……」とならないよう注意しましょう。
TypeScript を使い慣れたエンジニアなら、あらゆるデータ型を代入できる Any 型 の存在を目にすると、親近感と同時に「型安全が壊れるのでは」という警戒心を抱くでしょう。
確かに、PowerScript における Any 型の多用は、コンパイル時の型チェックを事実上無効化するため、本番環境での強制終了 (アプリケーションエラー) を招くリスクがあります。そのため、通常の業務ロジックでは String や Long などの固有の型を明示的に定義するのが鉄則です。
しかし、この Any 型は単に型安全を放棄するためのものではありません。データベースと密結合する PowerBuilder において、「実行時までデータ型が確定しない動的なデータウィンドウの値取得」や「高度に抽象化された汎用共通関数」を実装する際には、なくてはならない極めて便利な機能です。
さらに、TypeScript の any と決定的に異なるのは、PowerScript の Any 型は「値の本来の型を内部で厳格に記憶している」という点です。実行時に ClassName() 関数などを用いて中身の型を厳密にチェック・ガードする (= PowerScript 特有の堅苦しい作法を踏む) ことで、動的な柔軟性を活かしつつ、バグを未然に防ぐ「極めて堅牢なロジック」を組み立てることができます。
ここからが本題です。PowerScript の世界に足を踏み入れると、Web 開発の常識は心地よく (あるいは戸惑うほどに) 裏切られることになります。一見すると、モダンフロントエンドの基準からは外れた「時代遅れな癖」や「堅苦しさ」に思えるかもしれません。
ですが、これらの仕様こそが、歴史ある業務システムの「バグの混入を防ぐ」「予期せぬクラッシュを起こさない」という強固な堅牢性を生み出す源泉となっています。ここでは、Web エンジニアが特に衝撃を受ける以下の 3 つの独特な仕様について、そのメリットと共に紐解いていきましょう。
JavaScript エンジニアが最も驚くポイントかもしれません。PowerScript では、識別子の大文字 / 小文字が区別されません。
String ls_UserName // 変数宣言 ls_username = "John" // これで ls_UserName が更新される LS_USERNAME = "Doe" // これも同じ変数を指す
変数名だけでなく、関数名も区別しません。これは一見楽ですが、チーム開発では命名規則を徹底しないと、コードの可読性が一気に崩壊します。
JavaScript (およびほぼ全てのモダン言語) の配列は 0 番目から始まりますが、PowerBuilder の配列は 1 番目から始まります。
String ls_apps[] // 配列変数を宣言 ls_apps[0] = "PowerBuilder" // これはアプリケーションエラーになる ls_apps[1] = "Notepad" ls_apps[2] = "VS Code"
この「1-based index」は、慣れない間はループ処理 (For 文) を書く際に失敗しやすいでしょう。常に「最初の要素は 1」を意識してコーディングしてください。
JavaScript では null + 5 は 5 になり (暗黙の型変換)、undefined はエラーの元になります。
しかし、PowerScript の NULL は SQL の NULL と同じように計算式に NULL が含まれると結果は常に NULL になります。
Long ll_price Long ll_tax Long ll_total ll_price = 100 SetNull(ll_tax) // NULLを代入 ll_total = ll_price + ll_tax // ll_total は NULL になります!
文字列結合でも同様です。"Hello " + ls_name において ls_name が NULL なら、結果は "Hello " でも空文字でもなく NULL です。
DB から取得した値に 1 つでも NULL が混じっていると、計算結果がすべて消える……。そのようなことを防ぐために、IsNull() 関数でのチェックが必須となります。
If…Then 構文は標準的ですが、JavaScript の switch 文に相当する CHOOSE CASE 文は多彩な書き方によって条件を指定できます。
Integer li_score String ls_result ・・・ CHOOSE CASE li_score CASE 100 // 100 の場合 ls_result = "満点" CASE 80 TO 99 // 80~99 の場合 ls_result = "優秀" CASE 60, 70, 75 // 60、70、75 のみ ls_result = "合格" CASE IS < 60 // 60 未満 ls_result = "赤点" CASE ELSE ls_result = "不正な値" END CHOOSE
カンマ区切りによる条件の複数指定 (OR に相当) や、範囲指定 (TO) や比較演算子 (IS <) が直接書けるため、複雑な分岐もスッキリと記述できます。また、初めに一致した条件のブロックのみを実行して自動的に構文を抜けるため break の記述は不要です。
JavaScript や TypeScript の洗練されたモダンなエコシステムに慣れ親しんだエンジニアにとって、PowerScript の構文規則は、最初はどこか古めかしく、制約の多い「堅苦しい言語」に映るかもしれません。一方で、大文字小文字を区別しない大雑把さや、配列が 1 から始まる違和感、あるいはコンパイルをすり抜ける Any 型や独自の NULL の挙動など、Web の常識とはあまりにも異なるギャップに、最初は戸惑いを覚えるのが自然な反応です。
しかし、その風変わりな「癖」の背景にある思想を紐解いていくと、すべてがビジネスクリティカルな業務システムを絶対に落とさないための「徹底された堅牢さ」と、データベース処理を最速で形にするための「実用的な便利さ」に直結していることが分かります。型安全を維持しながら動的なデータをさばく柔軟性や、エラーでシステムをクラッシュさせずに処理を伝播させる NULL の仕様、そしてバグを未然に防ぐ強力な分岐構文は、歴史ある PowerBuilder が導き出した一つの完成形です。
この独特な作法を単なる制約として忌避するのではなく、システムの安定性を担保する強力な防衛策として正しく理解し、乗りこなすこと。それこそが、PowerBuilder を学ぶ Web 開発経験者が、圧倒的な開発効率と揺るぎない信頼性を両立させたロジックを組み上げるための鍵となります。
PowerScript 構文の演算子など。
!=)。== ではなく = なので文脈で判断する)。「Web エンジニア向け PB 入門」バックナンバー