2011/03/31

access2010 Webデータベース その12 フィールドの最大値/最小値/平均値

データマクロで使用するデータブロックマクロアクション(LookupRecord/ForEachRecord)を使って、フィールドの最大値/最小値/平均値を求める。

最大値/最小値の場合、 レコードの参照(LookupRecord)でよい。引数InにはOrder By句を指定し昇順降順を指定する。参照されるレコードが複数となる可能性があるが、ひとつ目のレコードを参照するから降順であれば最大値、昇順であれば最小値を取得できる。ただし、昇順とした場合、フィールドの値がNullが先頭レコードになるから、Where句もしくはWhere条件(Where Condition)で、Is Not Nullとする必要がある。

平均値については、レコードごと(ForEachRecord)を使って、レコード数と合計を計算すればいい。


<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
  <DataMacro Name="FuncMaxMinAvr">
    <Parameters>
      <Parameter Name="paramFunc" Description="Max/Min/Avr  rtnMaxMiniAvr" />
    </Parameters>
    <Statements>
      <ConditionalBlock>
        <If>
          <Condition>[paramFunc]="Max"</Condition>
          <Statements>
            <LookUpRecord>
              <Data Alias="T">
                <Query>
                  <References>
                    <Reference Source="table01" />
                  </References>
                  <Results>
                    <Property All="true" />
                  </Results>
                  <Ordering>
                    <Order Direction="Descending" Source="table01" Name="Field01" />
                  </Ordering>
                </Query>
              </Data>
              <Statements>
                <Action Collapsed="true" Name="SetReturnVar">
                  <Argument Name="Name">rtnMaxMiniAvr</Argument>
                  <Argument Name="Value">[T].[Field01]</Argument>
                </Action>
              </Statements>
            </LookUpRecord>
          </Statements>
        </If>
      </ConditionalBlock>
      <ConditionalBlock>
        <If>
          <Condition>[paramFunc]="Min"</Condition>
          <Statements>
            <LookUpRecord>
              <Data Alias="T">
                <Query>
                  <References>
                    <Reference Source="table01" />
                  </References>
                  <Results>
                    <Property All="true" />
                  </Results>
                  <Ordering>
                    <Order Source="table01" Name="Field01" />
                  </Ordering>
                </Query>
                <WhereCondition>[table01].[Field01] Is Not Null</WhereCondition>
              </Data>
              <Statements>
                <Action Collapsed="true" Name="SetReturnVar">
                  <Argument Name="Name">rtnMaxMiniAvr</Argument>
                  <Argument Name="Value">[T].[Field01]</Argument>
                </Action>
              </Statements>
            </LookUpRecord>
          </Statements>
        </If>
      </ConditionalBlock>
      <ConditionalBlock>
        <If>
          <Condition>[paramFunc]="Avr"</Condition>
          <Statements>
            <Action Collapsed="true" Name="SetLocalVar">
              <Argument Name="Name">varCnt</Argument>
              <Argument Name="Value">0</Argument>
            </Action>
            <Action Collapsed="true" Name="SetLocalVar">
              <Argument Name="Name">varSum</Argument>
              <Argument Name="Value">0</Argument>
            </Action>
            <ForEachRecord>
              <Data>
                <Reference>table01</Reference>
                <WhereCondition>[table01].[Field01] Is Not Null</WhereCondition>
              </Data>
              <Statements>
                <Action Collapsed="true" Name="SetLocalVar">
                  <Argument Name="Name">varCnt</Argument>
                  <Argument Name="Value">[varCnt]+1</Argument>
                </Action>
                <Action Collapsed="true" Name="SetLocalVar">
                  <Argument Name="Name">varSum</Argument>
                  <Argument Name="Value">[varSum]+[table01].[Field01]</Argument>
                </Action>
              </Statements>
            </ForEachRecord>
            <ConditionalBlock>
              <If>
                <Condition>[varCnt]&gt;0</Condition>
                <Statements>
                  <Action Collapsed="true" Name="SetReturnVar">
                    <Argument Name="Name">rtnMaxMiniAvr</Argument>
                    <Argument Name="Value">[varSum]/[varCnt]</Argument>
                  </Action>
                </Statements>
              </If>
            </ConditionalBlock>
          </Statements>
        </If>
      </ConditionalBlock>
    </Statements>
  </DataMacro>
</DataMacros>
重要な補足
  • レコードの参照(LookupRecord)/レコードごと(ForEachRecord) は、AccessServicesの設定のクエリ 1 つあたりの最大行数(Maximum Rows per query)に影響を受ける。したがって、設定の既定値を超えて実行しようとすると、エラーが発生しマクロは終了する。
  • データマクロ実行中、レコードはロックされないから、必要な正確さを満たさないことがある。

0 件のコメント: