2011/05/22

access2010 Webデータベース その50 レコードの保存 -7-

ここから始まった、レコードの保存/SaveRecordのまとめ。


フォームのUIマクロで独自にValidationをしてもよいのだけど、フィールドの検証/レコードの検証/データマクロイベントなどで程よくできるのからどんな感じになるのかなと確認してみた。フィールドの検証/必須については、Validationの結果でコントロールがハイライトになるから結構良いかもしれない。

Form.Dirty=Trueの場合、Undoする
同じく、Form.Dirty=Trueの時、Undoしてフォームを閉じる。エラー時を用いてるのは、フォーム閉じるボタンで閉じた時用だったかも。
新規レコードでかつレコードの保存時にエラーが発生した場合、Form.DirtyプロパティがFalseになる場合がある。この場合Undoしようとするとエラーになる。
Form.Dirty=Falseであるのにレコード編集中のように振る舞うから、cmdClose押下でフォームを閉じようとするとシステムのアラートがでる。
なので、必須フィールドの値をプロパティの設定マクロアクションで再設定しForm.Dirty=Trueの状態になるよう調整した。
必須フィールドを選択したのは、必須のValidationでエラーとなった場合特段の処理をすることなくDirtyプロパティはTrueであるから。
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<UserInterfaceMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
  <UserInterfaceMacro For="cmdSave" Event="OnClick">
    <Statements>
      <Action Collapsed="true" Name="OnError">
        <Argument Name="Goto">Macro Name</Argument>
        <Argument Name="MacroName">ErrHnd</Argument>
      </Action>
      <Action Name="SaveRecord" />
    </Statements>
    <Sub Name="ErrHnd">
      <Statements>
        <Action Name="MessageBox">
          <Argument Name="Message">=[MacroError].[ActionName] &amp; " / " &amp; [MacroError].[Description]</Argument>
        </Action>
        <ConditionalBlock>
          <If>
            <Condition>Not IsClient()</Condition>
            <Statements>
              <ConditionalBlock>
                <If>
                  <Condition>IsNull([ID])</Condition>
                  <Statements>
                    <ConditionalBlock>
                      <If>
                        <Condition>[MacroError].[ActionName]="SaveRecord" And Not [Form].[Dirty]</Condition>
                        <Statements>
                          <Action Collapsed="true" Name="SetLocalVar">
                            <Argument Name="Name">lclVar</Argument>
                            <Argument Name="Expression">[Field2]</Argument>
                          </Action>
                          <Action Collapsed="true" Name="SetProperty">
                            <Argument Name="ControlName">Field2</Argument>
                            <Argument Name="Property">Value</Argument>
                          </Action>
                          <Action Collapsed="true" Name="SetProperty">
                            <Argument Name="ControlName">Field2</Argument>
                            <Argument Name="Property">Value</Argument>
                            <Argument Name="Value">=[LocalVars]![lclVar]</Argument>
                          </Action>
                        </Statements>
                      </If>
                    </ConditionalBlock>
                  </Statements>
                </If>
              </ConditionalBlock>
            </Statements>
          </If>
        </ConditionalBlock>
      </Statements>
    </Sub>
  </UserInterfaceMacro>
</UserInterfaceMacros>
不具合なのか仕様なのか。まぁ何とかなりそうだから気にしない。でも、こんな状態はよろしくないかなとは思う。Office365betaでも同じ状況。SP1リリースされたら再度確認してみよう。

0 件のコメント: