MW211 EXIT

devlog
ExcelVBA/日時型の分離
2018年10月31日
Date型は日時型である。
この値を日付型と時刻型に分けたいという場合について。
Date型は、整数部が日付型、小数部が時刻型なので、それぞれに分ければよい。
ただ、一番確実な方法は、DateValue()やTimeValue()を使う方法であろう。
┌──────────────────────────────────────┐
│日付 = DateValue(日時)                                                      │
├──────────────────────────────────────┤
│時刻 = TimeValue(日時)                                                      │
└──────────────────────────────────────┘
これらは、主に文字列を日時に変換する関数だが、日時をインプットにしても動くのだ。

他には、一旦各要素に変換して、そこから生成し直すというやり方もある。
┌──────────────────────────────────────┐
│日付 = DateSerial(Year(日時), Month(日時), Day(日時))                       │
├──────────────────────────────────────┤
│時刻 = TimeSerial(Hour(日時), Minute(日時), Second(日時))                   │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/ジャーナル
2018年10月30日
┌──────────────────────────────────────┐
│CREATE TABLE [DB].[dbo].[T_表] (                                            │
│    [キー]          [int]               NOT NULL,                           │
│    [値]            [nvarchar](256)     NULL,                               │
│    [更新者]        [nvarchar](32)      NOT NULL,                           │
│    [更新日時]      [datetime]          NOT NULL    DEFAULT (GETDATE()),    │
│    CONSTRAINT [PK_表] PRIMARY KEY CLUSTERED (                              │
│        [キー]                  ASC                                         │
│    )                                                                       │
│);                                                                          │
└──────────────────────────────────────┘
例えば上記テーブルのジャーナルテーブル(更新履歴テーブル)を実装する方法。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【1】ジャーナルテーブルを作る
┌──────────────────────────────────────┐
│CREATE TABLE [DB].[dbo].[T_ジャーナル_表] (                                 │
│    [ジャーナルID]      [int] IDENTITY(1,1) NOT NULL,                   --※│
│    [ジャーナル区分]    [nchar](2)          NOT NULL,                   --※│
│    [キー]              [int]               NULL,                           │
│    [値]                [nvarchar](256)     NULL,                           │
│    [更新者]            [nvarchar](32)      NULL,                           │
│    [更新日時]          [datetime]          NULL,                           │
│    CONSTRAINT [PK_ジャーナル_表] PRIMARY KEY CLUSTERED (                   │
│        [ジャーナルID]          ASC                                     --※│
│    )                                                                       │
│);                                                                          │
└──────────────────────────────────────┘
  対象テーブルの各列について、制約を一切はずして、継承する。
  また、代わりに主キーとして連番([ジャーナルID])をあてる。
  それと、「追加」か「削除」を記録する区分([ジャーナル区分])も設置。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【2】トリガを仕込む
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[TRIGGER_ジャーナル_表] ON [DB].[dbo].[T_表]           │
│    AFTER INSERT, UPDATE, DELETE                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    INSERT INTO [DB].[dbo].[T_ジャーナル_表] (                              │
│            [ジャーナル区分],                                               │
│            [キー],                                                         │
│            [値],                                                           │
│            [更新者],                                                       │
│            [更新日時]                                                      │
│        )                                                                   │
│        SELECT '削除' AS [ジャーナル区分],                                  │
│               [キー],                                                      │
│               [値],                                                        │
│               [更新者],                                                    │
│               [更新日時]                                                   │
│            FROM deleted;                                                   │
│    INSERT INTO [DB].[dbo].[T_ジャーナル_表] (                              │
│            [ジャーナル区分],                                               │
│            [キー],                                                         │
│            [値],                                                           │
│            [更新者],                                                       │
│            [更新日時]                                                      │
│        )                                                                   │
│        SELECT '追加' AS [ジャーナル区分],                                  │
│               [キー],                                                      │
│               [値],                                                        │
│               [更新者],                                                    │
│               [更新日時]                                                   │
│            FROM inserted;                                                  │
│END;                                                                        │
└──────────────────────────────────────┘
  MSSQLの場合は、「deleted」で更新前(削除前)のレコードが、
  「inserted」で更新後(追加後)のレコードが取得できるので
  それをそのままジャーナルにしてしまった方が間違いないようだ。

  もちろん、INSERT・UPDATE・DELETEに分けるという方法もあるが
  一つのトリガ内で、これを(何をトリガとしたのかを)識別することは難しい模様。
  そうなると、トリガを三つ用意した方が間違いないようではあるが。。。
分類:MSSQL
ExcelVBA/日付を年度に変換
2018年10月29日
日付を年度に変換する関数。(年度開始月が4月の場合)
┌──────────────────────────────────────┐
│Public Function 年度変換(ByVal 日付 As Variant) As Long                     │
│    If IsDate(日付) Then                                                    │
│        年度変換 = IIf(Month(日付) < 4, Year(日付) - 1, Year(日付))         │
│    Else                                                                    │
│        年度変換 = 0                                                        │
│    End If                                                                  │
│End Function                                                                │
└──────────────────────────────────────┘
日付じゃないもの(空欄も含む)が入力された場合は、「0」年度を返す。
分類:ExcelVBA
SQLite/SQLite2からSQLite3へのデータ変換
2018年10月28日
(1) SQLite3のコマンドラインツールを入手する
    以下のサイトから最新版を入手する
    https://www.sqlite.org/download.html
    例)「sqlite-tools-win32-x86-3250200.zip」

    →圧縮ファイルが入手でき、中に「sqlite3.exe」が入っている

(2) SQLite2のコマンドラインツールを入手する
    ダウンロードサイトはないようなので、直接URL入力する
    http://www.sqlite.org/sqlite-2_8_17.zip

    URL中のバージョン部分は適宜変更のこと

    変更履歴は以下で確認できる(SQLite2の最終版は現在「2.8.17」)
    https://www.sqlite.org/changes.html

    →圧縮ファイルが入手でき、中に「sqlite.exe」が入っている

(3) 「sqlite3.exe」と「sqlite.exe」を任意のフォルダに置き
    コマンドプロンプトにてそのフォルダへ移動する

(4) コマンドを実行
    ┌───────────────────────────────────┐
    │> sqlite sqlite2データ.db .dump | sqlite3 sqlite3データ.db            │
    └───────────────────────────────────┘
    SQLite2で(「.dump」にて全ての)ダンプデータを吐き出し、パイプを経由して
    それを元にSQLite3のデータファイルを新規作成する形になる

以上でSQLite3のデータへの変換は完了
分類:SQL
Excel/1900年02月29日
2018年10月27日
Excelの世界では、存在しないはずの「1900年02月29日」が存在する。

「4年に一度の閏年は、100年に一度閏年ではなくなる(但し400年に一度は閏年になる)」
という法則からすると、「2000年02月29日」は存在しても
「1900年02月29日」や「2100年02月29日」は存在しないことになる

ただ、競合するLotus1-2-3の仕様が「1900年02月29日」が存在するものだった(*1)ので
Excelもそれに合わせて今日に至っているという事情のようだ
*1:メモリ節約のため「100年に一度閏年ではなくなる」を端折ったとの話も

従って、シリアル値を日付に変換する場合、
基本的に「シリアル値1=1900年01月01日」から日数を加算していく形となるが
「1~59」の間はこれが遵守されるが、「シリアル値60=1900年02月29日」
「シリアル値61=1900年03月01日」なので、「61~」は前述の法則性から
敢えて一日引いてあげなければなない
┌───┬──────────────────────────────────┐
│ 1~59│1900年01月01日の(シリアル値 - 1)日後                                │
├───┼──────────────────────────────────┤
│60    │1900年02月29日(本来はありえない)                                    │
├───┼──────────────────────────────────┤
│61~  │1900年01月01日の(シリアル値 - 2)日後                                │
└───┴──────────────────────────────────┘

ちなみに、「2100年02月29日」は存在しない
┌──────────────────────────────────────┐
│・シリアル値73109=2100年02月28日                                           │
│・シリアル値73110=2100年03月01日                                           │
└──────────────────────────────────────┘
→あくまで「100年に一度閏年ではなくなる」を端折ったのではなく
  「1900年02月29日」だけ(前述の事情による)特例であるという扱いである
分類:Excel
HTML5/その他タグ
2018年10月26日
┌──┐
│wbr │
└──┘
  文字数が多い場合に自動改行されるが、
  その場合の改行して欲しい位置を提示するもの
  Netscape時代の独自仕様がHTML5で標準仕様となった

┌──┐
│bdi │
└──┘
  一般的には文字の並びは左から右だが、
  アラビア語など一部の言語では右から左となっている。
  この点についてはブラウザ側で自動で判別して表示してくれるので
  タグ等を用いる必要はないのだが、それが誤認される場合(*1)などに
  bdiタグで囲って明示してあげる

  *1:例えば、アラビア語、数字、日本語の順に記載があった場合に、
      真ん中の数字が、アラビア語の一部として認識される
      これを防ぐために、アラビア語の部分をbdiタグで囲う(spanタグ代替といえる)
分類:HTML5+CSS3
CSS3/枠画像
2018年10月23日
以下のような96px×96pxの画像を用意する。
┌─┬─┬─┐
│┏│━│┓│
├─┼─┼─┤
│┃│  │┃│
├─┼─┼─┤
│┗│━│┛│
└─┴─┴─┘

そして、以下のようなCSSを指定すると。
┌──────────────────────────────────────┐
│div {                                                                       │
│    height          :160px;                                                 │
│    width           :160px;                                                 │
│    background-color:#CCCCCC;                                               │
│                                                                            │
│    border-style    :solid;                                                 │
│    border-width    :32px;                                                  │
│    border-image    :url("画像.png") 32 repeat;                             │
│}                                                                           │
└──────────────────────────────────────┘

以下のように表示できる。
┌─┬─┬─┬─┬─┬─┬─┐
│┏│━│━│━│━│━│┓│
├─┼─┼─┼─┼─┼─┼─┤
│┃│  │  │  │  │  │┃│
├─┼─┼─┼─┼─┼─┼─┤
│┃│  │  │  │  │  │┃│
├─┼─┼─┼─┼─┼─┼─┤
│┃│  │  │  │  │  │┃│
├─┼─┼─┼─┼─┼─┼─┤
│┃│  │  │  │  │  │┃│
├─┼─┼─┼─┼─┼─┼─┤
│┃│  │  │  │  │  │┃│
├─┼─┼─┼─┼─┼─┼─┤
│┗│━│━│━│━│━│┛│
└─┴─┴─┴─┴─┴─┴─┘
分類:HTML5+CSS3
前へ 1 次へ