Zum Erzeugen von Diagrammen steht in .NET die Klasse System.Windows.Forms.DataVisualization.Chart zur Verfügung. 

Wir benutzen die Klasse zum Einblenden eines Diagramms "Auftragseingang" in Transaktion VD03 (Anzeige Kunden), Vertriebsbereichsdaten:

 

Die Implementierung besteht aus folgenden drei Schritten:

  • Einfügen einer Drucktaste für die Diagrammanzeige, Einblenden der Grafikdatei

  • Lesen der Auftragseingangsdaten

  • Erzeugen des Diagramms als Bilddatei

 

Für den ersten Teil reichen einige Scriptzeilen aus:

GuiXT
// Reset variables if new transaction or new customer
if not V[VD03_transactionid=&V[_transactionid]]
  or not V[VD03_kunnr=&F[RF02D-KUNNR]]

  Set V[VD03_*] ""
  Set V[VD03_transactionid] "&V[_transactionid]"
  Set V[VD03_kunnr] "&F[RF02D-KUNNR]"

endif

if Q[transaction=VD03] and Q[Page=SCREEN_1100_TAB_01]
  Set V[chartfilename] "&%[TEMP]\saleschart.&V[VD03_kunnr].png"

  // display chart?
    if V[VD03_display_chart=X]
      Box (7,86) (22,135) "Auftragseingang &V[year4] - &V[year0] in Tausend"
  Pushbutton (7,137) "x" size=(1,1) process="chart_close.txt"
     Image (8,87) "&V[chartfilename]" -noBuffer

  else
      Pushbutton (7,86) "@NF\QGrafik einblenden@Grafik Auftragseingang" _ 
		process="chart_open.txt"
  endif
endif

 

InputScript "chart_open.txt":

GuiXT
// Generate chart

...

// Display chart
Set V[VD03_display_chart] "X"
Return

 

InputScript "chart_close.txt":

GuiXT

// Close chart
Set V[VD03_display_chart] ""
Return

 

Damit kann der Benutzer das Diagramm über eine Drucktaste abrufen und danach wieder schließen:

 



 

Zur Datenbeschaffung verwenden wir den Funktionsbaustein /guixt/dbselect. WIr lesen eine der Statistiktabellen des Vertriebsinformationssystems; entweder die SAP-Standardtabelle S001 oder aus Performancegründen eine Kopie der S001, in der die Materialnummer aus dem Schlüssel entfernt ist. Anschliessend rufen wir .NET (VB/C#) auf zum Erzeugen des Diagramms:

GuiXT
// Determine years
Set V[year0] &V[today_y]
Set V[year1] &V[year0] - 1
Set V[year2] &V[year0] - 2
Set V[year3] &V[year0] - 3
Set V[year4] &V[year0] - 4

// ialize sales figues
Set V[sales0] 0
Set V[sales1] 0
Set V[sales2] 0
Set V[sales3] 0
Set V[sales4] 0

// key values
Set V[kunnr] "&F[BUS_JOEL_MAIN-CHANGE_NUMBER]"
Set V[vkorg] "&F[RF02D-VKORG]"
Set V[vtweg] "&F[RF02D-VTWEG]"
Set V[spart] "&F[RF02D-SPART]"

// leading zeros
//Set V[kunnr](1-10) "0000000000&V[kunnr]" -alignRight

// search condition
Set V[c1] "KUNNR = '&V[kunnr]'"
Set V[c2] "and VKORG = '&V[vkorg]'"
Set V[c3] "and VTWEG = '&V[vtweg]'"
Set V[c4] "and SPART = '&V[spart]'"
Set V[c5] "and SPMON GE '&V[year4]01'"

Set V[condition] "&V[c1] &V[c2] &V[c3] &V[c4] &V[c5]"
Set V[fields] "SPMON,AENETWR"

Set V[table] "S001"

CreateTable V[sales_table] spmon aenetwr

// read VIS statistics table S001
Call /guixt/dbselect export.table="table" _ 
  export.condition="condition" export.fields="fields" _ 
  import.values="sales_table"

// Build sales figures
Set V[i] 1
label next
Set V[spmon] "&V[sales_table.spmon.&V[i]]"
Message "&V[i] &V[spmon]" -statusline
if V[spmon=]
  Message "&V[i] Skipped" -statusline
  goto skip
endif
Set V[aenetwr] "&V[sales_table.aenetwr.&V[i]]"
Set V[i] &V[i] + 1
Set V[year] &V[spmon](4-7)

// year0
if V[year=&V[year0]]
  Set V[sales0] &V[sales0] + &V[aenetwr]
  goto next
endif

// year1
if V[year=&V[year1]]
  Set V[sales1] &V[sales1] + &V[aenetwr]
  goto next
endif

// year2
if V[year=&V[year2]]
  Set V[sales2] &V[sales2] + &V[aenetwr]
  goto next
endif

// year3
if V[year=&V[year3]]
  Set V[sales3] &V[sales3] + &V[aenetwr]
  goto next
endif

// year4
if V[year=&V[year4]]
  Set V[sales4] &V[sales4] + &V[aenetwr]
  goto next
endif

goto next

label skip



// in thousands

Set V[sales0] &V[sales0] / 1000 decimals=0
Set V[sales1] &V[sales1] / 1000 decimals=0
Set V[sales2] &V[sales2] / 1000 decimals=0
Set V[sales3] &V[sales3] / 1000 decimals=0
Set V[sales4] &V[sales4] / 1000 decimals=0

// generate chart
CallVB Chart01.Customer.SalesChart "&V[chartfilename]"

// Display chart
Set V[VD03_display_chart] "X"
Return

Der .NET (VB/C#) Routine übergeben wir dabei den Namen der zu erzeugenden Bilddatei. Die Daten für das Diagramm (Jahreszahlen und Auftragseingang) entnehmen wir direkt den GuiXT Variablen:

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class Customer
{
    private guinet.guixt guixt = new guinet.guixt();

    public void SalesChart(string imgfilename)
    {
        // create chart
        Chart chart1 = new Chart();

        chart1.Size = new Size(480, 340);
        chart1.BackColor = Color.DeepSkyBlue;

        ChartArea chartArea1 = new ChartArea();
        chartArea1.Name = "ChartArea1";
        chart1.ChartAreas.Add(chartArea1);

        Series series1 = new Series();
        series1.ChartArea = "ChartArea1";
        series1.Palette = ChartColorPalette.Pastel;
        series1.XValueMember = "Year";
        series1.YValueMembers = "Sales";
        chart1.Series.Add(series1);

        DataTable table = new DataTable();

        // Create columns in the DataTable
        table.Columns.Add("Year", typeof(string));
        table.Columns.Add("Sales", typeof(int));

        // Add sales figures for 5 years, using GuiXT variables
        table.Rows.Add(guixt.GetVariable("year4"),
            Convert.ToInt32(guixt.GetVariable("sales4")));

        table.Rows.Add(guixt.GetVariable("year3"),
            Convert.ToInt32(guixt.GetVariable("sales3")));

        table.Rows.Add(guixt.GetVariable("year2"),
            Convert.ToInt32(guixt.GetVariable("sales2")));

        table.Rows.Add(guixt.GetVariable("year1"),
            Convert.ToInt32(guixt.GetVariable("sales1")));

        table.Rows.Add(guixt.GetVariable("year0"),
            Convert.ToInt32(guixt.GetVariable("sales0")));

        // Chart data
        chart1.DataSource = table;

        // save chart as .png file
        chart1.SaveImage(imgfilename, ChartImageFormat.Png);
    }
}

Diagramm-Skripte herunterladen (ZIP)