愚者の経験

「また今度」はほとんどこない

時代が自分に追いついた(違)

かなり久しぶりの投稿なのにどうでもいい話

以前こんなこといってたんですが『EpicGear DeFiant』なるキーボードが去年の10月に出てました。

あとはこの「キートップ自体が入力する文字を持つ」のが常識になってキートップの差し込みの形が統一されて色んな土台(キーボード自体の形)とキートップの外装をメーカーが出してくれれば、みんな好きなようにカスタム、セレクトできて幸せになれそうです。

[CSS]ボックスの高さをページにあわせるには?

よくhtmlとbodyにheight:100%;つけて、中のボックスにmin-height:100%;をつければ~的なのがあるんですが
height:100%;ボックスの上下に別の高さを持つ要素があれば、その分の高さ+ページの高さになってしまいます…(´・ω・`)

height:100%;は親要素の高さをそのまま持つという意味ですから当たり前なのですがどちらかと言うと
「(途中から始まったとしても)画面下まで一杯の高さを持ちたい」という要望が多いと思うのです。

これをする場合はまず親要素(bodyとかのページそのものの高さを持つもの)にposition:absolute;
途中に囲むdivなどにはheight:100%;だけを指定して、下まで伸ばすボックス要素にposition:absolute;を追加、
座標起点がページ左上になるのでボックスの上にある要素の高さXXを合計してborder-top:XX solid #fff;box-sizing:border-box;height:100%;
で、下まで伸ばすためにbottom:0;を利用する

でごり押してるんですがもっといい方法ありませんかね?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>ハイト100%</title>
        <style type="text/css">
            html{height: 100%;}
            body{height: 100%;margin: 0;position: absolute;}
            #main{height: 100%;width: 800px;position: absolute;}
            #main>#tab {height: 100%;box-sizing: border-box;border-top: 70px #fff solid;}
            
            header{margin: 10px;height: 50px;position: absolute;}
            .tabradio{display: none;}
            #contents{width: 800px;display: table;height:100%;}
                        
            #sono1lbl{background: #ffbf7f;}
            #sono1_cont{border-color: #ffbf7f;}
            #sono2lbl{background: #ffff7f;}
            #sono2_cont{border-color: #ffff7f;}
            #sono3lbl{background: #7fff7f;}
            #sono3_cont{border-color: #7fff7f;}
            #sono4lbl{background: #7fbfff;}
            #sono4_cont{border-color: #7fbfff;}
            #sono5lbl{background: #ff7fff;}
            #sono5_cont{border-color: #ff7fff;}
                        
            .tabpage{display: none;position:absolute;top: 150px;left:0;bottom: 0;right: 0;width: 120%;box-sizing:border-box;border-width: 3px;border-style:solid;font-size: 20px;}
            #sono1:checked+#sono1_cont{display:block;}
            #sono2:checked+#sono2_cont{display:block;}
            #sono3:checked+#sono3_cont{display:block;}
            #sono4:checked+#sono4_cont{display:block;}
            #sono5:checked+#sono5_cont{display:block;}
            
            #tab{width: 100%;font-size:0;height:100%;}
            .tabindex{display:inline-block;font-size:20px; width: 20%;height: 80px;text-align: center;border:#a5a5a5 1px solid;box-sizing:border-box;padding-top:25px;}
        </style>
    </head>
    <body>
        <div id="main">
            <header>
                <h1>ハイト100%テスト</h1>
            </header>
            <div id="tab">
                <label id="sono1lbl" for="sono1" class="tabindex">その1</label>
                <input id="sono1" type="radio" name="nav" class="tabradio" checked>
                <div id="sono1_cont" class="tabpage">その1</div>
                <label id="sono2lbl" for="sono2" class="tabindex">その2</label>
                <input id="sono2" type="radio" name="nav" class="tabradio">
                <div id="sono2_cont" class="tabpage">その2</div>
                <label id="sono3lbl" for="sono3" class="tabindex">その3</label>
                <input id="sono3" type="radio" name="nav" class="tabradio">
                <div id="sono3_cont" class="tabpage">その3</div>
                <label id="sono4lbl" for="sono4" class="tabindex">その4</label>
                <input id="sono4" type="radio" name="nav" class="tabradio">
                <div id="sono4_cont" class="tabpage">その4</div>
                <label id="sono5lbl" for="sono5" class="tabindex">その5</label>
                <input id="sono5" type="radio" name="nav" class="tabradio">
                <div id="sono5_cont" class="tabpage">その5</div>
             </div>
        </div>
    </body>
</html>

半年振り…node.js少し始めました

最近Access関係で書くことなかったので放置気味でしたが、訳あってAndroidタブレットでアプリを作ろうと思いたち自分のネイティブアプリを作る知識は皆無なので比較的知識のあるwebでやってみることになりました。

しばらく自分の備忘録としてこのネタでブログを書いていきますのでよろしくお願いします。

こんなキーボードないかなぁ…。

ブログネタがない…。

ということで今回は趣向を変えてパソコンの周辺機器について。
私はトラックボールマウスが結構好きなんですが、使うたびに「これキーボードに付いてるのないかなぁ」と思います。
少し昔にあったようですがほぼ全滅してますね…。会社ではロジクールさんのG700使ってますがこういうのも大好きです。
キーボードのホームポジション(っていうんだっけ?)から手を動かしたくないんですよね…。

「キートップそのもの」に文字入力基板(?)があって、キーボードの土台と完全に分離できたらな~と思ってます。
キートップの配置場所(キーピッチ)や形状(はやりのエルゴノミクスデザインとか)を土台で選択し、
キーの色や形状、高さ、おした時の硬さ等ををそれぞれ選ぶことでかなり広い範囲でカスタマイズ出来る
キーボードが出来る気がするんですが…。その中にトラックボールのパーツもあったらなおいいですね~。

[Access][SQL Server]パススルークエリで「レコードが大きすぎます」のエラー

ODBCでパススルークエリ書いていると突然発生…。
どうやら文字列型のフィールドでの合計文字列数に上限があるみたいです。レコード長2000バイトみたいですね。
メモ型にするとこの制約から外れる(合計文字列数に含まれなくなる)んですが、パススルークエリって適当に型変換してますよね?

でもとりあえずnvarchar(max)にcastすればメモ型として見てくれる模様。
ODBCは意外な場所に落とし穴があって大変です。

[SQL Server][Access]日時のフィールドで苦労した話

Accessで時刻を入力するのは若干面倒くさい。最終的に使いたい項目が日時だとしても
「日付」と「時刻」の別にフィールドを設けることが多いです。以下長文ごめんなさい。

テキストを1つにすると日付だけ既定値で入れられることが出来たとしても
時刻を続けて入力するにはキャレットを移動させるしかなく、F2キーやマウスをクリックしたり矢印キーを
使用するのを避けられないのが主な理由です。(テキスト毎にEnterイベントでSelStart入れればそんなもんですがそれもちょっと…)
他の理由としては自前のカレンダーや時刻の入力フォームが別にある場合該当のテキストへの入力が複雑になるということもあります。

さらに大きな問題としてOSの時刻の表示が「H:mm」になっているせいで定型入力が「00:00」系で例えば「09:00」
と入力しても再表示時に「9:00」となって、フォーカスすると「9_:00」となって出るときにエラーになって安定しなかったり、
時刻に24時以上を打ち込みたい場合はどうしようもないという理由で最近は時刻は文字列型にしています。
(エラーの方に関しては私が体験したもので必ずでるというわけではないです。今やってみても再現出来ない…。)

そんなこんなでフィールドを2つに割ったとして今度は利用する際に毎回「[日付]+cdate(nz([時刻],”00:00″))=……」とか
しなければいけなくなるのですが、SQLServerを利用している場合は「計算列」という機能があるので
これを使うんですがちょっと問題があります。

24時以上を入力しない場合は計算列の数式に「[日付]+cast(isnull([時刻],’00:00′) as datetime)」とやればいいんですが
「列’xxxx’の数式を検証中にエラーが発生しました。変更を取り消しますか?」と言われてしまいます。
うーんあってるはずなのに…多少書き方を変えても同じです。
どうすればいいかというと上記警告を無視して(上記ダイアログを[いいえ]で突破する)、テーブルの保存時にも似たようなことを
警告されますが再度無視し、テーブルを見ると…ちゃんと出来てますorz
この時castで書いたはずの型変換はconvert(datetime,isnull([時刻],’00:00′))に書き換わっていました。
これで書けばいいのか~とconvertで書いてもやっぱりエラー笑

「悩みまくったのは一体何だったんだ」と思いました。インデックス貼るまでは。
続いてアプリがこなれて仕様も固まってきた頃、速度改善のためにインデックスを作成しようと思って
上記の計算列を選ぶと「インデックスの作成に失敗しました」という趣旨のエラー発生。
「あ~計算列はインデックスキー列に含めないのね」と勝手に思って仕方なく付加列に追加…
出来ません!再度エラーが出ます。
なんで?と思って調べたら、以下の情報がヒット
https://msdn.microsoft.com/ja-jp/library/ms189292.aspx
「決定的」であるかどうかが重要で文字列型を日付にconvertする時は値が決定的になる第三引数が必要だそうです。
なので「convert(datetime,isnull([時刻],’00:00′),108)」とすると保存時にエラーは出ますが、インデックスは使えるようになりました。

うーん。言いたいことは分かるんですがエラー出るのは気持ち悪い。とりあえず24時対応しましたところ
(([日付]+CONVERT([int],left(isnull([時刻],’00:00′),(2)))/(24))+CONVERT([datetime],(CONVERT([varchar](2),CONVERT([int],left(isnull([時刻],’00:00′),(2)))%(24))+’:’)+right(isnull([時刻],’00:00′),(2)),(108)))
これだとエラー出ないんですよね…不思議。

[Office 2013][Access]Access2013の計算値が表示されなくなる現象

Access2013なんですが、たまにおかしい現象が出ます。
・コントロールソースに計算を入れているテキストボックスの表示が表示されなくなる
・サブフォームコントロールの親リンクフィールド、子リンクフィールドが機能せず何も表示されなくなる
主にこの2つです。
またたまに「コントロールをクリックすると表示される」という状態になることもあります。
私が知るかぎりこれはかなり厳しい状況で、すぐ思いつくことをしても大体直りません…
・最適化/修復
・デコンパイル
・PC再起動

現状戻せている方法は「システムの復元」とAccessのバージョン切り替え(Accessを複数バージョンインストールしている場合のみ)です。
おそらくAccessを再インストールしても直るでしょう…また修復で直るかは未確認ですが
クライアントのPCでしていただくにはあまりにも重すぎます…orz

試しに同じプログラムをAccess2010で動かすとちゃんと表示されるので
ファイルが壊れているとかプログラムが間違っているということではありません。
WindowsUpdateも自動で当てているPCだったのでおそらくAccess自体も最新だと思います。

当初WindowsUpdateでなにか変わったのかと思ったのですが復元先のチェックポイントまでに
「自動復元ポイント」しかなかったとしても、それで直るパターンがありました。
なのでシステムに影響があって変わったというわけでもなく、突然上記の症状になるということになります。

OSはWindows7とWindows8.1の両方で発生したことを確認しています。

この方も多分同じ症状だと思います…よく見たらこの方はAccessの修復をされたみたいですね。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11125283376

あんまりこんなこと言いたくないんですが、Micr○softさんなんとかしてください、お願いします。…m(__)m

2015-1-23 追記
「[ハードウェアのグラフィック アクセラレータを無効にする] のチェックを外す」が効くかもしれません(未確認)
アンインストールする前に確認出来た方いらっしゃれば教えていただければ。
ただ、これVBAで設定する方法がわからない…VBAでレジストリいじるの入れようかな。

さらに追記
Access2010sp2でも発生…サブフォーム内のテキストボックスのコントロールソースに「=[コンボボックス名].column(1)」とか
書いてあるのも空白になっていました。もちろん合計欄見えず、親子リンク動かず。
動くPCと動かないPCが出るのでファイルサーバーのせいではなさそう。クライアントOSは全てWindows8.1 pro 64bitで
PCを再起動しても直らず、Accessを修復すると直りました。しかしサーバは開発用にAccess2013がインストールされているのですが
Access2013を修復しても現象は直りませんでした。クイック、オンライン両方でダメです。

原因が不明で再現性もなく、まったくわかりません…異常が発生したPCのプログラムとサーバのデータを持って帰り
Windows 7のAccess2013で動かしてみましたが再現せず、Windows 8.1のAccess2010で動かして見ても再現せず。
一体どうすればいいのやら。

[Access][ODBC][VBA]RefreshLinkとリンクテーブルマネージャでの再リンク

同じことやっているんだろう…そう思っていた時期が私にもありました。
Viewに適用するとRefreshLinkは主キーの擬似インデックスが外れますが、リンクテーブルマネージャは
外れません。なぜでしょう…これのせいでRefreshLinkがかなり使いづらいです。

[Access][VBA]Accessの開発方法考察(模索中)

・単純かつ頻繁に出るコードは標準モジュールのPublic Functionに集める
フォームのオープン、クローズ
コンボボックスのカラム値を代入
リストボックスを複数選択した場合の値を連結
Tempvarsに値を代入
リボンの表示非表示切り替え
RGBを6桁で入力する
・ODBCでパススルークエリを使う場合はなるべくパススルークエリを直接
 フォームのレコードソースにせずにワークテーブルを利用する
(私が知らないだけかもしれないが)パススルークエリで行を最新に更新する場合
Requeryでパススルークエリの対象行全てを問い合わせるしかないため。
面倒だがトラフィックを考慮し、ワークテーブルに対して別のパススルークエリで
更新対象行のUpdate(またはDeleteとInsert)を行ってフォームのレコードを更新する。
パススルークエリが1行しか表示しない場合などはそのままでいいと思います。

[SQL Server][SQL][Tips]pivotを使ってAccessのクロス集計クエリっぽいことをする2

前回の続きというか応用

テーブル用意(前回と同じです)
pivott

Q.「いやね、金額と個数の両方合計してだしてくれない?」とか言われたらどうしますか?
A.イラッとする
見てのとおりpivotでは集計項目は1つしか選べません。なので同じデータを2回selectして
項目を変えればもちろん取得出来ます。

	select Y.*
		,(select top 1 A.売上先名称 from dbo.mtbl_売上先 as A where A.売上先ID=Y.売上先ID) as 売上先名称
	from (
		select A.売上先ID,B.商品名称,sum(A.金額) as 金額計
		from dbo.tbl_売上明細 as A
			inner join dbo.mtbl_商品 as B on B.商品ID=A.商品ID
			left join dbo.mtbl_商品分類 as C on C.分類ID=B.分類ID
		group by A.売上先ID,C.分類名称,B.商品名称
	) as X
	pivot (
		max(X.金額計) for X.商品名称 in 
			(みかん,りんご,トマト,きゅうり)
	) as Y

	select Y.*
		,(select top 1 A.売上先名称 from dbo.mtbl_売上先 as A where A.売上先ID=Y.売上先ID) as 売上先名称
	from (
		select A.売上先ID,B.商品名称,sum(A.個数) as 個数計--変更部分
		from dbo.tbl_売上明細 as A
			inner join dbo.mtbl_商品 as B on B.商品ID=A.商品ID
			left join dbo.mtbl_商品分類 as C on C.分類ID=B.分類ID
		group by A.売上先ID,C.分類名称,B.商品名称
	) as X
	pivot (
		max(X.個数計) for X.商品名称 in 
			(みかん,りんご,トマト,きゅうり)
	) as Y

あとは2つのビューを「inner join」なり「union all」なりすればいいのですが
「selectのコスト重すぎ…2回もできない…」という方、「inner join」を使う代わりにこんな方法もあります。

	select Y.*
	from (
                -- ※※※※※※※※※※※※
		select D.売上先ID
			,D.商品名称+E.Col as Col,E.Val
		from (
			select A.売上先ID,B.商品名称,sum(A.個数) as 個数計,sum(A.金額) as 金額計
			from dbo.tbl_売上明細 as A
				inner join dbo.mtbl_商品 as B on B.商品ID=A.商品ID
				left join dbo.mtbl_商品分類 as C on C.分類ID=B.分類ID
			group by A.売上先ID,C.分類名称,B.商品名称
		) as D
			cross apply (
				select '個数',D.個数計 union all
				select '金額',D.金額計
			) as E (Col,Val)
                -- ※※※※※※※※※※※※
	) as X
	pivot (
		max(X.Val) for X.Col in
			(みかん個数,りんご個数,トマト個数,きゅうり個数
			,みかん金額,りんご金額,トマト金額,きゅうり金額)
	) as Y

なんじゃこりゃぁ…とか思いますが私も最初はそうでした(笑)当然(?)ミソはcross applyの部分です。
この部分で「項目名」と「値」のセットをそれぞれunionします。
今回の場合、集計項目が「個数」と「金額」ですので、
項目名に’個数’というリテラル文字、値に「個数計=sum(個数)」
項目名に’金額’というリテラル文字、値に「金額計=sum(金額)」
となりこれらをunionし、cross applyします。

この時点でどうなっているかというと※の間のselectを実行すればわかりますが
売上先ID、Col、Val
10、りんご個数、sum(個数)
10、りんご金額、sum(金額)

というような形になって一行のデータを個数と金額の2行に分けています。
あとはpivotで(みかん,りんご,トマト,きゅうり)だったのを
(みかん個数,りんご個数,トマト個数,きゅうり個数,みかん金額,りんご金額,トマト金額,きゅうり金額)に
変更して値を集めているというわけです。機会があったらぜひ利用してみてください。

参考URL:http://stackoverflow.com/questions/18662012/sql-server-pivot-on-multiple-columns