プログラム言語
PowerShell 4.0
以前、職場PCのWindows7sp1のPowerShellを2.0から4.0に上げてました。
情報取得したりするのに最近いじってたので、家のPCにも4.0入れてみました。
以下を見て必要なものをダウンロード。
PowerShell/Windows7にPowerShell4.0をインストールする手順
.Net 4.5は家のには4.7が既に入ってたので不要でした。
Windows Management Framework 4.0・・・これを入れると4.0になる模様。
最後に再起動して、無事に4.0になりました。
FindFastとSeek
毎月、Accessでデータ集計してるシステムがあるのですが、新しいデータに対応するのに改造しました。
グループ化してるQueryに、FindFastで検索かけてましたが、50分かかるようになってしいました。
ワークテーブルに書き出してみても、かわらず。
テーブルになったので、Seekで検索するように改造しました。
結果、2分ほどで集計処理が終了しました。
この後、結果データでExcelを編集する処理が21分かかりました。
こっちのFindFastは、10分ぐらいだからそのままにしとこうかと思います。
こんなに差が出るとは予想してませんでした。
文字列をまとめて構造体にコピー CopyMemory
仕事でAccess VBAでデータを処理するシステムを毎月一つ程度開発しています。
現在は、QRコードから読み込んだデータを処理するのですが、いくつかの情報がつながってスキャナーから取得できるので、分解するのにTypeでユーザー定義してみました。
(固定長の1レコードのテキストのようにスキャナーで取得できました。)
構造体というらしいですが、初めて使いました。
フォームにスキャナからのデータを入力するテキストボックスを設置して、更新後処理で分解して、各コードのテキストボックスにセットしようとしました。
しかし、ユーザー定義型にした変数には、テキストボックスの値は直接は転送できませんでした。
構造体の中の項目一つずつに対して代入しないといけないようです。
W_TP_QR.HINNO = Mid(Me!TXT_SCAN01,1,7)
W_TP_QR.HINMEI = Mid(Me!TXT_SCAN01,8,25)
項目も
Public Type TP_QR
HINNO As String * 7
HINMEI As String * 25
End Type
とかして、項目の長さ指定したのが無駄に。
ネットでいろいろ調べました。
そしたら、Windows API を使えばいいことがわかりました。
以下を参考にしました。
構造体の内容を変数にコピーする
コピーの方向が逆ですが、なんとかなりました。
気を付けるのは、引数の1つ目は受け取り用構造体。
2つ目は、今回はテキストボックス。
3つ目はテキストボックス内の文字列のバイト数。
使用してるのが、Access2007なので、内部処理はUnicodeです。
LEN使っても、LENB使っても、見た目上正しいようですが、内部でUnicodeなので、各文字が1文字と数えられてました。(実際は、Unicodeなので各文字は2Byte使ってます。)
StrConvでvbFromUnicodeしてからLENBしてもだめでした。
なのでCopyMemoryの結果が半分しかできてない。
仕方ないので、* 2しました(^_^.)
引数はすべてByValで値渡しにしました。
引数の2つ目は、StrPtrで囲みました。
これでなんとか、文字列を構造体にセットできました。
各項目でテキストボックスにセットして、確認できました。
標準モジュールの頭で、
'API定義
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'ユーザー定義型
Public Type TP_QR
HINNO As String * 7
HINMEI As String * 25
End Type
'パブリック変数定義
Public W_TP_QR As TP_QR
プロシージャの中で、
'文字列のバイト数取得
Dim W_LENB As Long
W_LENB = LenB(StrConv(Me!TXT_SCAN01,VbFromUnicode))
'構造体に文字列コピー
Call CopyMemory(ByVal W_TP_QR, ByVal StrPtr(Me!TXT_SCAN01), ByVal W_LENB * 2)
Me!TXT_HINNO = W_TP_QR.HINNO
とかやってたかと思います。
ソースとか持ち出せないので、記憶で書いてますので間違いあるかも。
LenBは結局意味なかったかも。
素直にLENで文字列長取得して* 2でもいいかも。
今回は、半角英数しかなかったのでこれでいいんですが。
Microsoft Small Basic
窓の杜で紹介されていましたが、Microsoftが初心者向けプログラミング言語をリリースしたそうです。
Basicがもとになっているので、マニュアルを見ればそこそこ遊べます。
日本語版のマニュアルがないようなので、英語版のPDFかDocxのマニュアルをダウンロードします。
起動は、Localizedにある、Small Basic(Japanese)を起動します。
アルファベットを入力すると、その文字で始まる関数などが表示されます。
F5キーで実行です。
Web開発需要が減少傾向
参照先の記事によると、Web開発の需要が減少傾向にあるそうです。誰でもそこそこできちゃうのもありますが、せっかく自分でも少しかじったのでもう少しこの技術を生かしたかったのですが。
SQL Server 2005 用 カラム一覧を表示するSQL
職場で、SQL Server 2005 を使用してますが、テーブルのカラム一覧を「sp_columns テーブル名」で表示したりしてます。Oracleのときは、「desc テーブル名」で単純にカラム名だけ出せてました。「sp_columns テーブル名」だと情報がたくさん出るので、コマンドラインとか、秀丸エディタからのSQLCMD発行の結果では、行が長くなるので折り返されて見づらくなります。
以下のサイトを参考に作りました。
■sqlcmd(SQL Server)の使い方 データベースの一覧表示 > select name from sys.databases > go ■使用しているデータベースの切り替え > use データベース名 > go ■現在のデータベースのテーブルの一覧表示 > select name from sys.tables > go ■テーブルのカラム一覧表示 > sp_columns テーブル名など > go ※上のカラム一覧は項目が多すぎるので、必要なものだけ出力するSQL --抽出_Object_Col_List.sql---- --変数の宣言 declare @ObjectName Varchar(50); --以下にオブジェクト名を指定 set @ObjectName = 'Obj_Name'; --オブジェクト名出力 select left(name,20) as Object_Name, left(type_desc,20) as Type from sys.objects where name = @ObjectName; --カラム名出力 SELECT -- left(sys.objects.name,20) as Object_Name, -- sys.objects.object_id, -- left(sys.objects.type_desc,15) Type, sys.columns.column_id, left(sys.columns.name,20) as Column_Name, sys.columns.max_length, (CASE sys.columns.is_nullable WHEN 0 THEN 'NO' WHEN 1 THEN 'YES' ELSE 'nothing' END) as 'NULL許可' FROM sys.objects, sys.columns WHERE sys.objects.name like @ObjectName AND sys.objects.object_id = sys.columns.object_id ORDER BY sys.columns.column_id ---------------------------
上のSQLをまとめて、実行すると、結果が2つ連続で出ます。
オブジェクト名とそのタイプ、カラム一覧です。秀丸エディタからの実行ではちょうどいい感じに出ました。
秀丸エディタからSQLCMDを発行するマクロ
Visual Studio 2008 Express Edition 日本語版が公開
無料で使えるVisual Studio 2008 Express Edition 日本語版が公開されました。
PowerShell 1.0正式版
PowerShell 1.0の正式版が出ました。
旧版は、アプリケーションの追加と削除で、更新プログラムの表示をチェックすると、
PowerShellが出てくるので削除してから、正式版をインストールします。