bdc, powershell & c#

wie werden eigentlich die informationen aus dem bdc auf feld-ebene gespeichert? schauen wir uns das anhand eines beispieles an:

nehmen wir an, wir haben folgenden bdc:
application: QueryDemoData
entity: Demo_Entity_ID
systeminstance: Demo_LobSystemInstance

dieser bdc wird in einem blog bei den posts verwendet – und zwar in der column namens “DemoID”. primär wird das gleichnamige bdc feld “DemoID” angezeigt, weiters noch “field two”.

schauen wir uns nun einen post mit der powershell an – holen wir uns zuerst den post mit der id nummer 2:

$SiteName = “http://mosstest/”
$WebName = “/blog/”
$ListName = “Posts”
$mossSite = new-object Microsoft.SharePoint.SPSite($SiteName);
$mossWeb = $MossSite.AllWebs[$WebName];
$mossList = $MossWeb.Lists[$ListName];
$item = $mossList.GetItemById(2)

und schauen uns einmal an, welche felder dieses item zu bieten hat:

$item.Fields | format-table InternalName

neben vielen anderen sind für uns nur folgende wichtig:

DemoID
Demo_Entity_DemoID_ID
Demo_x003a__x0020_field_x002

und im ersten schritt das feld “DemoID”:

$field = $item.Fields.GetFieldByInternalName(“DemoID”)

dieses feld hat den typ “BusinessData”, was man auch mittels

$field.TypeAsString

kontrollieren kann. der primäre bdc feldname ist “DEMOID”, und auch die systeminstance und entity ist vorhanden:

$field.BdcFieldName
$field.SystemInstanceName
$field.EntityName

bleiben nur noch die zusätzlichen felder – hier “FIELDTWO” (der zugehörige wert wird nach dem query in dem feld “Demo_x003a__x0020_field_x002” gespeichert):

$field.GetSecondaryFieldsNames()

und die kontrolle, ob es zugehörige actions gibt:

$field.HasActions

das fast wichtigste feld ist allerdings “Demo_Entity_DemoID_ID” – schauen wir uns den inhalt an:

$item.GetFormattedValue(“Demo_Entity_DemoID_ID”)

der inhalt ist z.b. “__bk43003600f600f600c6009700f6005700b600e600f600770036003200” – es handelt sich um eine encodede version des in diesem post verwendeten identifier keywords; mir ist allerdings keine möglichkeit bekannt, wir man den string in der powershell decoden oder gar ein neues keyword (um über die powershell neue documente mit befülltem bdc erstellen zu können) encoden könnte…

dazu muss man c# bemühen:

folgende references einbinden:
– Microsoft.Office.Server
– Microsoft.Sharepoint
– Microsoft.Sharepoint.Portal

und dann brauchen wir:
using Microsoft.Office.Server.ApplicationRegistry.Administration;
using Microsoft.Office.Server.ApplicationRegistry.Infrastructure;

und schon können wir encoden und decoden:
EntityInstanceIdEncoder.EncodeEntityInstanceId(new object[] { “coolyouknowc#” })
EntityInstanceIdEncoder.DecodeEntityInstanceId(“__bk43003600f600f600c6009700f6005700b600e600f600770036003200” )