Consumare un web service SAP da applicazione .NET in C# con Visual Studio

Pubblicato da Davide, venerdì 26 ottobre 2012 Nessun Commento »

Lo scenario è il seguente: dobbiamo pubblicare su una pagina web alcuni dati provenienti da SAP. Il modo migliore per farlo? Creare un function module su SAP che estragga i dati richiesti, pubblicarlo come web service e consumarlo scrivendo qualche riga di codice in Visual Studio.

Lato SAP, dopo aver scritto il nostro function module in ABAP (che in questo esempio estrae una tabella di dati tramite alcuni parametri in input e averlo reso disponibile pubblicandolo come web service), per evitare che sia necessario passare le credenziali di accesso durante la chiamata al web service, possiamo pubblicarlo con un utente di default. Per fare ciò: dalla transazione SICF, individuare il web service nel ramo sap/bc/srt/rfc/sap/, entrare in modifica e settare l’utente nella sezione “Dati di logon anonimi”.

Avevo già appuntato qualche nota su come consumare un web service da una pagina ASPX, tutto quello che sta scritto in quell’articolo è ovviamente valido, ma questa volta aggiungeremo il servizio al nostro progetto in un modo leggermente diverso. Da Visual Studio 2010, cliccando col tasto destro sul nome del progetto e selezionando la voce di menù “Aggiungi riferimento al servizio..”

Nella popup che appare inseriremo l’url del servizio web di SAP e sceglieremo un nome: in questo caso d’esempio lo chiameremo “Ws_Factory”.

A questo punto siamo pronti per sfruttare il web service su una pagina aspx. La pagina avrà un DataGrid che servirà per pubblicare la tabella restituita dal web service, in questo datagrid vengono esplicitate solo le colonne da visualizzare, i nomi sono esattamente gli stessi nomi dei campi della tabella su SAP (se avessimo voluto far visualizzare tutta la tabella, bastava non riportare alcuna colonna). Ecco il codice aspx:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Esempio Webservice</title>
<link href="StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div id="container">
<div id="main-container">
<asp:GridView ID="GridVisual" AutoGenerateColumns="false" runat="server" CellPadding="0" CellSpacing="0">
<Columns>
<asp:BoundField HeaderText="CdL" DataField="ARBPL"></asp:BoundField>
<asp:BoundField HeaderText="Materiale" DataField="MATNR"></asp:BoundField>
<asp:BoundField HeaderText="Squadra" DataField="TEAMTXT" ItemStyle-CssClass="team"></asp:BoundField>
<asp:BoundField HeaderText="T Setup" DataField="SETUP_TIME"></asp:BoundField>
<asp:BoundField HeaderText="T Lavorato" DataField="WORKED_TIME"></asp:BoundField>
<asp:BoundField HeaderText="T Sospensione" DataField="TIMEOUT"></asp:BoundField>
<asp:BoundField HeaderText="Pz Teorici" DataField="QTY_THEORETICAL"></asp:BoundField>
<asp:BoundField HeaderText="Pz Reali" DataField="LMNGA"></asp:BoundField>
<asp:BoundField HeaderText="Pz Scarto" DataField="XMNGA"></asp:BoundField>
<asp:BoundField HeaderText="Efficienza Prod" DataField="EFFICIENCY"></asp:BoundField>
<asp:BoundField HeaderText="Pz da Produrre" DataField="QTY_TO_PROD"></asp:BoundField>
<asp:BoundField HeaderText="T al Setup Succ" DataField="NEXT_SETUP"></asp:BoundField>
<asp:BoundField HeaderText="Stato" DataField="VM_STATUS"></asp:BoundField>
</Columns>
</asp:GridView>
</div>
</div>
</form>
</body>
</html>

Il codice C# necessario è riportato sotto, con relativi commenti che spiegano tutti i passaggi:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ws_factory; //riferimento al Web Service di SAP
public partial class _Default : System.Web.UI.Page
{
// Inizializzazione oggetti
Ws_factory.YSVISUAL_MNGT MyVisual = new Ws_factory.YSVISUAL_MNGT();
Ws_factory.ys_ws_factory_vmClient MyClient = new Ws_factory.ys_ws_factory_vmClient();
Ws_factory.YS_FACTORY_VMRequest MyRequest = new Ws_factory.YS_FACTORY_VMRequest();
Ws_factory.YS_FACTORY_VMResponse MyResponse = new Ws_factory.YS_FACTORY_VMResponse();
protected void Page_Load(object sender, EventArgs e)
{
/* YSVISUAL_MNGT[] è la tabella dove vengono restituiti i dati dal web service di SAP
* Inizializzo come vuota */
YSVISUAL_MNGT[] MyVisual = new YSVISUAL_MNGT[] { };
/* Compilo i parametri della richiesta mettendo i filtri che mi interessano */
//MyRequest.CT_YSVISUAL_MNGT = MyVisual;
MyRequest.IV_ARBPL = "";
MyRequest.IV_DTOEE = "";
MyRequest.IV_NEW_RUN = "";
MyRequest.IV_WERKS = "P100";
/* Lancio il metodo via web passando i parametri appena impostati sopra,
* il riferimento della tab da popolare coi risultati è la tabella MyVisual */
MyClient.YS_FACTORY_VM(ref MyVisual, MyRequest.IV_ARBPL, MyRequest.IV_DTOEE, MyRequest.IV_NEW_RUN, MyRequest.IV_WERKS);
MyResponse.CT_YSVISUAL_MNGT = MyVisual;
/* Ora elaboro i dati restituiti per farli visualizzare sulla pagina */
GridVisual.DataSource = MyResponse.CT_YSVISUAL_MNGT;
GridVisual.DataBind();
}
}

Questo è semplicemente il punto di partenza, da qui è ovviamente possibile spingersi oltre e perdere tempo a volontà.. ;)

Nessun Commento »

Puoi lasciare un tuo commento, oppure fare un trackback dal tuo sito.

Vuoi essere il primo a lasciare un commento per questo articolo? Utilizza il modulo sotto..

Lascia il tuo commento