Sunday, May 27, 2007

Hvis du i en eller anden form har noget med Office 2007 udvikling af gøre (klient eller server) så bør du lige se her

Office Developer How-to Center on MSDN

om der er ikke skulle være lidt info som du kan bruge til noget.

Der findes et hav af screencasts med tilhørende kode og tekst omkring eksempelvis udvikling med Word 2007, Excel 2007, Open XML, SharePoint og meget mere.

Jeg har en flok konsulenter som skal gennem et certificeringsforløb på Teknologisk Institut omkring SharePoint-udvikling, og de bør se på nogle af disse (hint hint hint...):

  • Activate Auditing Programmatically for a Single Document Library in Windows SharePoint Services 3.0
  • Activate Auditing Programmatically for a Site Collection in Windows SharePoint Services 3.0
  • Configure IntelliSense with CAML Files When Developing for Windows SharePoint Services 3.0 - NEW!
  • Create a Custom HttpHandler (AuditLogWorkbook.ashx) in in Windows SharePoint Services 3.0 - NEW!
  • Create a Feature for an Entry Control Block Item in Windows SharePoint Services 3.0
  • Create a Feature for the Site Actions Menu in Windows SharePoint Services 3.0
  • Create an Application Page in Windows SharePoint Services 3.0
  • Create a Solution Package in in Windows SharePoint Services 3.0 - NEW!
  • Display Data by Using the SPGridView Control in Windows SharePoint Services 3.0 - NEW!
  • Read Entries from the Audit Log in Windows SharePoint Services 3.0 - NEW!
  • Read ListId and ItemId from an Application Page in Windows SharePoint Services 3.0
  • Run Commands with Elevated Privileges in Windows SharePoint Services 3.0 - NEW!
  • Write Custom Entries to the Audit Log in Windows SharePoint Services 3.0 - NEW!
  • Create a Custom Search Page and Tabs in the Search Center of SharePoint Server
  • Create and Expose Managed Properties in the Advanced Search Page of SharePoint Server Enterprise Search
  • Create and Expose Search Scopes in SharePoint Server 2007 Enterprise Search
  • Create Business Data Catalog Entities in SharePoint Server 2007
  • Create Content Sources to Crawl Business Data in SharePoint Server 2007 Enterprise Search
  • Create Managed-Code UDFs for Excel Services
  • Enable Users to Act on LOB Data with Business Data Catalog Actions - NEW!
  • Filter One Business Data Catalog List from Another by Using Associations in SharePoint Server 2007
  • Refine Business Data Catalog Search with Scopes
  • Retrieve Excel 2007 Workbooks or Snapshots Using SharePoint Server 2007 Excel Services
  • Use Business Data Catalog Actions to Pass Parameters to InfoPath 2007 Browser Forms

 

posted on Sunday, May 27, 2007 9:51:31 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]

Dette produkt er da gået helt hen over hovedet på mig - pinligt. Refactor! for ASP.NET er en gratis add-on der tilføjer flere refactor funktioner til VS fsva ASP.NET, og en del funktioner relateret til andre projekttyper (skrevet i VB og C#). Læs dette indlæg for en nærmere gennemgang - der er et par gode screenshots som viser mange af funktionerne.

posted on Sunday, May 27, 2007 9:36:52 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Wednesday, May 23, 2007

Så lige andet afsnit af Hjemmeservice (se evt. tidligere indlæg) hvor Billy Cross guider rundt i New York - blandt på Oyster BarGrand Central Station.

Jeg er egentlig ikke så vild med muslinger mv., men det er måske bare fordi jeg ikke har spist de rigtige steder. Det tyder på at man bør tage et smut forbi Oyster Bar. Prøv at se et af deres menukort.

posted on Wednesday, May 23, 2007 8:36:29 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Sunday, May 20, 2007

I forbindelse med en artikel til Alt om DATA har jeg lovet at smide et par links som man skal bruge til at installere WSS 3.0 (Windows SharePoint Services).

  1. WSS kræver Windows Server 2003 med SP1. Find service pack (mv) på Windows Update og sørg for at maskinen er fuldt opdateret. Installer herefter IIS (application server). Lad være med at installere Front Page Server Extensions.
  2. Hent og installer .NET Framework Version 2.0 Redistributable Package
  3. Hent og installer .NET Framework Version 3.0 Redistributable Package
  4. Hent og installer Windows SharePoint Services 3.0. Husk eventuelt at vælge dansk som sprog
  5. Når du er oppe at køre kan du eventuelt hente en eller flere applikations skabeloner. Der er et hav at vælge i mellem på "Application Templates for Windows SharePoint Services 3.0"

God fornøjelse!

posted on Sunday, May 20, 2007 9:59:44 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]

Min miniserie om brug af XMLTextReader-klassen fortsætter med at se på nogle af de brugbare metoder. Følgende kode benytter samme hjælpemetoder og XML struktur som det første indlæg - så de vil ikke blive gentage her.

I sidste "afsnit" så vi på hvad der reelt sker når man parser en XML struktur igennem med Read()-metoden fra XMLTextReader-klassen. Heldigvis indeholder klassen dog også et par metoder som gør det lidt nemmere at løbe en struktur igennem

  • MoveToContent()
    Checks whether the current node is a content (non-white space text, CDATA, Element, EndElement, EntityReference, or EndEntity) node. If the node is not a content node, the reader skips ahead to the next content node or end of file. It skips over nodes of the following type: ProcessingInstruction, DocumentType, Comment, Whitespace, or SignificantWhitespace.
  • ReadStartElement()
    Checks that the current node is an element and advances the reader to the next node.
  • ReadElementString()
    This is a helper method for reading simple text-only elements.

Lad os starte med MoveToContent() som checker om den aktuelle node har indhold (eksempelvis er et element). Hvis den ikke har indhold hopper den til den første node med indhold. Derfor vil denne kode hoppe direkte til medarbejdere-noden:

r = new XmlTextReader("test.xml");
wl("");

r.MoveToContent();
wlr(r);
wl(r.Name);

Det vil resultere i følgende:

002|002 medarbejdere

Så ved hjælp af MoveToContent() springer man altså over både deklaration og whitespace. Et efterfølgende kald til MoveToContent() vil derimod ikke gøre det store - den aktuelle node er et element, og derfor gøres ikke noget. Skal vi have fat i fornavn-noden kræver det således et par Read() kald:

r = new XmlTextReader("test.xml");
wl("");

r.MoveToContent();
wlr(r);
wl(r.Name);

r.Read();
wlr(r);
wl(r.Name);

r.MoveToContent();
wlr(r);
wl(r.Name);

r.Read();
wlr(r);
wl(r.Name);

r.MoveToContent();
wlr(r);
wl(r.Name);

r.Read();
wlr(r);
wl("Text", r.Value);

Den sidste Read() bringer os til indholdet af fornavn. Resultat:

002|002 medarbejdere
002|015
004|004 medarbejder
004|016
005|006 fornavn
005|037 Text                     : Michell

ReadStartElement() checker om den aktuelle noder er et element, og læser den efterfølgende node:

r = new XmlTextReader("test.xml");
wl("");

r.ReadStartElement();
wlr(r);
wl(r.Name);

r.ReadStartElement();
wlr(r);
wl(r.Name);

r.ReadStartElement("fornavn");
wlr(r);
wl("Text", r.Value);
r.Read();
r.ReadEndElement();

r.ReadStartElement("efternavn");
wlr(r);
wl("Text", r.Value);
  

Resultat:

002|015
004|016
005|037 Text                     : Michell
006|016 Text                     : Cronberg

Bemærk, at metoden kan kaldes med og uden nodenavn. Metoden sparer os for et par Read() kald, og reelt bruger den internt både MoveToContent() og Read(). Læser man videre kan man som det fremgår bruge ReadEndElement(), som checker at den aktuelle node er en slut opmærkning, og derefter læser en node frem.

Endnu nemmere er brug af ReadElementString() som læser en text-værdi (kræver det er text only), og samtidigt læser en afsluttende opmærkning:

r = new XmlTextReader("test.xml");
wl("");

r.ReadStartElement();
wlr(r);
wl(r.Name);

r.ReadStartElement();
wlr(r);
wl(r.Name);

string tmp = r.ReadElementString();
wlr(r);
wl(tmp);

tmp = r.ReadElementString();
wlr(r);
wl(tmp);

Resultat:

002|015
004|016
005|054 Michell
006|036 Cronberg

Hvis man har styr på Read(), MoveToContent(), ReadStartElement() og ReadElementString() er man nogenlunde klædt på til de mulige XML(Text)Reader spørgsmål der måtte komme under MCTS test (herunder 70-528). Måske skulle man dog også lige se på de mange Readxxx-metoder (herunder ReadString()).

posted on Sunday, May 20, 2007 2:56:00 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]

Jeg har altid været en stor fan af Mick Schack, og har set (og hørt) en masse af hans programmer på DR - især Hjemmeservice (som nu vist desværre ophører fordi Mick Schack ikke længere er ansat hos DR). Hjemmeservice handler om mad i alle mulige forklædninger, og det har jeg altid syntes var interessant - og så kan jeg godt lide at høre på manden.

Her til aften (nat) - hvor jeg egentlig burde forberede undervisning til mandag - så jeg et afsnit af Hjemmeservice på dr.dk tv hvor han med Billy Cross som guide så på New York.

Nu kan du jo selv se programmet, men næste gang jeg er i New York må jeg forbi

Hvis jeg nu skriver det her er der en chance for at jeg kan huske det næste gang jeg er i New York :-)

posted on Sunday, May 20, 2007 12:11:00 AM (Romance Standard Time, UTC+01:00)  #    Comments [1]
 Saturday, May 19, 2007

I forbindelse med en artikel til Alt om DATA om SharePoint 2007 har jeg lovet at vise hvordan man nemt (og uden kode) kan vise "live" valutakurser fra Nationalbanken. Here we go

  1. Tilføj "webdelen XML" til en side, og klik på rediger
  2. Som XML-hyperlink angives http://www.nationalbanken.dk/dndk/valuta.nsf/valuta.xml
  3. Klik herefter på XSL-editor-knappen og tilføj følgende
<xsl:stylesheet version = '1.0' 
  xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  <xsl:template match="exchangerates/dailyrates">
    <table>
      <xsl:for-each 
        select="//currency[@code='USD' or 
                           @code='EUR' or 
                           @code='GBP' or 
                           @code='CHF']">
        <xsl:sort select="@code"/>
        <tr>
          <td width="100">
            <xsl:value-of select="@code"/>
          </td>
          <td align="right" width="100">
            <xsl:value-of select="@rate"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
    <br/>
    <p>
      Kurser er jf. Nationalbanken 
      fra <xsl:value-of select="@id"/>
    </p>
  </xsl:template>
</xsl:stylesheet>

Det vil resultere i følgende (forudsat man har angivet titlen til "Valutakurser fra Nationalbanken):

Bemærk: Denne løsning henter jo et dokument fra Nationalbanken hver gang siden loader (afhængig af hvordan SharePoint er sat op), og det er måske ikke den mest hensigtsmæssige løsning.

posted on Saturday, May 19, 2007 10:14:26 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Monday, May 14, 2007

Underviser i øjeblikket en stor flok konsulenter på Teknologisk Institut som skal igennem en del stof for at blive klar til en af de populære MCTS certificeringer. En af de ting vi arbejdede med i dag var nogle af de klasser der er til rådighed i frameworket til at arbejde med XML - herunder en af de sværeste at have med at gøre - XmlTextReader (som arver fra XmlReader). Jeg var ikke helt forberedt på at vi kiggede så konkret på den klasse, og var derfor ikke tilstrækkeligt klædt på. Sidder nu i toget på vej hjem, og syntes jeg burde bruge lidt tid på at dække hullerne med et ordentlig eksempel.

Brug af XmlTextReader-klassen svarer til at "lægge træet ned" og arbejde med elementerne et af gangen på en forward only og read only måde. Det er dog ikke hele strukturen der blive fladet ud - eksempelvis skal attributter håndteres specielt.

Den nemmeste måde at arbejde med XmlTextReader-klassen er at benytte Read() metoden som blot læser et element af gangen, men man skal være opmærksom på at element kan være mange ting - eksempelvis en deklaration, kommentar, whitespace og ligende - og det gør det hele lidt mere kompliceret (men logisk nok når man lige lære at tænke rigtigt).

Se på denne simple XML struktur

<?xml version="1.0" encoding="utf-8" ?>
<medarbejdere>
  <!-- Kommentar før medarbejder -->
  <medarbejder>
    <fornavn id="1" erLeder="false">Michell</fornavn>
    <efternavn>Cronberg</efternavn>
    <beskrivelse>
      <![CDATA[<p>Bla Bla Bla</p>]]>
    </beskrivelse>
  </medarbejder>
  <medarbejder>
    <!-- Kommentar før 2. medarbejders fornavn -->
    <fornavn id="2">Mathias</fornavn>
    <efternavn>Cronberg</efternavn>
  </medarbejder>
</medarbejdere>

Den benytte mange af de almindelige elementer i en XML-stuktur - herunder deklaration, kommentarer, elementer, attributter, CDATA, og whitespaces. Lad os se på hvordan den kan løbes igennem med en XmlTextReader med brug af Read(). For at gøre det nemt at læse er der lavet disse tre hjælpemetoder:

static void wl(string key)
{
  System.Console.WriteLine(key.PadRight(25));
}

static void wl(string key, string value)
{
  System.Console.WriteLine(key.PadRight(25) + ": " + value);
}

static void wlr(XmlTextReader r)
{
  System.Console.Write(r.LineNumber.ToString("000") + "|" + (r.LinePosition).ToString("000") + " ");
}

De to metoder (wl()) skriver blot ud på Console, og wlr() skriver på basis af et XmlTextReader-objekt både linjenummer og linjeposition ud.

Her er selve koden der looper hele strukturen igennem:

XmlTextReader r = new XmlTextReader("test.xml");

while (r.Read())
{
  wlr(r);
  switch (r.NodeType)
  {
    case XmlNodeType.Element:
      wl("Start element " +"Att=" + r.AttributeCount.ToString(), r.Name);
      if(r.AttributeCount>0)
        for (int i = 0; i < r.AttributeCount; i++)
        {
          r.MoveToAttribute(i);
          wlr(r);
          wl("Attribut="+r.Name, r.Value);
        }
      break;
    case XmlNodeType.EndElement:
      wl("End element", r.Name);
      break;
    case XmlNodeType.Text:
      wl("Text",r.Value);
      break;
    case XmlNodeType.Comment:
      wl("Comment", r.Value.Trim());
      break;
    case XmlNodeType.Whitespace:
      wl("Whitespace");
      break;
    case XmlNodeType.CDATA:
      wl("CData", r.Value.Trim());
      break;
    case XmlNodeType.XmlDeclaration:
      wl("XmlDeclaration");
      break;

    default:
      throw new ApplicationException("Ukendt XmlNodeType");
  }
}
r.Close();

Læg mærke til at der switch'es på alle de i strukturen kendte typer. Resultatet er som følger:

001|003 XmlDeclaration
001|040 Whitespace
002|002 Start element Att=0      : medarbejdere
002|015 Whitespace
003|007 Comment                  : Kommentar for medarbejder
003|037 Whitespace
004|004 Start element Att=0      : medarbejder
004|016 Whitespace
005|006 Start element Att=2      : fornavn
005|014 Attribut=id              : 1
005|021 Attribut=erLeder         : false
005|037 Text                     : Michell
005|046 End element              : fornavn
005|054 Whitespace
006|006 Start element Att=0      : efternavn
006|016 Text                     : Cronberg
006|026 End element              : efternavn
006|036 Whitespace
007|006 Start element Att=0      : beskrivelse
007|018 Whitespace
008|016 CData                    : <p>Bla Bla Bla</p>
008|058 Whitespace
009|007 End element              : beskrivelse
009|019 Whitespace
010|005 End element              : medarbejder
010|017 Whitespace
011|004 Start element Att=0      : medarbejder
011|016 Whitespace
012|009 Comment                  : Kommentar for 2. medarbejders fornavn
012|051 Whitespace
013|006 Start element Att=1      : fornavn
013|014 Attribut=id              : 2
013|021 Text                     : Mathias
013|030 End element              : fornavn
013|038 Whitespace
014|006 Start element Att=0      : efternavn
014|016 Text                     : Cronberg
014|026 End element              : efternavn
014|036 Whitespace
015|005 End element              : medarbejder
015|017 Whitespace
016|003 End element              : medarbejdere

Læg mærke til hvordan deklaration, whitespaces og kommentarer behandles, og at attributter håndteres helt separat ved hjælpe af MoveToAttribute(). Hvis du leger lidt videre med koden selv så prøv at trække hele XML-strukturen sammen på en linje (fjerner whitespaces) og fjerne deklaration og kommentarer. Det gør XML-filen uoverskuelig men resultatet af koden bliver mere renere.

Med basis i ovennævnte er det nemmere at prøve nogle at de mere brugbare metoder som MoveToContent(), ReadStartElement() og ReadElementString() der gør gennemløb af strukturen noget nemmere end blot brug af Read(). Det ser vi på i et senere indlæg (for nu kører vi ind på Odense banegård ;)

posted on Monday, May 14, 2007 10:07:48 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Sunday, May 13, 2007

Microsoft har netop officielt løftet sløret for den næste version af SQL Server (Katmai) som vil erstatte SQL Server 2005. Hvis du er nysgerrig kan du her læse lidt om hvad der venter.

posted on Sunday, May 13, 2007 8:27:42 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]
 Tuesday, May 08, 2007

Silverlight er jo som bekendt over os alle, og man må hellere hoppe på bussen inden den kører. Jeg syntes at video er en rigtig god måde at lære ny teknologi på, og jeg så lige at Tim Sneath har lavet en lang række screencasts. Se selv

http://blogs.msdn.com/tims/archive/2007/04/30/silverlight-screencasts.aspx

posted on Tuesday, May 08, 2007 8:21:52 AM (Romance Standard Time, UTC+01:00)  #    Comments [2]
 Saturday, May 05, 2007

Gammel nyhed - ved det godt - men bare for en god ordens skyld.

Hvis du heller ikke var på MIX i Las Vegas for et stykke tid siden så ligger sessioner på

http://sessions.visitmix.com/

Ingen undskyld for ikke at lære det sidste nye inden for bla. webudvikling (AJAX, Silverlight mv)

 

posted on Saturday, May 05, 2007 10:20:30 PM (Romance Standard Time, UTC+01:00)  #    Comments [0]