3

改訂履歴を調べようとしていますが、どうすればよいかわかりません。私が何をしても、nullを返します。関連するコードは以下のとおりです。

        string objectType = "HierarchicalRequirement";
        string orderString = "";
        bool fetchFullObjects = true;
        long start = 1;
        long pageSize = 200;
        QueryResult queryResult = Global.service.query(Global.workspace, objectType, queryString, orderString, fetchFullObjects, start, pageSize);
        int cnt = 0;
        for (int i = 0; i < queryResult.Results.Length; i++)
        {
            // Results array is of type "DomainObject"
            DomainObject rallyobject = queryResult.Results[i];
            HierarchicalRequirement story = (HierarchicalRequirement)rallyobject;
            var rev = story.RevisionHistory;

            if (rev.Revisions != null)
            {
                  // traverse revisions for info, never gets here
            }

            dataGridView3.Rows.Add(new object[] { story.FormattedID, story.Description, story.InProgressDate, story.AcceptedDate, story.PlanEstimate});

        }

        // Return the avereage days from inprogress to accepted
        return;
    }

デバッグでは、revは常にnullに戻ります。

おそらく私はクエリ結果を間違ってキャストしていますか?

4

4 に答える 4

3

ループを閉じるために、Kyleが参照したservice.read()の実行方法を示す例を次に示します。LBAPIを使用するというMarkの推奨は、アーティファクトのスナップショットを確実に追跡するためのはるかに堅牢な方法ですが、LBAPIへのRESTクエリURLを自分で作成する必要があります。RallyにはLBAPI用のC#SDKがありません(まだ) 。

特に統合の構築を始めたばかりの場合は、SOAPの代わりにRallyの.NETRESTSDKのいずれかを使用することを強くお勧めします。

RESTはより堅牢でパフォーマンスが高く、Webservices API 1.4x(xはまだ決定されていません)がSOAPをサポートする最後のAPIリリースになります。Webservices 2.xはRESTのみであるため、RESTを使用することは、新しいWebサービス機能を前進させたい人にとって不可欠です。

namespace SOAP_QueryStoryRevisions
{
    class Program
    {
        static void Main(string[] args)
        {

            // create a service object
            RallyServiceService service = new RallyServiceService();

            // Credentials
            string rallyUser = "user@company.com";
            string rallyPassword = "topsecret";

            // set the service URL
            service.Url = "https://rally1.rallydev.com/slm/webservice/1.37/RallyService";

            // login to service using HTTP Basic auth
            System.Net.NetworkCredential credential =
               new System.Net.NetworkCredential(rallyUser, rallyPassword);

            Uri uri = new Uri(service.Url);
            System.Net.ICredentials credentials = credential.GetCredential(uri, "Basic");
            service.Credentials = credentials;
            service.PreAuthenticate = true;

            // Configure the service to maintain an HTTP session cookie
            service.CookieContainer = new System.Net.CookieContainer();

            // Get current user
            User user = (User)service.getCurrentUser();

            // Get reference to UserProfile for current user
            UserProfile profile = new UserProfile();
            profile.@ref = user.UserProfile.@ref;

            // Read will return a WSObject that you can then cast to a UserProfile 
            WSObject resultobj = service.read(profile);
            UserProfile newprofile = (UserProfile)resultobj;

            // Default workspace for current user
            Console.WriteLine(newprofile.DefaultWorkspace.@ref);

            // set workspace for query
            Workspace workspace = new Workspace();
            workspace.@ref = newprofile.DefaultWorkspace.@ref;

            // Make the web service call
            //---------------------------

            // Look for Stories
            string objectType = "hierarchicalrequirement";

            // Find Stories
            string queryString = "(FormattedID < US100)";

            // Order by FormattedID Ascending
            string orderString = "FormattedID asc";

            // Fetch full objects, or return just object shells
            // with the "@ref" attribute set.  You can fetch the full version
            // of a ref object later by calling service.read().
            bool fetchFullObjects = true;

            // Paging information
            long start = 0;
            long pageSize = 200;

            // Query for project
            QueryResult projectQueryResult = service.query(workspace, "Project", "(Name = \"My Project\")", orderString, fetchFullObjects, start, pageSize);

            // look at the object returned from query()
            Console.WriteLine("Query returned " + projectQueryResult.TotalResultCount + " Projects");

            // Grab project
            DomainObject myProjectObject = projectQueryResult.Results[0];
            Project myProject = (Project)myProjectObject;

            // issue query
            QueryResult queryResult = service.query(workspace, myProject, true, true, objectType, queryString, orderString, fetchFullObjects, start, pageSize);

            // look at the object returned from query()
            Console.WriteLine("Query returned " + queryResult.TotalResultCount + " objects");

            // loop through results returned

            Console.WriteLine("There are " + queryResult.Results.Length + " objects on this page");
            for (int i = 0; i < queryResult.Results.Length; i++)
            {
                // Results array is of type "DomainObject"
                DomainObject rallyobject = queryResult.Results[i];
                Console.WriteLine("  result[" + i + "] = " + rallyobject);
                Console.WriteLine("           ref = " + rallyobject.@ref);

                HierarchicalRequirement myStory = (HierarchicalRequirement)rallyobject;

                Console.WriteLine("===>           FormattedID = " + myStory.FormattedID);
                Console.WriteLine("===>           Story Name = " + myStory.Name);

                RevisionHistory myStoryRevisionHistory = myStory.RevisionHistory;

                // Perform service.read on RevisionHistory
                RevisionHistory myRevisionHistoryHydrated =  (RevisionHistory)service.read(myStoryRevisionHistory);

                // Grab revisions
                Revision[] myRevisions = myRevisionHistoryHydrated.Revisions;

                // Loop through each Revision and read it, output summary
                for (int j = 0; j < myRevisions.Length; j++)
                {
                    Revision revisionHydrated = (Revision)service.read(myRevisions[j]);
                    Console.WriteLine("===>                Revision[" + j + "] = " + revisionHydrated.RevisionNumber);
                    Console.WriteLine("===>                Description: " + revisionHydrated.Description);
                }
            }

            Console.ReadKey();
        }

        // determine if the result had errors
        static bool hasErrors(OperationResult result)
        {
            return (result.Errors.Length > 0);
        }

        // print warnings and errors to the console
        static void printWarningsErrors(OperationResult result)
        {
            if (result.Warnings.Length > 0)
            {
                Console.WriteLine("Result has warnings:");
                for (int i = 0; i < result.Warnings.Length; i++)
                {
                    Console.WriteLine("  warnings[" + i + "] = " + result.Warnings[i]);
                }
            }
            if (result.Errors.Length > 0)
            {
                Console.WriteLine("Result has errors:");
                for (int i = 0; i < result.Errors.Length; i++)
                {
                    Console.WriteLine("  errors[" + i + "] = " + result.Errors[i]);
                }
            }
        }
    }
于 2013-03-28T18:12:48.073 に答える
0

SOAPを使用してこれを実行できるかどうかはわかりません。fetchFullObjectsパラメーターは、リビジョン履歴やリビジョンなどのサブオブジェクトフィールドに入力されません。これらのフィールドは、1つの要求でWSAPIを介して使用できますが、fetchパラメーターで指定することによって使用できます。

この場合、リビジョンを設定するには、おそらくservice.read(rev)を実行する必要があります。

于 2013-03-28T13:13:23.217 に答える
0

リビジョン履歴で何をしようとしているのかわかりませんが、もう1つのオプションとして、新しいLookbackAPIがあります。

https://rally1.rallydev.com/analytics/doc/

これにより、アーティファクトの履歴のより豊富で解析可能なビューを備えたRESTAPIが提供されます。たとえば、ObjectID 1234(または任意のサブプロジェクト)のプロジェクトの下にあるストーリーの完全な履歴を見つけるには、次のようにします。

find={ _ProjectHierarchy: 1234, _TypeHierarchy: "HierarchicalRequirement" }

分析チームの場合、完全なURLは次のようになります。

https://rally1.rallydev.com/analytics/v2.0/service/rally/workspace/41529001/artifact/snapshot/query.js?find={_ProjectHierarchy:279050021,_TypeHierarchy:"HierarchicalRequirement"}

ここで、41529001はワークスペースのObjectIDであり、279050021はプロジェクトOIDです。

fieldsパラメータを追加して、戻したいフィールドを指定します。開発モードの場合は、fields = trueを追加して、何が利用可能かを判断します。

https://rally1.rallydev.com/analytics/v2.0/service/rally/workspace/41529001/artifact/snapshot/query.js?find={_ProjectHierarchy:279050021,_TypeHierarchy:%22HierarchicalRequirement%22}&fields=true

ただし、fields = trueは1ページあたり200件の結果に制限されているため、本番環境で必要なフィールドの実際のリストを指定する必要があります。たとえば、ObjectID、ストーリー名、スナップショットが作成された日付を返すには、次のようになります。

https://rally1.rallydev.com/analytics/v2.0/service/rally/workspace/41529001/artifact/snapshot/query.js?find={_ProjectHierarchy:279050021,_TypeHierarchy:%22HierarchicalRequirement%22}&fields=[%22ObjectID%22,%20%22Name%22,%20%22_ValidFrom%22,%20%22_ValidTo%22]

このスナップショットモデルで興味深いもう1つの機能は、_PreviousValuesフィールドです。このフィールドは、現在のスナップショットで変更されたフィールドの古い値を保持するため、アーティファクトの状態の変更を検出(および照会)できます。詳細はこちら: https ://rally1.rallydev.com/analytics/doc/Analytics2.0LookbackAPIUserManual.html?_debugResources = y&n = 1364482493883#h.uv4o9mhshx4

お役に立てれば。

于 2013-03-28T15:02:43.050 に答える
0

これは、RESTを使用してリビジョン履歴を取得して表示する方法です。

import com.google.gson.JsonObject;
import com.rallydev.rest.RallyRestApi;
import com.rallydev.rest.request.QueryRequest;
import com.rallydev.rest.response.QueryResponse;
import com.rallydev.rest.util.Fetch;
import com.rallydev.rest.util.QueryFilter;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeSet;

public class revisions {

    public static void main(String[] args) throws URISyntaxException, IOException {

        // Configure RallyRestApi
        final String rallyURL = "https://rally1.rallydev.com";
        final String wsapiVersion = "v2.0";
        final RallyRestApi restApi = new RallyRestApi(new URI(rallyURL), "RallyID", "password");    // TODO: update id / password
        restApi.setWsapiVersion(wsapiVersion);

        // Select and query project information
        final String myProject = "A Project Name";                      // TODO: update project name
        QueryRequest projectRequest = new QueryRequest("Project");
        projectRequest.setFetch(new Fetch("Name", "Iterations"));
        projectRequest.setQueryFilter(new QueryFilter("Name", "=", myProject));
        QueryResponse projectQueryResponse = restApi.query(projectRequest);
        String iterationListRef = projectQueryResponse.getResults().get(0).getAsJsonObject().get("Iterations").getAsJsonObject().get("_ref").toString().replaceAll("\"", "");
        iterationListRef = iterationListRef.substring(iterationListRef.indexOf("Project"));

        // Query and store iteration information
        QueryRequest iterationRequest = new QueryRequest(iterationListRef);
        QueryResponse iterationQueryResponse = restApi.query(iterationRequest);

        HashMap<String, String> iterations = new HashMap<String, String>();
        String iterationName = "", iterationStartDate="";
        int irc = iterationQueryResponse.getTotalResultCount();
        for (int iter = 0; iter < irc; iter++) {
            JsonObject iterationObj = iterationQueryResponse.getResults().get(iter).getAsJsonObject();

            iterationName = iterationObj.get("_refObjectName").toString();
            iterationName = iterationName.substring(1, iterationName.length()-1);
            iterationStartDate = iterationObj.get("StartDate").toString().replaceAll("\"", "").substring(0, 10);
            iterations.put(iterationName, iterationStartDate);
        }

        // Query and store story information
        QueryRequest storyRequest = new QueryRequest("HierarchicalRequirement");
        String ir = iterationRequest.toUrl();
        storyRequest.setProject(ir.substring(0, ir.indexOf("/iterations")));
        QueryResponse storyQueryResponse = restApi.query(storyRequest);

        TreeSet<StoryInfo> stories = new TreeSet<StoryInfo>(new StoryComp());
        String refIteration = "", storyID = "", storyName = "", revHistory = "";
        int src = storyQueryResponse.getTotalResultCount();
        for (int story = 0; story < src; story++) {         
            JsonObject storyOjb = storyQueryResponse.getResults().get(story).getAsJsonObject();

            refIteration = storyOjb.get("Iteration").toString();
            if (refIteration.contains("_refObjectName")) 
                refIteration = storyOjb.get("Iteration").getAsJsonObject().get("_refObjectName").toString().replaceAll("\"", "");

            storyID = storyOjb.get("FormattedID").toString();
            storyID = storyID.substring(1, storyID.length()-1);

            storyName = storyOjb.get("_refObjectName").toString().replaceAll("\"", "");

        revHistory = storyOjb.get("RevisionHistory").getAsJsonObject().get("_ref").toString().replaceAll("\"", "");
        revHistory = revHistory.substring(revHistory.indexOf("revisionhistory"))+"/Revisions";

        stories.add(new StoryInfo(refIteration, ""+iterations.get(refIteration), storyID, storyName, revHistory));
        }

        System.out.println("Project: "+myProject);
        for (StoryInfo s:stories) {
            // Print the story iteration, id, name and revisions!
        System.out.println('\n'+s.iteration+" - "+s.id+" "+s.name);
        QueryRequest historyRequest = new QueryRequest(s.revHist);
        QueryResponse historyResponse = restApi.query(historyRequest);
        final int hrc = historyResponse.getTotalResultCount();
        for (int rev = 1; rev < hrc; rev++) {
            JsonObject historyObj = historyResponse.getResults().get(rev).getAsJsonObject();
//          System.out.println(historyObj);     // BINGO !!!
            System.out.println(historyObj.get("RevisionNumber")+" "+historyObj.get("CreationDate")+" "+historyObj.get("Description"));
        }                
        }
        restApi.close();
    }

    static class StoryComp implements Comparator<StoryInfo> {
        public int compare(StoryInfo i1, StoryInfo i2) {
            return (i1.startDate+i1.id).compareTo(i2.startDate+i2.id);
        }
    }   

    static class StoryInfo {
        String iteration, startDate, id, name, revHist;
        StoryInfo(String it, String sd, String i, String n, String rh) {
            iteration = it; startDate = sd; id = i; name = n; revHist = rh;
        }
    }

}
于 2013-09-03T17:30:14.900 に答える