eDocArrangement2 ヘルプ / 共通マクロ書式
条件を判定し、条件に合致する場合は真の値を返却し、合致しない場合は偽の値を返却します。条件の比較記号は、>,<,=,>=,<=,!=が使用可能です。条件の左辺、右辺が両方とも数字の場合、数値としての比較を行います。それ以外は文字比較になります。条件や、真の値、偽の値には、各種書式を入れ子で記述することが可能です。
カンマそのものを条件や値に記述したい場合は、「|,」と記述します。
比較式の左辺と右辺が両方とも数値の場合は、比較を数値として行います。
数値として比較できるのは18桁までです(符号や小数点も桁数に含みます)。左辺・右辺のいずれかが19桁以上の数字の場合は「19桁以上の数字の比較をすることができません。」というエラーになります。19桁以上の数字を比較したい場合は、例2のように先頭に数字以外の文字を付加して文字列として比較してください。
数値として比較できる桁数の上限は、Version 2.6.5から18桁に拡大されました(Version 2.6.4以前は8桁まで。それぞれ19桁以上、9桁以上でエラーとなります)。
比較式の左辺、右辺は空白も文字列として比較対象とします。
例1 現在の日が20日より後の場合、翌月を返却し、20日以前の場合は、当月を返却する場合
{%SET_U(属性,処理日,{%DATE(yyyy/MM/dd)})}
{%IF({%FORMAT({%GET_U(属性,処理日)},dd)}>20,{%DATE_ADD({%GET_U(属性,処理日)},yyMM,+1M)},{%FORMAT({%GET_U(属性,処理日)},yyMM)})}
現在の日付が2004年2月20日の場合、0402となります。
現在の日付が2004年2月21日の場合、0403となります。
DATEマクロはマクロ毎にシステム日付を取得するので、0時付近に処理をすると日付が変わるので、上記のようにユーザーデータに一度セットしてから、ユーザーデータの日付で判定と取得を行います。
例2 19桁以上の数字を比較する場合(文字列として比較)
19桁以上の数字は数値として比較できないため、桁数を揃えて先頭に数字以外の文字(例: x)を付加し、文字列として比較します。桁数を揃えるには、STRINGマクロで0を並べた文字列を数字の先頭に連結し、RIGHTマクロで右から必要な桁数を取り出します(0埋め)。文字列比較は先頭の文字から順に行われるため、桁数を揃えないと正しく大小判定できません。先頭のxは両辺に付けることで、数値ではなく文字列として比較させるためのものです(x以外の数字以外の文字でも構いません)。
{%IF(x{%RIGHT({%STRING(0,20)}1234567890123456789,20)}<x{%RIGHT({%STRING(0,20)}1234567890123456790,20)},小さい,大きいか等しい)}
結果
小さい
{%STRING(0,20)} で「00000000000000000000」(0を20個)を作り、その後ろに数字を連結してから {%RIGHT(...,20)} で右から20文字を取り出すことで、20桁に0埋めした文字列になります。
両辺とも「x」で始まる同じ桁数の文字列に変換され、文字列として比較されます。
STRINGとRIGHTの桁数(例では20)は、比較する数字の最大桁数に合わせて指定します。
この方法は数値への変換を行わない文字列処理のため、桁数に上限はありません。FORMATマクロでも0埋めできますが、値が9223372036854775807(Int64の最大値)を超えると内部で丸められて正しく桁を揃えられないため、19桁以上の数字にはこのSTRING+RIGHTの方法を使用してください。口座番号などで元の値が既に同じ桁数の文字列として得られる場合は、0埋めを行わず両辺の先頭にxを付けるだけで比較できます。
文字列を繰り返し回数分展開します。名前には任意の文字列を指定します。文字列には、改行が含まれても問題ありません。
文字列には、以下の特殊キーワードが使用できます。
[L_IDX(名前)]
L_IDXキーワードは、LOOPマクロの引数文字列中に使用すると、ループの展開時に、インデックスに置換します。名前には、LOOPマクロで指定した名前と同じ名前を指定します。
例1 ログ出力を3回繰り返す。
{%LOOP L1 3(
{%WRITE_LOG([L_IDX(L1)])}
)}
結果 1 2 3
ファイルの繰り返しパネルと同等のファイルループ処理をマクロで実行します。
識別子はファイルの繰り返し式の処理名としてログに出力されます。
オプションには、あらかじめSET_Uマクロで属性をセットしたユーザーデータのキー名を指定します。オプションを省略(空括弧)した場合は、すべての属性がデフォルト値で動作します。
文字列にはファイル毎に実行するマクロを記述します。文字列には改行が含まれても問題ありません。文字列中ではGETマクロの以下の値が使用できます。
{%GET(FullPathFileName)} ... 処理中のファイルのフルパス
{%GET(FileLoopCount)} ... 現在のループカウンタ(1始まり)
{%GET(FileCount)} ... ファイル総数
LOOPマクロのL_IDXキーワードもLOOP_FILEの文字列中で使用できます。
ファイルの繰り返しパネルと同等の以下の処理を自動的に行います。
キャンセル処理(Cancel / FileLoopCancel)
ログ出力(「~を処理します。」)
プログレスバーの初期化・カウントアップ・後処理
ユーザーデータのクリア(属性で指定した場合)
中断条件(Until)の評価
エラーハンドリング(ErrCatch / ErrorProc)
グループ処理(File / Folder / RegExp)
メインファイルリスト処理時の「実行済み」状態出力
分割データの削除
オプションで指定したユーザーデータにセットできる属性は以下の通りです。
|
属性名 |
値 |
|---|---|
|
LoopTarget |
繰り返し対象。省略時は「メイン画面のファイルリスト」。 メイン画面のファイルリスト 処理名(ファイル検索処理等の処理名) |
|
Group |
グループ単位。省略時は「なし(ファイル)」。 なし(ファイル) フォルダ フルパスの一部(正規表現) |
|
GroupSortOrder |
グループの並び順。省略時は「昇順」。 昇順 昇順 (自然順) 降順 降順 (自然順) |
|
GroupRegEx |
グループ単位が「フルパスの一部(正規表現)」の場合の正規表現。 |
|
FileSort |
ファイルの並べ替えを行うかどうか。省略時は「しない」。 する しない |
|
SortTarget |
並べ替え対象。省略時は「ファイル」。 ファイル フルパス フルパスの一部(正規表現) 更新日 作成日 |
|
SortOrder |
並べ替え順。省略時は「昇順」。 昇順 昇順 (自然順) 降順 降順 (自然順) |
|
SortRegEx |
並べ替え対象が「フルパスの一部(正規表現)」の場合の正規表現。 |
|
ClearUserData |
ファイル毎にユーザーデータをクリアするかどうか。省略時は「しない」。 する しない |
|
UserDataNotCleared |
ClearUserDataが「する」の場合にクリアしないユーザーデータのキーをカンマ区切りで指定。 |
|
ErrCatch |
エラー発生時にループを中断するかどうか。省略時は「しない」。 する しない |
|
ErrorProc |
エラー発生時に実行するマクロ文字列。マクロで指定する場合は{%ESCAPE()}でマクロ文をエスケープして指定してください。 |
|
Until |
中断条件のマクロ文字列。各ループの先頭で評価され、結果が「true」の場合にループを中断します。マクロで指定する場合は{%ESCAPE()}でマクロ文をエスケープして指定してください。 |
LOOP_FILE実行中にエラーが発生すると、デフォルト(ErrCatch省略時=「しない」)ではエラーを「エラー」レベルでログに出力し、次のファイルの処理を継続します。ErrCatch属性を「する」に設定するとエラー発生時にループを中断します。ループ本体の処理を TRY_CATCH マクロで囲むと、エラーの内容をGET_ERROR_MESSAGE()で取得してログに記録するなど、柔軟なエラーハンドリングが可能です。また、TRY_CATCHでキャッチされたエラーはエラー回数に加算されないため、エラーレベルのログ出力を抑制できます。
例1 オプションを省略してデフォルト設定でファイルの繰り返しを行う。ソートなし、グループなしで投入順に処理する。
{%LOOP_FILE FL1()(
{%WRITE_LOG([L_IDX(FL1)] / {%GET(FileCount)} : {%GET(FullPathFileName)})}
)}
例2 ファイル名の昇順(自然順)に並べ替えてファイルの繰り返しを行う。
{%SET_U(Attr,FileSort,する)}
{%SET_U(Attr,SortTarget,ファイル)}
{%SET_U(Attr,SortOrder,昇順 (自然順))}
{%LOOP_FILE FL1(Attr)(
{%WRITE_LOG({%GET(FullPathFileName)})}
)}
例3 ファイル毎にユーザーデータをクリアし、エラー発生時もループを継続する。
{%SET_U(Attr,ClearUserData,する)}
{%SET_U(Attr,UserDataNotCleared,Attr)}
{%SET_U(Attr,ErrCatch,しない)}
{%LOOP_FILE FL1(Attr)(
{%WRITE_LOG({%GET(FullPathFileName)})}
)}
例4 中断条件(Until)を使い、先頭3件のみ処理する。SET_Uでマクロ文を指定する場合は{%ESCAPE()}でエスケープし、マクロ文がそのまま保存されるようにする。
{%SET_U(Attr,FileSort,する)}
{%SET_U(Attr,SortTarget,ファイル)}
{%SET_U(Attr,SortOrder,昇順)}
{%SET_U(Attr,Until,{%ESCAPE({%IF({%GET(FileLoopCount)}>=4,True,False)})})}
{%LOOP_FILE FL1(Attr)(
{%WRITE_LOG({%GET(FullPathFileName)})}
)}
例5 TRY_CATCHを使い、ファイル毎にエラーハンドリングを行う。エラーが発生してもログに記録して次のファイルの処理を継続する。
{%LOOP_FILE FL1(Attr)(
{%TRY_CATCH(
{%WRITE_LOG({%GET(FullPathFileName)} を処理中)}
{%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})}
,
{%WRITE_LOG(エラー: {%GET_ERROR_MESSAGE()})}
)}
)}
引き数の左辺と右辺を比較するための比較演算式情報を作成します。
比較演算子には、「<,>,<=,>=,=,!=,正規表現,部分一致,前方一致,後方一致」の何れかが指定できます。
比較演算を行うためのデータ(JSON文字列)を作成します。
この比較演算用の文字列は条件式評価マクロ(EVALUATE)等で判定を行うことができます。
例1 年齢が20以上であるかを判定する比較演算式情報を作成する。
{%SET_U(属性,年齢,21)}
{%CREATE_COMPARE({%GET_U(属性,年齢)},>=,20)}
例2 処理中ファイルのパスに「総務課」が含まれるかを判定する比較演算式情報を作成、評価して条件分岐の処理を行う。
{%IF({%EVALUATE({%CREATE_COMPARE({%GET(FullPathFileName)},部分一致,総務課)})}=True,
#条件を満たす場合
{%WRITE_LOG(条件を満たしています。)}
,
#条件を満たさない場合
{%WRITE_LOG(条件を満たしていません。)}
)}
例3 処理中ファイルのパスに「営業1課」又は「総務課」が含まれるかを判定する比較演算式情報を作成する。
{%CREATE_COMPARE({%GET(FullPathFileName)},正規表現,(?:営業1課|総務課))}
例3 処理中ファイル名の先頭が2024で始まっているかを判定する比較演算式情報を作成する。
{%CREATE_COMPARE({%GET(FileName)},前方一致,2024)}
論理演算を行うための論理演算式情報を作成します。
2番目以降の引き数に指定された論理演算式または比較演算式を、1番目の引き数で指定された論理積(AND)又は論理和(OR)又は排他的論理和(XOR)で論理演算を行うためのデータ(JSON文字列)を作成します。
この論理演算用の文字列は条件式評価マクロ(EVALUATE)等で判定を行うことができます。
例1 年齢が20以上、且つ、50以下であるかを判定する条件を作成する
{%SET_U(属性,年齢,21)}
{%CREATE_OPERATOR(AND,
{%CREATE_COMPARE({%GET_U(属性,年齢)},>=,20)},
{%CREATE_COMPARE({%GET_U(属性,年齢)},<=,50)}
)}
比較演算式情報、論理演算式情報から演算式を評価します。
比較演算式作成マクロや論理演算式作成マクロで作成された演算を行うためのデータ(JSON文字列)を引き数に指定します。
評価の結果、条件を満たす場合はTrueを満たさない場合はFalseを返却します。
例1 年齢が20以上、且つ、50以下であるかを判定する条件を評価する。
{%SET_U(属性,年齢,21)}
{%SET_U(temp,条件式,
{%CREATE_OPERATOR(AND,
{%CREATE_COMPARE({%GET_U(属性,年齢)},>=,20)},
{%CREATE_COMPARE({%GET_U(属性,年齢)},<=,50)}
)}
)}
{%IF({%EVALUATE({%GET_U(temp,条件式)})}=True,
#条件を満たす場合
{%WRITE_LOG(条件を満たしています。)}
,
#条件を満たさない場合
{%WRITE_LOG(条件を満たしていません。)}
)}
第1引数のマクロを実行し、エラーが発生した場合に第2引数のマクロを実行します。
エラーが発生しなかった場合は、第1引数の実行結果を返却します。
エラーが発生した場合は、エラーメッセージを設定してから第2引数のマクロを実行し、その結果を返却します。第2引数が省略された場合は空文字を返却します(エラーを無視します)。
TRY_CATCHはエスケープ系マクロです。引数部分のマクロは自動的にエスケープされ、TRY_CATCH内部で個別に実行されます。そのため、引数をESCAPEマクロでエスケープする必要はありません。
TRY_CATCHでキャッチされたエラーは、処理階層内のエラー回数(CurrentErrorCount)には加算されません。エラーは「処理済み」として扱われます。
エラー時の処理中で{%GET_ERROR_MESSAGE()}を使用すると、発生したエラーのメッセージを取得できます。
例1 エラーが発生する可能性のある処理を実行し、エラー時にエラーメッセージをログに出力する。
{%TRY_CATCH(
{%WRITE_LOG(処理を開始します)}
{%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})}
,
{%WRITE_LOG(エラー発生: {%GET_ERROR_MESSAGE()})}
)}
例2 エラーを無視して処理を続行する(第2引数を省略)。ファイル移動に失敗してもエラーにならない。
{%TRY_CATCH({%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})})}
例3 LOOP_FILEと組み合わせて、ファイル毎にエラーハンドリングを行う。エラーが発生しても次のファイルの処理を継続する。
{%LOOP_FILE FL1(Attr)(
{%TRY_CATCH(
{%WRITE_LOG([{%GET(FileLoopCount)}/{%GET(FileCount)}] {%GET(FileName)})}
{%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})}
,
{%WRITE_LOG(エラー: {%GET_ERROR_MESSAGE()})}
)}
)}
例4 複数の処理ステップをそれぞれ独立してエラーハンドリングする。ステップ1でエラーが発生してもステップ2は実行される。
{%LOOP_FILE FL1(Attr)(
{%TRY_CATCH(
{%WRITE_LOG(ステップ1: マクロ実行)}
{%PARSE_MACRO({%GET_U(属性,マクロ)})}
,
{%WRITE_LOG(ステップ1でエラー: {%GET_ERROR_MESSAGE()})}
)}
{%TRY_CATCH(
{%WRITE_LOG(ステップ2: ファイル移動)}
{%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})}
,
{%WRITE_LOG(ステップ2でエラー: {%GET_ERROR_MESSAGE()})}
)}
)}
例5 TRY_CATCHをネストして、エラー時の処理自体のエラーもハンドリングする。
{%TRY_CATCH(
{%MOVE_FILE({%GET(FullPathFileName)},C:\Output\{%GET(FileName)})}
,
{%TRY_CATCH(
{%WRITE_LOG(エラー: {%GET_ERROR_MESSAGE()})}
{%SET_U(通知先,1,admin@example.com)}
{%SEND_MAIL(メールサーバー1,通知先,noreply@example.com,,,エラー通知,{%GET_ERROR_MESSAGE()})}
,
{%WRITE_LOG(エラー通知の送信にも失敗しました)}
)}
)}