MW211 EXIT

devlog
Oracle/年月表(年度版)
2018年02月06日
年度版(4月~翌3月)。
┌──────────────────────────────────────┐
│WITH "年月D" AS (                                                          │
│    SELECT "年",                                                            │
│           "月",                                                            │
│           COUNT(*) AS "値"                                                 │
│        FROM (                                                              │
│            SELECT "年"                                                     │
│                   "月"                                                     │
│                FROM "表"                                                   │
│        )                                                                   │
│        GROUP BY "年",                                                      │
│                 "月"                                                       │
│)                                                                           │
│SELECT *                                                                    │
│    FROM (                                                                  │
│        SELECT CASE                                                         │
│                 WHEN "カレンダM"."月" < 4 THEN "カレンダM"."年" - 1      │
│                 ELSE                            "カレンダM"."年"          │
│               END AS "年度",                                               │
│               CASE                                                         │
│                 WHEN "カレンダM"."月" < 4 THEN "カレンダM"."月" + 12     │
│                 ELSE                            "カレンダM"."月"          │
│               END AS "月",                                                 │
│               NVL("年月D"."値", 0) AS "値"                                │
│            FROM (                                                          │
│                SELECT "年"."年",                                           │
│                       "月"."月"                                            │
│                    FROM (                                                  │
│                        SELECT 開始年度 + ROWNUM - 1  AS "年"               │
│                            FROM DUAL                                       │
│                                CONNECT BY ROWNUM <= 終了年度 - 開始年度 + 2│
│                    ) "年"                                                  │
│                        CROSS JOIN (                                        │
│                            SELECT ROWNUM AS "月"                           │
│                                FROM DUAL CONNECT BY ROWNUM <= 12           │
│                        ) "月"                                              │
│            ) "カレンダM"                                                  │
│                LEFT JOIN "年月D"                                          │
│                  ON  "年月D"."年" = "カレンダM"."年"                     │
│                  AND "年月D"."月" = "カレンダM"."月"                     
│    ) "集計D"                                                              │
│     PIVOT (                                                                │
│        SUM("値") FOR "月" IN ( 4 AS  "4月",                                │
│                                5 AS  "5月",                                │
│                                6 AS  "6月",                                │
│                                7 AS  "7月",                                │
│                                8 AS  "8月",                                │
│                                9 AS  "9月",                                │
│                               10 AS "10月",                                │
│                               11 AS "11月",                                │
│                               12 AS "12月",                                │
│                               13 AS  "1月",                                │
│                               14 AS  "2月",                                │
│                               15 AS  "3月")                                │
│    ) "ピボット"                                                            │
│    WHERE "年度" BETWEEN 開始年度 AND 終了年度                              │
│    ORDER BY "年度" ASC;                                                    │
└──────────────────────────────────────┘
  ・「開始年度」と「終了年度」の部分はそれぞれの数値に置き換える
  ・「年月D」の中身を変えれば、元データをいろいろなものにできる
分類:Oracle
Oracle/年月表
2018年02月05日
ピボット集計にて、縦軸に年、横軸に1~12月のマトリクス表を出力するSQL文。
┌──────────────────────────────────────┐
│WITH "年月D" AS (                                                          │
│    SELECT "年",                                                            │
│           "月",                                                            │
│           COUNT(*) AS "値"                                                 │
│        FROM (                                                              │
│            SELECT "年"                                                     │
│                   "月"                                                     │
│                FROM "表"                                                   │
│        )                                                                   │
│        GROUP BY "年",                                                      │
│                 "月"                                                       │
│)                                                                           │
│SELECT *                                                                    │
│    FROM (                                                                  │
│        SELECT "カレンダM"."年",                                           │
│               "カレンダM"."月",                                           │
│               NVL("年月D"."値", 0) AS "値"                                │
│            FROM (                                                          │
│                SELECT "年"."年",                                           │
│                       "月"."月"                                            │
│                    FROM (                                                  │
│                        SELECT 開始年 + ROWNUM - 1  AS "年"                 │
│                            FROM DUAL                                       │
│                                 CONNECT BY ROWNUM <= 終了年 - 開始年 + 1   │
│                    ) "年"                                                  │
│                        CROSS JOIN (                                        │
│                            SELECT ROWNUM AS "月"                           │
│                                FROM DUAL CONNECT BY ROWNUM <= 12           │
│                        ) "月"                                              │
│            ) "カレンダM"                                                  │
│                LEFT JOIN "年月D"                                          │
│                  ON  "年月D"."年" = "カレンダM"."年"                     │
│                  AND "年月D"."月" = "カレンダM"."月"                     │
│    ) "集計D"                                                              │
│    PIVOT (                                                                 │
│        SUM("値") FOR "月" IN ( 1 AS  "1月",                                │
│                                2 AS  "2月",                                │
│                                3 AS  "3月",                                │
│                                4 AS  "4月",                                │
│                                5 AS  "5月",                                │
│                                6 AS  "6月",                                │
│                                7 AS  "7月",                                │
│                                8 AS  "8月",                                │
│                                9 AS  "9月",                                │
│                               10 AS "10月",                                │
│                               11 AS "11月",                                │
│                               12 AS "12月")                                │
│    ) "ピボット"                                                            │
│    ORDER BY "年" ASC;                                                      │
└──────────────────────────────────────┘
  ・「開始年」と「終了年」の部分はそれぞれの数値に置き換える
  ・「年月D」の中身を変えれば、元データをいろいろなものにできる
分類:Oracle
Oracle/一つ前のレコード
2018年02月02日
一つ前のレコードを参照するには、LAG()関数を使う。こんな感じ。
┌──────────────────────────────────────┐
│SELECT LAG("列") OVER(PARTITION BY "グループ列"                             │
│                      ORDER BY     "ソート列"   ASC) AS "列"                │
│    FROM "表";                                                              │
└──────────────────────────────────────┘
その列だけ局地的に一つ前のレコードを取得するような感じになる。
なお、一つまえのレコードがない場合には、「NULL」になる。

では、結合した場合はどうか?
┌──────────────────────────────────────┐
│SELECT LAG("副表"."列") OVER(PARTITION BY "副表"."グループ列"               │
│                             ORDER BY     "副表"."ソート列"   ASC) AS "列"  │
│    FROM "主表"                                                             │
│        LEFT JOIN "副表"                                                    │
│          ON "副表"."主キー" = "主表"."外部キー";                           │
└──────────────────────────────────────┘
うっかりこういうのはNG。予期せぬ「NULL」が多発する。
なぜなら、LAG()関数はあくまで直前の母集団の一つ前のレコードを探し出してくるので
この場合、"副表"側全部の中の一つ前のレコードとはならないのだ。

とはいえ、以下のようなのはNG。
┌──────────────────────────────────────┐
│SELECT "副表"."列"                                                          │
│    FROM "主表"                                                             │
│        LEFT JOIN "副表" "中継副表"                                         │
│            LEFT JOIN "副表"                                                │
│              ON "副表"."主キー"                                            │
│       = LAG("中継副表"."主キー") OVER(PARTITION BY "副表"."グループ列"     │
│                                       ORDER BY     "副表"."ソート列"   ASC)│
│          ON "中継副表"."主キー" = "主表"."外部キー";                       │
└──────────────────────────────────────┘
「ORA-30483: ここでウィンドウ・ファンクションは使用できません。」エラーとなる。

なので、副問合せの時点で解決してしまうのがよいようだ。
┌──────────────────────────────────────┐
│SELECT "副表"."列"                                                          │
│    FROM "主表"                                                             │
│        LEFT JOIN (                                                         │
│            SELECT "主キー",                                                │
│                   LAG("列") OVER(PARTITION BY "グループ列"                 │
│                                  ORDER BY     "ソート列"   ASC) AS "列"    │
│                FROM "副表"                                                 │
│        ) "副表"                                                            │
│          ON "副表"."主キー" = "主表"."外部キー";                           │
└──────────────────────────────────────┘
本当にこれがベストなのかは不安だが。
分類:Oracle
UUID(GUID)
2018年02月01日
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx│16進法による文字列表記                │
└──────────────────┴───────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【バリアント(変種)】
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-xxxx-0xxx-xxxxxxxxxxxx│後方互換予約                          │
│xxxxxxxx-xxxx-xxxx-1xxx-xxxxxxxxxxxx│(Network Computing System)            │
│xxxxxxxx-xxxx-xxxx-2xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-3xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-4xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-5xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-6xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-7xxx-xxxxxxxxxxxx│                                      │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-8xxx-xxxxxxxxxxxx│一般的に使用(RFC4122)                 │
│xxxxxxxx-xxxx-xxxx-9xxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-Axxx-xxxxxxxxxxxx│                                      │
│xxxxxxxx-xxxx-xxxx-Bxxx-xxxxxxxxxxxx│                                      │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-Cxxx-xxxxxxxxxxxx│後方互換予約                          │
│xxxxxxxx-xxxx-xxxx-Dxxx-xxxxxxxxxxxx│(マイクロソフト(COMのGUID))           │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-xxxx-Exxx-xxxxxxxxxxxx│将来予約                              │
│xxxxxxxx-xxxx-xxxx-Fxxx-xxxxxxxxxxxx│                                      │
└──────────────────┴───────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【バージョン】
┌──────────────────┬───────────────────┐
│xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx│バージョン1(時刻とMACアドレス)        │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-2xxx-xxxx-xxxxxxxxxxxx│バージョン2(時刻とMACとローカルID)    │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx│バージョン3(ハッシュ値)               │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx│バージョン4(乱数値)                   │
├──────────────────┼───────────────────┤
│xxxxxxxx-xxxx-5xxx-xxxx-xxxxxxxxxxxx│バージョン5(ハッシュ値)               │
└──────────────────┴───────────────────┘
分類:設計
ExcelVBA/リボンの最小化と非表示
2018年01月26日
Excel2010までは「リボンの最小化」しかなかったが
(というか「リボンの最小化」の導入はExcel2010からだが)
Excel2013から「リボンの非表示」も導入された。

力関係的には、「リボンの非表示」>「リボンの最小化」なので
リボンが非表示状態で、最小化云々をやろうとするとエラー(*1)となってしまう。
*1:「'ExecuteMso'メソッドは失敗しました:'_CommandBars'オブジェクト」

たとえば、以下は最小化されていない場合に、最小化するマクロだが…
┌──────────────────────────────────────┐
│If Application.CommandBars.GetPressedMso("MinimizeRibbon") = False Then     │
│    Application.CommandBars.ExecuteMso "MinimizeRibbon"                     │
│End If                                                                      │
└──────────────────────────────────────┘
非表示状態の場合には、エラーとなってしまう。

なので、非表示状態じゃない時という条件が必要になる。
しかも、Excel2010では非表示自体ないので、その条件文にも注意が必要。

例えばこんな感じになる(事前に非表示を解消してしまう方法)。
┌──────────────────────────────────────┐
│If CInt(Application.Version) >= 15 Then     ' Excel2013(バージョン15.0)以降 │
│    If Application.CommandBars.GetPressedMso("HideRibbon") = True Then      │
│        Application.CommandBars.ExecuteMso "HideRibbon"                     │
│    End If                                                                  │
│End If                                                                      │
│If Application.CommandBars.GetPressedMso("MinimizeRibbon") = False Then     │
│    Application.CommandBars.ExecuteMso "MinimizeRibbon"                     │
│End If                                                                      │
└──────────────────────────────────────┘
なお、"HideRibbon"も"MinimizeRibbon"もトグル命令なので、状態が反転する。
False下で実行するとTrueとなり非表示化・最小化し、
True下で実行するとFalseとなりそれが解除される。
分類:ExcelVBA
ExcelVBA/ボタンの設定
2018年01月25日
ボタンを設定するには以下の方法がある。
┌──────────┬───────────────────────────┐
│フォームコントロール│マクロを登録する                                      │
├──────────┼───────────────────────────┤
│ActiveXコントロール │イベントとして登録する                                │
├──────────┼───────────────────────────┤
│オートシェイブ      │マクロを登録する                                      │
└──────────┴───────────────────────────┘
分類:ExcelVBA
ExcelVBA/セルの範囲
2018年01月21日
┌───────────┬──────────────────────────┐
│起点セル.CurrentRegion│空白で囲まれた範囲(矩形)を選択                      │
├───────────┼──────────────────────────┤
│シート.UsedRange      │(空白関係なく)すべての使用済み範囲(矩形)を選択      │
└───────────┴──────────────────────────┘
分類:ExcelVBA
ExcelVBA/.Formulaのイコール
2018年01月16日
┌─┬────────────────────────────────────┐
│A│With Selection                                                          │
│  │    .Formula = .Formula                                                 │
│  │End With                                                                │
├─┼────────────────────────────────────┤
│B│With Selection                                                          │
│  │    .Formula = "=" & .Formula                                           │
│  │End With                                                                │
└─┴────────────────────────────────────┘
上記の違い。

元々の値が数式だった場合には、影響はなし。
Aで「=」が足りないとか、Bで「=」が過剰とか、怒られたりはしない。

違いは、元の値が数式っぽい文字列だった場合。
例えば「A1」という文字だったら、Aはそのままだが、Bは数式「=A1」となる。
分類:ExcelVBA
ExcelVBA/選択とオブジェクト
2018年01月15日
選択中のものは、セルだけとは限らない。オブジェクトの場合もある。
オブジェクトも一つの種類のオブジェクトとは限らない。
但し、セルとオブジェクトを同時に選択することはない。
何を選択しているかは、「TypeName(Selection)」で確認すればよい。
なお、複数のオブジェクトを選択している場合には
その種類に差異があるかは不問で「DrawingObjects」となる。
┌──────┬───────┬──────────────┐
│セル        │Range         │                            │
├──────┼───────┼─────┬────────┤
│オブジェクト│DrawingObjects│TextBox   │テキストボックス│
│            │              ├─────┼────────┤
│            │              │Line      │直線            │
│            │              ├─────┼────────┤
│            │              │Rectangle │四角形          │
│            │              ├─────┼────────┤
│            │              │Oval      │円(楕円)        │
│            │              ├─────┼────────┤
│            │              │Picture   │画像            │
└──────┴───────┴─────┴────────┘

ということで、テキストボックスの数式を置換するマクロはこんな感じになる。
┌──────────────────────────────────────┐
│Public Sub テキストボックスの数式参照相対化()                               │
│    Dim theObject As Object                                                 │
│    Select Case TypeName(Selection)                                         │
│        Case "DrawingObjects"                                               │
│            For Each theObject In Selection                                 │
│                If TypeName(theObject) = "TextBox" Then                     │
│                    With theObject                                          │
│                        .Formula = Replace(.Formula, "$", "")               │
│                    End With                                                │
│                End If                                                      │
│            Next theObject                                                  │
│        Case "TextBox"                                                      │
│            With Selection                                                  │
│                .Formula = Replace(.Formula, "$", "")                       │
│            End With                                                        │
│        Case Else                                                           │
│            MsgBox "テキストボックスを選択してください"                     │
│            Exit Sub                                                        │
│    End Select                                                              │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
SQL/採番をバッティングさせない方法
2018年01月11日
①列の自動採番機能を使う
  ○確実(漏れがない、直接SQL文で更新しても効く)
  ×単一列でしか利用できない(複合キーには向かない)
②更新前トリガを使う
  ○確実(漏れがない、直接SQL文で更新しても効く)
  ○採番方法は自由(複合キーでもOK)
  △トリガの管理が煩雑(他列が増減した場合にトリガも追従させないといけない)
③排他トランザクションを使う
  ○採番方法は自由(複合キーでもOK)
  △不確実(処理ルートに漏れがあってはならない、直接SQL文で更新したら対応外)
④プログラムで行う
  ○採番方法は自由(複合キーでもOK)
  △不確実(処理ルートに漏れがあってはならない、直接SQL文で更新したら対応外)
  △管理が煩雑(SQLに一元化されない)
分類:SQL
前へ 1 … 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 … 156 次へ