in

SharePoint Blogs

The Best Place for SharePoint-related Blogs

rcragg's blog

  • MCP-me

    I passed my first MCP exam today with a satisfyingly high score (hint: > 900)!

    I'm delighted to be able to say with confidence that I am now a certified expert in Developing and Implementing Web Applications with Visual C#.Net and Visual Studio.NET (070-315)

    [UPDATE] after kind congrats from Thomas Williams I thought I'd say something about how I managed this feat ;-)

    For anyone else wanting to do the same, be aware that the MS Press books DON'T cover everything you need to know in the exams. While they're a good foundation they miss out material or don't go into enough detail. I have read very good reviews of the MCSD/MCAD Training Guide by Amit Kalani if you want to be sure of not missing anything.

    Of course, there's no substitute for experience of actually using the technology (which is a good thing of course - dump the braindumps).

     

     

     

  • Crosspost test

    This is just to test that my new dasBlog blog is cross-posting OK to my SharePoint blog and to my dotnetjunkies blog
  • Indexing list items in SPS search results

    I discovered today that Indexing List Items so that they appear in Search Results doesnt happen by default and I thought "surely this can't be right". Luckily (thanks to Daniel McPherson) if you follow this link you'll see that you can still enable this on a list-by list basis
  • New MSDN article on Custom Data Processing Extension

    Christa Carpentiere has done yet another implementation of reporting off an ADO.Net Dataset but this time it's in an MSDN article, and it's in both VB.Net and C#.

    This one add something interesting though, as it also shows how you might call an external assembly to generate the DataSet.

     

     

  • More on Data Processing Extensions

    Toby Riley emailed me to alert me to his extension that can take a select query and execute it against any DB using a connection string as a parameter and pass the data back to the designer:

    http://workspaces.gotdotnet.com/appworld

    Another blogger of note has also come online,  lead developer for the Reporting Services product by the name of 'Tudor'.

  • SPS installation woes

    Searching google groups for "failed to create portal successfully" group:microsoft.public.sharepoint.portalserver.* returns 120 results

    "portal creation failed" group:microsoft.public.sharepoint.portalserver.* returns 86 results.

    I have read most of them and few seem to offer any resolution, there are ALOT of very unhappy people out there.

    Unlike most people I am only reaching a very early stage in the portal creation process, most seem to get past the 'extending virtual server' step, but I don't. The app pool identity has the required privileges on the remote SQL server (database creators role) and local admin rights on the IIS server.


    22:41:32 Checking virtual server state.
    22:41:32 Virtual server needs extend.
    22:41:32 Extending virtual server 'http://myserver:8100/' using existing AppPool 'MSSharePointPortalAppPool'...
    22:41:33 Failed to create portal successfully MY Portal


    UPDATE: Travis advised that I should have removed WSS before starting the SPS installation but this document clearly states that during SPS installation "your virtual servers for WSS are automatically disconnected" it does not at any point indicate that you should first uninstall WSS completely. This is a valid point but not the source of the problems in this case.

    UPDATE 2: Having completely removed SPS and WSS and restored our production sites from backups I have had more time now to inspect the server event logs.

    It seems that at the stage when I was asked to configure the component assignments web/search/index/ (SPS Central Administration | Configure Server Topology), there are 'Information' messages in the event log (surely these should be warnings or errors?!) relating to errors with various SharePoint-related services (search service, alert service etc)

    e.g. "..description for Event ID ( 0 ) in Source ( SharePoint Portal Alert Service ) cannot be found."

    So there is no way to find out what the errors are, but in any case it seems a whole slew of services failed to get installed properly. What annoys me no end is that the 'Configure Server Topology' page gives you no indication that anything has gone wrong.

    The reason I assume that these services failed to get installed is that immediately preceding these cryptic errors there are more specific errors as follows: 

    "The configuration information of the performance library "C:\WINDOWS\system32\infoctrs.dll" for the "InetInfo" service does not match the trusted performance library information stored in the registry" and there was a similar one relating to W3SVC

    then one of these:

    "WMI ADAP was unable to process the SharePoint Portal Alerts Notification Service performance library since one of the data blobs reported to have classes but had zero size"

    and one of these:

    "WMI ADAP was unable to retrieve data from the PerfLib subkey: SYSTEM\CurrentControlSet\Services\SPSARPI\Performance\Library, error code: 0x80041009"

    the same error was also logged for SPSAUTOCAT, SPSGATHERER, SPSGTHRSVC, SPSINDEX, SPSMATRIXPI, SPSSEARCH, SSO, subpi.

    Then there was this (reported under the identity of the app pool service account being used for SPS/WSS):

    "Windows cannot unload your classes registry file - it is still in use by other applications or services. The file will be unloaded when it is no longer in use."

    and

    "Windows saved user MyDomain\svcSharePoint registry while an application or service was still using the registry during log off. The memory used by the user's registry has not been freed. The registry will be unloaded when it is no longer in use. This is often caused by services running as a user account, try configuring the services to run in either the LocalService or NetworkService account."

    and then

    "The worker process failed to initialize the http.sys communication or the w3svc communication layer and therefore could not be started. The data field contains the error number."

    If anyone know why all this could have occurred I'd be interested to hear. In the meantime I'm probably going to call TechNet direct.

    UPDATE 3: We had numerous issues with DNS and Kerberos authentication on our domain about which we raised a PSS call to Microsoft who dealt with the issue very efficiently. After also reinstalling W2K3 from scratch I then didnt have any problems installing SPS, thanks to everyone who replied with comments.

  • Custom DataProcessing Extensions - problem with the Refresh Fields button?

    In my previous post I stated that I had succeeded in converting a Reporting Services Data Processing Extension for reporting on ad-hoc data from a serialized ADO.Net DataSet into VB.Net. I have since extended this with an extra parameter (IDataParameterCollection) to allow the report designer to define at design-time (or indeed at run-time) which DataTable within the DataSet should be used as the source table. The implementation of DataProcessing.IDataReader also now iterates over a DataView of the table rather than the DataTable itself thus allowing me to pass a third parameter (actually passed via the Generic Query Designer as the command text (IDbCommand.CommandText)) which I then use as the RowFilter for the DataView.

    This all works great. I can supply the parameters which I have told the extension to request from the designer (via the implementation of IDbCommandAnalysis.GetParameters method), and the query designer screen returns the data into the results screen, but if I attempt to navigate to the report layout tab, or I click on the 'Refresh Fields' button within the Generic Query Designer, I get an exception.

    I deliberately decided to Debug.Assert that the @DataSource parameter should not be empty, but it should not be empty anyway as I have already supplied it via the designer. Following my debug trace information I can see that ExecuteReader in being called, but that the parameters are being passed as empty strings. If I elect to ignore the error then I can see via the trace that ExecuteReader gets called a second time, this time passing the parameters as I have entered them, and all is well.

    The solution of course is not to require there to be non-empty parameters, but surely this is a bug?

    UPDATE: after lots more detective work I have discovered that presumably the Report Designer graciously handles any ArgumentExceptions, and just carries on and attempts the ExecuteReader a second time.

    How did I discover this? I turned off my assertions and just let the code proceed, the code gets as far as trying to load the DataSet:

    Try
      
    dataset.ReadXml(dataSource)
    Catch ex As
    System.Exception
       Trace.WriteLine(
    String
    .Format("Error Reading XML into dataset: {0}:{1}", ex.Message, ex.GetType))
       Throw
    ex
    End Try

    but inevitably it fails because the dataSource parameter is a blank string, so I catch an ArgumentException and write a message to the trace as follows:

    Error Reading XML into dataset: The path is not of a legal form.:System.ArgumentException

    The Report Designer then carries on and repeats the call to ExecuteReader, this time passing the correct parameters and everything goes smoothly.

    So, still a bug in my opinion (unless anyone can enlighten me otherwise) - but it works! ;-)

    UPDATE 2:

    Robert Bruckner has now kindly enlightened me as follows (see also this thread):

    If you actually execute the query when ExecuteReader(SchemaOnly) is called
    then the implementation is incorrect. For SchemaOnly execution, no parameter
    values are passed in because no query should be executed - just the columns
    should be returned.

    When Refreshing Fields, the report designer first tries to determine the
    fields based on ExecuteReader(SchemaOnly) because this should not affect any
    database state (and it is cheaper). If SchemaOnly fails, then report
    designer tries to actually execute the query and determine the fields based
    on the returned dataset. In order to execute the query it has to pass in
    parameter values.

  • A WSS Data Processing Extension for Reporting Services?

    Having decided to use Windows SharePoint Services (WSS) as a company-wide document repository I'm thinking I'm probably going to need to report on the documents and list content (in combination with data from other enterprise systems) and not just rely on SharePoint Search, so Reporting Services seems like a sensible option. Clearly though RPTSVCS can't do this out-of-the-box so I'll need to write a data processing extension. So I thought I'd see if anyone else had tried so far...

    Other than what I read in this thread, and this one so far no-one has written an extension for accessing a web service (or at least, if Bryan Keller hasnt found it the I doubt it's out there yet). So I doubt theres one floating out there for accessing info in WSS and I'll need to roll my own. I found these links which I think will prove useful, any other pointers would be welcome:

    File Share Extension
    XML Data Extension
    Clarification on the Placement of CodeGroup Elements for Extensions
    How hard is it to write Reporting Services extensions?

    If I manage it I'll post and article here!

    UPDATE: Ohad has listed some other useful links including two for extensions for custom ADO.Net DataSets by Gavin Joyce and by a GotDotNet community

    UPDATE 2: I have converted the original GotDotNet sample to VB.Net and it works! Now to write one to work with web services and ultimately with WSS lists so I can report on WSS lists to my heart's content...

  • Frontpage RPC for check-in check-out etc.

    Although I'm now happy with my custom web service, codewheeney isn't and has posted that he/she has worked out how to use the FrontPage RPC calls to do the same stuff without resorting to web services.

    I thought I'd post in case anyone else was interested and maybe we could persuade codewheeney to share the code... Otherwise the concept is (partly) documented here

  • Why is SPListItem always ReadOnly?

    Dim targetWeb As SPWeb = SPControl.GetContextWeb(Context).Webs.Item("sites/IT")
    Dim docLib As SPDocumentLibrary = CType(targetWeb.Lists.Item(New Guid(targetFolderGUID)), SPDocumentLibrary)
    Dim docLibFile As SPFile = docLib.RootFolder.Files.Add(fileName, fileContents)
    Dim docItem As SPListItem = docLibFile.Item
    docItem.Fields("Category") = "General"

    If I attempt to set the value of a field (i.e. a Column) in a List, the complier complains that:

    Property 'Item' is 'ReadOnly'

    Anyone know why I shouldnt be allowed to do it this way?!


    UPDATE: the following code is what I was looking for...

    docItem("Category") = "General"
    docItem.Update()

  • Problems uploading documents with a custom web service

     
    It is supposed to allow me to upload a document into a library of my choice except that the document completely disappeared. The bit I was originally missing is now highlighted in red. I wish the article could have mentioned this, it would have saved me alot of time! The problem was that I was starting off in the root site 'myintranet:8099', and I wanted to access a document library in 'myintranet:8099/sites/it'. Even though I was supplying the GUID it couldnt find the list from the root web, I had to also tell it to move up to the 'sites/it' web before it would find it. Needless to say the documentation does not make this at all clear.
     
    However this still does not explain what happened to the documents that were being reported as being saved OK?!
     
    Now I want to set the value of a custom field (i.e. a Column) in this List, and I'm having trouble doing that too (see my other post). This is not a good week :-(

     
    Here's how it was supposed to work. The web service was registered OK, the client code calls the upload method sending the folder URL, the filename and the binary data, and the web service uses the SPFolder.Files.Add method to create the file. It appeared to do so because it then returns the SPFile.Title, and .TimeCreated properties correctly, however the document completely disappeared into the void and didn't appear in the list (nor in any other list that I could find either)!
     
    Here's (some of) the code:
     
    [WebMethod (UploadDocument)

    targetWebsite = SPControl.GetContextWeb(Context).Webs.Item("sites/IT")
    Dim
    folder As SPFolder = targetWebSite.GetFolder(targetFolder)
    Dim NewFile As
    SPFile = folder.Files.Add(fileName, fileContents)
    Return NewFile.Title + " created " + NewFile.TimeCreated.ToLongDateString()

    ]

    [Client code:

    DialogResult = OpenFileDialogUpload.ShowDialog()
    If DialogResult = DialogResult.OK Then

    sFilePath = OpenFileDialogUpload.FileName
    sFileName = sFilePath.Substring(sFilePath.LastIndexOf("\") + 1)
    Dim fStream As IO.FileStream = CType
    (OpenFileDialogUpload.OpenFile, IO.FileStream)
    Dim nBytes As Integer = CInt
    (fStream.Length)
    Dim binFile(nBytes) As
    Byte
    ' get the file contents into a buffer
    Dim nBytesRead As Integer
    = fStream.Read(binFile, 0, nBytes)
    ' send the document to sharepoint
    Dim spf As New
    SPFiles.SPFiles
    spf.Credentials = System.Net.CredentialCache.DefaultCredentials
    MessageBox.Show(spf.UploadDocument(sFileName, binFile, sDestination))

    End If

    This topic is currently active on a newsgroup thread

  • Connectable Page Viewer Web Part

    Currently watching this thread with great interest - I love the new Google Groups

    Great work guys, here's one person who's definitely interested in the final solution! ;-)

    respect to:
    Mike Walsh
    Bart Waeterschoot
    and Ian Morrish

    UPDATE: Respect also, of course, to Jim Duncan. Mads Nissen has also now posted his own solution

  • Towards a Fault Tracking application in WSS

    I have been mulling over this for a long time so I thought I'd start a post and see where it went, and I'll keep this up to date (or write an article) if I get somewhere with it. I am the sole developer in an IT team of 5, our other main function therefore is systems admin and support for all IT systems within the office (other than printer maintenance which is out-sourced). I wrote our in-house fault-logging/issue tracking application in ASP.Net but it's lacking some features we need (I was only learning when I worte it!), and I want to do a complete re-write in SharePoint as this seems like a sensible place to host such a solution as we begin to make more and more use of SharePoint.

    I like the look of the Issues list in WSS and would like to use it as a simple fault logging system. However 'out of the box' it doesnt have everything we'd need and I'm going to have to extend it somewhat:

    For example

    1. I would prefer the ' Assign to' drop-down list to only list site administrators (or users with some other specific level of permission) rather than every user of the site - or be some other form of custom look-up that could be configured.
    2. I would prefer the notification email to also be cc' d to the user logging the issue. That way the person to whom the call has been assigned can quickly ' Reply to All' so that everyone involved knows what' s going on. The other (even better) solution to this would be if the system could automatically create an alert for the user logging the issue (and maybe even the person who has been assigned the issue) to be notified of changes to the issue (with maybe a quick link to an opt-out to this alert).
    3. It would be nice if this could be somehow be linked to tasks, either in a task list in WSS or in Outlook (i.e. the person who has the issue assigned to them also has a new task created for them). I had already written a post on using an issues list and a tasks list connected via two web parts but I saw some limitations with this approach which I outlined, and would need to be resolved.

    on Javascript 'listeners' which sounds like just the kind of thing I'm looking for in point (2) but I'm not too sure just yet what Andrew is using these listeners for so I'm going to ask!... more to come...

    Update: a while ago I printed off an article by Mark Bower at Microsoft on how to customise the context-menu for list items, but all I can find now is this article which is not quite as friendly but it gives you a starting point. It occurs to me that you could use this for a 'send email to person who logged the fault' function. Not quite as nice as the solution I hoped for in point (2) but better than nothing.

    Update2: Mark Bower has since posted about this on his blog. Here's a link to his updated article

  • Reporting Services - using parameters with Data Processing Extensions

    I had been reading in Bryan Keller's post "How hard is it to write Reporting Services Extensions?" 

    The documentation for Reporting Services includes a sample, however, that sample does not cover the use of data extensions that handle parameters. This is the only area where it gets confusing. Hopefully we will include a more comprehensive sample in the future.

    ...but I didnt need to search too far to find Gavin Joyce's post with some sample source code for doing just that.

    Now to try it out for myself!

     

  • Using the Form Web Part to pass parameters to a DataView Web Part

    I have been reading this article  Building XML Data-Driven Web Sites with FrontPage 2003

    ...and in the section on adding Data View Web Parts, it states that, when adding a connection to a SQL Stored Proc, or a Web Service:

    "you can supply parameters at runtime. The Default Value combo box supplies several options, including [QueryString(arg)] and [Form(arg)]. Select [QueryString(arg)] if you will be supplying the parameter at runtime via a querystring item."

    However, it wasn't made at all clear how you would do this in practice, I know what forms and querystrings are but at first I couldn't fathom how you are supposed to pass these parameters to the Web Part. Also, it is not clear whether you can use web part connections (i.e. a provider web part on the same page) to supply the parameter to the consumer web part at runtime. I would have thought this is the ideal way to use dataview web parts without needing to do any coding?... so I started to do some digging.

    So then I have discovered 'Insert | Form | Form Web Part' in FrontPage which looked promising. I put one onto the page and made a web part connection to my dataview web part with the following settings

    Source Web Part: Form Web Part
    Source action: Provide Form Values To
    Target Web Part: [my dataview web part]
    Target action: Modify View Using Parameters From

    ...and it just works!

    NB: After much tearing out of hair I also discovered this article, which states that you need to enable update support before you can used Stored Procs in FrontPage


Need SharePoint Training? Attend a SharePoint Bootcamp!

Posts (c) their respective authors. Everything else (c) 2007 SharePoint Experts