MW211 EXIT

devlog
PHP/自前のgetCsv()
2022年05月14日
┌──────────────────────────────────────┐
│function getCsv($rows) {                                                    │
│    if (count($rows) == 0) {                                                │
│        return NULL;                                                        │
│    }                                                                       │
│    $return = [];                                                           │
│    $i = 0;                                                                 │
│    $return[] = implode(',', array_keys($rows[$i]));                        │
│    // 二件目以降読込                                                       │
│    do {                                                                    │
│        // CSV補正                                                          │
│        foreach ($rows[$i] as &$column) {                                   │
│            // 「"」を「""」に変換                                          │
│            if (preg_match('/"/', $column)) {                               │
│                $column = preg_replace('/"/', '""', $column);               │
│            }                                                               │
│            // 「"~"」で囲う                                               │
│            if ((preg_match('/"/' , $column))                               │
│             || (preg_match('/,/' , $column))                               │
│             || (preg_match('/\n/', $column)))                              │
│            {                                                               │
│                $column = '"' . $column . '"';                              │
│            }                                                               │
│        }                                                                   │
│        unset($column);                                                     │
│        //                                                                  │
│        $return[] = implode(',', $rows[$i]);                                │
│        $i++;                                                               │
│    } while ($i < count($rows));                                            │
│    return implode("\r\n", $return) . "\r\n";                               │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
jQuery/データのエクスポート
2022年05月13日
以下のような感じで。

【jQuery(JavaScript)】
┌──────────────────────────────────────┐
│$(':button').on('click', function() {                                       │
│    $.ajax({                                                                │
│            url         :URLを指定,                                         │
│            type        :'POST',                                            │
│            data        :{},                                                │
│            dataType    :'text',                                            │
│            timeout     :30000                                              │
│        })                                                                  │
│        .done(function(data, status, xhr) {                                 │
│            if (data) {                                                     │
│                const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);             │
│                const blob = new Blob([bom, data], {'type':'text/csv'});    │
│                $('<a></a>', {                                              │
│                    'href'      :window.URL.createObjectURL(blob),          │
│                    'download'  :'エクスポート.csv',                        │
│                    'target'    :'_blank'                                   │
│                })[0].click();                                              │
│            } else {                                                        │
│                alert('エラー');                                            │
│            }                                                               │
│        })                                                                  │
│        .fail(function(xhr, status, error) {                                │
│            alert('エラー');                                                │
│        });                                                                 │
└──────────────────────────────────────┘
  API(のURL)を指定して、CSVデータを返してもらう。
  そして、それに先頭BOMをつけて、UTF-8形式でダウンロードする形にする。

【PHP】
┌──────────────────────────────────────┐
│echo '1,2,3';                                                               │
└──────────────────────────────────────┘
  API側では、CSVデータを返す。
分類:jQuery
JavaScript/数値を文字列に変換する無名関数
2022年04月06日
┌──────────────────────────────────────┐
│(                                                                           │
│    (arg) => {                                                              │
│        switch (arg) {                                                      │
│            case  1: return 'a';                                            │
│            case  2: return 'b';                                            │
│            case  3: return 'c';                                            │
│            default: return 'z';                                            │
│        }                                                                   │
│    }                                                                       │
│)(1)                                                                        │
└──────────────────────────────────────┘
分類:JavaScript
jQuery/非同期「$.when()」の中でループ
2022年03月16日
以下のようなHTMLタグがあり(ま、どんなんでもいいのだが)
┌──────────────────────────────────────┐
│<div id="i1"></div>                                                         │
│<div id="i2"></div>                                                         │
│<div id="i3"></div>                                                         │
└──────────────────────────────────────┘

以下のような関数にてアニメーションをランダムに完了させる
┌──────────────────────────────────────┐
│function test(i) {                                                          │
│    let d = new $.Deferred;                                                 │
│    $('#i' + i).animate(                                                    │
│        {'display' :'block'},                                               │
│        1000 + Math.floor(Math.random() * (250 + 1)),                       │
│        'swing',                                                            │
│        function() {                                                        │
│            console.log($(this).text());                                    │
│            d.resolve();                                                    │
│        }                                                                   │
│    );                                                                      │
│    return d.promise();                                                     │
│}                                                                           │
└──────────────────────────────────────┘

んで、以下のように非同期で並列処理を行い、
全部完了したら「完了」をコンソールログに出力する
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $.when(                                                                 │
│        test(1),                                                            │
│        test(2),                                                            │
│        test(3)                                                             │
│    )                                                                       │
│    .done(function() {                                                      │
│        console.log('完了');                                                │
│    })                                                                      │
│    .fail(function() {                                                      │
│        console.log('失敗');                                                │
│    });                                                                     │
│});                                                                         │
└──────────────────────────────────────┘
みたいなのは上記でできた。

さて、「$.when()」の中にベタ書きというのはこの場合はちょっといただけない。
「$.when()」の中で、ループさせることはできないか?(できないけど)

ということで、ループを用いる方法は以下の通り。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    let ary = [];                                                           │
│    for (let i = 1; i <= 3; i++) {                                          │
│        ary.push(test(i));                                                  │
│    }                                                                       │
│    $.when.apply(null, ary)                                                 │
│    .done(function() {                                                      │
│        console.log('完了');                                                │
│    })                                                                      │
│    .fail(function() {                                                      │
│        console.log('失敗');                                                │
│    });                                                                     │
│});                                                                         │
└──────────────────────────────────────┘
一回配列にぶちこめばよい。
但し、その配列を「$.when()」の中に直接ぶちこむと
「.done()」とかが効かなくなるので「.apply()」をかますのがミソ。
分類:jQuery
jQuery/値変更でイベント発動
2022年03月04日
以下のようにチェックボックスのイベントを設定し
チェックボックスの値を変更した(チェックを入れた)場合
画面からチェックを入れた時は発動するイベントが発動せずスルーされてしまう。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $(':checkbox').on('change', function() {                                │
│        alert('イベント発動!');                                            │
│    });                                                                     │
│    $(':checkbox').prop('checked', true);                                   │
│});                                                                         │
└──────────────────────────────────────┘

これを発動させるようにするには「.change()」メソッドをつけて
イベントを能動的に実行してあげればよい。
┌──────────────────────────────────────┐
│$(function() {                                                              │
│    $(':checkbox').on('change', function() {                                │
│        alert('イベント発動!');                                            │
│    });                                                                     │
│    $(':checkbox').prop('checked', true).change();                          │
│});                                                                         │
└──────────────────────────────────────┘
分類:jQuery
MSSQL/(年と)週番号から週の開始日を求める
2022年02月24日
┌──────────────────────────────────────┐
│SELECT DATEADD([week],                                                      │
│               週番号 - 1,                                                  │
│               DATEADD([dd],                                                │
│                       1 - DATEPART([dw], DATEFROMPARTS(年, 1, 1)),         │
│                       DATEFROMPARTS(年, 1, 1))) AS [週頭日]                │
└──────────────────────────────────────┘
もっといい方法はないものか?
分類:MSSQL
ExcelVBA/シートのグループごと集計
2022年01月20日
A列とB列が複合キーでC列の値を集計したい場合のマクロ。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
├──────────────────────────────────────┤
│Public Sub 集計()                                                           │
│    Application.ScreenUpdating = False                                      │
│    Dim yMax As Long, y As Long, yKey As Long                               │
│    With ThisWorkbook.Worksheets("対象名")                                  │
│        Call ソート                                                         │
│        yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                   │
│        y = 1                                                               │
│        Do While y <= yMax                                                  │
│            yKey = y                                                        │
│            Do                                                              │
│                If y <> yKey Then                                           │
│                    .Cells(yKey, 3).Value = .Cells(yKey, 3).Value _         │
│                                          + .Cells(y, 3).Value              │
│                    .Rows(y).ClearContents                                  │
│                End If                                                      │
│                y = y + 1                                                   │
│            Loop While y <= .Rows.Count _                                   │
│                And .Cells(y, 1).Value = .Cells(yKey, 1).Value _            │
│                And .Cells(y, 2).Value = .Cells(yKey, 2).Value              │
│        Loop                                                                │
│        Call ソート                                                         │
│    End With                                                                │
│    Application.ScreenUpdating = True                                       │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub ソート()                                                        │
│    With ThisWorkbook.Worksheets("対象名")                                  │
│        With .Sort                                                          │
│            With .SortFields                                                │
│                .Clear                                                      │
│                .Add Key:=ThisWorkbook.Worksheets("対象名").Columns(1), _   │
│                     SortOn:=xlSortOnValues, _                              │
│                     Order:=xlAscending, _                                  │
│                     DataOption:=xlSortNormal                               │
│                .Add Key:=ThisWorkbook.Worksheets("対象名").Columns(2), _   │
│                     SortOn:=xlSortOnValues, _                              │
│                     Order:=xlAscending, _                                  │
│                     DataOption:=xlSortNormal                               │
│            End With                                                        │
│            .SetRange ThisWorkbook.Worksheets("対象名").Cells               │
│            .Header = xlYes                                                 │
│            .MatchCase = True                                               │
│            .Orientation = xlTopToBottom                                    │
│            .SortMethod = xlPinYin                                          │
│            .Apply                                                          │
│        End With                                                            │
│    End With                                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/マトリクス月間表
2021年11月10日
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @引数年 [int];  SET @引数年 = 2021;                             │
│    DECLARE @引数月 [int];  SET @引数月 = 11;                               │
│    -- ---------------------------------------------------------------------│
│    SET NOCOUNT ON;--EXECUTEによる参照の場合はなくても大丈夫そうだが念のため│
│    DECLARE @sql    [nvarchar](max);                                        │
│    -- ---------------------------------------------------------------------│
│    --   列(@テーブル変数)                                                  │
│    -- ---------------------------------------------------------------------│
│    DECLARE @列 table (                                                     │
│        [日付]  [date]  NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    WITH [カレンダM] AS (                                                  │
│             SELECT DATEFROMPARTS(@引数年, @引数月, 1) AS [日付]            │
│             UNION ALL                                                      │
│             SELECT DATEADD(dd, 1, [日付])             AS [日付]            │
│                 FROM [カレンダM]                                          │
│                 WHERE YEAR(DATEADD(dd, 1, [日付]))  = @引数年              │
│                   AND MONTH(DATEADD(dd, 1, [日付])) = @引数月              │
│         )                                                                  │
│    INSERT INTO @列                                                         │
│        SELECT [日付]                                                       │
│            FROM [カレンダM];                                              │
│    -- ---------------------------------------------------------------------│
│    --   行(#一時テーブル)                                                  │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行 (                                                      │
│        [キー]  [int]   NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行                                                         │
│        SELECT DISTINCT [キー]                                              │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月;                                  │
│    -- ---------------------------------------------------------------------│
│    --   行列(#一時テーブル)                                                │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行列 (                                                    │
│        [キー]  [int]   NOT NULL,                                           │
│        [日付]  [date]  NOT NULL,                                           │
│        [値]    [int]   NULL,                                               │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC,                                                    │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行列                                                       │
│        SELECT [キー],                                                      │
│               [日付],                                                      │
│               SUM([値]) AS [値]                                            │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月                                   │
│            GROUP BY [キー],                                                │
│                     [日付];                                                │
│    -- ---------------------------------------------------------------------│
│    --   明細                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql = ISNULL(@sql + ',','')                                     │
│                + '(SELECT COUNT(*)'                                        │
│                + '     FROM #行列'                                         │
│                + '     WHERE #行列.[キー] = #行.[キー]'                    │
│                + '       AND #行列.[日付] = '                              │
│                          + CHAR(39) + CONVERT([varchar], [日付]) + CHAR(39)│
│                + ') AS [' + FORMAT(DAY([日付]), '00') + ']'                │
│        FROM @列                                                            │
│        ORDER BY [日付] ASC;                                                │
│    SET @sql = 'SELECT #行.[キー],'                                         │
│             + @sql                                                         │
│             + '    FROM #行'                                               │
│             + '    ORDER BY #行.[キー] ASC;';                              │
│    EXECUTE (@sql);                                                         │
│    -- ---------------------------------------------------------------------│
│    --   一時テーブルの削除                                                 │
│    -- ---------------------------------------------------------------------│
│    DROP TABLE #行列;                                                       │
│    DROP TABLE #行;                                                         │
│GO                                                                          │
└──────────────────────────────────────┘
分類:MSSQL
Excel/図形のサイズ変更
2021年11月09日
図形の境界線をつかんでサイズを変更する際に、
以下のキーを複合するといい感じにサイズが調整される。
┌──────┬──────────────────┐
│Alt         │セルの境界線に合わせてサイズ変更    │
├──────┼──────────────────┤
│Ctrl        │中心固定でサイズ変更                │
├──────┼──────────────────┤
│Shift       │縦横比率固定でサイズ変更            │
├──────┼──────────────────┤
│Ctrl+Shift │中心固定かつ縦横比率固定でサイズ変更│
└──────┴──────────────────┘
分類:Excel
Excel/数式で「0」が表示される問題対策
2021年11月08日
空欄セルを数式で指定すると「0」が表示される問題。
┌─┬──┬──┐  ┌─┬──┬──┐
│  │ A  │ B  │  │  │ A  │ B  │
├─┼──┼──┤→├─┼──┼──┤
│ 1│    │=A1 │  │ 1│    │   0│
└─┴──┴──┘  └─┴──┴──┘
解決方法は以下の通り。

(1) B1の書式が文字列の場合  →「0」と表示されてしまう
  ┌──┬───┐
  │数式│=A1&""│
  └──┴───┘
(2) B1の書式が数値の場合  →「0」と表示されてしまう
  ┌────────┬─┐
  │書式のユーザ定義│# │
  └────────┴─┘
  これだと数値「0」が表示できなくなるが、それが嫌なら(1)+右寄せか。

(3) B1の書式が日付の場合  →「1900/1/0」と表示されてしまう
  ┌────────┬──────┐
  │書式のユーザ定義│yyyy/m/d;;; │
  └────────┴──────┘
  日付の場合、(1)だと「2021/11/8」→「44508」のように
  シリアル値表示になってしまう。
  よって、日付については書式で回避するのがよいだろう。
  ちなみに「;」が3つ並んでいて、4つのブロックに分かれているが
  それぞれ以下の条件の場合という意味になる
    (左から1番目)正数の場合  →唯一表示する
    (左から2番目)負数の場合
    (左から3番目)ゼロの場合  →空欄なので「0」を抑止している
    (左から4番目)文字列の場合
分類:Excel
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 156 次へ