Introduzione
Eccoci con un altro articolo sull'integrazione di SugarCRM con vari linguaggi/piattaforme. Questa volta ci occuperemo di interazione tra SugarCRM e VB6. Molti sviluppatori e software house hanno deciso di non migrare il proprio codice VB6 a VB.NET per le più svariate ragioni, e ricevo costantemente richieste di consulenza e mentoring da parte di software house che necessitano integrazione tra i loro applicativi VB6 e SugarCRM. Ci sono svariati modi per utilizzare SOAP in VB6, MS SOAP Toolkit è una delle più note ed usate malgrado ormai deprecata da Microsoft. Noi utilizzeremo un altro tool, PocketSoap, che a mio parere è uno dei più completi e semplici da usare. PocketSoap è, come specificato sul suo sito: "un componente COM client SOAP Open Source [MPL] per la famiglia Windows". Ne faremo uso per generare automaticamente tutte le classi necessarie per interagire con SugarCRM.
Generazione delle classi Proxy Compito semplice, dato che tutto il lavoro lo svolgerà PocketSoap. Lanciamo il programma "PocketSOAP Wsdl Wizard". Tutto ciò di cui ha bisogno è la URL del file WSDL esposto da SugarCRM. Per i pigri, ecco la definizione di wsdl estratta da Wikipedia: "The Web Services Description Language (WSDL, pronounced 'wiz-dəl' or spelled out, 'W-S-D-L') is an XML-based language that provides a model for describing Web services." In pratica, un file wsdl descrive formalmente i metodi (operazioni) esposti da un web service e tutti i tipi di dati utilizzati. Partendo da questo, il wizard di pocketsoap può tradurre le chiamate a questi metodi in codice VB. Ora, questo è più o meno ciò che inseriremo nella prima schermata del wizard ("yourhost" sarà l'IP della nostra installazione SugarCRM): Accertiamoci che la directory indicata esista. Dopo aver cliccato "Next", se tutto è a posto, ci verrà mostrata la lista di servizi trovati dal wizard: Di nuovo, clicchiamo "Next" e vedremo la lista delle operazioni(metodi) esposte. Assicuriamoci che siano tutte selezionate e clicchiamo per l'ultima volta "Next". A questo punto, nella directory precedentemente selezionata, troveremo un progetto VB6 "ActiveX DLL" contenente tutte le classi di cui abbiamo bisogno. Il generatore aggiungerà automaticamente "PocketSoap Type Library" alla lista di "references" del nostro progetto. Ora è tempo di mettere alla prova il codice generato per connetterci a SugarCRM. Metodo "login" Creiamo un progetto VB (un semplice progetto exe andrà benissimo) ed aggiungiamo l'ActiveX DLL generato precedentemente alla lista di "references". Le prime linee di codice che scriveremo sono: Dim soap As sugarsoapPortType Set soap = New sugarsoapPortType per istanziare la classe proxy da usare per chiamare le varie operazioni. La prima chiamata che faremo è "login", per ottenere un "session id" richiesto dalla maggior parte delle altre operazioni. "login" richiede come parametri un tipo "userauth" e un nome di applicazione. "userauth" si compone di: username, password encodata md5 e una stringa indicante la versione. Ecco il codice: Dim user As userauth Dim loginresult As setentryresult Set user = New userauth user.username = "admin" user.password = "526ee3641d541a646b4adff94e97dc8d" user.version = "1.0" Set loginresult = soap.login(user, "test") If loginresult.Error.Number <> 0 Then MsgBox loginresult.Error.Description + " - " + loginresult.Error.Description Else MsgBox loginresult.id End If "setentryresult" è il tipo di dato che la chiamata ci restituisce. Contiene un oggetto error (con proprietà number,name e description), e una stringa "id". Se il login va a buon fine, "loginresult.Error.Number" sarà "0" e "loginresult.id" conterrà un session id valido che useremo in seguito. Per ottenere l'hash md5 della password, ci sono in rete svariati servizi, come questo . Ad esempio, l'hash md5 che vedete nel codice corrisponde alla parola "adminpassword". "user.version" parrebbe non essere rilevante,e il secondo parametro della chiamata "soap.login" call ("test" in questo caso) è il nome che vogliamo dare alla nostra applicazione. Ora che abbiamo un session id valido ,possiamo chiamare metodi più interessanti esposti dall'interfaccia SOAP di SugarCRM. Richieder dati a SugarCRM Interrogheremo il modulo "Contacts" di SugarCRM per ottenere alcuni dati. Il metodo implicato è "get_entry_list" , che si aspetta i seguenti parametri: - un session id valido, quello ottenuto mediante la chiamata a "login"
- il nome del modulo, "Contacts" nel nostro caso (o uno qualsiasi dei moduli di SugarCRM)
- una query, la clausola "WHERE" in sql
- l'ordine dei record, la clausola "ORDER BY" in sql
- un "offset", da utilizzare in caso di paginazione
- un array di stringhe contenente i nomi dei campi da restituire
- il numero massimo di record da restituire
- un flag "deleted" . Se diverso da 0 verranno restituiti anche i record cancellati (SugarCRM non cancella fisicamente i record, li marca come "deleted")
Esattamente come prima, prima istanziamo i vari oggetti dei tipi di dato che ci servono. Dim entrylistresult As getentrylistresult Dim elist() As entryvalue Dim nvaluelist() As namevalue Dim fields(0 To 3) As String fields(0) = "first_name" fields(1) = "last_name" fields(2) = "email1" Dim str As String E alla fine chiamiamo il metodo "get_entry_list". Set entrylistresult = soap.get_entry_list(loginresult.id, "Contacts", "contacts.last_name <>''", "contacts.last_name desc", 0, fields, 20, 0) If entrylistresult.Error.Number <> 0 Then MsgBox entrylistresult.Error.Description + " - " + entrylistresult.Error.Description Else elist = entrylistresult.entrylist For t = 0 To UBound(elist) nvaluelist = elist(t).namevaluelist str = "" For t1 = 0 To UBound(nvaluelist) str = str + nvaluelist(t1).Name + " -" + nvaluelist(t1).Value + Chr$(10) + Chr$(13) Next MsgBox str Next End If "entrylistresult", di tipo "getentrylistresult", contiene vari dati. Quelli che ci interessano sono il solito oggetto "error" e "entrylist",che è un array di "entryvalue", rappresentante il recordset. Ogni entryvalue è a sua volta un array di oggetti "namevalue", rappresentanti il singolo campo come coppia name/value. Scrivere dati su SugarCRM L'ultimo metodo che vedremo è "set_entry". Lo usiamo per scrivere record su SugarCRM. Richiede i seguenti parametri: - un session id valido, quello ottenuto mediante la chiamata a "login"
- il nome del modulo, "Contacts" nel nostro caso (o uno qualsiasi dei moduli di SugarCRM)
- un array di "namevalue",contenente la lista di campi del record sotto forma di coppie name/value.
Ecco come facciamo: Dim sentryresult As setentryresult Dim namevaluelist(0 To 2) As namevalue Set namevaluelist(0) = New namevalue namevaluelist(0).Name = "first_name" namevaluelist(0).Value = "ppppp" Set namevaluelist(1) = New namevalue namevaluelist(1).Name = "last_name" namevaluelist(1).Value = "lllll" Set namevaluelist(2) = New namevalue namevaluelist(2).Name = "email1" namevaluelist(2).Value = "
Indirizzo e-mail protetto dal bots spam , deve abilitare Javascript per vederlo
" Set sentryresult = soap.set_entry(loginresult.id, "Contacts", namevaluelist) If sentryresult.Error.Number <> 0 Then MsgBox sentryresult.Error.Description + " - " + sentryresult.Error.Description Else MsgBox sentryresult.id End If il risultato della chiamata è di tipo "setentryresult", esattamente come per la chiamata a "login" , e conterrà un oggetto "error e l' "id" del record. Una cosa importante da notare è che se una delle coppie "namevalue" che passiamo ha "name"="id" e il "value" appartiene ad un record esistente, staremo facendo un "update",altrimenti verrà creato un nuovo record. E' tutto per oggi. Hasta la proxima. |