PROGETTO MS 2010 PSI: esiste un modo per ottenere valori di campo personalizzati senza caricare un progetto?
-
12-11-2019 - |
Domanda
Sto cercando di individuare un particolare progetto con un valore di campo personalizzato. Finora, questo è il modo migliore per farlo:
var targetProjectId = "some_external_reference_ID";
var projIdCustomFieldUid = GetCustomFieldUidByName("ExternalProjectId");
var projectList = base.ProjectClient.ReadProjectList();
foreach (ProjectDataSet.ProjectRow projRow in projectList.Project.Rows)
{
var fullProj = base.ProjectClient.ReadProject(projRow.PROJ_UID, DataStoreEnum.WorkingStore);
if (fullProj != null)
{
var cf = fullProj.ProjectCustomFields.Where(x => x.MD_PROP_UID == projIdCustomFieldUid && x.TEXT_VALUE == targetProjectId ).FirstOrDefault();
if (cf != null)
{
return fullProj;
}
}
}
return null;
}
Come puoi immaginare, il loop attraverso tutti i progetti e il caricamento di ciascuno per controllare il valore del campo personalizzato è orribilmente lento e brutto. Devo identificare un proj_uid per valore del campo personalizzato il più velocemente possibile, quindi:
C'è un modo per ottenere valori di campo personalizzati senza caricare un intero progetto?
Soluzione
Se hai solo bisogno di progetti pubblicati, utilizzerei una query SQL sul database Progerserver_Reporting, probabilmente la vista MSP_EPMProject_Userview. Questa vista include colonne per la maggior parte dei tipi di campi personalizzati.
SELECT
ProjectUid
,ProjectName
FROM
MSP_EPMProject_UserView mepuv
WHERE
mepuv.[My Custom Field] = 'the value I care about'
Se hai davvero bisogno di chiamarlo tramite PSI, allora IIRC, c'è una query filtrata che puoi emettere per ottenere solo i progetti di cui hai bisogno, ma non ho la sintassi di fronte a me. Fammi sapere se vuoi davvero usare PSI per questo invece del metodo SQL, e cercherò questo.
Spero che questo aiuti ... James Fraser
Altri suggerimenti
Usando la versione del 2007 del PSI, ci siamo trovati in questo stesso problema. Abbiamo deciso di sincronizzare tutte le proprietà dei metadati personalizzati in un elenco di SharePoint. Questo rende molto facile interrogare e consumare. Tuttavia, la sincronizzazione è un po 'di lavoro da mantenere.
Penso che un'alternativa sarebbe quella di interrogare il database di reporting, ma non sono stato in grado di trovare una buona fonte di informazioni per questo.
Per caricare i campi personalizzati con il caricamento di un intero di caricamento, è possibile utilizzare projecttenesi come questo readprojectità (..., 32, ...) dove 32 identifica le entità customfield