はじめに
ASTERIA Warp開発でたまに使えるかもしれない小技や、設定・操作などの小ネタを集めてみました。
小ネタ
コンポーネント・関数の貼り付け
コンポーネントをコピーし、貼り付ける時に張り付ける場所が指定できます。
CTRL+V:コピー元と同じ場所に貼り付け
貼り付けたい場所で右クリックメニューから貼り付け:その場所に貼り付け
開いているフローのプロジェクトを確認する
フローを多く開いていたり、フローをコピーして作業をしていると、開いているプロジェクトがどのプロジェクトのものかわからなくなる時があります。フロータブにマウスカーソルを当てて待つと、プロジェクト名が表示されます。
検索ウィンドウの固定
ASTERIA Warpの検索機能は非常に強力ですが、検索ウィンドウを一度閉じてしまうと、再びWindowを開くためにはもう一度検索を行う必要があります。
検索結果ウィンドウのタイトルを右クリックすると、ドッキング可能が表示されますので、そちらをオンにすると、他のペインと同様にレイアウトに組み込めます。この状態でレイアウトに配置を行うとその情報は記憶され、検索タブをすべて消すと、検索結果タブは消えますが、再度検索すれば再び表示されます。
この状態を解除するためには検索結果タブをドラッグしフローデザイナー外にドラッグをします。
検索と同様に、2212で追加された「使用コネクション」2306で追加された「フロー呼び出し元」「使用フロー」もドッキングさせることが可能です。
デバッガーダイアログもドッキング可能なダイアログですが、このダイアログは右クリックメニューが表示されません。誤ってドッキングしてしまった場合はレイアウトの初期化を行うか、他のドッキング可能なダイアログをデバッガーダイアログのエリアでタブ表示させると、デバッガーのタブが出現し、そこから右クリックでフローティングを選択すれば再びダイアログに戻ります。残ったダイアログ(救出用にドッキングしたもの)は右クリックで「タイトルバーを表示」を選択する事で、タイトルが出現しますので、タイトルバーのフローティングに切り替えをクリックするか、タイトルバーをドラッグし、再びダイアログとします。
コンポーネントテンプレートの利用
フローを初期処理などを含めてテンプレート化するフローのテンプレートとはベつに、コンポーネント自体をテンプレート登録できますので、コンポーネントで頻繁に利用する設定などをテンプレートとして登録する事ができます。例えば、Table関数でCSV形式のマスタ情報を変換をいろいろなフローで行うような場合にテンプレート登録する、といった利用です。下記はTableコンポーネントの登録をテンプレート化する例です。
対象のコンポーネントの右クリックメニューから「テンプレートとして登録」を選択し登録名と説明を登録します。この際の説明は、テンプレート摘要後の説明の値ではなく、このテンプレート登録の内容説明です。”初期値にする”をチェックした場合、ドラッグする際の初期設定値を置き換えます。
使用する場合は、新たに配置されたTable関数を右クリックし、「テンプレートから選択」を選び、ウィンドウから適用するテンプレートを指定します。
削除、初期値の設定は左の一覧から行います。
フォルダの誤移動防止
フローデザイナーの操作で、気付かないうちにフォルダを選択して移動してしまった。という失敗があります。プロジェクトフォルダ以外にも、Table関数で共通で利用するファイルをホームフォルダ下に配置して共有する場合などで、このフォルダが知らない間にベつのフォルダ下に移動していて実行でエラーになった。というケースはだれしも1度くらいは経験すると思います。そういったミスを防止するために、対象のフォルダにロックファイル(移動防止.$$$など)を配置しておくと、フォルダ移動する前に「ファイルをロックできませんでした:[フォルダ名]」というダイアログが表示されるので誤移動防止になります。
フローデザイナーの環境設定
フローデザイナーの挙動を環境設定から自分の好みに合わせて変更しましょう。
ファイルフィルターの変更
プロジェクトを開く時にロックファイル(拡張子$$$)があると、ロック状態と判定され読取専用で開かれます。($$$の内容はIPアドレスです)
フローデザイナーの初期設定では、ロックファイルはファイルペインに表示されない様フィルターが設定されています。
フィルターを外し、ファイルのIPアドレスを確認し、使用者がプロジェクト編集中でなければ消しても問題ないため、$$$ファイルを消してプロジェクトを開きなおします。
クイックアイコンの表示の変更
クイックアイコンの表示を消したり、削除を消す場合は環境の「表示/編集」タブで変更します。
コンポーネント配置時の自動リンク
フローデザイナーでアイコンをドラッグして配置する場合の挙動を変えます。配置で自動リンクさせないならチェックオフにします。
すでにひかれているリンクの上にドラッグ配置すると、その位置にコンポーネントが挿入されますが、その際に後続を自動的にずらさない様にする場合にチェックオフにします。
自動バックアップ時の確認
プロジェクトを閉じるときにフローデザイナー側のローカルにファイルをバックアップする自動バックアップで、自動バックアップ時に確認ダイアログが開きますが、開かない様にする場合はチェックオフにします
小技
パラレルで分割された流れを合流させる
パラレルの合流で再び1つに合流したい場合Mapperを利用します。
この時Mapperの入力には複数が入力されますがJOINはされません。
入力1 |
---|
field1 |
入力2 |
---|
field2 |
入力3 |
---|
field3 |
Field1 | Field2 | Field3 |
---|---|---|
入力1のレコード1 | 入力2のレコード1 | 入力3のレコード1 |
入力1のレコード2 | 入力2のレコード2 | 入力3のレコード2 |
入力1のレコード3 | 入力3のレコード3 |
といった様に順に出力されます。
バイナリやテキストなどのレコード形式でない場合はオブジェクトとして入力ストリームに入りますので、各ストリームをMapper内でConcatして1つのストリームにする、という事も可能です。
入力レコードが無いときは出力ストリームにレコードを出力したくない
非常に分かりにくいですが、入力ストリームがレコードの無いものをMapperで受け取ったときに、そのMapperの条件なしレイヤーで固定値を設定している場合、固定値のみのレコードが1レコード出力されます。例としてはRDBGetで取得したレコードに初期値をMapperにて追加したい様な場合で取得レコードがない場合にキーの無い初期値のみが格納された1レコードが作成されます。
これは、Mapperがストリームを生成するコンポーネントであり、入力の有無に関係なく出力ストリーム値の設定がされていれば、その値をレコードに格納するためです。そのため条件なしレイヤーで固定値を移送すれば必ずレコードは1レコード以上が出力されます。通常ではマッピングの前に、入力レイヤーのレコード数など調べてBrachで$stream.RecordCount = 0などとしレコード数0の場合のバイパスをする事が考えられると思います。
無条件レイヤーにて移送する事でレコードが発生しますので、条件レイヤーでレコードがある場合にのみ移送する、とする事でレコードが無い場合にはレコードが生成されずフロー処理の簡略化が見込めます。
本件とは直接関係はありませんが、ヘルプに「LoopEndコンポーネントの直後にマッパーを配置した場合「レコード件数」は取得できません。」とある通り、Mapperのストリーム変数に表示されるレコード件数は、LoopEnd直後のMapperでは取得でできず0となりますが、条件レイヤーでの条件指定では$stream.RecordCountは参照可能です。
utf8の出力にBOMを付ける
ASTERIA Warpはutf8の出力時BOMをつける事が出来ません。そのためBOM付きのutf8ファイルを出力する場合はBOMを加工し追加する必要があります。CSVを一旦Convertでバイナリにし、Mapper内でBOM(EF BB BF)を結合します。
Nullを0にする
数値カラム値がNullの場合に0にしたい場合、Mapper内で該当項目をAdd関数で0を足す事で強制的にInteger変換されNullに0が設定されます。MultiFieldMapperで利用すると初期化の簡略化が行えます。
EXCELのテンプレートの管理
ExcelInput、ExcelOutputではEXCELを利用します(便宜上EXCELテンプレートと呼びます)。ExcelBuilderでは前回使用したファイルと異なる場合にはワーニングが表示されます。また、シートがなくなっている場合などではExcelBuilderが開けない事もあります。
それを防ぐために、ルールを決めておきます。
- Excelコンポーネントで使用するEXCELテンプレートはすべて同じ場所に保存する
- 保存するEXCELテンプレート名はプロジェクトの識別ができるようにする
- プロジェクトフォルダ使ったEXCELテンプレートを利用しなくても配置する
ストリーム定義ファイルの活用
ストリーム定義を行う場合XML、JSONの場合はファイルからインポートが行えますが、CSVの場合
「CSV形式で編集」を利用し名称の設定をしてると思います。このストリーム定義はStandard以上のエディションであれば、「ストリームセット定義」を利用して共通化する事も可能ですが、ファイルとしてエクスポートしておくことで項目定義を再利用する事が出来ます。マッパー変数や集計を行うRecordAggregateなどではCSV形式では編集できず、項目が多い場合結構大変です。マッパー変数やRecordAggregateはこのストリーム定義ファイルのインポートが行えますので、ストリームのエクスポートファイルを加工してインポートする事で作業を簡略化できます。ストリーム定義からエクスポートされた定義ファイルをそのままインポートしてもエラーとはなりませんが、一部値が設定されない状態でインポートされるためその後編集が必要です。インポート前に普段使用されているエディタプログラムの正規表現置き換えを利用し一部変更してからインポートを行います。
エクスポートされるストリームの定義ファイルはこのようなXML形式となっています。
<?xml version="1.0" encoding="utf-8"?>
<Table type="CSV">
<Row Name="商品番号" Type="String"/>
<Row Name="商品名" Type="String"/>
<Row Name="価格" Type="Integer"/>
</Table>
- ストリーム型からRecordAggregateの集計項目に置き換える場合
ストリームの定義の不要なカラムを削除し、必要なものだけ残し置き換えを行います。
下記例では、のこったものを「集計」として置き換えます。
-- 置き換え前正規表現
Row Name="(.+)" Type="(.+)"/>
-- 置き換え後
Row Default= "\1" Name="\1" Type="SUM"/>
Default:集計フィールド名
Name:出力フィールド名
Type:集計方法
集計方法 | Type |
---|---|
合計 | SUM |
平均 | AVG |
最大値 | MAX |
最小値 | MIN |
個数 | COUNT |
個数(重複を除く) | DCOUNT |
- ストリーム型からマッパー変数に置き換える場合
-- 置き換え前正規表現
Row Name="(.+)" Type="(.+)"/>
-- 置き換え後
Row Default= "" Name="\1" Type="\2" streamVariables="false"/>
- フロー変数からマッパー変数に置き換える場合
-- 置き換え前正規表現
<(.+)/>
-- 置き換え後
<\1 streamVariables="false"/>
起動、終了のログだけ別にしたい
ASTERIA Warpの実行ログは、設定を変更しなければシステムログ(FlowService.log)に出力されます。FlowService.logにはすべてのLogが記録されます。logの出力を分離するためにはアプリケーションログが利用されます。例えば、「フローの開始、終了だけを別のログで記録しログを見やすくしたい」「httpリクエストのみを独立したLogとし、リクエスト状況を把握したい」といった場合です。ログの出力先を選択できる箇所はフローの「アプリケーションログ設定」で可能ですが、ここで設定した場合、そのフローのログがすべてアプリケーションログに出力されますので、そういった用途には向きません。個別のアプリケーションログに出力を行う場合は、コンポーネントのログ設定を利用します。
ログに記録する内容はプロパティ式で記述します。Ifで条件指定なども可能です。
ログ設定の出力タイミングはコンポーネントを出るときに書かれる様です。例えばMapperの場合であればMapperへ入った際に記録されるわけではなく、Mapperから出るときになります。ログ設定ではストリーム変数は利用できませんので、ストリームのレコード数等を記録する場合、ログ出力用のフロー変数を用意し、Mapper内でそのフロー変数に格納する事で出力を行います。フロー変数ですので移送のタイミングに注意して下さい。
RDBPutのUpdate.Deleteで全レコード対象で処理したい
RDBPutはInput、Update、Deleteを行えるコンポーネントですが、入力ストリームに登録、更新、削除の判定となるキーを入力ストリームで指定する必要があります。SQLCallの使用できないCore+で、全削除を行いたい場合にRDBGetで削除を行う場合が事前に削除対象のレコードを読み込みしなければならず処理効率が悪いです。
RDBPutの「キーを指定」のキーは一意キーである必要はありません。そのテーブルに対してそのキーを持っているレコードがすべて対象となります。そのため全削除を行いたい場合、すべてのレコードに同一の値が入っているカラムをキーとし、そのキーを指定した1レコードを入力ストリームとすれば、対象のレコードはすべてDeleteされる事となります。
Viewで削除を行えるデータベースであれば、専用のViewを作成しても良いでしょう。
create view v_corporatemst_wk as
select
sequenceNumber,
CONVERT(VARCHAR(8), insert_date, 112) del_column1,
1 del_column2
from
TestDB.dbo.corporatemst_wk cw;
当然ですがこの方法で削除すれば対象レコードがすべて消える事となりますので、内容をよく理解し、事前に十分な検証を実施してください。
応用として、時間も含まれている日時カラムに対し指定日のデータ一括更新したい・削除したい、という場合であれば、削除用ビューを作成し単一条件指定できるカラムを用意し(上記例のdel_column1)それをキーに指定する事で対象日付の一括削除が可能になります。
ファイルのパス指定文字の指定
ファイルパスの指定時、スラッシュかバックスラッシュのどちらを指定したらよいかですが、ASTERIA Warp上の参照・出力であればどちらでも良いです。外部で利用する(EXEコンポーネントの引数として利用する場合など)はOSに合わせる必要がありますが、ASTERIA上で使い限りはどちらを使用しても問題なく、スラッシュとバックスラッシュが混在しても変換してどちらかいに合わせる、という事をしなくても問題なく動作します。
C:/asteriahome5/home/@demo/demo01/Qiita/Qoo5/Qiita/Qoo5/wk
C:\asteriahome5\home\@demo\demo01\Qiita\Qoo5\Qiita\Qoo5\wk
ストリームCSV型でのバックスラッシュ二重化
CSV型のストリーム定義で囲み文字を指定していて「囲み文字のエスケープ」が”バックスラッシュ”となっている場合、CSVのカラムに\が含まれているとその\が2重化されて出力されます。ストリーム内部ではバックスラッシュは1つのままで保持されれていますが、CSV型のがテキスト出力の時点でバックスラッシュが二重化されてしまいます。解消方法は以下のものが考えられます
- 「囲み文字のエスケープ」を”二重化”に設定
- 「囲み文字」を"(none)"に設定
- CSVストリームをConvertでテキスト型に変換し、MapperでStringReplace関数を使用し文字を置き換える
StringReplace関数の「置き換えテーブルの内容」は以下を指定します。
\\\\=\
数値の文字変換書式
マッパー関数のFormat関数で数値をで文字にする際、プラス、マイナスの書式指定はセパレータを使用して記述できますが、3つめのゼロの場合判定は行えないため、ゼロの書式を変えたい場合は事前に判定を行う必要があります。
プラスの場合:#,##0、マイナスの場合:(#,##0)、ゼロの場合-としたい場合「数値フォーマット」にしたい場合でも3番目に指定ができないため、先に0かどうかを判定し、BoolIf関数で、0なら-を指定しそうでないなら、Format関数の結果とします。
--OK
#,##0;(#,##)
--NG
#,##0;(#,##);-
Velocityコンポーネント
$や#を出力したい
Velocityコンポーネントを利用時に、$や#を文字やtrue/falseを出力したい場合にテンプレートへ含めるとエラーになります。そのような場合はローカル変数を定義し固定値として出力するようにします。
#は単体ではエラーになりますが、#1などの場合はエラーとなりません。例外的に#ifや#defineなどVelocityの構文や、単一コメント:##、複数行コメント:#* *#もコメントと解釈されますので、これらをそのままの文字として出力したい場合は同様の手法を用います(ないとは思いますが)。
変数名 | 値(文字) |
---|---|
cDollar | $ |
cSharp | # |
cTrue | true |
cFalse | fasle |
-- $trueと出力したい場合
$local.get("cDollar")$local.get("cTrue")
$local.get("cDollarTrue")
-- cDollarTrueを$trueと設定する
アクセント記号変換
データに登録されているアクセント記号や、数値文字参照、文字実体参照を記号文字に変換したい場合、Mapper関数のStringReplaceを使用し文字置き換えを行います。
変換ファイルで置き換えする場合は下記サンプルの様なファイルを利用します。その際の文字コードはutf8を明示的に指定します。BOM付きファイルを利用する場合1行目の先頭に3バイトが付加されますので、BOM無しファイルを利用するか、1行目にダミーを指定します。
Standard以降のエディションで関数化する場合、ファイルをホームフォルダ配下とするか、関数内のStringReplaceに直接入力で指定します。
文字実体参照サンプル
¡=¡
¢=¢
£=£
¤=¤
¥=¥
¦=¦
§=§
¨=¨
©=©
ª=ª
«=«
¬=¬
=­
®=®
¯=¯
°=°
±=±
²=²
³=³
´=´
µ=µ
¶=¶
·=·
¸=¸
¹=¹
º=º
»=»
¼=¼
½=½
¾=¾
¿=¿
À=À
Á=Á
Â=Â
Ã=Ã
Ä=Ä
Å=Å
Æ=Æ
Ç=Ç
È=È
É=É
Ê=Ê
Ë=Ë
Ì=Ì
Í=Í
Î=Î
Ï=Ï
Ð=Ð
Ñ=Ñ
Ò=Ò
Ó=Ó
Ô=Ô
Õ=Õ
Ö=Ö
×=×
Ø=Ø
Ù=Ù
Ú=Ú
Û=Û
Ü=Ü
Ý=Ý
Þ=Þ
ß=ß
à=à
á=á
â=â
ã=ã
ä=ä
å=å
æ=æ
ç=ç
è=è
é=é
ê=ê
ë=ë
ì=ì
í=í
î=î
ï=ï
ð=ð
ñ=ñ
ò=ò
ó=ó
ô=ô
õ=õ
ö=ö
÷=÷
ø=ø
ù=ù
ú=ú
û=û
ü=ü
ý=ý
þ=þ
ÿ=ÿ
¡=¡
¢=¢
£=£
¤=¤
¥=¥
¦=¦
§=§
¨=¨
©=©
ª=ª
«=«
¬=¬
­=
®=®
¯=¯
°=°
±=±
²=²
³=³
´=´
µ=µ
¶=¶
·=·
¸=¸
¹=¹
º=º
»=»
¼=¼
½=½
¾=¾
¿=¿
À=À
Á=Á
Â=Â
Ã=Ã
Ä=Ä
Å=Å
Æ=Æ
Ç=Ç
È=È
É=É
Ê=Ê
Ë=Ë
Ì=Ì
Í=Í
Î=Î
Ï=Ï
Ð=Ð
Ñ=Ñ
Ò=Ò
Ó=Ó
Ô=Ô
Õ=Õ
Ö=Ö
×=×
Ø=Ø
Ù=Ù
Ú=Ú
Û=Û
Ü=Ü
Ý=Ý
Þ=Þ
ß=ß
à=à
á=á
â=â
ã=ã
ä=ä
å=å
æ=æ
ç=ç
è=è
é=é
ê=ê
ë=ë
ì=ì
í=í
î=î
ï=ï
ð=ð
ñ=ñ
ò=ò
ó=ó
ô=ô
õ=õ
ö=ö
÷=÷
ø=ø
ù=ù
ú=ú
û=û
ü=ü
ý=ý
þ=þ
ÿ=ÿ
数値実体参照サンプル
¡=¡
¢=¢
£=£
¤=¤
¥=¥
¦=¦
§=§
¨=¨
©=©
ª=ª
«=«
¬=¬
­=
®=®
¯=¯
°=°
±=±
²=²
³=³
´=´
µ=µ
¶=¶
·=·
¸=¸
¹=¹
º=º
»=»
¼=¼
½=½
¾=¾
¿=¿
À=À
Á=Á
Â=Â
Ã=Ã
Ä=Ä
Å=Å
Æ=Æ
Ç=Ç
È=È
É=É
Ê=Ê
Ë=Ë
Ì=Ì
Í=Í
Î=Î
Ï=Ï
Ð=Ð
Ñ=Ñ
Ò=Ò
Ó=Ó
Ô=Ô
Õ=Õ
Ö=Ö
×=×
Ø=Ø
Ù=Ù
Ú=Ú
Û=Û
Ü=Ü
Ý=Ý
Þ=Þ
ß=ß
à=à
á=á
â=â
ã=ã
ä=ä
å=å
æ=æ
ç=ç
è=è
é=é
ê=ê
ë=ë
ì=ì
í=í
î=î
ï=ï
ð=ð
ñ=ñ
ò=ò
ó=ó
ô=ô
õ=õ
ö=ö
÷=÷
ø=ø
ù=ù
ú=ú
û=û
ü=ü
ý=ý
þ=þ
ÿ=ÿ
¡=¡
¢=¢
£=£
¤=¤
¥=¥
¦=¦
§=§
¨=¨
©=©
ª=ª
«=«
¬=¬
=­
®=®
¯=¯
°=°
±=±
²=²
³=³
´=´
µ=µ
¶=¶
·=·
¸=¸
¹=¹
º=º
»=»
¼=¼
½=½
¾=¾
¿=¿
À=À
Á=Á
Â=Â
Ã=Ã
Ä=Ä
Å=Å
Æ=Æ
Ç=Ç
È=È
É=É
Ê=Ê
Ë=Ë
Ì=Ì
Í=Í
Î=Î
Ï=Ï
Ð=Ð
Ñ=Ñ
Ò=Ò
Ó=Ó
Ô=Ô
Õ=Õ
Ö=Ö
×=×
Ø=Ø
Ù=Ù
Ú=Ú
Û=Û
Ü=Ü
Ý=Ý
Þ=Þ
ß=ß
à=à
á=á
â=â
ã=ã
ä=ä
å=å
æ=æ
ç=ç
è=è
é=é
ê=ê
ë=ë
ì=ì
í=í
î=î
ï=ï
ð=ð
ñ=ñ
ò=ò
ó=ó
ô=ô
õ=õ
ö=ö
÷=÷
ø=ø
ù=ù
ú=ú
û=û
ü=ü
ý=ý
þ=þ
ÿ=ÿ
2つの日付間の日数を取得したい
RecordSQLで使用できるDATEDIFF関数を利用します。RecordSQLのインプットストリームをレコード型でカラムをFormDate、ToDateとし、RecordSQLを利用します。
select DATEDIFF(DAY ,field[1], field[2]) cnt from in[1]
DATEDIFFでMONTHの指定をした場合はその月自体の差を求めます。期間としての月数を求める場合は、MONTHS_BETWEENを利用します。
例:2024/5/10と2024/6/9の差を取得する場合
DATEDIFFをMONTHを使用した場合:1
MONTHS_BETWEENを使用した場合:0.967741935483871
RecordSQLのDATEDIFFの詳細はこちらを参照。 [↗]
最後に
小ネタ系はもともと書き留めておきたいとおもっていたんですが、検証や「それってどうなの?」みたいものも結構あり、なかなか掲示するまでには至りませんでした。また、バージョンが進んで解消されたものもあります(例えば、「モニターツールはモーダルウィンドウでシフトキー押しながらだとモードレスウィンドウ表示になる」などです)今回はある程度ネタとして有効なものがそろってきたので一旦公開し、追加があれば随時更新していこうと思います。