Accessでグループ毎の連番を振る

Accessでグループ分けされているデータがあり、それらのグループごとに連番を振りたいとき。

f:id:rolling_panda:20150915082657p:plain


このテーブルに、Group1に1,2,3,…、Group2に1,2,3,…と連番を振る。

そういう時に、DCount関数を使って以下のようにするといいらしいです。

DCount("*","【テーブル名】","【ID】 <=" & [【ID】] & "and 【グループ名】=" & [【グループ名】])

詳細は以下の通り。

【テーブル名】振りたい連番があるテーブル名。

【ID】そのテーブルの主キーとなるフィールド。

【グループ名】グループ連番の親となるグループのフィールド名。




このようなクエリになります。

DCount("*","test","ID <=" & [ID] & "and Group=" & [Group])

あとは更新クエリで、G連番をこのクエリで更新するだけです。

ただし、グループが文字列などの場合はこのクエリは使えないので、数字に置き換えておくなどしましょう。

f:id:rolling_panda:20150915082736p:plain

 

 

こんな感じに一気に割り振ってくれます。

 

f:id:rolling_panda:20150915082807p:plain

既存のグループ連番に追加したい場合は、グループごとの連番の最大値を集計クエリで計算してフィールドに入れておいて、その最大値+新しい連番の値を入れていけます。

グループごとの最大値をとったテーブルを作って、その値を元のテーブルに反映させるとか。他にも良い方法はありそうですが。

プログラムを組んだ方が色々融通も利きそうですが、クエリひとつでもできるので単純なテーブル構造のときに。

F#で魔法陣問題

F#を初めて学ぶため、魔法陣問題に取り組みました。

先にC#でプログラムを組み、それをF#で同じように書くという手順。

 

作った関数

C#で作った関数は以下の3つ。

jun:順列を作る再帰関数
isValidCombination:配列が魔法陣の条件を満たすか
displayList:配列の中身の表示

関数名がひどいですが、自分の力量に合ったレベルの名前なのでよしとします。

junで順列を作っていき、isValidCombinationで条件を満たしていれば、displayListで中身を表示といった流れです。

これをF#で同じように書く、という手順でやりました。



その中で、isValidCombinationの部分。

C#では、

return
    numList[0] + numList[1] + numList[2] == 15 &&
    numList[3] + numList[4] + numList[5] == 15 &&
    numList[6] + numList[7] + numList[8] == 15 &&
...
    numList[2] + numList[4] + numList[6] == 15;

といった感じでtrue/falseを返していたのですが(これもだいぶひどい)、それがF#だとこんなかんじに。

module valid =
    let isValidCombination =
        if (numberList.[0] + numberList.[1] + numberList.[2] = 15 &&
            numberList.[3] + numberList.[4] + numberList.[5] = 15 &&
            numberList.[6] + numberList.[7] + numberList.[8] = 15 &&
            numberList.[0] + numberList.[3] + numberList.[6] = 15 &&
            numberList.[1] + numberList.[4] + numberList.[7] = 15 &&
            numberList.[2] + numberList.[5] + numberList.[8] = 15 &&
            numberList.[0] + numberList.[4] + numberList.[8] = 15 &&
            numberList.[2] + numberList.[4] + numberList.[6] = 15) then
                true
        else
                
                false

F#だとreturnとかがないので、いまいちどれを返すのかがよくわからない。

そして全体を書き上げて実行しても一向に終わる気配がなく、何も表示されないコンソールが残るのみ。

ビルド時のエラーも表示されず、しばらく途方に暮れていたわけですが、よく見るとこれが原因でした。

    let isValidCombination =

括弧抜けてるだけ。

でも括弧の有無だけで全然結果が違う。





ということで、非常に初歩的なミスでした。

ただ、結局F#の関数の返り値の書き方もよく分からないままなので、そのあたりも調べておきたいですね。