MW211 EXIT

devlog
Oracle/エラーORA-01779
2017年07月30日
「ORA-01779:キー保存されていない表にマップする列は変更できません」の主な原因。

以下だとOK。
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT "表1"."列1",                                                 │
│               "表2"."列2"                                                  │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."主キー" = "表1"."主キー"                        │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘

でも、以下だとNG(本エラー)。
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT "表1"."列1",                                                 │
│               "表2"."列2"                                                  │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."非主キー" = "表1"."非主キー"                    │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘
入力元(表2)が複数ある場合を恐れて、制限している。
なお、理論上、単数になることを保証できても、許してくれないようだ。


ヒント句「/*+ BYPASS_UJVC */」で回避(強制実行)できた時代もあったようだが
Oracle11g以降は厳しくなってできなくなっている
┌──────────────────────────────────────┐
│UPDATE (                                                                    │
│        SELECT /*+ BYPASS_UJVC */ "表1"."列1",                              │
│                                  "表2"."列2"                               │
│            FROM "表1"                                                      │
│                INNER JOIN "表2"                                            │
│                  ON "表2"."非主キー" = "表1"."非主キー"                    │
│    )                                                                       │
│    SET "列1" = "列2";                                                      │
└──────────────────────────────────────┘
分類:Oracle
MySQL/更新時における自身のサブクエリ
2017年07月29日
例えば、並び順を末尾に追加したい場合、現状の最大値+1を更新するようにするとする。

ただ、以下だとエラー(1093エラー)となる。
┌──────────────────────────────────────┐
│INSERT INTO `表`                                                            │
│    SET `列` = 値,                                                          │
│        `順` = (SELECT MAX(`順`) + 1                                        │
│                    FROM `表`);                                             │
└──────────────────────────────────────┘

サブクエリに自らの表を使用できないのが原因だ。
この場合、以下のように別表にしてしまえば、これを回避できる。
┌──────────────────────────────────────┐
│INSERT INTO `表`                                                            │
│    SET `列` = 値,                                                          │
│        `順` = (SELECT `順` + 1                                             │
│                    FROM (                                                  │
│                        SELECT MAX(`順`) AS `順`                            │
│                            FROM `表`                                       │
│                    ) AS `別表`);                                           │
└──────────────────────────────────────┘
分類:MySQL
Windowsバッチ/値入力
2017年07月27日
「set /P」を使う。

以下のような感じ。
┌──────────────────────────────────────┐
│@echo off                                                                   │
│cls                                                                         │
│set /P VAR="値を入力してください:"                                         │
│if "%VAR%"=="" (                                                            │
│    echo 入力がありません                                                   │
│) else (                                                                    │
│    echo 入力された値:%VAR%                                                │
│)                                                                           │
│pause;                                                                      │
└──────────────────────────────────────┘
分類:Windows
Windowsバッチ/空行のecho
2017年07月26日
空行のechoは以下ではダメ。
┌──────────────────────────────────────┐
│echo                                                                        │
└──────────────────────────────────────┘
以下のように「.」をつける。
┌──────────────────────────────────────┐
│echo.                                                                       │
└──────────────────────────────────────┘
分類:Windows
Oracle/部分一致結合
2017年07月23日
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" = "表1"."列"                                       │
└──────────────────────────────────────┘
上記だと完全一致したものしか結合できない。

例えば表1が「ABC」で表2が「ABC2」の場合も結合したい場合、
「'ABC2' LIKE 'ABC%'」的なことをしたい場合、
「CONCAT()」で「%」を結合させてあげれば実現できる。
(「CONCAT()」の代わりに「||」でもOK)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" LIKE CONCAT("表1"."列", '%');                      │
├──────────────────────────────────────┤
│SELECT *                                                                    │
│    FROM "表1"                                                              │
│        INNER JOIN "表2"                                                    │
│          ON  "表2"."列" LIKE "表1"."列" || '%';                            │
└──────────────────────────────────────┘
分類:Oracle
ExcelVBA/CountIf()で大文字小文字の区別
2017年07月17日
┌──────────────────────────────────────┐
│WorksheetFunction.CountIf(範囲, 値)                                         │
└──────────────────────────────────────┘
上記では、大文字と小文字の区別ができない。

Excel関数なら以下のようにすれば大文字と小文字を区別できる。
┌──────────────────────────────────────┐
│=SUMPRODUCT((EXACT(範囲,値))*1)                                             │
└──────────────────────────────────────┘

しかし、これを、VBAにしようとすると「WorksheetFunction.Exact()」がないので
実装た困難である。

だが、Excel関数を直接実行する「Evaluate()」を使えば実装できなくはない。
┌──────────────────────────────────────┐
│Evaluate("SUMPRODUCT(EXACT(" & 範囲 & "," & Chr(34) & 値 & Chr(34) & ")*1)")│
└──────────────────────────────────────┘
だけど「Evaluate()」は処理速度が遅いのがネックである。

ちなみに範囲の部分は「Selection」だったら「Selection.Address」とかになる。
分類:ExcelVBA
ExcelVBA/デスクトップのパス
2017年07月06日
ファイルをデスクトップへ出力する場合などに、デスクトップのパスを知りたくなるが
その方法は以下の通り。
┌──────────────────────────────────────┐
│Dim objWSH As Object                                                        │
│Set objWSH = CreateObject("WScript.Shell")                                  │
│MsgBox objWSH.SpecialFolders("Desktop")                                     │
└──────────────────────────────────────┘
なお、末尾に「\」はつかないので、続けてファイルを指定する場合には
「\」をはさむ必要がある。
分類:ExcelVBA
ExcelVBA/途中経過の表示
2017年07月05日
大量のデータを処理する場合、現在、どこまで進んでいるか知りたくなる。

そんな場合、以下のように、ステータスバーに件数を表示すればよい。
┌──────────────────────────────────────┐
│For y = 1 To 10000                                                          │
│    If .Rows(y).Row Mod 100 = 0 Then                                        │
│        DoEvents                                                            │
│        Application.StatusBar = .Rows(y).Row                                │
│    End If                                                                  │
│    ' 処理                                                                  │
│Next y                                                                      │
│Application.StatusBar = False  ' 最後に表示をクリア                         │
└──────────────────────────────────────┘
  ・行番号「.Rows(y).Row」を表示するようにしているが、
    もちろんそのまま「y」でもOK。
  ・処理が速めなので、100件ごとに間引いている。
  ・「DoEvents」がないと、途中でステータスバーの表示自体も固まってしまい
    表示されなくなるので、これは必須だ。
分類:ExcelVBA
前へ 1 次へ