MW211 EXIT

devlog
ExcelVBA/IIf()で除数ゼロエラー回避はできない
2017年10月21日
除数ゼロエラー回避のため、以下のようなIf文を用いたとする。
┌──────────────────────────────────────┐
│If 分母 = 0 Then                                                            │
│    比率 = 999                                                              │
│Else                                                                        │
│    比率 = 分子 * 100 / 分母                                                │
│EndIf                                                                       │
└──────────────────────────────────────┘
あ、これ三項式でいけるじゃんと思い、「IIf()」で実装を試みてみる。
┌──────────────────────────────────────┐
│比率 = IIf(分母 = 0, 999, 分子 * 100 / 分母)                                │
└──────────────────────────────────────┘
でも、これだと除数ゼロエラーが発生してしまう。
「IIf()」は偽の式も評価されてしまうのである。
ということで、If文を使うしかあるまい。
(VisualBasicだと「If()」ってのが新登場したとかしないとか)
分類:ExcelVBA
PostgreSQL/pgAdminでDBを別名で複写
2017年10月13日
テスト用にDBを別名でまるごと複写する方法。
(1) 複写元でバックアップを実行(バックアップファイルを入手)
    Customあたりの圧縮形式でよいだろう
(2) 複写先DBを作成
(3) 複写先DBでリストアを実行(上記バックアップファイルを指定)
これだけ

バックアップファイルにはDB内の情報しかない(DBの情報はない)ので
指定されたDB配下にDB配下の情報をリストアする感じとなる
分類:PostgreSQL
Oracle/SERVEROUTPUT
2017年10月11日
┌───────────┬──────────────────────────┐
│SET SERVEROUTPUT ON;  │DBMS_OUPUT()の出力をONにする                        │
├───────────┼──────────────────────────┤
│SET SERVEROUTPUT OFF; │DBMS_OUPUT()の出力をOFFにする                       │
├───────────┼──────────────────────────┤
│SHOW SERVEROUTPUT;    │設定状況を確認する                                  │
└───────────┴──────────────────────────┘
SQL Developerで、ONして、終了するとOFFに戻る。
そのセッション中のみ設定変更が有効となるようだ。
分類:Oracle
Oracle/ストアドプロシージャでの更新
2017年10月10日
(SQL Developerで)ストアドプロシージャを実行して、いきなり更新してしまうと、
WHERE句の誤記で大変なことになりかねない(全件更新とか)。

そこで、ワンクッションを置く方法。
┌──────────────────────────────────────┐
│CREATE OR REPLACE PROCEDURE "ストアドプロシージャ"                          │
│IS                                                                          │
│    "更新数" NUMBER := 0;                                                   │
│BEGIN                                                                       │
│    UPDATE "表"                                                             │
│        SET "列" = 値                                                       │
│        WHERE "キー" = 値;                                                  │
│    "更新数" := sql%rowcount;                                               │
│    DBMS_OUTPUT.PUT_LINE('更新件数=' || "更新数");                         │
│    RETURN;                                                                 │
│    EXCEPTION                                                               │
│        WHEN OTHERS THEN                                                    │
│            RETURN;                                                         │
│END;                                                                        │
│//                                        ※変数"更新数"を経由しなくてもよい│
└──────────────────────────────────────┘
  一、ストアドプロシージャ内では、「COMMIT」しない
  二、ストアドプロシージャ内で、更新結果を出力する
    二の一、更新件数は更新直後に「sql%rowcount」を参照すればよい
    二の二、更新結果は「DBMS_OUTPUT.PUT_LINE()」で出力すればよい

で、実行する側ではこうなる。
┌──────────────────────────────────────┐
│SET SERVEROUTPUT ON;                                                        │
│EXECUTE "ストアドプロシージャ";                                             │
├──────────────────────────────────────┤
│COMMIT;                                                                     │
└──────────────────────────────────────┘
  一、最初に「SET SERVEROUTPUT ON」を実行し、
      SQL Developerに「DBMS_OUTPUT.PUT_LINE()」の結果が出力されるようにする
      ┌──────────────────────────────────┐
      │更新件数=1                                                         │
      │PL/SQLプロシージャが正常に完了しました。                            │
      └──────────────────────────────────┘
  二、更新件数の妥当性を確認した上で、「COMMIT」する
      ┌──────────────────────────────────┐
      │コミットが完了しました。                                            │
      └──────────────────────────────────┘
くれぐれも、「COMMIT」忘れのなきよう。
分類:Oracle
Oracle/ダブルクォーテーション
2017年10月05日
OracleのSQLでは表名や列名をダブルクォーテーションで囲っても
囲わなくてもよい。

但し、以下の場合は囲わなければならない。
・予約語を表名や列名として使用する場合
・大文字小文字を厳密に区別する場合

なお、囲わないと小文字は大文字に変換される。
なので、囲わないで上手くいっていた小文字を
敢えて囲ったことによりエラーとなるなんてこともあるから注意。
分類:Oracle
Word/変更履歴を残す方法
2017年10月04日
完成した文章に校正する場合など。

メニューバーの「校閲」より(「変更履歴の記録」の)「変更履歴の記録」を実行する。
すると、以降に書き込んだ部分に目印がつく。

なお、画面右上の吹き出しアイコンで、コメント(変更履歴)も記入できる。
分類:Word
ガード節
2017年10月03日
「break」や「continue」を使って、処理を回避する方法である。
┌──────────────────────────────────────┐
│for (ループ条件) {                                                          │
│    if (終了条件) {                                                         │
│        break;                                                              │
│    }                                                                       │
│    if (スキップ条件) {                                                     │
│        continue;                                                           │
│    }                                                                       │
│    処理;                                                                   │
│}                                                                           │
└──────────────────────────────────────┘
これらを使わないと(真の構造化プログラミングだと)、
以下のようにネストで対処せねばならなくなり、ネストが深くなる。
┌──────────────────────────────────────┐
│for (ループ条件) {                                                          │
│    if (!終了条件) {                                                        │
│        if (!スキップ条件) {                                                │
│            処理;                                                           │
│        }                                                                   │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
前者は縦に、後者は横に広がっていく感じである。

ちなみに、サブ関数においても同じ様に使える。
┌──────────────────────────────────────┐
│function func() {                                                           │
│    for (ループ条件) {                                                      │
│        if (終了条件) {                                                     │
│            return 戻り値;                                                  │
│        }                                                                   │
│        if (スキップ条件) {                                                 │
│            continue;                                                       │
│        }                                                                   │
│        処理;                                                               │
│    }                                                                       │
│    return 戻り値;                                                          │
│}                                                                           │
├──────────────────────────────────────┤
│function func() {                                                           │
│    for (ループ条件) {                                                      │
│        if (!終了条件) {                                                    │
│            if (!スキップ条件) {                                            │
│                処理;                                                       │
│            }                                                               │
│        }                                                                   │
│    }                                                                       │
│    return 戻り値;                                                          │
│}                                                                           │
└──────────────────────────────────────┘
なお、戻り値をデバッガで参照したい場合には、
後者はブレークポイントが一箇所で済むというメリットがある。

とはいえ、前者の方が圧倒的に見やすいと思うのだが。。。
分類:設計
前へ 1 次へ