2017年10月30日

【Access】VBAで指定したフォームを選択する


VBAで指定したフォームを選択するには、DoCmdオブジェクトのSelectObjectメソッドを使います。

たとえば、「フォーム2」という名前のフォームを選択するには次のように記述します。
Public Sub SelectForm()

    DoCmd.SelectObject acForm, "フォーム2"

End Sub

2017年10月29日

【Linux】Linux Mint にSQL Serverをインストールしてみた




先日、SQL ServerのLinux版が正式にリリースされたということで、試しにLinux Mintにインストールしてみました。



まずは下記のサイトに行きます。

https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads


サイトに行ったら、Linuxのメニューから「Ubuntu Linux 16.04 にインストールする」をクリックします。
Linux Mint 18 は、Ubuntu Linux 16.04 がベースになっていますので、これをクリックします。

クリックするとインストール手順が書かれたページが開きますので、この手順にそってインストールを行ってみます。



まず、パブリックリポジトリ鍵キーをインポートします。
$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

次に、Microsoft SQL Server Ubuntu リポジトリを登録します。
$ sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)"

この2つに関してはよく分かりませんが、おそらくGitか何かのリポジトリにアクセスするためのものと思われます。とりあえず書いてあるとおりに実行します。


ここまで出来たら、SQL Serverをインストールします。

つぎのようにコマンドを打ちます。
$ sudo apt-get update
$ sudo apt-get install -y mssql-server


パッケージのインストールが完了したらエディションを選択します。
$ sudo /opt/mssql/bin/mssql-conf setup
SQL Server のエディションを選択します:
  1) Evaluation (無料、製品使用権なし、期限 180 日間)
  2) Developer (無料、製品使用権なし)
  3) Express (無料)
  4) Web (有料)
  5) Standard (有料)
  6) Enterprise (有料)
  7) Enterprise Core (有料)
  8) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。

エディションの詳細については、以下を参照してください
https://go.microsoft.com/fwlink/?LinkId=852748&clcid=0x411

このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります
Microsoft ボリューム ライセンス プログラム。
有料エディションを選択することは、
このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。

エディションを入力してください(1-8): 2
Evaluation、Developer、Expressが無料で使えます。
今回、Developer版を選びました。


次にライセンス条項の同意を求めてきます。
この製品のライセンス条項は
/usr/share/doc/mssql-server で参照できるほか、次の場所からダウンロードすることもできます:
https://go.microsoft.com/fwlink/?LinkId=855862&clcid=0x411

プライバシーに関する声明は、次の場所で確認できます:
https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x411

ライセンス条項に同意しますか? [Yes/No]:Y
Yで同意します。


次に言語の設定です。
SQL Server の言語の選択:
(1) English
(2) Deutsch
(3) Español
(4) Français
(5) Italiano
(6) 日本語
(7) 한국어
(8) Português
(9) Русский
(10) 中文 – 简体
(11) 中文 (繁体)
オプション 1-11 を入力: 6
日本語を選択します。


次にsaのパスワードを設定します。
SQL Server システム管理者パスワードを入力してください: 
SQL Server システム管理者パスワードを確認入力してください: 
SQL Server を構成しています...

Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /lib/systemd/system/mssql-server.service.
セットアップは正常に完了しました。SQL Server を起動しています。


最後にサービスが実行されていることを確認し、実行されていればとりあえずインストールは完了です。
$ systemctl status mssql-server


次に、コマンドラインツールをインストールしていきます。
これはsqlcmdとbcpを使えるようにするためのものです。

これも手順通りに実行します。

パブリックリポジトリ鍵キーのインポート。
$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

Microsoft Ubuntu リポジトリを登録。
$ sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list)"

ソースリストを更新し、unixODBC 開発者のパッケージでインストール コマンドを実行。
$ sudo apt-get update
$ sudo apt-get install -y mssql-tools unixodbc-dev

パス環境変数
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
$ source ~/.bashrc



では、実際にデータベースを作成して、テーブルを作成し、データを挿入してみたいと思います。


まずは、データベースエンジンに接続。
$ sqlcmd -S localhost -U SA -P 'パスワード'


次に、データベースの作成
1> CREATE DATABASE MYDB
2> GO
1> SELECT Name FROM sys.Databases
2> GO
Name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
master                                                                                                                          
tempdb                                                                                                                          
model                                                                                                                           
msdb                                                                                                                            
TestDB                                                                                                                          
MYDB                                                                                                                            

(6 rows affected)


そして、データベースMYDBを選択し、
1> USE MYDB
2> GO
データベース コンテキストが 'MYDB' に変更されました。


テーブルの作成します。
1> CREATE TABLE T_Mascots ([ID] [int] NOT NULL, [Name] NVARCHAR(50) NULL, [Type] NVARCHAR(50) NULL)
2> GO
1> SELECT Name FROM sys.tables
2> GO
name                                                                                                                            
--------------------------------------------------------------------------------------------------------------------------------
T_Mascots                                                                                                                       

(1 rows affected)


最後にデータを挿入してみます。
1> INSERT INTO T_Mascots VALUES (1, 'あゆコロちゃん', 'ぶた')
2> GO

(1 rows affected)
1> INSERT INTO T_Mascots VALUES (2, 'ぐんまちゃん', 'ポニー')
2> GO

(1 rows affected)
1> INSERT INTO T_Mascots VALUES (3, 'ひこにゃん', '猫')
2> GO

(1 rows affected)


SELECT文でデータを参照してみます。
1> SELECT ID, Name, Type FROM T_Mascots
2> GO
ID          Name                                               Type                                              
----------- -------------------------------------------------- --------------------------------------------------
          1 あゆコロちゃん                                            ぶた                                                
          2 ぐんまちゃん                                             ポニー                                               
          3 ひこにゃん                                              猫                                                 

(3 rows affected)

ちゃんと挿入したデータが表示できました。

まだここまでしか使っていませんが、Windows版とまったく同じ操作でデータベースにアクセス出来るのにはちょっと感動です。まあ、マイクロソフトはそのように作ったと言ってるので、当たり前と言えば当たり前ですが、けっこうすごいことだと思います。

いままで、SQL Serverを使うにはWindowsマシンが必ず必要でしたが、これからはLinuxマシンでもいいということになります。これは別の言い方をすれば、SQL ServerのためにWindowsマシンを用意しなくてもいいということになります。高価なWindows Server OS を用意できないような中小零細企業などにはかなりメリットがあると思えますね。


<関連記事>
Windows10マシンにデュアルブートでインストールしたLinux Mintを削除する方法
Windows10マシンにLinux Mintをインストールしてデュアルブート化してみた。
【Linux】Linux Mint にPowerShellをインストールしてみた。
Linux Mint にSophos Anti-Virus for Linux(Free Edition)を入れてみた
【Linux】viの使い方はとりあえずこれだけ知っていればなんとかなる
【Linux】Linux MintでGRUBのメニューの順番を変える


2017年10月28日

【PowerShell】Bloggerのフィード情報を読み込んで最新記事5件分を表示するスクリプト


Bloggerのフィード情報を読み込んで最新記事5件分を表示するスクリプトを作ってみました。

$atom = Invoke-WebRequest https://hosopro.blogspot.com/feeds/posts/default
$xml = [xml]$atom.Content
$ent = $xml.GetElementsByTagName("entry")

for ($i = 0; $i -lt 5; $i++){

    #タイトル
    $ent[$i].Item("title")."#text"

    #投稿日時
    $date = [DateTime]$ent[$i].Item("published")."#text"
    $date.ToString("yyyy/MM/dd HH:mm")
    
    #サマリー
    $ent[$i].Item("summary")."#text".Replace("`n",'').Substring(0, 50).trim() + "..."

    Write-Host
}
フィードの取得にはInvoke-WebRequestを使っています。
サマリーは50文字分表示するようにしてみました。


実行結果
PS C:\work\PowerShell> .\Get-BloggerFeed.ps1
【Access】現在開いている全てのフォームを参照する
2017/10/27 22:13
現在開いている全てのフォームを参照するには、Formsコレクションを使った方法とAllFormsコレ...

【Access】データベース内の全てのフォームを参照する
2017/10/26 21:25
データベース内の全てのフォームを参照するには、AllFormsコレクションを使います。例たとえばこの...

【Access】フォームの背景色を変更する
2017/10/25 21:38
フォームの背景色は、各セクションのBackColorプロパティに値を設定することで変更できます。例た...

【Access】帳票フォームでRequeryを行っても画面がチラつかないようにする
2017/10/24 21:49
前回、「帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする」方法を書きま...

【Access】帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする
2017/10/23 21:00
帳票フォームでデータの更新などを行ってフォームのRequeryを実行するとレコードの表示が変わってし...






2017年10月27日

【Access】現在開いている全てのフォームを参照する


現在開いている全てのフォームを参照するには、Formsコレクションを使った方法とAllFormsコレクションを使った方法があります。

たとえばこのようなデータベース(accdbファイル)があるとします。



開いている全てのフォーム名を取得するにはそれぞれ次のように記述します。

Formsコレクション

Public Sub GetOpenFormsInfo()

    Dim frm As Form
    Dim msg As String
    
    For Each frm In Forms
    
        msg = msg & frm.Name & vbCrLf
        
    Next
    
    MsgBox msg
    
End Sub
Formsコレクションは、現在開いているフォームのコレクションになります。


AllFormsコレクション

Public Sub GetOpenFormsInfo()

    Dim frm As AccessObject
    Dim msg As String
    
    For Each frm In CurrentProject.AllForms
    
        If frm.IsLoaded Then
            msg = msg & frm.Name & vbCrLf
        End If
        
    Next
    
    MsgBox msg
    
End Sub
IsLoadedは、AccessObjectが現在ロードされているかを示します。すなわちIsLoaded=Trueならフォームが開いているということになります。

2017年10月26日

【Access】データベース内の全てのフォームを参照する


データベース内の全てのフォームを参照するには、AllFormsコレクションを使います。

たとえばこのようなデータベース(accdbファイル)があるとします。



このデータベース内の全てのフォームのフォーム名を取得するには次のように記述します。
Public Sub GetAllFormsInfo()

    Dim frm As AccessObject
    Dim msg As String
    
    For Each frm In CurrentProject.AllForms
    
        msg = msg & frm.Name & vbCrLf
        
    Next
    
    MsgBox msg
    
End Sub

2017年10月25日

【Access】フォームの背景色を変更する


フォームの背景色は、各セクションのBackColorプロパティに値を設定することで変更できます。

たとえば、フォームヘッダー、詳細、フォームフッターの背景色を変更するには次のように記述します。
Private Sub Form_Load()

    Me.フォームヘッダー.BackColor = vbYellow
    
    Me.詳細.BackColor = vbCyan
    
    Me.フォームフッター.BackColor = vbGreen
    
End Sub

2017年10月24日

【Access】帳票フォームでRequeryを行っても画面がチラつかないようにする


前回、「帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする」方法を書きましたが、この方法だとレコード件数が多くなってくると画面のチラつきが気になってきます。

このような場合、フォームのPaintingプロパティを一時的にOFFにして描画を止めることによって画面のチラつきを抑えることが出来ます。

Private Sub buttonRequery_Click()

    Dim headerHeight As Long
    Dim curTop As Long
    Dim curRecNum As Long
    Dim topRecNum As Long
    
    Me.ID.SetFocus
    
    curRecNum = Me.CurrentRecord
    
    headerHeight = Int(Me.Section("フォームヘッダー").Height / Me.Section("詳細").Height)
    
    curTop = Me.CurrentSectionTop
    
    topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight)
    
    'フォームの描画をOFF
    Me.Painting = False
    
    '再表示
    Me.Requery

    '表示の復元
    DoCmd.GoToRecord acActiveDataObject, , acLast
    DoCmd.GoToRecord acActiveDataObject, , acGoTo, topRecNum
    DoCmd.GoToRecord acActiveDataObject, , acGoTo, curRecNum
    
    'フォームの再描画をON
    Me.Painting = True
 
End Sub

Requeryの前に「Painting = False」で描画をOFFにして、レコードの表示位置を復元したあとに「Me.Painting = True」で再描画をONにしています。

少ないレコード数では、この処理を入れるのと入れないのであまり違いがみられませんが、レコード数が多くなってくると明らかに違いが出てきます。