0

QBFC を使用して、クイック ブックから自分のプロジェクトにアイテム データをインポートしています。

コード :1 を使用して、クイックブック内のアイテムの総数を見つけることができます。

クイックブックから各アイテムタイプをカウントする必要があります。

しかし、コードを使用すると、特定のアイテムのアイテム数を見つけることができません(例:Serive)

コード: 1

IORItemRet itemRet = default(IORItemRet);
IORItemRetList itemRetList = default(IORItemRetList);
IResponse response = responseSet.ResponseList.GetAt(0);
if ((response.Detail != null))
{
    itemRetList = (IORItemRetList)response.Detail;
    if ((itemRetList != null))
    {
        int i = 0;
        for (int j = 0; j <= itemRetList.Count - 1; j++)
        {
        }
    }
}

コード: 2

IItemServiceRet itemSeriveRet = default(IItemServiceRet);
IItemServiceRetList itemServiceRetList = default(IItemServiceRetList);
IResponse response = responseSet.ResponseList.GetAt(0);
if ((response.Detail != null))
{
    itemServiceRetList = (IItemServiceRetList)response.Detail;  //Com object Error
    if ((itemServiceRetList  != null))
    {
        int i = 0;
        for (int j = 0; j <= itemServiceRetList.Count - 1; j++)
        {
        }
    }
}

//Com オブジェクト エラー

タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ 'Interop.QBFC10.IItemServiceRetList' にキャストできません。IID '{C53D1081-9FE4-4569-9181-A9D7E0155907}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: No such interface supported (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .

クイックブックから各アイテムの数を見つける方法を教えてください

4

1 に答える 1

0

コードでは、response.Detail が null ではないことを確認しているようです。しかし、response.StatusCode と responseType の値もチェックしていますか? エラーが発生している場合は、IORItemRetList インターフェイスを実装していない可能性のある応答が返されている可能性があります。On Screen Referenceから以下のコードを参照してください。

IResponse response = responseList.GetAt(i);
//check the status code of the response, 0=ok, >0 is warning
if (response.StatusCode >= 0)
{
  //the request-specific response is in the details, make sure we have some
  if (response.Detail != null)
  {
    //make sure the response is the type we're expecting
    ENResponseType responseType = (ENResponseType)response.Type.GetValue();
    if (responseType == ENResponseType.rtItemQueryRs)
    {
      //upcast to more specific type here, this is safe because we checked with response.Type check above
      IORItemRetList OR = (IORItemRetList)response.Detail;
      WalkOR(OR);
    }
  }
}

上記のコードのコメントに注意してください。

これは、response.Type check で確認したので安全です。

SDK Programmers Guide (p.107) には、次のように記載されています。

...クエリ応答である応答オブジェクトには、潜在的に複数の Ret オブジェクトを含む Ret リスト オブジェクトが含まれています。クエリ応答ではない応答オブジェクトには、Ret オブジェクトが 1 つだけ含まれ、Ret リストは含まれません。この違いは、応答データの処理に関して非常に重要です。

インターフェース チェックを行うと、for ループが正しく動作するはずです。

于 2013-03-25T21:53:36.337 に答える