2010/09/29

access2010 "SetProperty/プロパティの設定" マクロ アクション

"SetProperty/プロパティの設定" マクロ アクション の不具合メモ
<再現>
Form.DirtyイベントにSetProperty/プロパティを設定
  • コントロール名:(コントロール名)
  • プロパティ:値
  • 値:任意
 で、どうなるかというと、
<現象>
マクロが再帰呼び出しされる。カウンタをこさえて確認



<対処>
エラー時マクロアクションでエラーメッセージを表示させないことは可能だが、再帰呼び出しは発生する。なので、2007同様値の代入マクロアクションを使う。
もしくは、VBAで対応。
Private Sub Form_Dirty(Cancel As Integer)
    DoCmd.SetProperty Me.フィールド3.Name, acPropertyValue, Now()
End Sub

と、思い込んでたけど、VBAでもだめなんだな。値の代入であれば、Dirtyイベントが発生しないんだけど、Dirtyイベントでプロパティの設定を実行させた場合、さらにDirtyイベントが発生してしまうと。
Private i As Integer

Private Sub Form_Dirty(Cancel As Integer)
    DoCmd.SetProperty Me.フィールド1.Name, acPropertyValue, 1234
    i = i + 1
    Debug.Print i '73までカウントした
End Sub

サポート:現象確認済み

2010/09/28

access2010 "CloseWindow/ウィンドウを閉じる" マクロ アクション

"CloseWindow/ウィンドウを閉じる" マクロ アクションでの不具合メモ
<再現>
レポートのショートカットメニューをマクロで作成。
"CloseWindow/ウィンドウを閉じる" マクロ アクション
  • オブジェクトの種類:レポート
  • オブジェクト名:(レポート名)
  • オブジェクトの保存:任意
のサブマクロをショートカットメニューから起動させる設定。

<現象>
ダイアログモード+印刷プレビューで開いたレポートを閉じることは成功するが、以降、タスクバーでaccessを終了させる以外の操作が不能になる。
<対処>
メニューコマンドの実行/閉じるを使う。もしくは

マクロでショートカットメニューを作らなければ無事に作動する。
Option Compare Database
Option Explicit
'msoBarPopup=5
'msoControlButton=1
Sub CreateSC01()
    Dim cb As Object

On Error Resume Next
    CommandBars("testSC").Delete
    Set cb = CommandBars.Add("testSC", 5, False, False)

    With cb.Controls.Add(1, 15948)
        .Caption = "PrintDialogAccess"
    End With

    With cb.Controls.Add(1, 923)
        .Caption = "PrintPreviewClose"
    End With

    With cb.Controls.Add(1, 14782)
        .Caption = "CloseDocument"
    End With
    
    With cb.Controls.Add(1)
        .Caption = "メニューコマンドの実行:閉じる"
        .OnAction = "reportshortcut.メニューコマンドの実行閉じる"
    End With
   
    With cb.Controls.Add(1)
        .Caption = "メニューコマンドの実行:ウインドウを閉じる"
        .OnAction = "reportshortcut.メニューコマンドの実行ウインドウを閉じる"
    End With
    
    With cb.Controls.Add(1)
        .Caption = "ウインドウを閉じるアクション"
        .OnAction = "reportshortcut.ウインドウを閉じるアクション"
    End With
    
    Set cb = Nothing

End Sub

不具合確認済み

2010/09/26

access2010 リボンイメージのカスタマイズ

リボンに使うイメージに独自イメージを使うにはどうしたらいいのかのメモ
getImageでローカルイメージファイルを取り扱う方法はわかっていたのだけれども、どうせなら添付ファイルフィールドに格納したイメージを使えないものだろうか。また、bmp/icoではなくpngで使えないものかということ。こっちは見た目の問題。pngなど他のイメージや透過を扱うにはGDI+を使うとできるらしい。
で、試したらできた。

http://www.accessribbon.de/en/index.php?Access_-_Ribbons:User_Defined_Icons___Pictures_In_Ribbon_Controls

でサンプルが、
http://www.accessribbon.de/en/index.php?Downloads:25

http://www.accessribbon.de/en/index.php?Downloads:23

なんだか面倒くさいことになってる感がしないでもない。

2010/09/21

access2010 アプリケーション配布時の設定 改

開いてれば閉じればいいじゃない。

いつまでたってもきりがない。Alt+F11とF11を処理してと。
別件、データマクロはaccdeであっても編集できちゃうから要注意で。
うぉ、コメントの関数名がまちがっとる。

AutoExec/AutoKeys 

2010/09/20

access2010 アプリケーション配布時の設定

2010になってちょっと考え直し。Runtime環境でのことも考えて。
基本的にはRuntimeかRuntimeモードで作動するようにしておくべきなんだけど、そうもいかない時もあるわけで、どうしようかなと。

まずもってコードは実行させたいから、CurrentProject.IsTrustedで仕分け。
いずれの場合であっても、ナビゲーションウインドウの非表示 。
念のためナビゲーションウインドウのロック、そして隠しオブジェクトにして非表示とナビゲーションオプションでグループの非表示。で、このとき最低一つは表示されるフォームがないとナビゲーションウインドウ非表示させる時にエラーになる。
まぁ、SysCmd(acSysCmdRuntime)でRuntime以外終了ということでもいいのだけれども。
残り、ショートカットキーを有効にする(allowspecialkeys)をFalse、allowbypasskeyをFalse、autokeysでショートカットキーの抑制を追加とそれでもこぼれるのはキーボードイベントで。最後にaccdeに。

リボンを非表示にしてしまってるけど、できればリボンのカスタマイズでいいかな。
なぜなら、 VBEが開いてる状態で、ファイルと開くコマンドで開くとVBEが使用できてしまうから。

AutoExec/AutoKeys

2010/09/17

access2010 DoCmd.SetParameter

DoCmd.SetParameter メソッド
VBAで使うときちょっと癖があるので。

'Module:DoCmdR
Option Compare Database
Option Explicit

Public Sub SetParameter(ParameterName As String, _
                        ParameterValue As Variant)
    Dim tmpParam As Variant

    Select Case VarType(ParameterValue)
        Case 7 'vbDate
            tmpParam = Format(ParameterValue, _
                              "\#mm/dd/yyyy hh:nn:ss\#")
        Case 8 'vbString
            tmpParam = Chr(34) & _
                       Replace(ParameterValue, _
                               Chr(34), String(2, 34), , , _
                               vbBinaryCompare) & _
                       Chr(34)
        Case Else
            tmpParam = ParameterValue
    End Select
    DoCmd.SetParameter ParameterName, tmpParam
End Sub
'使用例
Option Compare Database
Option Explicit

Private Sub cmd01_Click()
    DoCmdR.SetParameter "parameter_name", Me.txt01
    DoCmd.OpenQuery "Query_Name"
End Sub
PARAMETERS param01 Value;
SELECT T_0.ID, T_0.F_Num, T_0.F_txt, T_0.F_date, T_0.F_boolean
FROM T_0
WHERE T_0.F_date=param01;
BrowseTo/OpenForm/OpenQuery/OpenReport/RunDataMacroが実行されるとパラメータコレクションはすべてクリアになるから、使用する直前にメソッドを使用する。

2010/09/16

access2010 ナビゲーションフォーム その4


ナビゲーションフォームのお問い合わせが続いたので。
フォームさえ準備しておけばいいわけで、便利だと思う。基本コーディングなしでいいし。VBA/マクロでのコントロールではBrowseToを使えばいい。自動作成した場合、NavigationSubform というサブフォームに対して処理するという感じで。

access2010 BrowseTo/参照先 マクロ アクション


今回はマクロでやってみたけど、VBAでも問題なくできる。マクロの方が使いやすいと思うけど。
サブフォームを動的に使うという意味ではそこそこ便利になる。ナビゲーションフォームであってもサブフォームだから、form_name1.subform_name1>form_name2.subform_name2でつないでやればよい。
ナビゲーションコントロールとナビゲーションボタンに紐付いたフォームに移動した場合は、同期されたはずだから、ナビゲーションフォームをマクロやコードで操作する場合、BrowseToすればよい。
ページパラメータは、ブラウザで表示しているときでページングができるんだけどそのページを指定するもの。クライアントでは無効になるパラメータ。

2010/09/14

access2010 Webデータベース その4 そして、後処理まで待機する


Formプロパティの[後処理まで待機する]は一体、何?だったのだけど、ここにきてわかった気がする。
なんとなく、Webデータベース/SharePointっぽい件なのかなと思っていたのだけれども、やっと確認できたのかもしれない。access servicesを利用するアプリはクライアント/ブラウザとあるわけだけれども、基本的に非同期なわけだからデータマクロがバックグランドで作動していて時間を要している場合にモーダルでメッセージを出してくるというもののような気がする。多分そう。きっと。おそらく。
ブラウザで稼働している場合には特に必要なのかも知れない
  • form.Properties("WaitForPostProcessing") : Boolean
多分クライアントアプリであれば気にすることないプロパティなのかも。Google先生に聞いても教えてくれる内容は皆無に等しかったから、ここにきてスッキリしただけか。まぁいいや。

2010/09/13

access2010 Webデータベース その3


少々勢い余って試してみたところ。
モーダルなフォームをダイアログとして調整してみた。フォーム間の受け渡しはTempVarsを使用して、ダイアログのOKボタン押下を検査した。
詳細フォームでは、Form.Dirtyプロパティで分岐させて、Undo/Save/Closeを実行。
OpenFormコマンドでWhereを使わずにパラメータを使った。メリットデメリットは追及してない。
Web/クライアントいずれでも動作はする。すべてマクロで書かないとならないから感覚つかめるまで時間がかかりそう。フォーム/コントロールのイベント/プロパティが少ないし。

Webフォーム:閉じるボタンプロパティがない
Webフォーム:Current/Loadイベントしかない
Webフォーム:Dirtyイベントはない、Dirtyプロパティはある
添付ファイルコントロール:AfterUpdateイベントがない
添付ファイルコントロール:添付ファイルを変更してもForm.Dirtyに影響しない

access2010 Webデータベース その2


取り急ぎテンプレートからの作成でSharePointに発行。大体こんな感じということ。
PDF出力時のフォントがおかしいのは、正確な日本語フォントが設定されていないから。

使ったサンプルには出てこないけど、MsgBox関数が使用できないから自前でフォームを作らにゃならんってこと。で、ブラウザ上でのデータ更新をしていけるけど、Ajax使ってるみたいな感じでで非同期更新してくれないから 、ダイアログフォーム開く→入力→閉じる→再クエリの手順が必要。
したがって、カレントレコードは最初のレコードに移動してしまうことになる。さて、どうするか。

続く

2010/09/11

access2010 Sharepoint2010 Webデータベース環境構成メモ

access 2010 + SharePoint 2010 のAccess Servicesテスト環境を再び作ってみたのでメモ。
前回とは変更して単一 サーバ構成でSharePointを展開。ADは無し。
<<必要なもの>>
  • Windows Server 2008R2
  • SharePoint Server 2010 Enterprise
  • メモリ(できるだけ多く/テスト環境だけど最低4GBは欲しい) 
<<手順>>
1.OSインストール Updateをできるだけ当てておく
2.SilverLight あとでもいいけど結局入れる
3.Microsoft SQL Server 2008 R2 Reporting Services (SSRS) アドインインストール
4.SharePoint Serverインストール 単一サーバで製品構成ウィザードやってとりあえずで動くまで。
5.SharePoint管理シェル起動
  • Enable-SPSessionStateService [Enter]
  • accessreports [Enter] ← DatabaseNameを指定、実際ここはなんでもいい。
6.Cmd起動
  • iisreset [Enter] ←IISリセット
項番3と4の順番が重要で準備ツールでインストールされることが後にわかった、項番5やらないとWebレポートを表示できない。
中の人に言われたとおりにやってれば無事終わる。

<<他参考リンク>>
Access Services の管理

2010/09/09

access2010 データマクロでログとか

まぁログを取ってみようかと。
IsInsertプロパティで分岐して、TimeStampをふたつ、変更前テーブルイベントBefore_Changeで。
で、各テーブルイベントでログテーブルにレコードの作成データブロックで追加。
名前付きデータマクロでちょこっとおまとめ
名前付きデータマクロならVBAから呼び出せもする。
IntelliSense使えるのは便利でいいやね

2010/09/08

access2010 アプリケーションパーツ その6

その4でもメモってたけど、足りないことあったから追加。
テンプレートaccdtは、CurrentDB.Version=12.0になるように作った方がよかった。
a2007用作ってたつもりだったのに、いつのまにか14.0になってた原因がアプリケーションパーツだった模様。まぁ、新規accdbで再構成すればよいのだけれども。

2010/09/07

access2010 カレンダーコントロールmscal.ocxからの変更

カレンダーコントロール mscal.ocx がなくなったので、DatePickerへの変更時のメモ
カレンダーコントロールのイベントで制御などしていた場合について。
該当するテキストボックスイベントChangeとTextプロパティを使いましょうかね。ValueだとDatePickerで選択した日付は参照できないのさ。Form.Requeryでもいい場合もあるかもだけど、レコード確定しちゃうから普通は避けるべきじゃないかな。
Option Compare Database
Option Explicit

Private Sub date01_Change()
    If Not IsDate(Me.date01.Text) Then Exit Sub
    '以降、日付とかに合わせた処理
End Sub

Private Sub date02_Change()
    If Not IsDate(Me.date02.Text) Then Exit Sub
    '以降、日付とかに合わせた処理
End Sub

Private Sub date02_GotFocus()
    DoCmd.RunCommand acCmdShowDatePicker
End Sub

access2010 ナビゲーションフォーム その3

  • 移動コントロール:ナビゲーションコントロール:NavigationControl
  • 移動ボタン:ナビゲーションボタン:NavigationButton
の関連ってどうなってるのか確認してみた。

NavigationControl.Properties("NavigationParent") String
NavigationControl.Properties("NavigationChild") String

NavigationButton.Properties("NavigationParentButton") String
NavigationButton.Properties("DefaultInsertButton")  Integer

ってことらしい。常時に触れることないプロパティではあるけれどもCreateControlとかで使うのかもしれんね。 移動コントロール/移動ボタンいずれもVisible/Enabledつかえるから実行時に制御可能と。
でもって、NavigationControlに配置されているNavigationButtonの列挙
    Dim Frm As Access.Form
    Dim naviCtr As Access.NavigationControl
    Dim naviBtn As Access.NavigationButton
    Set naviCtr = Frm.移動コントロール0
    
    For Each naviBtn In naviCtr.Controls
        If naviBtn.Properties("DefaultInsertButton") = 0 Then
            Debug.Print naviBtn.Name
        End If
    Next

2010/09/05

access2010 カレンダーコントロール 推奨しない

なにが起きるかわからないから、自己責任で。 カレンダーなくなるよってあれほど言ってたのに。今頃になって問い合わせしてくるとはね。
ライセンス的にどうかは自分で確認して。少なくとも製品版どうしのSideBySideは問題ないはず。

access2010 フォーム設定クラス その4

その4
フォームがたくさんになって面倒になるから、できるだけ手抜きする試み。
SharedResource MSysResourcesに格納しているイメージをボタンに使用
イメージの差し替えとかできるし埋め込むよりいいでしょ。他加えるとしたらフォームキーボードイベントを補足して特定のショートカットキー操作を制御するとか、MsgBoxをラップするとか、フォームエラーイベントを共通化しちゃうとか。デザインビューでのみ設定できるプロパティ以外であればいいわけだ。


ClassModule:Class_FormDefault
Option Compare Database
Option Explicit

Private WithEvents Frm As Access.Form
Private WithEvents cmdClose As Access.CommandButton
Private WithEvents cmdQuit As Access.CommandButton

Private CloseCancel As Boolean

Private Sub Class_Initialize()
    Set Frm = Application.CodeContextObject
    
    FrmSettings
    BindcmdButtons
    
    CloseCancel = True
    
End Sub

Private Sub Class_Terminate()
On Error Resume Next
    Set Frm = Nothing
    Set cmdClose = Nothing
    Set cmdQuit = Nothing
End Sub

Private Sub FrmSettings()
    With Frm
        Select Case .DefaultView 'acDefView
            Case acDefViewSingle
                .NavigationButtons = False
                .RecordSelectors = False
            Case acDefViewDatasheet
                .NavigationButtons = True
                .RecordSelectors = True
            Case Else
                'Planned Site
        End Select
        
        .OnUnload = "[EVENT PROCEDURE]"
    End With
End Sub

Private Sub BindcmdButtons()
    Dim cmdbtn As Access.Control
    For Each cmdbtn In Frm.Controls
        Select Case cmdbtn.Tag
            Case "Close"
                Set cmdClose = cmdbtn
                With cmdClose
                    .OnClick = "[EVENT PROCEDURE]"
                    .OnGotFocus = "[EVENT PROCEDURE]"
                    .OnLostFocus = "[EVENT PROCEDURE]"
                    .PictureType = 2
                    .Picture = "cmdClose16"
                End With
            Case "Quit"
                Set cmdQuit = cmdbtn
                With cmdQuit
                    .OnClick = "[EVENT PROCEDURE]"
                    .OnGotFocus = "[EVENT PROCEDURE]"
                    .OnLostFocus = "[EVENT PROCEDURE]"
                    .PictureType = 2
                    .Picture = "cmdQuit16"
                End With
            Case Else
                'Planned site
        End Select
    Next
End Sub

Private Sub cmdClose_Click()
    CloseCancel = False
    DoCmd.Close acForm, Frm.Name
End Sub

Private Sub cmdClose_GotFocus()
    cmdClose.Picture = "cmdClose32"
End Sub

Private Sub cmdClose_LostFocus()
    cmdClose.Picture = "cmdClose16"
End Sub

Private Sub cmdQuit_Click()
    CloseCancel = False
    Application.CloseCurrentDatabase
End Sub

Private Sub cmdQuit_GotFocus()
    cmdQuit.Picture = "cmdQuit32"
End Sub

Private Sub cmdQuit_LostFocus()
    cmdQuit.Picture = "cmdQuit16"
End Sub

Private Sub Frm_Unload(Cancel As Integer)
    Cancel = CloseCancel
End Sub
Form:
Option Compare Database
Option Explicit

Private clsFD As Class_FormDefault

Private Sub Form_Open(Cancel As Integer)
    Set clsFD = New Class_FormDefault
End Sub

Private Sub Form_Close()
    Set clsFD = Nothing
End Sub

access2010 フォーム設定クラス その3

その3
フォームがたくさんになって面倒になるから、できるだけ手抜きする試み。
form.Unloadで開発者が意図しない方法で終了するのを制御を盛り込んでみる

access2010 フォーム設定クラス その2

その2
フォームがたくさんになって面倒になるから、できるだけ手抜きする試み。
コマンドボタンの動作で共通化できそうなものを。WithEvents使ってクラスでコマンドボタンのイベントを設定しちゃう算段。commandbutton.Tagで仕分け

access2010 フォーム設定クラス その1

その1
フォームがたくさんになって面倒になるから、できるだけ手抜きする試み。
NavigationButtonsとRecordSelectorsの表示を制御
form.DefaultViewで仕分けする目論見。

2010/09/03

access2010 アプリケーションパーツ その5

USysRibbonsテーブルを新規作成できて、編集用フォームを用意してみたアプリケーションパーツ