2013/03/23

Office 365 Access アプリ -9- レコードごと データ ブロック

ForEachRcord そのまんま"レコードごと"。テーブルもしくはクエリから参照したレコードを順次処理を行う。

  レコードごと/ForEachRecord データ ブロック内でいくつかのデータ ブロックやデータ アクションを使用することができるのだけど、例えばレコードの編集/EditRecord データブロックを使用した場合、参照されているすべてのレコードに対しフィールドの編集を行うことができる。レコードの削除/DeleteRecord アクションを使用した場合、すべてのレコードを削除することになる。当然 If プログラム フローなどでフィールドの値を判定しながら処理することもできる。


  レコードごと データブロックが終了するのは、
  • 最後のレコードについての処理が終了した時
  • エラーの生成/RaiseError アクションが実行された時
  • マクロの中止/StopMacro アクションが実行された時
  • レコードごとに終了/ExitForEachRecord アクションが実行された時
  このあたりは、トレース テーブルで確認することができる。
  なお、レコードごと データ ブロックで参照するレコードが 0レコードであった場合は、ブロック内のアクションはすべて実行されない。

  以下、サンプルでFizz Buzzをデータマクロで実行してみる。

非常にシンプルなテーブルを用意。
こんな感じで 30レコードほど
  こんな感じでレコードごとのフィールドの値を参照しながら処理を分岐させてすべてのレコードを更新している。"Where 条件式/Where Condition"引数で参照するレコードをフィルタすることも可能。
  レコードごと データ ブロックで参照するレコードの順番に厳密さが必要である場合、ソートを設定したクエリを使用する。
  SQL Azure 上ではストアド プロシージャになっているが、概ねどのような動作になっているのかは、
  1. @@TRANCOUNT > 0 である時、SAVE TRANSACTION
  2. @@TRANCOUNT = 0 である時、BEGIN TRANSACTION
  3. レコードごと データ ブロックに相応する部分のトランザクションの分離レベルは、SERIALIZABLE
  4. テーブルやPKを含むクエリを参照する場合、PKの"ID"で昇順ソート
  5. @@FETCH_STATUS = 0 である間、カーソルをフェッチ
  6. WHILEを抜けたら、トランザクション分離レベルは、READ COMMITTED
  7. BEGIN TRANSACTION している場合、COMMIT

  
    
      
        
          t_FizzBuzz
        
        
          
            
            
              
                
                  
                    
                      [t1].[ID] Mod 3=0
                      
                        
                          
                          
                        
                        
                      
                    
                  
                  
                    
                      rtnFizzBuzz
                      
                        
                          "Fizz"
                          
                        
                      
                    
                  
                
              
              
                
                  
                    
                      [t1].[ID] Mod 5=0
                      
                        
                          
                          
                        
                        
                      
                    
                  
                  
                    
                      rtnFizzBuzz
                      
                        
                          Concat([rtnFizzBuzz],"Buzz")
                          
                            
                            
                          
                        
                      
                    
                  
                
              
              
                t1.FizzBuzz
                
                  
                    Coalesce([rtnFizzBuzz],Format([t1].[ID],'0'))
                    
                      
                      
                        
                        
                      
                    
                  
                
              
              
                rtnFizzBuzz
                
                  
                    Null
                    
                  
                
              
            
          
        
      
    
  

0 件のコメント: