Question

Je n'arrive pas à trouver d'exemples sur la façon de définir un champ externe BCS via du code.J'ai deux listes qui comportent toutes deux un champ BCS nommé "Industrie".Lorsqu'un élément est créé dans la liste A, je dois créer un nouvel élément dans B et définir la valeur du champ secteur d'activité pour qu'elle soit la même que la valeur du nouvel élément de la liste A.

L'utilisation de ParseAndSetValue ne fonctionne sur le champ que lorsqu'il a une valeur initiale.Cela signifie que lorsque l'élément de la liste A est créé avec une valeur de "Pavage", l'élément de la liste B est vide même si le code pour le définir s'exécute.Lorsque je mets à jour l'élément de la liste A et que je change à nouveau la valeur en "Agriculture", rien ne se passe (bien que le code s'exécute). Si je règle manuellement l'élément de la liste B sur "Pavage" puis remplacez l'élément de la liste A par "Agriculture" l'élément de la liste B est mis à jour vers "Agriculture".Voici mon exemple de code pour ledit changement.Ceci s'exécute dans ItemUpdating, le code exécuté dans ItemAdded est fondamentalement le même.

if (industryChanged)
{
    using (new DisabledItemEventsScope())
    {
       String new_value = properties.AfterProperties[MarketNeedFieldNames.Industry_Internal].ToString();
       SPBusinessDataField ind = item.Fields[MarketNeedFieldNames.Industry_Internal] as SPBusinessDataField;
        ind.ParseAndSetValue(item, new_value);
        item.SystemUpdate();
     }
}

Mise à jour:

Si je parcours chaque élément de la liste à l'aide de PowerShell, je FAIRE voir les valeurs du champ dans la liste B mais pas via l'interface utilisateur SharePoint.Ceux dont la valeur est visible dans l'interface utilisateur de SharePoint ont tous été mis à jour via le sélecteur d'éléments.

$web = Get-SPWeb "http://dom-dev.domain.net/sites/plm"
$mnlist = $web.Lists["MarketNeed_Priority"]

foreach($item in $mnlist.Items)
{
    $item["Industry"] + " - " + $item["Request_ID"]
}
  • Excavation de terrassement - NONE-00001
  • Terrain - AUCUN-00002
  • Pavage - XXX-00001
  • Solutions de machines compactes - NONE-00003
  • Pavage - AUCUN-00004
  • Solutions de machines compactes - NONE-00005
  • Nivellement de terrassement - NONE-00006

enter image description here

Était-ce utile?

La solution

J'espère que l'article suivant vous aidera,

http://rompenpatrick.wordpress.com/2012/07/19/programmatically-setting-bcs-external-data-column/

Lorsque vous créez un Colonne de données externes basée sur BCS dans une liste SharePoint, un autre champ masqué est créé pour vous.On lui donne le nom yourFieldName_ID de sorte que si votre champ s'appelle "Industrie", le champ masqué s'appelle Industry_ID.Celui-ci contient l'identifiant d'entité BCS pour l'entité en question.Le nom de ce champ est également stocké dans le SchemaXml propriété du champ BusinessData.Vous pouvez le configurer en utilisant cette méthode d'extension :

    /// <summary>
    /// Sets the value of an SPBusinessDataField to the newValue.
    /// </summary>
    /// <param name="item"></param>
    /// <param name="fieldInternalName"></param>
    /// <param name="newValue"></param>
    public static void SetExternalFieldValue(this SPListItem item, string fieldInternalName, string newValue)
    {
        if (item.Fields[fieldInternalName].TypeAsString == "BusinessData")
        {
            SPField myField = item.Fields[fieldInternalName];
            XmlDocument xmlData = new XmlDocument();
            xmlData.LoadXml(myField.SchemaXml);
            //Get teh internal name of the SPBusinessDataField's identity column.
            String entityName = xmlData.FirstChild.Attributes["RelatedFieldWssStaticName"].Value;

            //Set the value of the identity column.
            item[entityName] = EntityInstanceIdEncoder.EncodeEntityInstanceId(new object[] { newValue });
            item[fieldInternalName] = newValue;
        }
        else
        {
            throw new InvalidOperationException(fieldInternalName + " is not of type BusinessData");
        }
    }

Autres conseils

Merci à Brian Abrams sur le Forums MSDN Je l'ai compris. Lorsque vous créez une colonne de données externe basée sur la BCS, dans une liste SharePoint, un autre champ Hiddne créé pour vous. Ceci est donné le nom yourFieldName_ID de sorte que si votre champ s'appelle "industrie", le champ caché est appelé Industry_ID. Cela détient l'ID d'entité de la BCS pour l'entité en question. Fondamentalement, tout ce que j'ai fait était à jour cette colonne avec la valeur de la liste d'origine et les éléments s'affichent correctement dans l'interface graphique SharePoint.

imo, en plus d'être mal documenté, cela est tout simplement horrible. Le but d'avoir une API est de résumer ces types de complexités. Cela signifie également que les principes acides sont simplement simplement inventés dans un EDC. Je peux bien définir clairement l'identifiant et la valeur de texte sur des choses complètement différentes.

String new_value = properties.AfterProperties[MarketNeedFieldNames.Industry_Internal].ToString();
SPBusinessDataField ind = (SPBusinessDataField)item.Fields[MarketNeedFieldNames.Industry_Internal];
ind.ParseAndSetValue(item, new_value);
item[MarketNeedFieldNames.Industry_Internal + "_ID"] = properties.AfterProperties[MarketNeedFieldNames.Industry_Internal + "_ID"].ToString();

Essayez ce code pour régler le champ externe dans la liste SharePoint:

// "Project ID" is the BDC column in list
SPBusinessDataField dataField1 = oSPFile.Item.Fields["Project ID"] as SPBusinessDataField; 

dataField1.ParseAndSetValue(oSPFile.Item, ProjectID.ToString());  //Set your value here

oSPFile.Item[dataField1.RelatedField] = oSPFile.Item.Fields["Project ID"];

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top