Posts
289
Comments
88
Trackbacks
4
November 2008 Entries
Mögliche Fehlerquelle bei Excel-Services und Datenbankverknüpfung

Wenn man beim Aufruf einer Excel-Tabelle mit einer Datenbankverknüpfung in den Excel-Services den Fehler:

"Unable to retrieve external data for the following connections:

BEISPIEL_CONNECTION

The data sources may be unreachable, may not be responding, or may have denied you access."

erhält

Bild1

 dann kann dies daran liegen, dass man unter "Daten | Verbindungen | Eigenschaften | Definition | Authentifizierungseinstellungen" als Authentifizierungstyp nicht "keine" ausgewählt hat.

authenifitierung

posted @ Wednesday, November 26, 2008 10:21 PM | Feedback (0)
Übersicht: Shortcuts für Visual Studio

Hier mal ein Link mit den Shortcuts für Visual Studio:
http://www.codinghorror.com/blog/files/Visual%20Studio%20.NET%202005%20Keyboard%20Shortcuts.htm

posted @ Monday, November 24, 2008 9:17 PM | Feedback (0)
Sharepoint Body-onload-Event

SharePoint bietet mit seiner JavaScript-Bibliothek (INIT.JS) die Möglichkeit dem Body onload-Event mehrere JavaScript-Funktionen hinzuzufügen um diese im onlad-Event nacheinander auszuführen.

Dazu werden zum einen dem Array _spBodyOnLoadFunctionNames weitere Funktionen hinzugefügt: _spBodyOnLoadFunctionNames.push("meineEigeneFunktion").

Zum anderen wird beim onload-Event das Array spBodyOnLoadFunctionNames abgefragt:

onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();"

Wenn die Funktion _spBodyOnLoadWrapper exisitert, dann wird diese aufgerufen. Diese Funktion wiederum ruft die Funktion ProcessDefaultOnLoad auf welche das Array _spBodyOnLoadFunctionNames nach Funktionsnamen durchgeht und anschießend diese Funktionen nacheinander ausführt:

function ProcessDefaultOnLoad(onLoadFunctionNames)
{

// ...
for (var i=0; i < onLoadFunctionNames.length; i++)
{
      var expr="if(typeof("+onLoadFunctionNames[i]+")=='function'){"+onLoadFunctionNames[i]+"();}";
      eval(expr);
}
if (typeof(_spUseDefaultFocus)!="undefined")
DefaultFocus();

}

Auf diese Weise lassen sich eigene Funktionen wie z.B. Ajax-Funktionen in ein SharePoint-Projekt einbinden.

posted @ Monday, November 24, 2008 9:16 PM | Feedback (0)
Commandline Programme von C# aus aufrufen

Ab und zu ist es zweckmäßig Commandline Programme von C# aus aufrufen um deren Fuktionen,z.B. zippen zu verwenden. Hier ein

Code-Snippet für einen solchen Fall:

string sProgram = @"PfadZumProgramm";
string sArguments = "ProgrammParameter;

Process proc = new Process();
proc.StartInfo.FileName = sProgram;
proc.StartInfo.Arguments = sArguments;
proc.Start();

Nicht vergessen den Namespace "System.Diagnostics" einzubinden.

posted @ Sunday, November 23, 2008 9:15 PM | Feedback (0)
String in Textdateien ersetzen

manchmal muss man in einer Textdatei einen String durch einen anderen ersetzen:

 class Program
{
    static void Main(string[] args)
    {
        string sFilename = "Pfad zur Datei";
        string sContent = string.Empty;
File.ReadAllText(sFilename);
 
       sContent = Regex.Replace(sContent, "sucheNach", "ErsetzeDurch");
    
   File.WriteAllText(sFilename, sContent); 
     }
}

posted @ Sunday, November 23, 2008 9:15 PM | Feedback (1)
Sharepoint: Alle Listen eines Webs mit den dazugehörigen Elementen ausgeben

Mit dem folgenden Code-Fragment kann man sich alle Listen eines Webs mit den dazugehörigen Elemente ausgeben lassen: 

string site = URL_zum_Web";
using (SPSite oSPSite = new SPSite(site))
{
   using (SPWeb oSPWeb = oSPSite.OpenWeb()) 
   { 
      foreach (SPList list in oSPWeb.Lists) 
      { 
         foreach (SPListItem listItem in list.Items) 
         { 
            Console.WriteLine(list.Title); 
            Console.WriteLine("-----------------------------------"; 
            Console.WriteLine();

            foreach (SPField field in list.Fields) 
            { 
               Console.WriteLine(field.Title.PadRight(30) + ": " + 
                  listItem[field.Title]); 
            } 
            Console.WriteLine(); 
            Console.WriteLine(); 
         } 
      } 
      Console.Read(); 
   }
}

posted @ Saturday, November 22, 2008 4:49 PM | Feedback (0)
Sharepoint: Alle Listen eines Webs ausgeben

Mit dem folgenden Code-Fragment kann man sich alle Listen eines Webs anzeigen lassen:

string site = "URL_des_Webs";
using (SPSite oSPSite = new SPSite(site))
{
   using (SPWeb oSPWeb = oSPSite.OpenWeb()) 
   { 
      Console.WriteLine("Titel".PadRight(30) + " " + 
      "BaseType".PadRight(20) + " " + 
      "BaseTemplate".PadRight(20)); 
      Console.WriteLine(); 
      foreach (SPList list in oSPWeb.Lists) 
      { 
         Console.WriteLine(list.Title.PadRight(30) + " " + 
            list.BaseType.ToString().PadRight(20) + " " + 
            list.BaseTemplate.ToString().PadRight(20)); 
      } 
      Console.Read(); 
   } 
}

posted @ Saturday, November 22, 2008 11:44 AM | Feedback (0)
Sharepoint: Alle Webs einer Site ausgeben lasen

Mit dem folgenden Code-Fragmenr kann man sich alle Webs einer Site ausgeben lassen: 

string site = "URL_ROOT";
using (SPSite oSPSite = new SPSite(site))

   SPWebCollection oWebCollection = oSPSite.AllWebs;

   Console.WriteLine("Titel".PadRight(30) + "relativer Pfad".PadRight(30)); 
   Console.WriteLine(); 
   foreach (SPWeb oSPWeb in oWebCollection) 
   { 
      Console.WriteLine(oSPWeb.Title.ToString().PadRight(30) + 
         oSPWeb.ServerRelativeUrl.ToString().PadRight(30));
   } 
   Console.Read();
}

posted @ Saturday, November 22, 2008 11:16 AM | Feedback (0)
Hashtables lassen sich auf 2 Wegen enumerieren

Fürs Archiv:

Hashtables lassen sich auf 2 Wegen enumerieren:

Möglichkeit a)

Hashtable tableDefaultValues = new Hashtable();

IDictionaryEnumerator enumeratorDefaultValues = tableDefaultValues.GetEnumerator();

while (enumeratorDefaultValues.MoveNext()) {

}

Möglichkeit b)

Hashtable tableDefaultValues = new Hashtable();

foreach (DictionaryEntry entry in tableDefaultValues) {

}

posted @ Friday, November 21, 2008 11:12 AM | Feedback (0)
Interessanter Dienst von Google: TRENDS

Gestern hatte ich in einem Podacst von dem Dienst Trends von Google gehört: www.gogle.de/trends

http://www.google.de/trends?q=sap&ctab=0&geo=all&geor=all&date=all&sort=0

Hier kann man einen Suchbegriiff eingeben und dann sehen in welchen Ländern dieser am meisten eingegeben wurde. Die Suche kann man auch auf Länder und Regionen eingrenzen.

Zum anderen bietet www.gogle.de/trendsauch auch eine Suche nach Websites und gibt als Auswertung der Zugriffe auf die eingegebenen Website. Das System gibt jeweils die Anzahl der Besucher pro Tag an.:
http://trends.google.com/websites?q=sap.com&geo=all&date=all

posted @ Thursday, November 20, 2008 6:51 PM | Feedback (0)
Unterschied zwischen XLSX- und XLSM-Dateien

Excel 2007 verwendet als Standarddateiformat Dateien mit der Typenbezeichnung .XLSX. Die altbekannte Dateierweiterung wird also um ein X am Ende erweitert, um darauf hinzuweisen, dass es sich um ein XML-Dokument handelt. Enthält die Mappe Makros, wird die Endung .XLSM verwendet.

Wenn man nun eine XLSM-Excel-Datei erhält und diese per Daten | Verbindungen mit dem Ergebnis einer stored procedure befüllen möchte erhält man den Fehler "Bezug ist ungültig":

Bild1

Unter Verbindungseigenschaften | Definition wird als Verbindungstyp "Office-Datenverbindung" angegeben.

Man muss als die Datei als XLSX-Datei speichern und die Verbindung neu anlegen. Der Verbindungstyp unter Verbindngseigenschaften | Definition wird nun als "Ole-DB-Abfrage" angeben und die Verbindung zur stored procedure klappt.

posted @ Wednesday, November 19, 2008 8:53 PM | Feedback (0)
Kleine Zeile - große Wirkung

Da Excel VBA-Makros in den SharePoint Excel-Services - aus Sicherheitsgünden - nicht funktionieren mussten in unserem SharePoint-Projekt die vorbereiteten Berechnung per stored procedures im SQL-Server abbilden.

Die stored procedures mit diversen temporären Tabellen, Updates und insert intos liefen im SQL management Studio einwandfrei.

Beim Einbinden der stored procedures in die Excel Pivot-Tabelle erhielten wir die Fehlermeldung:
"Die Abfrage oder das Öffnen der Tabelle konnte nicht ausgeführt werden"

Erst nachdem ein Kollege die Idee hatte "SET NOCOUNT ON;" in die stored procedure einzufügen, wurden die Daten korrekt in Excel übertragen.

"SET NOCOUNT ON" bewirkt, dass die Meldung bezüglich der Anzahl der von einer Transact-SQL-Anweisung oder gespeicherten Prozedur betroffenen Zeilen nicht mehr als Teil des Resultsets zurückgegeben wird.
Eingefügt aus <http://msdn.microsoft.com/de-de/library/ms189837.aspx>

Da Excel diese Meldungen der betroffnen Zeilen nicht als Tabelle interpretieren konnte gab Excel die obige Fehlermeldung aus.

posted @ Tuesday, November 18, 2008 7:12 PM | Feedback (0)
Entwicklung von Sharepoint-Programmen

Da in der Praxis auf dem SharePoint - Server meist keine Entwicklungsumgebung installiert ist muss man folgende Weg gehen:

  • Entweder einen dedizierten Entwicklungsrechners mit SharePoint und Visual Studio auf einer realen Maschine oder einer virtuellen Maschine installieren
  • Oder sich die Microsoft.Sharepoint.dll auf seinen Entwicklungsrechner kopieren, dann hat man im Visual Studio das SharePoint Objekt Modell und die IntelliSense zur Verfügung. Kopiert man sich noch die Datei wss.xsd, dann hat man auch IntelliSense in den SharePoint-XML-Dateien.
    Man wird die Anwendungen immer auf dem Server testen müssen,jedoch hat man es leichter bei der Entwicklung.
posted @ Saturday, November 15, 2008 12:32 PM | Feedback (0)
SharePoint: Dynamische Verlinkung zur Wiki einbauen

In unserem aktuellen Sharepoint-Projekt hatte ein Kollege die Idee auf folgende Weise eine dynamische Verlinung zur Wiki einzubauen:

Oft kommt es vor, dass es zu einer umfangreichen Sharepoint Anwendung auch eine umfangreiche Wiki gibt. Hier ein Beispiel wie man zu den Listen eine dynamsiche Verlinkung zu der Wiki der aktuellen Liste in die Seite enbauen kann. Wenn es zu der aktuellen Liste kein Wiki gibt, dann wird auf die Wiki-Startseite verlinkt.

Voraussetzung hierfür ist, dass der jeweilige Wiki den gleichen Namen wie die dazugehörige Liste hat.

Zunächst wird per Javascript im onload-Event der Seite ausgelesen um welche Liste es sich handelt. Danach wird der Name der Liste an die Datei gotolistwiki.aspx übergeben, hierzu wird ein Popup-Fenster (javascript:popupWiki(newURL)) geöffnet.

function showWikiForList () {
    if(typeof(ctx) != 'undefined') {
        var url = document.location.href;
        url = url.substring(0, url.lastIndexOf("/"));
        url = url.substring(0, url.lastIndexOf("/"));
        url = url.substring(0, url.lastIndexOf("/"));
        newURL = "/gotolistwiki.aspx?ItemName=" + ctx.ListTitle;
        var link = document.getElementById(Element für den Link zum Wiki);
        link.href = "javascript:popupWiki(newURL)";
        link.href = newURL;
    }
}

function popupWiki(url) {
    showWindow = window.open(url, "wiki", "width=900,height=700,status=yes,scrollbars=yes,resizable=yes");
    showWindow.focus();
}

In der Datei gotolistwiki.aspx schließlich wird nachgesehen ob es im Wiki-Verzeichnis "Help" eine Datei mit dem Namen der Liste existiert. Wenn ja, dann wir diese Seite geladen, ansonsten wird auf die Startseite des Wiki verlinkt.

<%@ Page Language="C#" %>
<%@ Import namespace="Microsoft.SharePoint"%>

<script runat="server">
protected override void OnLoad(EventArgs e)
{
    string strWikiItem = Request.QueryString["ItemName"];
    string sWikiRelative = "/Help/";
    string sWikiHome = "Home.aspx";
    string sWikiPage = strWikiItem+".aspx";
    string sWikiBase = Request.UrlReferrer.AbsoluteUri;
    using(SPSite oSPSite = new SPSite(sWikiBase))
    {
        using(SPWeb oSPWeb = oSPSite.OpenWeb())
        {
            sWikiBase = oSPWeb.Url;
            if (oSPWeb.GetFile(sWikiBase+sWikiRelative+sWikiPage).Exists)
                Response.Redirect(sWikiBase+sWikiRelative+sWikiPage);
            else
            Response.Redirect(sWikiBase+sWikiRelative+sWikiHome);
        }
    }
}
</script>

posted @ Monday, November 10, 2008 4:19 PM | Feedback (0)
Spamfilter für Outlook

Einen guten Spamfilter für Outlook (SpamBayes) findet man bei Sourceforge: http://spambayes.sourceforge.net/

posted @ Saturday, November 08, 2008 3:42 PM | Feedback (0)
Javascript nach dem Laden einer Seite aufrufen

In manchen Fällen kann es sinnvoll sein eine Javascript-Funktion erst dann aufzurufen nachdem eine Seite vollständig geladen und das onload-Event bereits ausgeführt wurde. Z.B. dann wenn das vewendete Framework unerwünschterweise den onload-Event der Seite überschreibt.

Folgendes Javascript kann hierbei weiterhelfen (Internet Explorer):

function proofLoaded() {
   if (document.readyState == "complete") {
      meineFunction()
   } else {
      setTimeout('proofLoaded()',500);
   }
}
setTimeout('proofLoaded()',500);

Ist dieses Skript in einer Javascript-Bibliohek includiert, dann wird solange der Befehl setTimeout('proofLoaded()',500); ausgeführt, bis die Seite vollständig geladen wurde. Erst dann wird die gewünschte Funktion aufgeführt und der Befehl setTimeout('proofLoaded()',500) nicht mehr aufgerufen.

posted @ Friday, November 07, 2008 10:37 AM | Feedback (0)
Besonderheiten bei den Klassen SPSite, SPWeb

Da die beiden wichtige Klassen im SharePoint Objektmodell SPSite und SPWeb die Schnittstelle IDisposable verwenden, werden deren Objekt nicht automatisch vom garbage collector gelöscht. D.h.man muss bei der Programmierung darauf achten, dass diese Objekte nach Ihrer Verwendung manuell aus dem Speicher gelöscht werden müssen.

Man sollte hier also mit der using clause oder mit einem try, catch und finally Block arbeiten.

Link: http://msdn.microsoft.com/en-us/library/aa973248.aspx

posted @ Thursday, November 06, 2008 10:30 AM | Feedback (0)
Javascripte in der SharePoint Listen-Ansicht "Edit in Datasheet"

Wird in SharePoint als Ansicht einer Liste "Edit in Datasheet" ausgewählt, dann wird die Liste in Form einer editierbaren Tabelle angezeigt.

Dabei werden in den Quellcode automatisch mehrere Javascripte eingefügt. So wird u.a. per Javacript das onload Event der Seite überschrieben:

<SCRIPT language=JavaScript for=window EVENT=onload>
GCWindowResize(document.xxx);
GCActivateAndFocus(document.xxx);
</SCRIPT>

und eine Variable "bGridViewPresent" definiert und auf true gesetzt

<SCRIPT language=JavaScript>
var bGridViewPresent = true;
</SCRIPT>

In manchen Fällen ist es nicht gewünscht, dass das onload-Event der Masterpage überschrieben wird, da hierüber nützliche Funktionen des Javscript-Frameworks ausgeführt werden.

Die Variable "bGridViewPresent" kann nun in der Masterpage verwendet werden um sich die alte onload-Funktion wieder zurückzuschreiben:

<SCRIPT language=JavaScript >
if ( typeof (bGridViewPresent) != 'undefined')
{
    window.onload =newOnload();
}

function newOnload() {
// … hier die gewünschte onload-Funktion einsetzen
}
</SCRIPT>

posted @ Wednesday, November 05, 2008 11:46 AM | Feedback (0)
Praktische Javascript-Funktionen

Per Javascript lassen sich auch Events überschreiben, hier einige Beispiele:

// Den Event onload überschreiben
<SCRIPT language=JavaScript for=window EVENT=onload>
// Javascript Code
</SCRIPT>

// Dem Event Windos.resize ein Javascript zuordnen
<SCRIPT language=JavaScript for=window EVENT=onresize>
// Javascript Code
</SCRIPT>

 

posted @ Monday, November 03, 2008 9:22 AM | Feedback (1)