1

範囲外のインデックスとは何かを知っています。デバッグすると、その理由もわかります。基本的に何が起こっているのかというと、データベースでフィルターを実行して、潜在的/保留中のレコードを探します。次に、それらの番号の配列を収集して別のサーバーに送信し、それらの番号がセールにアップグレードされているかどうかを確認します。販売にアップグレードされている場合、サーバーは新しい販売注文IDと古い保留中の販売注文ID(SourceID)で応答します。次に、そのリストでforループを実行して、特定のSourceIDをフィルタリングし、SourceIDをSales Order IDに更新して、他のいくつかの値を変更します。問題は、最初のフィルターでそのフィルターを使用すると、インデックスが範囲外のエラーをスローすることです。フィルタから返された結果を確認すると、0と表示されます。リストから販売注文番号を取得したので、そこにあるはずなので、これはちょっと奇妙だと思います。だから私は取引が何であるかわかりません。エラーをスローする問題のコードは次のとおりです。そして、それはいつもそれをするわけではありません。今朝コードを実行しただけで、エラーは発生しませんでした。でも昨夜は家に帰る前にやった。

        filter.RowFilter = string.Format("Stage = '{0}'", Potential.PotentialSale);
        if (filter.Count > 0)
        {
            var Soids = new int[filter.Count];
            Console.Write("Searching for Soids - (");
            for (int i = 0; i < filter.Count; i++)
            {
                Console.Write(filter[i][1].ToString() + ",");
                Soids[i] = (int)filter[i][1];
            }
            Console.WriteLine(")");
            var pendingRecords = Server.GetSoldRecords(Soids);
            var updateRecords = new NameValueCollection();
            for (int i = 0; i < pendingRecords.Length; i++)
            {
                filter.RowFilter = "Soid = " + pendingRecords[i][1];
                filter[0].Row["Soid"] = pendingRecords[i][0];
                filter[0].Row["SourceId"] = pendingRecords[i][1];
                filter[0].Row["Stage"] = Potential.ClosedWon;
                var potentialXML = Potential.GetUpdatePotentialXML(filter[0].Row["Soid"].ToString(), filter[0].Row["Stage"].ToString());
                updateRecords.Add(filter[0].Row["ZohoID"].ToString(), potentialXML);
            }

右の行を数えている場合、17行目はエラーがスローされたエラーです。保留中のレコードはobject[][]配列です。保留中のレコード[i]は個々のレコードです。untilRecords [i] [0]は新しい販売注文ID(SOID)であり、pendingRecords [i] [1]は古いSOID(現在はSourceID)です。

これについて何か助けはありますか?SOIDを新しいSOIDに変更していて、フィルターが自動的に更新されるためですか?わからない

4

1 に答える 1

0

さて、私はそれがすべて一緒に機能する方法を変更することになり、実際には今では少しうまくソートされています。投稿しようとしているコードには、返されるテーブルの構造のために、ハードコードされた数字がたくさんあります。申し訳ありません。それ以来、そうしないことを学びましたが、現在は別のプロジェクトに取り組んでおり、プログラムを変更する必要がある場合は変更します。しかし、ここに解決策があります。

        var potentials = Server.GetNewPotentials(); //loads all records from server
        for (int i = 0; i < potentials.Length; i++)
        {
            var filter = AllPotentials.DefaultView;
            var result1 = CheckSoidOrSource(potentials[i].Soid, true);
            var result2 = CheckSoidOrSource(potentials[i].SourceID,false) ;
            //This potential can't be found at all so let's add it to our table
            if (result1+result2==0)
            {
                Logger.WriteLine("Found new record. Adding it to DataTable and sending it to Zoho");
                AllPotentials.Add(potentials[i]);
                filter.RowFilter = string.Format("Soid = '{0}'", potentials[i].SourceID);
                var index = AllPotentials.Rows.IndexOf(filter[0].Row);
                ZohoPoster posterInsert = new ZohoPoster(Zoho.Fields.Potentials, Zoho.Calls.insertRecords);
                AllPotentials.Rows[index]["ZohoID"] = posterInsert.PostNewPotentialRecord(3, filter[0].Row);
            }
            //This potential is not found, but has a SourceId that matches a Soid of another record.
            if (result1==0 && result2 == 1)
            {
                Logger.WriteLine("Found a record that needs to be updated on Zoho");
                ZohoPoster posterUpdate = new ZohoPoster(Zoho.Fields.Potentials, Zoho.Calls.updateRecords);

                filter.RowFilter = string.Format("Soid = '{0}'", potentials[i].SourceID);
                var index = AllPotentials.Rows.IndexOf(filter[0].Row);
                AllPotentials.Rows[index]["Soid"] = potentials[i].Soid;
                AllPotentials.Rows[index]["SourceId"] = potentials[i].SourceID;
                AllPotentials.Rows[index]["PotentialStage"] = potentials[i].PotentialStage;
                AllPotentials.Rows[index]["UpdateRecord"] = true;
                AllPotentials.Rows[index]["Amount"] = potentials[i].Amount;
                AllPotentials.Rows[index]["ZohoID"] = posterUpdate.UpdatePotentialRecord(3, filter[0].Row);
            }
        }
        AllPotentials.AcceptChanges();
    }
    private int CheckSoidOrSource(string Soid, bool checkSource)
    {
        var filter = AllPotentials.DefaultView;
        if (checkSource)
            filter.RowFilter = string.Format("Soid = '{0}' OR SourceId = '{1}'",Soid, Soid);
        else
            filter.RowFilter = string.Format("Soid = '{0}'", Soid);

        return filter.Count;
    } 

基本的に何が起こっているかというと、この方法でデータをフィルタリングしたときに、自分のデータについて何かに気づいたということです。2 つの結果は次の結果のみを返します (0,0) (0,1) および (1,0) (0,0) は、このテーブルにレコードがまったく存在しないことを意味するため、追加する必要があります。(1,0) は、Sales Order ID (Soid) がテーブル内の別の Soid と一致するため、既に存在することを意味します。最後に (0,1) は、Soid がこのテーブルに存在しないことを意味しますが、Soid をソースとして持つレコードが見つかりました...これは、ソースとしてそれを持っていたレコードが、販売の可能性があるため、レコードと Zoho を更新する必要があります。勝ったレコードと失ったレコードを検索する必要がなくなり、失われたレコードを検索するだけで済むようになったため、これで作業が大幅に軽減されました。より少ないコードの同じ結果は常に良いことです:)

于 2012-05-17T16:42:08.863 に答える