ASAP2 プロジェクトのフォルダ構造をナビゲートするために、.NET API を介して INCA に接続しようとしています。具体的には、以下で強調表示した「ターゲット」フォルダーを表すオブジェクトを取得したいと考えています。
これはかなりトリッキーです。API は、「Folder」という名前を持つ多数のクラスを提供します: Folder
、Asap2ProjectFolder
、およびIncaFolder
. 「ターゲット」フォルダを取得するには、何を知る必要がありますか?
ASAP2 プロジェクトのフォルダ構造をナビゲートするために、.NET API を介して INCA に接続しようとしています。具体的には、以下で強調表示した「ターゲット」フォルダーを表すオブジェクトを取得したいと考えています。
これはかなりトリッキーです。API は、「Folder」という名前を持つ多数のクラスを提供します: Folder
、Asap2ProjectFolder
、およびIncaFolder
. 「ターゲット」フォルダを取得するには、何を知る必要がありますか?
あなたの最初の衝動は、Target フォルダーが のような長いパス上に存在すると考えるかもしれませんUSER A\Demo\Demo03\Foo\Bar\Baz\Target
。残念ながら、INCA にはこれを行うメカニズムがありません。代わりに、パスのデータベース オブジェクト部分で最下位の項目を取得し、パスのデータセット部分についてその項目をクエリする必要があります。
データベース ルートから、次の Demo03 にドリルダウンする必要がありますAsap2Project
。
USER A\Demo\Demo03
次に、Demo03 内から、次のターゲットにドリルダウンする必要がありますAsap2ProjectFolder
。
Foo\Bar\Baz\Target
最初の部分は非常に単純です。わずか数行のコードで、INCA に接続して Demo03 Asap2Project を取得できます。
Asap2ProjectFolder targetFolder = null;
Inca myIncaInstance = new Inca();
DataBase myDB = myIncaInstance.GetCurrentDataBase();
DataBaseItem tempItem = myDB.GetItemInFolder("Demo03", "USER A\\Demo");
if ((tempItem != null) &&
(tempItem.IsAsap2Project()))
{
Asap2Project demoProject = (Asap2Project)tempItem;
// Next step: grab the "Target folder!"
}
さて、ここからがややこしいところです。
DataSet
Demo03_1のようなものを取得しようとしている場合は、 like の呼び出しを使用できますdemoProject.GetDataSetForName("Demo03\\Demo03_1")
。問題は、このメソッドが DataSet 型のオブジェクトに対してのみ機能することです。したがって、これを使用して のようなフォルダーを取得することはできませんFoo\Bar\Baz\Target
。API を少し調べたことがあれば、次のようなことを試したことがあるかもしれません。
Asap2ProjectFolder tempProjFolder = demoProject.GetTopFolderNamed("Foo");
tempItem = tempProjFolder.GetDataBaseItem("Bar\\Baz\\Target"); // Won't work.
tempItem = tempProjFolder.GetSubFolder("Bar\\Baz\\Target"); // This won't either.
もう少し機知に富む必要があることがわかりました。およびクラスGetItemInFolder()
の拡張メソッドを作成して、これらのクラスがクラスと同じ項目取得の柔軟性を持つようにしましょう。Asap2Project
Asap2ProjectFolder
DataBase
namespace IncaExtensions
{
public static class GetItemInFolderExtensions
{
/// <summary>
/// Gets a DataBaseItem from an Asap2Project in an arbitrary subfolder.
/// </summary>
/// <param name="project">The current Asap2Project</param>
/// <param name="itemName">The name of the item that we want to retrieve</param>
/// <param name="folderName">The path, delimited by backslashes ('\\')</param>
/// <returns>A DataBaseItem matching the request.
/// If no matching item is found, or if the path is invalid, return null.
/// </returns>
public static DataBaseItem GetItemInFolder(this Asap2Project project,
string itemName,
string folderName)
{
DataBaseItem returnItem = null;
if ((folderName != null) &&
(itemName != null))
{
string folderToken = PluckPathToken(ref folderName);
Asap2ProjectFolder subFolder =
project.GetTopFolderNamed(folderToken);
if (subFolder != null)
{
returnItem = subFolder.GetItemInFolder(itemName, folderName);
}
}
return returnItem;
}
/// <summary>
/// Recursive call that returns a DataBaseItem in the target path.
/// </summary>
/// <param name="folder">The Asap2ProjectFolder to drill down</param>
/// <param name="itemName">The name of the item that we want to retrieve</param>
/// <param name="folderName">The path, delimited by backslashes ('\\')</param>
/// <returns>A DataBaseItem matching the request.
/// If no matching item is found, or if the path is invalid, return null.
/// </returns>
public static DataBaseItem GetItemInFolder(this Asap2ProjectFolder folder,
string itemName,
string folderName)
{
DataBaseItem returnItem = null;
if ((folderName != null) &&
(itemName != null))
{
string folderToken = PluckPathToken(ref folderName);
Asap2ProjectFolder subFolder =
(Asap2ProjectFolder)folder.GetSubFolder(folderToken);
if (subFolder != null)
{
returnItem = subFolder.GetItemInFolder(itemName, folderName);
}
}
else
{
returnItem = folder.GetDataBaseItem(itemName);
}
return returnItem;
}
/// <summary>
/// Removes a backslash-delimited token from a string and shortens the
/// input string.
/// </summary>
/// <param name="folderName">Backslash-delimited path. This will be
/// shortened each time a token is removed.</param>
/// <returns>The latest path token</returns>
static string PluckPathToken(ref string folderName)
{
int slashIdx = folderName.IndexOf('\\');
// If folderName has path tokens, extract the first token and
// shorten folderName accordingly.
string folderToken = (slashIdx > -1) ?
folderName.Substring(0, slashIdx) : folderName;
folderName = (slashIdx > -1) ?
folderName.Substring(slashIdx + 1) : null;
return folderToken;
}
}
}
Asap2Project
これにより、またはからアイテムを簡単に取得できAsap2ProjectFolder
ます。Target フォルダーを取得するには、次の呼び出しのみが必要です。
using IncaExtensions;
...
Asap2ProjectFolder targetFolder = null;
Inca myIncaInstance = new Inca();
DataBase myDB = myIncaInstance.GetCurrentDataBase();
DataBaseItem tempItem = myDB.GetItemInFolder("Demo03", "USER A\\Demo");
if ((tempItem != null) &&
(tempItem.IsAsap2Project()))
{
Asap2Project demoProject = (Asap2Project)tempItem;
targetFolder = (Asap2ProjectFolder)demoProject.GetItemInFolder("Target", "Foo\\Bar\\Baz");
}