קאַטעגאָריע אַרטשיוועס: שאַרעפּאָינט דעוועלאָפּמענט

באַמבו קאַלענדאַר ינטעראַקטינג מיט שאַרעפּאָינט קאַוסעס "א אומגעריכט טעות פארגעקומען"

הייַנט, I’ve been working in an environment that uses a Bamboo calendar web part for some improved collaboration. This a standard medium/small farm with two load balanced WFEs, אַ "אַפּלאַקיישאַן סערווירער" פֿאַר ינדעקסינג און ינפאָפּאַטה און אַ קלאַסטערד סקל צוריק סוף.

The client installed some disaster recovery software onto one of the WFEs and that resulted in a broken WFE for a specific site in the site collection. Whenever load balancing pointed at the affected WFE and that site, users saw a largely blank white screen with the sentence “An unexpected error occurred”. No other info showed, נאָר אַז זאַץ.

They asked me to look at it. I easily reproduced the problem and then added a ?contents=1 to the end of the URL. This is how I learned they were using the Bamboo web part. I went back to the page and now, פּלוצלינג, עס אנטפלעקט מיר אַ פייַן אָרדערלי טעות אָנזאָג:

image

איך טאָן ניט וויסן וואָס איז געווען געשעעניש אָדער וואָס איך האבן צו באַקומען די קאַנטראָולד טעות אָנזאָג צו אַרויסווייַזן אנדערע ווי אַפּפּענדינג די ?contents=1 bit of the query string.

דאס איז מיסטאָמע אַ זייער זעלטן ברעג פאַל אָבער אויב איר באַקומען וואָס אָנזאָג, "אַ אומגעריכט טעות פארגעקומען" גיין פאָרויס און לייגן ?אינהאַלט = 1 צו די אָנפֿרעג שטריקל און זען ווו וואָס פירט.

</עק>

אַבאָנירן צו מיין בלאָג.

גיי מיר אויף טוויטטער בייַ http://www.twitter.com/pagalvin

טעטשנאָראַטי טאַגס: ,

ניצן רעפלעקטאָר אויף מיקראָסאָפט.שאַרעפּאָינט.דלל

Redgate .NET Reflector מיכאל בלומענטהאַל האט לייגן אַרויף אַ אַרטיקל וועגן אַלערץ און קוקן ("Which views can be used when Creating an Alert ?"), which is interesting on its own merits. אָבער, I was even more interested to see how he methodically walks through the process of using Redgate’s .NET Reflector. Step by step, he shows how to use that tool track down how SharePoint determines whether a view on a list should be "subscribable" פֿאַר מאַנגל פון אַ בעסער וואָרט (he explains this much better than I do 🙂 ).

אין דעם פונט אין די שאַרעפּאָינט תקופה, you’d almost have to be deaf and blind to have not heard or read about using that tool. It’s advanced stuff and my own sense is that it’s in many ways a tool of last resort. אָבער, אויב איר טראַכטן איר דאַרפֿן עס אָבער טאָן ניט טאַקע וויסן ווי, מיכאל ס שרייַבן-אַרויף מיינט ווי אַ גרויס טוטאָריאַל אויף דעם אונטער.

</עק>

אַבאָנירן צו מיין בלאָג.

גיי מיר אויף טוויטטער בייַ http://www.twitter.com/pagalvin

סאָרטינג קאַלענדאַר יטעמס אין די קאַלענדאַר View

איך נוצן אַ קאַלענדאַר צו שפּור טאַפליע דיסקוסיעס אויף אַ געגעבן טאָג. איך האָבן צוויי סעשאַנז: מאָרגן און נאָכמיטאָג. איך ווילן צו מאַכן אַ מיינונג וואָס ווייזט מאָרגן סעשאַנז בלויז ליסטעד אַלפאַבעטיקלי דורך אַ סעסיע שייַן. דאָס איז אַ ביסל טריקי צו ויספירן (סייַדן איך מיסט עפּעס עמעס קלאָר ווי דער טאָג).

איך קענען לייכט מאַכן אַ געפילטערט מיינונג וואָס נאָר ווייַזן די געשעענישן פון דעם טאָג. די קאַלענדאַר וועט ווייַזן אַלע די געשעענישן און אויב זיי אַלע פאַלן אין דער זעלביקער שעה, עס ליסטעד זיי זייַט ביי זייַט אין די שעה שפּעלטל. דאס איז געוואלדיג. די טריקי טייל איז אַז, דורכ פעליקייַט, עס וויל צו רשימה זיי אין שייַן פֿאָרמאַט. אַזוי, if I add "Session 02" and then "Session 01" צו די לוח, עס ווייזט זיי אין אַז סדר (י.ע, סעסיע 02 און דעמאָלט סעשאַן 01). צו רשימה זיי אין סעסיע שייַן סדר, איך געדאַנק צו פּרובירן די זאכן:

  1. קאַנפיגיער די מיינונג מיט די וועב באַניצער צובינד. קיין גליק. עס זענען קיין אָפּציעס צו סאָרט זאכן אויף דעם וועג.

    זינט וואָס האט ניט אַרבעטן, I am now hoping there’s a CAML query somewhere in there that will allow me to override the sort. CQWP lets me make that kind of change, אפֿשר לוח וועט ווי געזונט?

  2. רעדאַגירן די וועב טייל, look for an "export" פונקציאָנירן און … בזזז! I can’t export its XML. There is no export option.

    I’m still holding out hope that I can find and modify some CAML query. Since I can’t export the web part, אַז בלעטער שאַרעפּאָינט דיזיינער.

  3. I add the calendar web part to a sandbox site and open that site using SharePoint Designer. I look at the markup for the web part and I find what I’m looking for. It’s encoded madness, אָבער עס ס דאָרט: "<ליסטוויעווקסמל …. >ענקאָודיד מאַדנעסס</ליסטוויעווקסמל>". ספּעסיפיקאַללי, דאָרט ס דעם יידלשטיין:

<אָנפֿרעג>
<ווו>
<דאַטעראַנגעסאָווערלאַפּ>
<FieldRef Name="EventDate"/>
<FieldRef Name="EndDate"/>
<FieldRef Name="RecurrenceID"/>
<Value Type="DateTime">
<חודש />
</ווערט>
</דאַטעראַנגעסאָווערלאַפּ>
</ווו>
<אָרדערבי><FieldRef Name="Session_x0020_ID" /></אָרדערבי>
</אָנפֿרעג>

(איך ווע דיקאָודאַד די &לט;'ס און &גט ס און שפּאַלטן זיי אויס צו קייפל שורות פֿאַר קלעריטי ס צוליב).

לייג די <אָרדערבי> ביסל און איצט עס סאָרץ דורך סעשאַן שייַן, נישט די ינערלעך רשימה נומער שייַן.

דזשייגאַניק שפּיץ אָדער’ די הוט צו בעקי יססערמאַן פֿאַר איר באַמערקונג צו ישאַ סאַגי ס בלאָג פּאָסטן: http://www.sharepoint-tips.com/2008/07/caml-sorting-by-file-name.html. I wouldn’t have put the <אָרדערבי> אין די רעכט אָרט אָן איר באַמערקונג.

איך האָפֿן צו שרייַבן דעם אַרויף מער קלאר מיט פאַרשטעלן שאַץ באַלד, אָבער אין פאַל איך קיינמאָל טאָן, לפּחות איך האט דאָס פיל.

</עק>

שאַרעפּאָינט פֿעיִקייטן & סאָלוטיאָנס מאַנאַגעמענט — צי ניט פארגעסן די יו אין קרוד (אָדער די די פֿאַר אַז ענין)

מיר קאַלעקטיוולי פאַרברענגען אַ גרויס געשעפט פון מאָל טראכטן וועגן שאַרעפּאָינט סאַלושאַנז — ווי צו שאַפֿן זיי, וואָס געצייַג צו נוצן, וואָס כאַפּאַנז ווען זיי פאַרפעלן צו צעוויקלען, טייַמער דזשאָבס, סקאָפּעס, אאז"ו ו. We spend so much time thinking about the up-front bits that it’s easy to forget that we need to retract them as well. Retracting solutions is probably more difficult, פון אַ קאַנסעפּטשואַל פּלאַן פּערספּעקטיוו, than deploying them. Deployment is basically a cookbook affair. Typically, ינסטאַלירן אַ שטריך, אפֿשר האָבן אַ שטריך ופנעמער מאַסע עטלעכע דאַטן אין אַ רשימה, that sort of thing. אָבער, ריטראַקטינג איז פּאַטענטשאַלי מער קאָמפּליצירט.

א געגעבן לייזונג זאל מאַכן אַרטאַפאַקץ ווי די:

  • אינהאַלט טיפּ
  • רשימה דעפיניטיאָן
  • פּלאַץ דעפיניטיאָן
  • דאַטע אין אַ רשימה
  • אפילו ראַסיווערז
  • ינפאָפּאַטה פארמען

די רשימה גייט אויף.

בשעת עס ס 'דאָך וויכטיק צו פּלאַן אַ לייזונג אַז ינסטאַנשיייץ יענע אַרטאַפאַקץ ריכטיק, it’s just as important to consider the update and delete cases. If your solution creates a new list and populates that list with data, וואָס כאַפּאַנז ווען די לייזונג איז ריטראַקטאַד? In some cases, the list should be deleted. In other cases, it should be left intact for historical purposes. Your business requirements will guide you to the right decision.

צו העלפן מיט דעם, create a matrix that lists each artifact your solution deploys to SharePoint. List three columns per artifact, איינער פֿאַר שאַפֿן, דערהייַנטיקן און ויסמעקן. For each case, באַשטימען די ריכטיק אַוטקאַם פֿאַר אַז אָפּעראַציע.

This sort of analysis is obviously best done before the solution is ever deployed to a SharePoint farm. אָבער, ווי סמאָוקינג, it’s never too late to start doing things correctly. Create that matrix and develop a plan to address the missing update/delete scenarios. It may be a hard problem to solve, אָבער לפּחות איר וועט האָבן שטעלן אַ קעסטל אַרום דעם פּראָבלעם.

</עק>

אַבאָנירן צו מיין בלאָג.

גיי מיר אויף טוויטטער בייַ http://www.twitter.com/pagalvin

טעטשנאָראַטי טאַגס:

שנעל פיקס: וועב סערוויסעס וואָס ינטעראַקט מיט שאַרעפּאָינט, ינוואַלידאָפּעראַטיאָנעקססעפּטיאָן

א מיליאָן יאר צוריק, I helped developed a web service that was invoked via a custom action for a SharePoint Designer workflow. דעם וואָך, דער קליענט געוואלט צו מאַך עס צו פּראָדוקציע (לעסאָף!) אַזוי מיר האבן.

דער מנהג קאַמף געארבעט פייַן, אָבער די וועב דינסט עס ינוואָוקט האט ניט, געבן אונדז דעם טעות:

סיסטעמ.ינוואַלידאָפּעראַטיאָנעקססעפּטיאָן: דעם אָפּעראַציע קענען זייַן געטאן בלויז אויף אַ קאָמפּיוטער וואָס איז זיך איינגעשריבן צו אַ סערווירער פאַרם דורך ניצערס, וואס האָבן פּערמישאַנז אין סקל סערווירער צו לייענען פון דער קאַנפיגיעריישאַן דאַטאַבאַסע. צו פאַרבינדן דעם סערווירער צו די סערווירער פאַרם, נוצן די שאַרעפּאָינט פּראָדוקטן און טעטשנאָלאָגיעס קאָנפיגוראַטיאָן וויזערד, ליגן אויף די אָנהייב מעניו אין אַדמיניסטראַטיווע מכשירים.
at Microsoft.SharePoint.Administration.SPWebApplication.Lookup(אורי רעקוועסטורי)

Turns out that I forgot to add the service to the SharePoint application pool in IIS. Once I did that, עס געארבעט פייַן.

דאס מסדן פאָרום פּאָסטינג האט מיר דער קלו איך דארף: http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/2c97c004-7118-4e06-a62c-b2b0ac07ac99

</עק>

אַבאָנירן צו מיין בלאָג.

גיי מיר אויף טוויטטער: http://twitter.com/pagalvin

טעטשנאָראַטי טאַגס:

שנעל און יזי: באַקומען ספּפאָלדער פון ספּיטעמליסט

איך האַלטן פליסנדיק אין דעם פּראָבלעם און די גוגל קיינמאָל מיינט צו פֿאַרשטיין וואָס איך ווילן צו טאָן, אַזוי איך פיגיערד איך וואָלט שרייַבן דעם אַראָפּ.

איך ווע שוין טאן אַ פּלאַץ פון געשעעניש ופנעמער דיבאַגינג אין די לעצטע וואָך אָדער צוויי. The ER is defined against a document library. The individual items in the document library are tightly related to their parent folders. אַזוי, I am always getting the folder of the item for various manipulations. While debugging, איך דארף צו דערהייַנטיקן די מעטאַדאַטאַ פון אַ טעקע פֿאַר אַ ספּעציפיש נומער וועמענס שייַן איך וויסן.

דאָ ס אַ ביסל קאַנסאָול אַפּלאַקיישאַן (דיזיינד צו לויפן אויף סערווער אין די פאַרם) וואָס נעמט צוויי טענות: די שייַן פון אַ נומער און אַ ווערט צו באַשטימען צו אַ פעלד, "Approval Status". It hard codes a lot of stuff and has no error checking.

The code looks up a hard coded site, gets a hard coded document library and then finds the indicated item. It then finds the parent folder of that item and assigns the status value.

The key lesson here for me is that SPItem doesn’t get you access to the folder. You need to use SPListItem.File.

If anyone cares to offer a critique or suggest a better way to get the folder of an item, ביטע לאָזן אַ באַמערקונג.

<code>
ניצן סיסטעם;
ניצן סיסטעמ.קאָללעקטיאָנס.גענעריק;
ניצן סיסטעמ.טעקסט;
ניצן Microsoft.SharePoint;
ניצן סיסטעמ.קאָללעקטיאָנס;

נאָמענטייל קאָנטשאַנגאָ
{
    /// <קיצער>
 /// </קיצער>
 קלאַס ManualFolderUpdate
    {
        סטאַטיק פּאָסל הויפּט(שטריקל[] אַרגס)
        {
            שטריקל msh = "ManualFolderUpdate (v1.0): "; // msh = "Message Header"

 קאַנסאָול.ווריטעלינע(msh + "Starting up.  I was last modified on 08/04/08.");

            שטריקל url = http://localhost/xyzzy;

            ניצן (ספּסיטע oSPSite = נייַ ספּסיטע(URL))
            {

                ניצן (ספּוועב oSPWeb = oSPSite.OpenWeb())
                {
                    ספּליסט docLib = oSPWeb.Lists["Documents"];

                    קאַנסאָול.ווריטעלינע(msh + "Got the document library.");

                    קאַנסאָול.ווריטעלינע(msh + "Doc lib item count: [" + docLib.ItemCount + "].");

                    ינט FolderID = 0;
                    שטריקל נעווסטאַטוס = "xyzzy";

                    פאָלדעריד = סיסטעם.גער.טאָינט32(אַרגס[0].טאָסטרינג());
                    קאַנסאָול.ווריטעלינע("Seeking folder for item: [" + פאָלדעריד + "].");

                    ספּליסטיטעם לי = דאָקליב.געטיטעמבייד(פאָלדעריד);

                    ספּפאָלדער טהיסיטעמפאָלדער = לי.פילע.פּאַרענטפאָלדער;

                    קאַנסאָול.ווריטעלינע(msh + "Got the parent folder.");

                    נעווסטאַטוס = אַרגס[1].טאָסטרינג();
                    קאַנסאָול.ווריטעלינע("Setting status to [" + נעווסטאַטוס + "].");

                    קאַנסאָול.ווריטעלינע("Press return to commit the update or CTRL-C to abort.");

                    קאַנסאָול.רעאַדלינע();

                    טהיסיטעמפאָלדער.יטעם["Approval Status"] = נעווסטאַטוס;
                    טהיסיטעמפאָלדער.יטעמ.ופּדאַטע();

                    קאַנסאָול.ווריטעלינע(msh + "Finished updating the folder.  עקסיטינג.");

                } // ניצן ספּוועב

            } // ניצן ספּסיטע

 קאַנסאָול.ווריטעלינע(msh + "Finished.");

        } // הויפּט

    } // קלאַס פאָלדערסינק
} // נאָמענטייל
</code>

</עק>

אַבאָנירן צו מיין בלאָג.

טעטשנאָראַטי טאַגס:

כיידינג מנהג אַקטיאָנס אין שאַרעפּאָינט

עטלעכע חדשים צוריק, בשעת ארבעטן אויף אַ פּרויעקט פֿאַר אַ קליענט, I created a feature. Among other things, אַז שטריך דיפיינד אַ מנהג קאַמף (די דערשייַנען אונטער פּלאַץ סעטטינגס). The only purpose for this custom action was to demonstrate to me that the feature activation was working as expected. בייסיקלי, איך געוויינט עס ווי אַ גראָב פאָרעם פון דיבאַגינג.

פיל צו מיין פאַרלעגנהייַט, דעם דיבאַגינג אַרטאַפאַקט געמאכט זייַן וועג פון דעוו צו ואַט און צו פּראָדוקציע איידער עמעצער גאַט אַרום צו אַסקינג, "what is this xyzzy link?"

דורך איצט, מיר ניטאָ אין פּראָדוקציע און איך טאַקע טאָן נישט וועלן צו נעם אַוועק די שטריך, fix elements.xml and then reinstall.

טאַד בליקער pointed out an easy way to handle it. In his words:

"CustomActions are not copied into the database, זיי זענען לייענען גלייַך פון די עלעמענצ.קסמל טעקע און קאַפּיד אין אַפּלאַקיישאַן שטאַט אין רונטימע. אַזוי, איר טאָן ניט דאַרפֿן צו דיאַקטיווייט, נעם אַוועק, ריינסטאַל, און ריאַקטאַווייט דער שטריך צו באַזייַטיקן די קוסטאָמאַקטיאָן. נאָר אַראָפּנעמען עס פון די עלעמענצ.קסמל טעקע און ריסייקאַל די אַפּלאַקיישאַן בעקן(ס) יפעקטיד. דער ווייַטער צייַט די שטריך איז אין פאַרנעם, איר וועט נישט זען די קוסטאָמאַקטיאָן ענימאָר."

איך נאכגעגאנגען זייַן ינסטראַקשאַנז און, אַוואַדע, זיי אַרבעט.

אין מיין פאַל, this is a department level installation with just a single WFE. If you find yourself with this problem in future and with multiple WFE’s, איך גלויבן איר וועט האָבן צו מאַכן די ענדערונג אין יעדער.

</עק>

אַבאָנירן צו מיין בלאָג.

שנעל פיקס: אַקסעסינג שאַרעפּאָינט מאַפּע טהראָווס [הטטפּעקססעפּטיאָן (0קס80004005): בעטן טיימד אויס.]

One of my developer colleagues was working on a project this week and ran into a timeout problem while working on building some crazy web part. His web part was fine, but "suddenly" אַ אַנרילייטיד פּלאַץ געווארן זייער פּאַמעלעך און אָפט טיימד אויס מיט דעם טעות:

[הטטפּעקססעפּטיאָן (0קס80004005): בעטן טיימד אויס.]

I logged in and saw that several other sites were just fine. I suspected that there were some hidden web parts on the page and using the trusty ?contents=1 debug technique, I did in fact find 11 web parts on the page, only two of which were visible. Even better (from a let’s-hope-I-find-something-ugly-here-that-I-can-fix perspective), three of those closed web parts had a name of "Error".

I deleted those web parts (which itself took a surprisingly long time) and that solved the problem. For today 🙂

</עק>

אַבאָנירן צו מיין בלאָג.

טעטשנאָראַטי טאַגס:

ינוואָקינג ססרס וועב סערוויסעס פון ווסס / מאָך אין פבאַ סוויווע

We needed to invoke the "CreateSubscription" method on an SSRS web service that is hosted in an FBA managed MOSS environment from a custom web part. We kept getting variations of:

  • 401: ניט אָטערייזד
  • כייפעץ אריבערגעפארן

The "object moved" message was most interesting because it was saying that the "object" (אונדזער ססרס דינסט) had "moved" to login.aspx. This clearly meant we had some kind of authentication problem.

איך יווענטשאַוואַלי איינגעזען אַז איך האט באָאָקמאַרקעד אַ בלאָג פּאָזיציע by Robert Garret that described how to invoke a general purpose WSS/MOSS web service living inside an FBA environment. Note that I can’t link directly to the article (ווי פון 06/09/08) because it wants to authenticate. The link I provide brings you to an "all posts" view and you can locate the specific article by searching for "Accessing MOSS Web Services using Forms Based Authentication".

דאָ ס דער קאָד וואָס געארבעט פֿאַר אונדז:

רעפּאָרטינגסערוויסע2006 רס = נול; 
// אָטענטאַקייט אָטענטאַקיישאַן אָט = נייַ אָטענטאַקיישאַן(); 
אַוטה.ורל = "הטטפּ://URL / _ווטי_בין / אַוטהענטיקאַטיאָנ.אַסמקס";
אַוטה.קאָאָקיעקאָנטאַינער =
נייַ קאָאָקיעקאָנטאַינער();
לאָגינרעסולט רעזולטאַט = אַוטה.לאָגין("userid", "password");
צי (רעסולט.ערראָרקאָדע == לאָגינערראָרקאָדע.נאָערראָר) 
{
// ניט קיין טעות, אַזוי באַקומען די קיכלעך.
קאָאָקיעקאָללעקטיאָן קיכלעך = אַוטה.קאָאָקיעקאָנטאַינער.געטקאָאָקיעס(נייַ אורי(אַוטה.ורל));
קיכל אַוטהקאָאָקיע = קיכלעך[רעסולט.קאָאָקיענאַמע];
רס =
נייַ רעפּאָרטינגסערוויסע2006();
רס.ורל =
"הטטפּ://server/_vti_bin/ReportServer/ReportService2006.asmx";
רס.קאָאָקיעקאָנטאַינער =
נייַ קאָאָקיעקאָנטאַינער();
רס.קאָאָקיעקאָנטאַינער.אַדד(אַוטהקאָאָקיע);
}
פּרובירן
{
  רס.קרעאַטעסובסקריפּטיאָן(באַריכט, עקסצעטטינגס, דעסק, עווענטטיפּע, matchData, פּאַראַמעטערס1);
}
כאַפּן (ויסנעם עקס)
{
  קאָנסאָלע.ווריטעלינע(עקס.מעססאַגע.טאָסטרינג());
}

איך טייַטשן זאכן צו אַרבעטן ווי דעם:

  • אונדזער וועב טייל דאַרף צו רעדל אַרויף די אָטענטאַקיישאַן דינסט און זאָגן, "Hey, טאני, עס ס מיר!".
  • אָטענטאַקיישאַן דינסט ריפּלייז געזאגט, "Hey, I know you. How are the kids? Here’s a token."
  • מיר רופן זיך די ססרס דינסט און זאָגן, "Tony sent me, דאָ ס די סימען."

</עק>

אַבאָנירן צו מיין בלאָג.

שנעל און סימפּלע: טנייַ אַ וועבסזייַטל וסינג שאַרעפּאָינט אָבדזשעקט מאָדעל אין C #

I tried searching for a little snippet code that would show how I can create a new SPWeb in a site collection. I didn’t find it as quickly or easily as I expected so I thought I’d slap together a little entry on the subject.

דעם קאָד קריייץ אַ נייַ וויקי פּלאַץ:

 ספּסיטע סיטעקאָללעקטיאָן;

    סיטעקאָללעקטיאָן = נייַ ספּסיטע("http://קאָנטשאַנג-אָ9ל8קי");

    ספּוועב וו = סיטעקאָללעקטיאָנ.אָפּענוועב();

    וו.וועבס.אַדד("xyzzy", "xyzzy Title",
        "xyzzy description", 1033, ספּוועבטעמפּלאַטע.וועבטעמפּלאַטעוויקי, פאַלש, פאַלש);

My initial searches failed because I was looking for phrases like "provision a web site using sharepoint object model" and the like.

אויב איר זוכן for "Webs.Add()", איר וועט געפינען אַ נומער פון זייער נוציק בלאָג איינסן, MSDN articles and SDK documentation that go into depth on this subject. I definitely recommend דעם פּלאַץ.

</עק>

אַבאָנירן צו מיין בלאָג.

טעטשנאָראַטי טאַגס: