Premetto che non so se è un bug di inde o se è un buon candidato per una miglioria.
Problema:
importare in inde un web service che come parametri ha valori stringa ma restituisce un oggetto .net System.Data.DataSet
System.Data.DataSet Invio (string , string …)
Usando visual studio e generando una classe proxy il metodo viene prodotto in questo modo
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Invio", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public System.Data.DataSet Invio(string CodiceCliente….) {
object[] results = this.Invoke("Invio", new object[] { CodiceCliente, …..});
return ((System.Data.DataSet)(results[0]));
}
Visual studio crea la riga con il tipo corretto introduce un cast da object a dataset…
Importando in inde il wsdl questo produce una classe leggermente diversa classe che viene depositata nella cartella app_code
[SoapDocumentMethodAttribute("http://tempuri.org/Invio", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public Object Invio (String CodiceCliente, String Password, String Mittente, bool Notifica, String Testo, String ListaNumeri)
{
Object[] Res = this.Invoke("Invio", new Object[] {CodiceCliente…..});
return ((Object)Res[0]);
}
public IDVariant Invio_ws (IDVariant CodiceCliente…..)
{
return IDVariant.convertObject(Invio(CodiceCliente.stringValue…..));
}
Inde incapsula la chiamata usa il suo solito idvariant.
È qui inizia il problema il metodo .convertobject chiaramente falisce la conversione da dataset a idvariant.
Nella libreria di tipo web service importata in inde esiste un flag la Conversione Automatica che rimuove o meno il cast automatico fra i tipi di dato. Questo flag agisce a livello di chi richiama la funzione importata e non nella generazione della classe proxy.
Io ho risolto inserendo in inde il tipo .net System.Data.DataSet come libreria.
Ed ho aggiunto il metodo populate all’oggetto recordset nativo di inde.
$0.populate($1.Tables[$2.stringValue()]);
questa funzione la utilizzo per caricare in un tipo di dato standard di inde attingendo dal dataset .net
ed usando il file list e la custom sovrascrivo la classe proxy di inde con una classe modificata che non richiama il convertobject .
il tutto pare funzionare.
Se il flag di Conversione Automatica oltre a sospendere il cast in chi usa la funzione lo facesse anche per la classe proxy che sottende mi risparmierei di dover riscrivere e sostituire la classe proxy generate da inde.
Lasciando il solo problema di gestire il tipo restituito.
io la butto li
ps
se qualcuno ha una soluzione migliore accetto consigli.