メニューボタン
IBMi海外記事2023.08.23

SQLを使用してIFSディレクトリーを比較する

Mike Larsen 著

私はほぼ毎日、SQLを業務で使用しています。それは、ACSでの単なる照会の場合もあれば、RPGプログラムの組み込みSQLの場合もあります。数日前、あるIFSディレクトリーの内容と別のIFSディレクトリーの内容を比較することが必要となりました。いくつかの異なる表関数を組み合わせて、素晴らしいソリューションを開発することができました。

注: この記事で使用しているコードは、 こちらでダウンロードすることができます

この例では、5つのテキスト ファイルが入っているディレクトリーがあります。また、3つのテキスト ファイルが入っている2つ目のディレクトリーがあり、それらは1つ目のディレクトリー内にあるのと同じドキュメントです。ここでの目的は、2つ目のディレクトリー内にはない、1つ目のディレクトリー内にある2つのドキュメントを識別することです。図1および図2に、両ディレクトリーの図を示します。

図1. ディレクトリー1

図2. ディレクトリー2

以下に、SQLステートメント全体を示します(図3)。その後で、コードを部分ごとに分けて見て行きます。

図3. SQLステートメント

1~9行目では、表関数 Ifs_object_statisticsを使用して、1つ目のディレクトリーからの情報を収集しています。また、3~5行目では、 Systools.split 表関数も使用しています。これはどうしてでしょうか。 Ifs_object_statistics は、ディレクトリー内のアイテムのフル パスを返します。一方、ここではアイテムの名前を比較したいだけです。 Systools.split 表関数を使用することで、このケースでは、ドキュメントの名前を抽出することができます。パス名をスラッシュで分割して、4番目の順序を示す位置を使用しています。その位置が、ドキュメントの名前がある位置だからです。

9行目の最後で、2つ目のディレクトリーに例外結合を行っています。再度、表関数 Ifs_object_statistics を使用して、そのディレクトリーについての情報を取得します。2つ目のディレクトリーにはない、どのようなドキュメントが、1つ目のディレクトリー内にあるのかを確認したいので、例外結合タイプを使用しています。

面白くなるのはここからです。13~15行目および17~19行目では、 Systools.split 表関数を使用して、ドキュメント名で2つの表を結合します。そうすることにより、どのドキュメントが1つ目のディレクトリー内にあって、2つ目のディレクトリー内にはないのか確認することができます。

最後に、21行目では、2023年6月10日以降に作成されたファイルのみを選択するための基準を使用しています。

このステートメントを実行すると、 testDocument2.txt および testDocument4.txt は2つ目のディレクトリーにはないことが分かります(図4)。

図4. 比較の結果

この短い(しかし、強力な)SQLステートメントは、求めていた結果を提供してくれて、実際の本番状況で役に立ちました。皆さんのお役に立つこともあると思います。

あわせて読みたい記事

PAGE TOP