JCo を使用して、SAP から MySQL データベースにデータを抽出する単純な Java ユーティリティを作成しようとしています。JCo のドキュメントを理解し、 SAP ヘルプ ポータルに記載されている関連する例を試してみました。テーブルからデータを取得し、MySQL DB に挿入することができました。
私が欲しいのは、次の2つの方法でデータをフィルタリングする機能です:
- 必要なフィールドだけを取得したいと思います。
- 特定のフィールドの値が特定のパターンに一致する場合にのみ、行をフェッチしたいと思います。
いくつかの調査を行った後、フィルター処理されたデータのみを取得するようにクエリパラメーターを指定する方法が見つかりませんでした。基本的に、テーブルからすべてのフィールドをクエリします。不要なデータを除外する必要があると思います私のJavaクライアント層で。ここで何か見逃している場合はお知らせください。
コード例を次に示します。
public static void readTables() throws JCoException, IOException {
final JCoDestination destination = JCoDestinationManager
.getDestination(DESTINATION_NAME2);
final JCoFunction function = destination.getRepository().getFunction(
"RFC_READ_TABLE");
function.getImportParameterList().setValue("QUERY_TABLE", "DD02L");
function.getImportParameterList().setValue("DELIMITER", ",");
if (function == null) {
throw new RuntimeException("BAPI RFC_READ_TABLE not found in SAP.");
}
try {
function.execute(destination);
} catch (final AbapException e) {
System.out.println(e.toString());
return;
}
final JCoTable codes = function.getTableParameterList().getTable(
"FIELDS");
String header = "SN";
for (int i = 0; i < codes.getNumRows(); i++) {
codes.setRow(i);
header += "," + codes.getString("FIELDNAME");
}
final FileWriter outFile = new FileWriter("out.csv");
outFile.write(header + "\n");
final JCoTable rows = function.getTableParameterList().getTable("DATA");
for (int i = 0; i < rows.getNumRows(); i++) {
rows.setRow(i);
outFile.write(i + "," + rows.getString("WA") + "\n");
outFile.flush();
}
outFile.close();
}
このメソッドは、SAP がメタデータまたはデータ ディクショナリを格納するテーブルを読み取ろうとし、出力を csv ファイルに書き込みます。これは正常に機能しますが、30 ~ 40 秒かかり、32 列の約 40 万件のレコードが返されます。私の意図は、すべてのフィールドを読み取ってクライアント層で破棄するのではなく、特定のフィールドのみを返すようにクエリを制限できる方法があるかどうかを尋ねることでした。
ありがとう。