フィールドの動的な選択は結構悩ましい問題です。動的に行うとすれば、たいていバッチマクロでパラメータを書き換えれば簡単にできる、と思われると思いますが、セレクトツールの書き換えはすでにあるものしか書き換えができず、未知のものに対してリネームや選択などはできません。
このような場合は「フォーミュラで生XMLを更新」することで柔軟な対応が可能なのですが、あまり初心者向きではありません。
今回は、セレクトツールを使わずにフィールドを選択する方法をご紹介します。
「フィールドの共有サブセットを出力」オプション
ユニオンツールには、「フィールドの共有サブセットを出力」というオプションが用意されています。通常はたいていデフォルト設定で進めることができるため、このオプションには気づかないかもしれません。
このオプションは、入力されたデータセットすべてに存在するフィールドのみ通過させるオプションです。このオプションを使うことで、必要なフィールドのヘッダだけ入力すればセレクトツールの代わりに必要なフィールドの選択が可能です。
なお、フィールド名が異なる場合のオプションとして、フィールド名が異なる場合のオプションとして「無視-レコードの処理を続行」を選択することをおすすめします。
ユニオンツールを使ったフィールドの選択を行う
それでは、実際にやってみましょう。
元データはこちらのような形です。UnitPriceは場所を変えたいですし、Descriptionは不要です。
これに対して、以下のように定義します。
今回は、OrderとNameだけを活かします。つまり、Order順にフィールドを並べ替えつつ、4つのフィールドを残したい、というわけです。
この定義に対して、クロスタブツールで列ヘッダーを「Order」とし、新しい列の値として「Name」を指定します。
これで以下のようになります。
ここまで来るとみなさんおわかりかもしれませんが、動的リネームツールの出番です。「データの最初の行からフィールド名を取得」します。
すべてのフィールドを処理するようにチェックを入れておきましょう。
これでほしいヘッダができました。
これをユニオンツールに突っ込んでいきます。
ここでのポイントは、動的リネームツールの出力は必ず最初にユニオンツールに接続してください。実際に中身のあるデータセットはその後に接続します。
これは、フィールドの並び方(とデータ型)は最初に接続されたデータストリームのものを使うためです。「出力順序」オプションで出力順序の設定はできるのですが、フィールドの並び順は最初に接続されたデータストリームのものになってしまいます。
これで無事に並び順とほしいフィールドのみに絞ることができました。
この方法の唯一の方法の欠点は、フィールドの型がすべてテキスト型に変わってしまうことです。そのため、ユニオンしたあとにオートフィールドツールで型を変えるのが一番楽な方法です。ただ、定義通りなんとかしたい、ということであれば別の方法を利用する必要があります。
また、Blob型、SpatialObj型などがある場合はこのままではエラーになってしまいます。回避策としては、動的リネームツールの直後にフィールドの型を適切なものに変更する必要があります。
ということで、Blob型、SpatialObj型には対応していませんが、以下のようなワークフローでユニオンをセレクトツール代わりに使用することができました。
(2024/7/30追記)なお、フィールドの順番は気にしないので、データ型をなんとかしたい、ということであれば、データセットからユニオンツールへの接続を最初に行ってください。これにより、データ型は元のデータのものがそのまま利用されます(その場合はオートフィールドツールが不要になります)。ただ、フィールドの並び順は上の方法を使わないとうまく指定できないことに注意願います。
まとめ
- ユニオンツールの「フィールドの共有サブセットを出力」オプションでセレクトツール代わりに使うことができました
- フィールドの型がすべてテキスト型に変わるので注意してください。ヘッダの方のデータストリームをあらかじめ適切な型に変えておけば問題ありません。もしくは、ユニオン後にオートフィールドツールで型を変更することも可能です。
- Blob型、SpatialObj型がある場合はエラーになるため、ヘッダ側のデータストリームでユニオン前に型を変えておく必要があります(Blob型は型変換メニューに出てこないため、XMLビューにて強制的に書き換える必要があります)。
- テーブル定義は今回はテキスト入力ツールに埋め込んでいますが、動的に行う場合は、外部のCSVやExcelから読み込むケースが多いかと思います
サンプルワークフローダウンロード
次回
空間のTipsになります
コメント