SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Entwicklung: Button + Kopieren einer Datei

Unbeantwortet Dieser Beitrag hat 31 Antworten

Ohne Rang
150 Beiträge
Lars Eigeldinger erstellt 20 Sept. 2011 15:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

wir möchten Firmen intern kleine Entwicklunges Aufgaben machen, die nicht allzu schwer sein sollten. Zumindest Theoretisch, nun habe ich folgende Aufgabe bekommen.

Ich soll ein Button im Ribbon erstellen der eine Word-Datei erzeugt.
Ich dachte ich mach das so, das die Datei aus einer Vorlagenbibliothek kommt und in eine andere hineinkopiert wird mit einem Neuen Namen von dem Element wo ausgewählt wurde mit der Laufenden Nummer, das man die zwei Dateien zuweisen kann.

Danach startet ein Workflow der die zusätzlichen Listenfelder mit Datenbefüllt.Mir geht es nur darum den Button + die Kopierfunktion zu machen, den rest weiss ich da schon.Habt vielleicht jemand eine Idee wie man das am besten macht? Bzw. ein paar gute Anleitungen?

Bin totaler C# Anfänger und arbeite mich erst gerade ein.

Danke
Gruss Lars

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Sept. 2011 15:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Naja, wo genau klemmt's denn? Wir können hier ja nicht alles von A-Z erklären ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 20 Sept. 2011 15:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es klempt schon daran, das ich nicht genau weiss wo bzw. wie ich anfangen soll.

Dachte mir ich fang zuerst mit dem Ribbon an.
Möchte da nur in einer speziellen Form-Bibliothek ein Button hinzufügen der die Kopfierfunktion für das Element startet.

Wenn ihr ein paar Anleitungen oder Links hättet, wäre mir da schon sehr geholfen. :-)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Sept. 2011 16:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Für den eigentlichen Ribbon-Button sollte eine kurze Websuche nach "sharepoint custom ribbon button" genug liefern.

Beim Rest wird es da schon schwieriger, weil es mehrere Möglichkeiten gibt, das umzusetzen. Außerdem hängt viel davon ab, ob die Vorlagebibliothek in der selben Website, der selben Websitesammlung oder sonstwo liegt. Und wie flexibel und wiederverwendbar das Ganze sein soll.

In jedem Fall solltest Du Dich auf eine steile Lernkurve gefaßt machen. Als Ausgangspunkt kannst Du Dich im SharePoint Developer Center umsehen:
http://msdn.microsoft.com/en-us/sharepoint/default.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 20 Sept. 2011 16:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich hab grad ein paar Dokus angeschaut und denke die vom Fabian (Blog) recht gut ist.

Die Vorlagenbibliothek ist auf der selben Website, sowie alle anderen Daten die benötigt werden.
Danke für den Link, werds mir anschauen.

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 22 Sept. 2011 14:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, ich hab jetzt meine Buttons, leider taucht die in der falsche Liste auf.
Zumindest weiss ich wo der Fehler liegt, ich habe die falsche RegistrationID für die Liste.

Weiss jemand zufällig wie die RegistrationID für InfoPath Listen sind?
Oder kann ich meine Buttons einer speziellen Liste zuweisen?

Danke
Gruss Lars

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 22 Sept. 2011 14:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Eventuell hilft Dir das hier weiter:

http://techtrainingnotes.blogspot.com/2008/01/sharepoint-registrationid-list-template.html

 

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 22 Sept. 2011 14:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

hey spitze, genau das habe ich gesucht.

Besten Dank.

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 23 Sept. 2011 10:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, ich dachte ich habe mein Ribbon fertig, nun sind mir doch ein paar Punkte aufgefallen.

Ich hab hier 2 Buttons. Erstellen und Öffnen.
Wie kann ich es machen das die Buttons nur aktiv sind wenn auch ein Listen-Element ausgewählt wurde?

Vor allem muss es dann so sein, das zuerst der Erstellen Button aktiv ist, und sobald der gedrückt wurde, darf nur noch der Öffnen Button aktiv sein und der erstellen ist deaktiviert.

Bzw. kann man das so machen das er nachschaut ob bei dem Element in einer speziellen Spalte:

Wenn False, aktiviere Erstellen, deaktviere Öffnen
Wenn True, aktivere Öffnen, deaktivere Erstellen

?

Danke
Gruss Lars

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Sept. 2011 10:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das geht alles indem man beim CommandUIHandler ein EnabledScript angibt.

Hier noch die Erklärung, wie man damit Metadaten prüfen kann:
http://blogs.evocom.de/af/archive/2011/03/22/eigene-ribbon-controls-enabledscript-und-asynchrones-javascript.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 23 Sept. 2011 11:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Script Link muss in der MasterPage eingebunden werden oder?
Auszug aus deinem Blog: "Damit das Ganze etwas übersichtlicher wird, lagert man das Script in eine eigene *.js Datei aus, die per ScriptLink eingebunden wird."

Und da wird ebenfalls der Pfad angegeben, oder wird das ganze in der Solution definiert?

Wir haben diesbezüglich schon ein Skript im Einsatz was das Design angeht, deshalb meine Frage. Ich weiss auch das die sich nichtgegenseitig in die Query kommen ;-)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Sept. 2011 11:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Lars Eigeldinger"]Der Script Link muss in der MasterPage eingebunden werden oder?[/quote]

Nein, lies Dir den verlinkten Artikel nochmal durch. Man kann das durch ein separates <CustomAction>-Element (auch in derselben elements.xml wie die Ribbon-Buttons) machen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 23 Sept. 2011 14:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, ich glaube ich hab da ein Fehler...

also dein Script habe eingebunden:

 <CustomAction
ScriptSrc="myEnabledFunction.js"
Location="ScriptLink"
Sequence="501">
</CustomAction>

Das Skript ist auch unter: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS gespeichert.
Er findet es auch, nur wenn ich auf die Listen-Elemente klicke bringt er mir ein Fehler beim Debuggen, das etwas nicht inizialisiert wurde...

var

 

 

myListItem = null;
var myButtonEnabled = false;
function myEnabledFunction() {
var selectedItems = SP.ListOperation.Selection.getSelectedItems();
if (CountDictionary(selectedItems) != 1) {
return false;
}
var itemId = selectedItems[0]["id"];
if (this.myListItem != null && this.myListItem.get_item("ID") == itemId) {
return this.myButtonEnabled;
}
else {
var ctx = new SP.ClientContext();
var web = ctx.get_web();
var list = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList());
this.myListItem = list.getItemById(itemId);
ctx.load(
this.myListItem, "ID", "8DReport");
ctx.executeQueryAsync(enabledQuerySuccess, enabledQueryFailed);
}
}
function enabledQueryFailed(s, args) {
this.myButtonEnabled = false;
this.myListItem = null;
}
function enabledQuerySuccess() {
var status = this.myListItem.get_item("8DReport");
if (status == "Yes") {
this.myButtonEnabled = false;
}
else {
this.myButtonEnabled = true;
}
RefreshCommandUI();
}

Beim Skript von dir habe ich nur den "Status" in 8DReport abgeändert, da so mein Feld heist, und das "Abgeschlossen" in Yes. Hätte ich da noch mehr ändern müssen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Sept. 2011 14:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das sieht eigentlich gut aus. Wo genau und welchen Fehler gibt es denn?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 23 Sept. 2011 14:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Fehler kommt sobald ich das Listen-Element anklicke (Hacken setzten)

Visual Studio sagt mir folgendes:
Microsoft JScript runtime error: The property or field has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.

und das hier wird direkt Markiert:

throw

 

 

Error.create(SP.Res.propertyHasNotBeenInitialized);

Kannst du mit dem etwas anfangen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Sept. 2011 15:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist leider immer noch zu ungenau. Kannst Du nicht das JavaScript debuggen, um die genaue Stelle herauszufinden? Das geht mit Visual Studio oder mit den Entwicklertools im IE (Menü Extras).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 23 Sept. 2011 15:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

-- gelöscht --

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Sept. 2011 16:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also alles was Recht ist, aber Du erwartest nicht, daß ich das analysiere, oder? ;-)

Das ist Code aus dem SharePoint-eigenen Script. Entweder ein bestimmter Aufruf aus Deinem Script löst das aus (dann solltest Du herausfinden welcher), oder eben nicht und dann hat es mit Deinem Problem nichts zu tun.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 08:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

nene sicher nicht, hatte nur den Anhaltspunkt, habs mal wieder gelöscht.

Ok, ich habe jetzt alles andere rausgeworfen und nun kommt der Fehler definitiv leider von deinem Script. Wenn er mir rausspringt, sagt er im VS auch das etwas nicht inizialisiert werden konnte.
Kann es sein das noch das Abfrage-Feld vorher wo definiert werden sollte?

Gruss Lars

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2011 08:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, aber solange Du nicht den genauen Ort angibst, an dem der Fehler auftritt, kann ich auch nichts dazu sagen. Das Script ist jedenfalls in einigen Projekten produktiv und fehlerfrei im Einsatz.

[quote user="Lars Eigeldinger"]Kann es sein das noch das Abfrage-Feld vorher wo definiert werden sollte?[/quote]

Das Feld muß an zwei Stellen angegeben werden: dort wo das ListItem initialisiert wird und dort wo es später ausgelesen wird.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 09:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

sorry, Andi, aber das ganze haut noch nicht so hin.

Hier ist mal mein Code vom Ribbon, wäre dir dankbar wenn du ein Blick draufwerfen könntest, vielleicht fällt dir noch was auf:

 

 

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <CustomAction

    ScriptSrc="jquery-1.6.2.min.js"

    Location="ScriptLink"

    Sequence="100">

  </CustomAction>

  <CustomAction

    ScriptSrc="myEnabledFunction.js"

    Location="ScriptLink"

    Sequence="101">

  </CustomAction>

 

  <CustomAction

    Id="MyCustomRibbonTab"

    Location="CommandUI.Ribbon.ListView"

    RegistrationId="115"

    RegistrationType="List">

    <CommandUIExtension>

      <CommandUIDefinitions>

        <CommandUIDefinition

          Location="Ribbon.Tabs._children">

          <Tab

            Id="Ribbon.CustomTabExample"

            Title="QM Process"

            Description="QM Process function"

            Sequence="501">

            <Scaling

              Id="Ribbon.CustomTabExample.Scaling">

              <MaxSize

                Id="Ribbon.CustomTabExample.MaxSize"

                GroupId="Ribbon.CustomTabExample.CustomGroupExample"

                Size="TwoLarge"/>

              <Scale

                Id="Ribbon.CustomTabExample.Scaling.CustomTabScaling"

                GroupId="Ribbon.CustomTabExample.CustomGroupExample"

                Size="TwoLarge" />

            </Scaling>

            <Groups Id="Ribbon.CustomTabExample.Groups">

              <Group

                Id="Ribbon.CustomTabExample.CustomGroupExample"

                Description="This is the 8D Report"

                Title="8D Report"

                Sequence="100"

                Template="Ribbon.Templates.CustomTemplateExample">

                <Controls Id="Ribbon.CustomTabExample.CustomGroupExample.Controls">

                  <Button

                    Id="Ribbon.CustomTabExample.CustomGroupExample.Create8D"

                    Command="CustomTabExample.Create8DCommand"

                    Sequence="10"

                    Image32by32="/_layouts/images/CreateFile_32x32.png"

                    Description="Create 8D Report"

                    LabelText="Create 8D Report"

                    TemplateAlias="cust1"/>

                  <Button

                    Id="Ribbon.CustomTabExample.CustomGroupExample.Open8D"

                    Command="CustomTabExample.Open8DCommand"

                    Sequence="20"

                    Image32by32="/_layouts/images/OpenFile_32x32.png"

                    Description="Open 8D Report"

                    LabelText="Open 8D Report"

                    TemplateAlias="cust2"/>

                </Controls>

              </Group>

            </Groups>

          </Tab>

        </CommandUIDefinition>

        <CommandUIDefinition Location="Ribbon.Templates._children">

          <GroupTemplate Id="Ribbon.Templates.CustomTemplateExample">

            <Layout

              Title="TwoLarge"

              LayoutTitle="TwoLarge">

              <Section Alignment="Top" Type="OneRow">

                <Row>

                  <ControlRef DisplayMode="Large" TemplateAlias="cust1" />

                </Row>

              </Section>

              <Section Alignment="Top" Type="OneRow">

                <Row>

                  <ControlRef DisplayMode="Large" TemplateAlias="cust2" />

                </Row>

              </Section>

            </Layout>

          </GroupTemplate>

        </CommandUIDefinition>

      </CommandUIDefinitions>

      <CommandUIHandlers>

        <CommandUIHandler

          Command="CustomTabExample.Create8DCommand"

          CommandAction="javascript:alert('8D Report wird bald erstellt!');"

          EnabledScript="javascript:myEnabledFunction();" />

        <CommandUIHandler

          Command="CustomTabExample.Open8DCommand"

          CommandAction="javascript:alert('8D Report wird bald geöffnet!');"

          />

      </CommandUIHandlers>

    </CommandUIExtension>

  </CustomAction>

</Elements>

 

 

 

 

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2011 09:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich würde mal behaupten, daß die ScriptSrc beim ScriptLink so nicht funktioniert. Du hast dort nur einen Dateinamen ohne Pfad angegeben und dazu müßte die Datei direkt im TEMPLATES-Ordner liegen (wo sie nicht hingehört).

In welchen Pfad wird die Datei denn deployed? Normalerweise in den Layouts-Ordner oder noch besser in einen eigenen Unterordner. Als ScriptSrc gibst Du dann /_layouts/Ordner/Script.js an.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 09:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

danke für die Info.

Hab soeben das Script in den Unterordner hingetan und den Pfad angepasst.
Leider bin ich nun wieder an der gleichen stelle, hab wieder die gleichen Fehler. Ich kann auch leider nicht sagen wo das Problem genau ist, da ich nur das zurück bekomme was ich schon mal geschrieben habe.

Wegen dem Pfad, habs da mal ausprobiert wo der falsche Pfad drinnen war, da hat er gleich gemekert das er die Datei nicht finden konnte. Also so wies jetzt ist findet er sie, nur sobald was darin ausgeführt werden soll, klappts nicht mehr denke ich.

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 09:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2011 10:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da hilft nur Debuggen! Setze einen Haltepunkt an den Anfang jeder Funktion und finde damit heraus, wo genau der Fehler entsteht.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 11:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, also folgendes:

Er geht in die

function

 

 

myEnabledFunction()

 

 

rein und läuft die komplette Funktion durch. Danach kommt der Fehler. Die anderen beiden Funktionen

function 

 

 

enabledQueryFailed(s, args)

function

 

 

enabledQuerySuccess()

werden komplett irgnoriert.
Mir kommts vor das er nicht mehr weiss was er danach tun soll. Bzw. keine Variable mehr hat oder nicht inizialisiert wurde, wies in der Fehlermeldung steht.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2011 11:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hast Du die beiden Funktionsnamen bei ctx.executeQueryAsync auch richtig geschrieben (inkl. Groß- und Kleinschreibung)? Hast Du den Namen des zu prüfenden Feldes korrekt angegeben (interner Name)?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 11:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ehrlich gesagt ich habe das ganze Skript von dir kopiert und nur mein Feld + den Abfragewert angepasst.
Das Feld habe ich so erstellt wie es da steht.

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 14:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, hier ist nun definitiv der Fehler, er kommt damit nicht klar:

this.myListItem = list.getItemById(itemId);

Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 26 Sept. 2011 14:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Andi, muss man noch etwas anderes mit einbinden abgesehen vom Script das benutzt werden soll? Ich glaub nun langsam, der kennt die Befehle nicht...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Sept. 2011 17:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also eigentlich sollte das alles passen. Die SharePoint-eigenen Scripte sind normalerweise bereits über die Masterpage eingebunden (sonst würde das gesamte Ribbon nicht funktionieren).

Tut mir leid, aber ich fürchte da kann man von außen nicht mehr helfen. Entweder Du findest das Problem durch weiteres Debuggen oder Du solltest das vielleicht mal auf das Wesentliche reduziert in einer blanken (Test-)Website durchspielen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
150 Beiträge
Lars Eigeldinger Als Antwort am 27 Sept. 2011 07:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das Problem ist leider, das auf dieser Webseite ansonsten nichts existiert. Das ist schon eine blanke Webseite, wenn ich mit einem Projekt fertig bin, resete ich die Seite immer neu.

Aber trotzdem danke für deine mühe. Auch wenns leider nicht funktioniert, habe ich schon einiges gelernt.