giovedì 23 luglio 2015

Easy way to copy a Sharepoint designer list between two different sites

A volte può essere necessario duplicare un workflow di sharepoint tra due siti diversi. Questa scelta è conveniente quando il workflow è complesso e riscriverlo potrebbe essere un operazione lunga e tediosa. Sharepoint non mette a disposizione una funzionalità dedicata per questa necessità perciò bisogna seguire questi semplici passi.

  1. Dal designer aprire il sito nel quale è presente il workflow da copiare. 
  2. Attraverso la barra di navigazione siteObjects selezionare workflows e quindi il workflow da copiare 
  3. Esportare il workflow tramite la funzionalità Export to Visio presente nella barra ribbon, viene creato un file con estensione vwi (default) 
  4. Selezionare il file appenda creato e cambiare l'estensione da .vwi a .zip 
  5. Aprire il file zip e rimuovere il file di nome workflow.xoml.wfconfig.xml 
  6. Una volta eliminato il file all'interno del file zip riconvertire il file rimuovendo l'estensione .zip, avremo così il file con estensione .vwi.
  7. Adesso si può procedere con l'importazione del workflow.
  8. Aprire il sito e selezionare workflow dalla barra di navigazione Site Objects e dalla barra ribbon selezionare Import from Visio
  9. Selezionare il file .vwi precedentemente modificato quindi terminare il wizard
  10. Ora i due workflow sono perfettamente allineati tra i due siti sharepoint.

mercoledì 27 maggio 2015

Custom ribbon in SharePoint 2013

Nel post di oggi verranno mostrati i passaggi per creare un custom ribbon nella barra multifunzione di SharePoint.

Per prima cosa è necessario creare una nuova SharePoint solution vuota in Visual Studio.

Aggiungere quindi un Empty Element, che servirà per definire lo stile e il comportamento del nostro ribbon.

Date un nome parlante all'elemento in modo da riconoscerlo tra gli altri.

A questo punto l'unica cosa che occorre fare è definire nel file Element.xml tutte le proprietà necessarie al funzionamento della nostra soluzione.

Riporto un esempio di seguito:

Andiamo ad analizzare da vicino il codice.

Nel tag CustomAction:
  • Id: indica l'identificativo univoco del ribbon
  • Location: il posto dove verrà visualizzato il ribbon (https://msdn.microsoft.com/en-us/library/office/ee537543.aspx)
  • RegistrationType: il ribbon può essere visibile in vari punti all'interno di SharePoint, come List,ContentType,ProgId e FileType
  • RegistrationId: va a specificare su quale tipo di lista deve essere pubblicata il ribbon
  • Title: il titolo del ribbon
CommandUIDefinition definisce l'interfaccia grafica del nostro ribbon:
  • Location: attributo molto importante, che va ad indicare in quale punto dovrà essere inserito il ribbon all'interno della barra multifunzione. Questo attributo è legato al tipo di lista definito in custom action e al tipo di elemento definito nel type.
    è possibile sovrascrivere un ribbon già esistente andando a settare uno di questi valori https://msdn.microsoft.com/en-us/library/office/ee537543.aspx, in alternativa è possibile aggiungere il ribbon ad un nodo figlio dell'elemento, nell'esempio viene inserito nei figli del tab action
Button è il controllo che verrà inserito nel ribbon, è possibile scegliere tra i seguenti controlli https://msdn.microsoft.com/en-us/library/office/ff458373.aspx#sectionSection1
  • Id: identificativo univoco del controllo
  • Command: riferimento del comando definito nell'elemento CommandUIHandler
  • Image16by16 e Image32by32: immagini da visualizzare nel ribbon
  • LabelText: testo da visualizzare nel controllo
  • Alt: testo alternativo
  • TemplateAlias: usato per dimensionare e posizionare il controllo nel gruppo dei ribbon
CommandUIHandler definisce gli eventi e le azioni utilizzabili nei controlli definiti in precedenza
  • Command: identificativo del comando
  • CommandAction: comando da eseguire all'attivazione dell'evento.
    NB: è necessario sapere che sono disponibili alcuni token che vengono sostituiti runtime, che indicano dove ci troviamo all'interno dell'applicazione di SharePoint 
    • {ItemId} 
    • {ItemUrl}
    • {RecurrenceId}
    • {SiteUrl} 
    • {ListId}
    • {ListUrlDir} 
    • {Source} 
    • {SelectedListId} 
    • {SelectedItemId}
A questo punto non rimane che deployare e vederne l'effetto.

Enjoy!

martedì 4 novembre 2014

Windows Server 2012 Task Scheduler launch failure error 101 code 2147943785

Problema:

Può capitare che un task, schedulato nel Task Scheduler di un server Windows Server 2012, non venga eseguito all'orario impostato

Lo scheduler ci fornisce il log riportato sotto :

Log Name:      Microsoft-Windows-TaskScheduler/Operational
Source:        Microsoft-Windows-TaskScheduler
Date:          03/11/2014 07:00:00
Event ID:      101
Task Category: Task Start Failed
Level:         Error
Keywords:      (1)
User:          SYSTEM
Computer:      MyServer.domain.com
Description:
Task Scheduler failed to start ""\Jobs\MyJob" task for user "MyServiceUser". Additional Data: Error Value: 2147943785.
Event Xml:



Soluzione :


  1. Assicurarsi che il task venga eseguito se l'account esecutore è loggato o meno




2.  Gli account utilizzati per l'esecuzione dei task richiedono permessi aggiuntivi come il        "Logon as batch job"

Per l'assegnazione si va in :

Administrative Tools -> Local Security Policy -> Local Policies -> User Rights Assignment -> Log On As Batch Job




lunedì 3 novembre 2014

Entity Framework - The stored procedure return no columns in the model creation

Accade molto spesso di dover utilizzare stored procedure dinamiche o che utilizzano tabelle temporanee per la selezione dei dati.

Se andassimo a mappare queste stored procedure, nel model dell'Entity Framework, il wizard non riuscirebbe a recuperare le informazioni dei metadata, restituiti dalla stored.

L'EF non supporta l'importazione di stored procedure che per la costruzione dei risultati utilizzano:
  • Query dinamiche
  • Tabelle temporanee
Come si comporta l'EF quando tenta di mappare una stored procedure nel model, recuperando i metadati?
  1. Invoca la stored, passando tutti i parametri a null, 
  2. Per prevenire qualunque operazione pericolosa che possa comportare variazioni sul database, esegue il comando prima della sua esecuzione
Tramite questo comando, la stored procedure ritornerà solo i metadati delle colonne e il loro risultato, ma la logica interna non verrà eseguita.
Ma poichè la logica non viene eseguita dal wizard, negli scenari con tabelle temporanee o query dinamiche, la struttura dei metadati risulterà vuota.

A questo punto si hanno due scelte per ovviare a questo problema:

  • Definire manualmente un complex type di ritorno
  • Aggiungere in testa alla stored procedure
Quest'ultimo comando permette al codice della stored di essere eseguito normalmente, eseguendo completamente la logica all'interno definita.

Ma come fare fare a introdurre questo comando nella stored procedure evitando di toglierlo e rimetterlo in ogni compilazione?
Introducendo questo IF statment in cima alla stored:

Quando FMTONLY è settato a on (dal wizard di import dell'EF), l'esecuzione della stored procedure causa uno strano comportamento che permette di ignorare le istruzioni condizionali (come nel nostro caso IF 1=0), ignorando ogni qualsiasi logica e ritornando il possibile set di risultati che il codice della stored genera.

In questo modo è possibile introdurre il trick:
l'IF non verrà considerato nella normale esecuzione della stored, ma solamente quando FMTONLY è ON (wizard).

lunedì 21 luglio 2014

Working with Logstash, Elasticsearch and Kibana in Windows/IIS7

Oggi vedremo come configurare e utilizzare la famiglia di prodotti che girano attorno al mondo di ElasticSearch (Logstash e Kibana) in ambiente Windows e sotto IIS7.

ElasticSearch:
Per prima cosa scarichiamo e installiamo il pacchetto di ES (elasticsearch) download

Una volta scaricato lo scompattiamo sotto C:\ e lanciamo il bat presente nella cartella bin tramite command prompt. NB: è importante che nel sistema sia installato Java v7, e che siano configurate la variabile d'ambiente JAVA_HOME Possiamo ora verificare che il nostro servizio sia in piedi accedendo all'url http://localhost:9200

Logstash:
Scarichiamo e scompattiamo il pacchetto di Logstash dall'indirizzo download.
Copiamo il contenuto del tar.gz sotto C:\
Creiamo un file di configurazione in \bin (config.conf) contenente tutte le configurazioni del nostro logstash come indicato nell'esempio:

In questo caso stiamo utilizzando una share di rete (Z:) mappata per accedere a due file di log, in aggiunta invieremo ad ES anche il testo inserito nello standard input (command prompt).

Facciamo partire il servizio di Logstash con il seguente comando  Kibana:
Scarichiamo (download) e installiamo Kibana in IIS.

Modifichiamo il file config.js inserendo l'indirizzo del nostro server Elasticsearch 

NB: L'indirizzo del server di elasticsearch deve essere raggiungibile da qualsiasi client, non può pertanto essere localhost.
Inseriamo in IIS il mime type per le estensioni .json e non riconosciute come mostrato in figura:



A questo punto il nostro ambiente è configurato e pronto per accogliere log ed eseguire report tramite Kibana.