2010/05/01

access2010 データマクロで累計 見直し -BeforeInsert-

少し手直しをして。

挿入先テーブルの全レコードをID降順で選択しているが、レコードの参照(LookUpRecord)で複数レコードが対象となるがカレントレコードは先頭なのでMax(ID)言い換えると、挿入時点で最新レコードを参照できる。
クエリ:SELECT * FROM t3 WHERE ID=(SELECT Max([ID]) FROM t3);を参照がいいんじゃないかと。


















<?xml version="1.0" encoding="utf-8"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
  <DataMacro Event="BeforeChange">
    <Statements>
      <ConditionalBlock>
        <If>
          <Condition>[IsInsert]</Condition>
          <Statements>
            <LookUpRecord>
              <Data Alias="t3_0">
                <Query>
                  <References>
                    <Reference Source="t3" />
                  </References>
                  <Results>
                    <Property Source="t3" Name="f_sum" />
                  </Results>
                  <Ordering>
                    <Order Direction="Descending" Source="t3" Name="ID" />
                  </Ordering>
                </Query>
              </Data>
              <Statements>
                <Action Name="SetField">
                  <Argument Name="Field">t3.f_sum</Argument>
                  <Argument Name="Value">[t3_0].[f_sum]+[t3].[f_num]</Argument>
                </Action>
              </Statements>
            </LookUpRecord>
          </Statements>
        </If>
      </ConditionalBlock>
    </Statements>
  </DataMacro>
</DataMacros>

access2010 データマクロでタイムスタンプ

タイムスタンプといっても秒単位だけど。
IfブロックIsInsertで挿入であることを確認できる

access2010 データマクロで累計

レコードごと(ForEachRecord)をネスト。
外側(t1_0)で全レコードを繰り返し、内側(t1_1)は、[t1_1].[ID]<=[t1_0].[ID]の条件を対象として、ローカル変数にレコードごと加算
内側ForEach終了後、レコードの編集(EditRecord):フィールドの編集(SetField)でt1_0.f_sumにローカル変数を代入
ローカル変数名tmpsumのつもりがtmpsubになってるし (*_*) 
実際のところ、このロジックは破綻しているから使えない。

access2010 データマクロで累計 -AfterDelete-

ロジックは、挿入後処理と同じ
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
  <DataMacro Event="AfterDelete">
    <Statements>
      <ForEachRecord>
        <Data Alias="t1_0">
          <Reference>t1</Reference>
        </Data>
        <Statements>
          <Action Name="SetLocalVar">
            <Argument Name="Name">tmpsub</Argument>
            <Argument Name="Value">0</Argument>
          </Action>
          <ForEachRecord>
            <Data Alias="t1_1">
              <Reference>t1</Reference>
              <WhereCondition>[t1_1].[ID]&lt;=[t1_0].[ID]</WhereCondition>
            </Data>
            <Statements>
              <Action Name="SetLocalVar">
                <Argument Name="Name">tmpsub</Argument>
                <Argument Name="Value">[t1_1].[f_num]+[tmpsub]</Argument>
              </Action>
            </Statements>
          </ForEachRecord>
          <EditRecord>
            <Data />
            <Statements>
              <Action Name="SetField">
                <Argument Name="Field">t1_0.f_sum</Argument>
                <Argument Name="Value">[tmpsub]</Argument>
              </Action>
            </Statements>
          </EditRecord>
        </Statements>
      </ForEachRecord>
    </Statements>
  </DataMacro>
</DataMacros>

access2010 データマクロで累計 -AfterUpdate-

基本的なところは、挿入後と同じ。 
IfブロックでUpdate("f_num")検査→f_numフィールドが更新されたら
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
  <DataMacro Event="AfterUpdate">
    <Statements>
      <ConditionalBlock>
        <If>
          <Condition>Updated("f_num")</Condition>
          <Statements>
            <ForEachRecord>
              <Data Alias="t1_0">
                <Reference>t1</Reference>
              </Data>
              <Statements>
                <Action Name="SetLocalVar">
                  <Argument Name="Name">tmpsub</Argument>
                  <Argument Name="Value">0</Argument>
                </Action>
                <ForEachRecord>
                  <Data Alias="t1_1">
                    <Reference>t1</Reference>
                    <WhereCondition>[t1_1].[ID]&lt;=[t1_0].[ID]</WhereCondition>
                  </Data>
                  <Statements>
                    <Action Name="SetLocalVar">
                      <Argument Name="Name">tmpsub</Argument>
                      <Argument Name="Value">[t1_1].[f_num]+[tmpsub]</Argument>
                    </Action>
                  </Statements>
                </ForEachRecord>
                <EditRecord>
                  <Data />
                  <Statements>
                    <Action Name="SetField">
                      <Argument Name="Field">t1_0.f_sum</Argument>
                      <Argument Name="Value">[tmpsub]</Argument>
                    </Action>
                  </Statements>
                </EditRecord>
              </Statements>
            </ForEachRecord>
          </Statements>
        </If>
      </ConditionalBlock>
    </Statements>
  </DataMacro>
</DataMacros>