SQLServer覚書 縦→横 (FOR XML)

SQLServerで縦並びになっているデータを横並び(カンマ区切り)にして出力したくなった。

【TABLE1】
CD | KOMOKU
1 | A
1 | B
2 | C
2 | D
【TABLE2】
CD | CNAME
1 | あ
2 | い

ってあった場合、

CD | CNAME | KOMOKU
1 | あ | A,B
2 | い | C,D

って出したい!ってことで、調べた結果、

select 
 TABLE2.*
 ,replace((select KOMOKU  AS [data()] 
 from TABLE1
 where (TABLE1.CD=TABLE2.CD)
 for xml path('')
 ),' ',',') AS KOMOKU
 from TABLE2

ってな感じに記述するとのこと。
KOMOKUにスペースが含まれているとこれってうまくいかないんだよねぇ・・・とか思いつつ、自分の場合は特に問題なかったのでOK。
[data()] ってのがアトミック値にするっていうことらしいがよくわからんかった。
(分解できないとか、処理速度が速いとか書いてあったけど、結局よくわからん・・・)

ExcelVBA覚書 ファイル起動

ExcelVBAでファイルを起動する方法。
Excelのブックとかでなく、JpegとかTextファイルとかを起動したい場合の記載方法。
(これでやれば、ファイルなら既定のアプリでファイルを開いてくれる)

CreateObject("Wscript.Shell").Run

参考URL
1) 別のやり方も載ってる
moug ExcelVBA 他アプリを起動する

2) 引数について詳しいのはこっち
VBScript Tips & サンプル プログラムを実行する、ファイルやフォルダを開く

一夢庵風流記 前田慶次/My Dream TAKARAZUKA

さてもさても、JCB貸切でござる。

キューピー
キューピー

退団公演だからチケットとれなさそうだしなぁと観る気なかったのだが、ポスター見たらなんか面白そうだったので、イソイソとチケットを取った。
初めての2階席で、しかも殆んどAかBだろう!!!と文句を言いたくなるS席だったが、2階からの眺めはそこそこ良かった。

今回のは芝居がよかったな。(前田慶次が?それとも馬が?)
前田慶次=壮一帆がピッタシくるところはもちろんなんだけど、今の組の状態が非常にバランスが取れていて、そのことがよくわかる芝居だったのだ。
落下傘トップというのは疑問視されることが多いのだが、力量があればすごくいい組を作れるものだなぁと実感した。
(ここ最近のトップだと、むしろ落下傘のほうがいい仕事をしているように思える。)
なんか、トップが辞めてこのバランスが崩れてしまうことが惜しい気がするけれど、これが宝塚の良さでまた新しい風が吹くのさ・・・
(と、感慨深げに花の道を歩いて帰る)
もうちょっと男女の絡みがあってもよかった気がするけど、まぁ時間的にこんなもんかな、とも思う。

で、ショー。
また「TAKARAZUKA」ってついてるから、もういいよ自画自賛オンパレードは・・・って思ってたけど、全然違ったのでよかった。
私は退団公演ってのは初めて生で観るんだけど、なんだか、これはファンでない、よくわかってない自分でもウルっときちゃうな。
ただ、もうちょっとしんみり、ってかしっとりした場面があってもよかったんじゃないかって思う。
結局盛り上がって場面終了!みたいなものばかりで、ちょっとウザい。
でも、正直、フィナーレだけで十分元は取れたな。
あのフィナーレ見るために、DVD買ってもいいなぁって思った。

そういえば、Shall We ダンス?のDVDは買ったのだが、ちょっと物足りないね。
生があんだけよかったのに、DVDは・・・ってちょっと残念だった。
DVDの編集の仕方とか変えるだけで、もっと売れそうに思うんだけどどうだろうか。

Excel VBA覚書 ファイルの所有者を取得する

このブログのアクセスって明らかに平日が多い。
記載した技術情報が役に立ってくれれば幸いなのだが・・・

さて、ファイルの所有者ってとってこれんのか?って話。
とってこれるみたい。

Kameya blog「VBScriptでフォルダ・ファイルの所有者の確認を行う」を参考に、ExcelVBAで作成してみた。

'-----------------------------------------------------
' ファイルの所有者を取得する
' 引数 :ファイルパス(File Only)
'-----------------------------------------------------
Private Function GetOwner(fpath As String) As String
    
    Dim WMIService  As Object
    Dim objSet      As Object
    Dim obj         As Object
    Dim buf         As String
    
    'ちゃんと渡してよ!って抜ける
    If Len(fpath) = 0 Then Exit Function
    
    Set WMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    
    buf = ""
    
    'TODO 本当はちゃんとエスケープしないとダメ
    Set objSet = WMIService.ExecQuery("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" _
                                    & Replace(fpath, "\", "\\") _
                                    & "'} WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    For Each obj In objSet
        buf = buf & obj.AccountName & ","
    Next
    If Len(buf) > 0 Then
        GetOwner = Left(buf, Len(buf) - 1)
    End If
    
    Set obj = Nothing
    Set objSet = Nothing
    Set WMIService = Nothing

End Function

参照したサイトだと記載されていなかったのだが、¥マークは二重にしないといけない。
(常識?いや、CとかC++とかC#とか・・・ならともかく、VB書いてるときは頭がBasicモードになってしまい、忘れてしまうのだ。)
フォルダの所有者を確認するときは、WHERE句が変わるはず。

ドラマ「ルーズベルトゲーム」

視聴率は半沢越えできないかもしれないが、観ていなかったら後悔するかもねって思い始めた。

半沢は大阪編と東京編が似たような話だったので、「またか・・・」みたいなところもあったし、半沢って、そんないいやつか?って気もしてたので、「勧善懲悪」なのがよい!っていう人の意見には少々違和感を感じてたのだよ、私は。
だってさ、はじめのうちはしおらしくしてて、勝ち目があると踏んだと途端「おい!てめぇ!!!」みたいな感じだったから、なんか豹変しすぎだろぉ・・・って思ったのだよ。

今回のも、なんか似たような感じなんだけど、
群雄割拠で「どうやって生き残るか!」みたいなところがあって、そういう意味で戦国時代好きとかには面白いと思うのだよ。

ということで、そろそろ視聴率が上がってくるんではなかろうかと期待する。
(まぁ視聴率なんて無意味なもんで縛られてほしくないんだけどね)

Struts2 ForとかDoとかWhileとか・・・

まぁとりあえず、ぐるぐる回したいときね。

あるんですよ。

鍵のついたキーホルダーの端っこを指にはめ込んで、鍵をぐるぐる意味もなく回したりね。

いや、そんな話でなくて・・・iterator

ソフトウェア技術ドキュメントを勝手に翻訳 iterator

ex) 1,2,3,4,5と順に・・・

<s:iterator status=”stat” value=”{1,2,3,4,5}” >

これなんかは、{1,3,6,10} とか括弧の中身を変えてしまうと、また違った使い方ができる。

ex) とりあえず5回

<s:iterator status=”stat” value=”(5).{ #this }” >

(5)ってところを変数つかって(data_max)とかできちゃうよね。

って、forつくりゃいいじゃんか!って思うんだけどね。
まぁ、人それぞれ、言語もそれぞれってことです。

SQLServer覚書 Excel→DB

Excelのデータを1行ずつ挿入していくのが面倒なので、シートまるっとINSERTをやってみた。

引数は以下の通り
workbook_path:元データのブック
sheet_name:workbook_pathのどのシートを元データとするのか指定
db_src:DBの場所
db_name:DBの名前
login_id:DBのユーザID
login_pw:DBのユーザパスワード
table_name:DBのどのテーブルを操作するのか(ここではデータの投入先)

Private Function ExportFromXLSX(workbook_path as String,sheet_name as String, db_src as String, db_name as String,login_id as String, login_pw as String, table_name as String) As Boolean

	Dim cn as ADODB.Connection
	Dim recs_aff as Long

	On Error Goto ErrFunc
	
	Set cn = New ADODB.Connection

	'2007バージョンのExcelファイルを開く
	cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & workbook_path & ";" & _
	        "Extended Properties=Excel 12.0"

	'Jetプロバイダを使用してインポート
	sql = "INSERT INTO [odbc;Driver={SQL Server};" & _
						"Server=" & db_src & ";" _ 
						& "Database=" & db_name & ";"  _
						& "UID=" & login_id  _
						& "PWD=" & login_pw _
						& "]." & table_name _
						& " SELECT * FROM [" & sheet_name & "$]"
	    
	cn.Execute sql, recs_aff, adExecuteNoRecords
	cn.Close
	Set cn = Nothing

	ExportFromXLSX = True
	Exit Function
	
ErrFunc:
	
	'エラーメッセージ表示
	' ---- (省略) ----
	
	If Not cn Is Nothing Then
		If cn.State=1 Then cn.Close
		Set cn = Nothing
	End If
	
End Function

こんなことやらなきゃいけないのは、SQLServer側からExcelシートの内容をとってこようとしたときに、分散クエリほにゃほにゃ・・・というエラーが出てしまったからなのだ。
なのでExcelシートから、SQLServer側に送るイメージ。

電子レンジを買った

汚くなった電子レンジを買い替えることにした。
買って10年近くなるし、消費税が8%に上がる前に・・・と思ったのだ。

冷凍食品や弁当の温め直しぐらいしか使わないので、オーブン機能とかいらないのだが、でも横開きじゃなくて前開きがほしいのだ。
とすると、もう限られたものしかなく、結局パナの23Lに目星をつけていた。

が、3月にヨドバシカメラに行ったら、価格.comの最低価格(1月)より欲しい電子レンジは10%以上値上がりしてた。
2月に私がヨドバシに行った時よりも、2000円ほど上がっていたのだ。

価格.comで見たら、1.8万円台の電子レンジが、3月下旬にヨドバシに行ったら2.2万ぐらいで、ポイント還元しても高いことは明白。
ただ、前のやつを粗大ごみに出してしまったので、早く替えがほしかった。

で、4月もいつ下がるのかと、梅田に出るたびに、ちょこちょこ覗いていたのだが、大して下がらず、とうとう5月。
その間もAmazonで毎日確認し、5月に入ると、1日100円ぐらい下がり始め、ようやく1.9万円台になってきた。
で、もうあまり下がりそうもないので、買うことにした。
おそらく、8月ぐらいには新しいタイプが出るのだろうが、それまで待てないし!ということで買った。

電子レンジが届いた。

前のもパナだったけど、操作感がいまいち違うので、ちょっと戸惑ってしまったが、温めるだけなので、まぁさしたることではない。

ようやく電子レンジで、冷凍食品&簡易調理ライフに戻れるので、ちょっとウキウキである。

Excel覚書 結合セルとの格闘

今日は昨日やったことの続きをやろうと思っていたら、昨日作ったロジックがどうも思い通りに動いていない。

検索絡みだ。

Find関数を使って、セル範囲内の値検索をしたかったのだが、同値のセルを検索してくれないとキタ。
Find(…) → FindeNext() を最初のセル、または戻り値がNothingになるまで繰り返すのだが、どうもうまくいかない。

で、結合セルが含まれているせいで、検索がうまくいかないのかと、結合セルをすべて解除させたシートを一つ作って、Ctrl+Fで検索してみたのだが、やはりうまくいかなかった。

Ctrl+Fの検索ダイアログでうまくいかないものをマクロでうまくいかそうなどというのは、無駄な抵抗なので、もう行列全体を1つ1つ当たっていくことにした。

With Worksheets(xx)
    For c=1 to 100 Step 1
      For r=1 to 100 Step 1
        If Cstr(.Cells(r,c).Value) = CheckText Then
                  ''' ここに処理 '''
            End If
            ''' ここに下の結合セルのMax行数抽出のサンプル挿入 '''
      Next r
    Next c
End With

こんな感じに1セルずつ当たっていくわけ。なんとも、面倒な話だが、仕方がない。

しかし、対象セル範囲の中に結合セルがあるので、厄介だ。
というより、結合されている場合は、先頭のセルだけ確認すればよいわけで、検索時間を短縮できると考えた。

下の「結合セルのMax行数抽出のサンプル」は縦結合しかされていないので、横結合の場合はまた変わってくるわけだが・・・

    Dim rng As Range   '確認対象セルを設定すること
    If Not rng.MergeCells Then
        '結合されていない場合
        min_row = rng.Row
        max_row = rng.Row
    Else
        '結合されている場合
        min_row = rng.MergeArea.Cells(1, 1).Row
        max_row = SearchMergeRowMin + rng.MergeArea.Rows.Count - 1
    End If

次に確認するセルは、同じ列の max_row+1 となる。

Excelオセェ~と思ってしまう事象について

現在仕事でExcel2010を使っているのだが、会社のサーバにあるドキュメントなんぞを開けようものなら、

ダウンロード中・・・

みたいなメッセージが出て、もう異様に遅い。

ってなことで、ググってみた。
そうすると、信頼できる場所にしたら、マシになるかもね!なんて話が。

Microsoft Officeサポート:信頼できる場所を追加、削除、変更する

さっそくやってみたさ。

って、ネットワーク上のフォルダが指定できひんやないかい!!!

ほな、あとは、

[レジストリ エディター] で、次のレジストリを見つけます。
※ レジストリが見つからない場合、手順 “4.” 以降は実施する必要はありません。
HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\11.0\Excel\Security\FileValidation
“EnableOnLoad” をダブル クリックし、値のデータに 1 を設定し [OK] をクリックします。
[ファイル]-[レジストリ エディタの終了] をクリックします。

出典:http://support.microsoft.com/kb/2575312/ja

のあたりを見ていくしかないですなぁ・・・

VAIO TAP11 ワイアレスキーボード

1、2か月ほど前、キーボードの充電が全然できてなくて、仕事が進まなかった。
メールとかはスクリーンキーボードでとりあえず済ましたのだが、やはり、プログラミングをスクリーンキーボードでやるのは狂気の沙汰。

で、修理に出した。

なんか、本体側のボードがおかしくなったらしくて取り替えてくれたらしい。

で、キーボードの充電はできるようになった。

よかった!と思ったけど、今度は充電が全然できてない。
2時間ちょこちょこと作業していただけで、もう切れた・・・

おまけに、本体と引っ付けなきゃ充電ができないから、仕事できないは、遊べないは・・・

こんなもん売ってるから、事業売らなきゃいけなくなるんだよぉ~

もう一回、修理に出してやろうか・・・

梅田GWのはじまり

グランフロント2014GW
グランフロント2014GW

GWが始まった。
といっても、カレンダー通りに出勤すると、あまりGWっぽくないのが今年。

今日の目当ては2つ。
1つは、阪神百貨店で開催されている猫フェス。
猫をモチーフにした作品で埋め尽くされるので、猫&手作りのフリマみたいなところだろうか。
毎年行っているので今年も行くことに。
2つ目は、今度は阪急百貨店でやっているディズニーのイベント。
こちらは阪神のカードでただで入れるので、これも行くことに。
あとは、惰性だけど、ヨドバシとグランフロント。
グランフロントは1周年なので、なにかやっている筈。

で、阪急・阪神はいつも通り見て回って、いつも通りちょこちょこと買って、ドバっと食べものを見繕って終了。

次はヨドバシ。
部屋の無線ルータが機能してなかったので、やばい!と思って、プラネックスの安いのを(っていっても6000円以上したのだが)買っておく。
(家に帰ったら、無線ルータが問題なく動いていたので、無駄な買い物だった・・・)

そして、グランフロント。
昼ごはん代わりに、初めて一番搾りのフローズンを飲む。
あと、ウィンナーのセットを買って貪り食らう。
ウィンナーは結構な値段だが、やはりビールとウィンナー(ソーセージ)は友達!なのだ。
次回はぜひツートンのカクテルのほうを飲もう。

一番搾り一番ガーデンメニュー
一番搾り一番ガーデンメニュー

一番ビヤガーデン
一番ビヤガーデン

十分酔っ払いになったところで、グランフロントの内部に入り、上の階に上がってみる。
まずはGAPだ。40%OFFってメールが届いたので、ちら見ぐらいで終わらせようかと思ったが、ついついあれやこれやと手が伸びて、結局8000円強ほど買ってしまった。
1万円以上買えばスープ皿がもらえたらしいが、もういいや。

さぁ、どんどん上層階へ上がっていく。
奈良県の観光案内ブースになっていたところに、ゆるきゃらがいたので、思わず写真を撮ってみる。

しかまろくん
しかまろくん

かわいいのぉ・・・・・・
最近奈良に行っていないから、今年は行くか!

あとは、いろいろLabo.が開かれていて、いろんな体験できて面白かった。
大人一人でも十分楽しめたので、子供を連れて行けば、一緒に勉強できてもっと楽しいだろう。

コカコーラのラベルに自分の名前を入れることができるよぉ!ってなところも行こうと思ったけど、そもそもスーパーで100円未満で売っているものに150円払って、ラベルに自分の名前が入って、だからなんなのだ?と思ったら、1時間も待ってまで行くこともなかろうとやめた。
実際にやってもらった人も、ちゃっちいって言ってたし。
空いてたら150円払うけどね。

と、そんなところでグランフロントでの買い物は終わった。

ARASHI宣伝カー
ARASHI宣伝カー

大阪のオバハンにまでうるさがられていた嵐の宣伝トレーラー。

Win覚書 Explorer起動時の参照先フォルダ

WindowsXPからWindows7に変えていろいろムカつくことがある。

その1つは、Explorerを立ち上げた時に、お気に入りだのマイドキュメントだのが、どで~んと拡がること。

あのね、そんなところにファイル置きませんから。

まったく、余計なことしやがって・・・

ということで、起動時に拡げたいフォルダをDドライブのほうにしてやる。

Explorerのプロパティを開いて、explorer.exe の後ろにほにゃほにゃと追加
%windir%\explorer.exe /e, /n, D:\
適用させて、Explorerを立ち上げれば、Dドライブが見えて、他は縮んだままになってる。

おせっかいはほどほどにしてほしいものだ。

大航海時代V マンネリ化の機運

さて、15年ぶりという鳴物入り的な状況でリリースされ、
リリース開始からいきなり緊急メンテに入ったという、暗黒史の1ページを気づいてしまった大航海時代V。

今のところ、私のWindowsでは、FirefoxとOperaで問題なく動いている。
よかったよかった。

だが、クエストがいつも同じようなものばかりでマンネリ化。
外伝は海図がないと続きができないけど、どこで海図がみつかるのかさっぱりわからんし、困った困った。

という、暗黒史第2幕を迎えているような気配の大航海時代Vを中継でお伝えしました。
ニュースセンターへお返しします。(いやいや)

私が好きなのはVer2なのだ。
あれって職業選べるというか、交易メインとか、戦闘メインとかのキャラを選べるし、シナリオもよかったし、楽にできたから好き。
もう1回やりたいけど、PC版もう売ってないんだねぇ。

そして、大航海時代最強はやはり、Ver3。
なんせ、子供まで作っちゃえるんだから、そりゃ最強でしょう。

ただ、Ver3が凄すぎたせいで、もうVer4とかだと絵はきれいだけど、退屈。
シナリオっていっても、Ver2で妹との再会を果たした後だから、退屈。
って感じになっちゃったわけ。

で、Ver5はって言ったら、戦闘がじゃんけん方式になった、ただのカードゲーム。
海図は今のところ北アフリカまでしかなくって、行きたいところに行けないし。
同じ場所の海図が3種類あるってどういうこと?
しかも、ラピスラズリが100個以上も溜まってるのに、ほしい海図は手に入らない。

で、結局行くところも決まってて、クエもお決まり一辺倒だから、もうマンネリにたどり着くしかないわねぇ・・・

早く新大陸に行きたいな・・・(行きたいな・・・とフェードアウト)

新しいPCがやってきた(会社に)

さて、うちの会社では、DELLからパソコンやらサーバやらを購入しているのだが、購入してからいっこうにPCがやってこなかった。

例の配送トラブル?がらみなのだろうか、それとも生産が追い付かないのか。
4/8になってもPCは来ず、サポートの切れたWinXPをそのまま使う羽目になっていた。
ようやく届いたのだが、今度は移行するのが面倒だ。

単純に右から左ならともかく、Win7対応だの64bit対応だので、インストールするアプリも変わってくる。
仕事しながら、ちょこちょことデータ移行をして、あとはメールの移行。

とりあえず、Office、メール、その他ネットワークアプリが設定できたところで、ようやく新しいPCに乗り換えることができた。

まだ、移行し忘れたものがあるといけないので、いったん古いPCはそのまま。
早く新しいPCに乗り換えたかったのは、処理速度やHDDとメモリの量。
HDDの容量も空きがもうほぼなかったので、処理速度がやたらめったら遅く、もう勘弁ならなかった。
はやく変えたかったのだ。

私はいつも言っているのだが、
すごい速いPCは要らない。
だけど、自分の思考速度を止めないPCはほしい!
これに尽きる。

それはそうと、移行するときにもうちょっとデータ整理したかったな。

Excel覚書 改行コードを検索

検索の入力欄に、Ctrl+Jで設定(見た目わからないけど、改行コードが入っている)
 ↓
検索ボタンクリック
 ↓
改行コードのあるセルが選択される

見た目わからないのが困るんです。

PostgreSQL覚書 UPDATE(副クエリー)

副クエリーを使ったUPDATEの方法。

扱っているブログは結構あるものの、複数項目をUPDATEする方法について書いてあるものが少ない気がする。


UPDATE table1 t1
 SET (data1,data2,data3)=(t2.data1,t2.data2,t3.data3)
 FROM table2 t2
 WHERE t1.xx_cd = t2.xx_cd;

4月がやってきた

いつも通り、4月がやってきた。
3月中にすでに入社式を済ませているところもあるだろうが、私の勤めている会社では4/1入社だ。

そうして、見た目まったく新鮮さのかけらもない新入社員がやってきた。

でも、しゃべると緊張してるのがわかる。
初々しい・・・

古参も頑張らねば!