[ABAP] Interne Tabelle mit Strings definieren

* Variante 1: unsortiert, ohne Schlüssel
DATA(it_names) = VALUE stringtab( ( |Horst| )
                                  ( |Udo| )
                                  ( |Heinz| ) ).

* Variante 2: sortiert, mit Schlüssel
TYPES: ty_sorted TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.

* strings dürfen nicht doppelt auftreten, sonst Duplicate-Key-Exception.
DATA(it_sorted) = VALUE ty_sorted( ( |Horst| )
                                   ( |Udo| )
                                   ( |Heinz| ) ).

[ABAP] Daten aus einer internen Tabelle löschen

Typen & Daten

* Typen
TYPES : BEGIN OF ty_s_sflight,
          carrid   TYPE sflight-carrid,
          connid   TYPE sflight-connid,
          seatsmax TYPE sflight-seatsmax,
          flag     TYPE abap_bool,
        END OF ty_s_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_s_sflight WITH DEFAULT KEY.

* Daten
DATA(it_sflight) = VALUE ty_it_sflight( ).

* Select
SELECT carrid,
       connid,
       seatsmax,
       CASE WHEN seatsmax > 200 THEN @abap_true " CASE-Anweisung zum Setzen der Spalte "flag"
       END AS flag
  INTO TABLE @it_sflight
  FROM sflight.

Variante 1 (INDEX)

* Eintrag mit Index 1
DELETE it_sflight INDEX 1.

cl_demo_output=>display( it_sflight ).

Variante 2 (Struktur)

* Genau einen Eintrag entsprechend der Struktur
DELETE TABLE it_sflight FROM VALUE #( carrid = 'LH' connid = '400' seatsmax = 280 flag = abap_true ).

cl_demo_output=>display( it_sflight ).

Variante 3 (TABLE KEY)

* Einträge mit Primärschlüssel aus Tabelle löschen
DELETE TABLE it_sflight WITH TABLE KEY carrid = 'LH' connid = '400' flag = abap_true.

cl_demo_output=>display( it_sflight ).

Variante 4 (WHERE)

* Alle Einträge mit leerem flag löschen
DELETE it_sflight WHERE flag IS INITIAL.
* Alle Einträge innerhalb eines Bereiches löschen
DELETE it_sflight WHERE seatsmax > 200 AND seatsmax < 350.
* Alle Einträge die nicht der Bedingung entsprechen
DELETE it_sflight WHERE NOT carrid = 'AA'.

cl_demo_output=>display( it_sflight ).

Variante 5 (RANGE)

* alle Carrier, die nicht 'AA' sind aus der iTab löschen
DELETE it_sflight WHERE NOT carrid IN VALUE rseloption( ( sign   = 'I'
                                                          option = 'EQ'
                                                          low    = 'AA'
                                                          high   = '' ) ).

cl_demo_output=>display( it_sflight ).

Variante 6 (RANGE mit Pattern)

* Alle Einträge beginnend mit 'A' und 'L' löschen
DELETE it_sflight WHERE carrid IN VALUE rseloption( ( sign   = 'I'
                                                      option = 'CP'
                                                      low    = 'A*'
                                                      high   = '' )
                                                    ( sign   = 'I'
                                                      option = 'CP'
                                                      low    = 'L*'
                                                      high   = '' ) ).

cl_demo_output=>display( it_sflight ).

Variante 7 (RANGE leer)

* Achtung: löscht alle Einträge in it_sflight!
DELETE it_sflight WHERE carrid IN VALUE rseloption( ).

cl_demo_output=>display( it_sflight ).

Variante 8 (Pattern CP)

* alle Einträge, deren carrid mit 'L' beginnen
DELETE it_sflight WHERE carrid CP 'L*'.

cl_demo_output=>display( it_sflight ).

Variante 9 (dynamische WHERE-Condition)

* Stringtab mit WHERE-Conditions -> Leerzeichen beachten!
DATA(it_where) = VALUE stringtab(
                                  ( |testfehler = 'AA'| )
                                  ( |carrid EQ 'AA' AND connid CP '001*' | )
                                  ( |seatsmax > 300| )
                                ).

LOOP AT it_where ASSIGNING FIELD-SYMBOL(<w>).

  WRITE: / <w>.

  TRY.
* dynamische WHERE-Condition ausführen
* fehlerhafte WHERE-Conditions werfen eine Exception
      DELETE it_sflight WHERE (<w>).
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

ENDLOOP.

cl_demo_output=>display( it_sflight ).

Variante 10 (Pseudokomponente TABLE_LINE)

* Die Tabellenzeile mit der Struktur ty_s_sflight wird gelöscht
DELETE it_sflight WHERE table_line = VALUE ty_s_sflight( carrid = 'LH' connid = '400' seatsmax = 280 flag = abap_true ).

cl_demo_output=>display( it_sflight ).

Variante 11 (CO [Contains Only])

* Carrier darf nur Zeichen 'A' und/oder 'Z' und/oder ' ' enthalten
* -> löscht Einträge für 'AA ', 'AZ '
DELETE it_sflight WHERE carrid CO 'AZ '.

cl_demo_output=>display( it_sflight ).

[ABAP] Interne Tabelle vorbelegen / VALUE als Wertoperator

TYPES: BEGIN OF s_bestand,
         isbn     TYPE n LENGTH 10,
         titel    TYPE string,
         bestand  TYPE i,
         autor    TYPE n,
       END OF s_bestand.

TYPES: t_bestand TYPE STANDARD TABLE OF s_bestand WITH DEFAULT KEY. " KEY-Angabe zwingend notwendig

* iTab mit Werten füllen
DATA(it_bestand) = VALUE t_bestand( ( isbn = '1234567823' titel = 'Titel1' bestand = 1 autor = 'Horst' )
                                    ( isbn = '3233423434' titel = 'Titel2' bestand = 2 autor = 'Udo' ) ).

* oder

DO 5 TIMES.
  DATA(l_wa) = VALUE s_bestand( isbn = '1234567823' titel = 'Titel1' bestand = 1 autor = 'Horst' ).
  APPEND l_wa TO it_bestand.
ENDDO.

* Testausgabe
LOOP AT it_bestand INTO DATA(wa_bestand).
  WRITE: / | { wa_bestand-isbn } \| { wa_bestand-titel } \| { wa_bestand-bestand } \| { wa_bestand-autor } |.
ENDLOOP.

weiterführende Info: Link

[ABAP] Variablendeklaration

DATA zahl TYPE i.                         " ganze Zahl (int)
DATA zahl TYPE i VALUE '1'.               " ganze Zahl (int) mit vordefiniertem Wert '1'
DATA chk TYPE c LENGTH 1 VALUE 'X'.       " char Länge 1 Vorbelegung mit Wert 'X'
DATA preis TYPE p DECIMALS 2 VALUE '1.3'. " gepackte Gleitkommazahl, zwei Nachkommastellen, Wert '1.3'
DATA zk(5) TYPE c.                        " char Länge 5 (obsolet)

TYPES zk TYPE c LENGTH 5.                 " Typdef zk vom Typ char Länge 5
DATA text TYPE zk.                        " text vom Typ zk

DATA: dt TYPE sy-datum,                   " verkettete Anweisung mit Komma getrennt
      zt TYPE sy-uzeit.                   " Nutzung von Systemdatentypen

Links

XML-Wetterdaten als RSS-Feed von Yahoo! abrufen

Links

Beispielcode

private void btnReadRSS_Click(object sender, EventArgs e)
{
    string sTempVal = string.Empty;

    string sLanguage = string.Empty;

    string sUnitTemperature = string.Empty;
    string sUnitDistance = string.Empty;
    string sUnitPressure = string.Empty;
    string sUnitSpeed = string.Empty;

    // p=GMXX0007 -> LocationID von Berlin
    // u=c -> metrisches System (°C, km/h) verwenden
    string sURLRSSFeed = "http://weather.yahooapis.com/forecastrss?p=GMXX0007&u=c";

    // Wetterdaten als RSS-Feed (XML) von Yahoo! lesen    
    XmlDocument xmlRSS = new XmlDocument();
    xmlRSS.Load(new XmlTextReader(sURLRSSFeed));

    // Daten aus XML lesen und in die RichTextBox eintragen
    rtbContent.Clear();

    // General
    rtbContent.AppendText("General:\n");
    rtbContent.AppendText("* Title:\t" + xmlRSS["rss"]["channel"]["title"].InnerText + "\n");
    rtbContent.AppendText("* Link:\t" + xmlRSS["rss"]["channel"]["link"].InnerText + "\n");
    rtbContent.AppendText("* Description:\t" + xmlRSS["rss"]["channel"]["description"].InnerText + "\n");
    sLanguage = xmlRSS["rss"]["channel"]["language"].InnerText;
    rtbContent.AppendText("* Language:\t" + sLanguage + "\n");
    rtbContent.AppendText("* LastBuildDate:\t" + xmlRSS["rss"]["channel"]["lastBuildDate"].InnerText + "\n");
    
    // Item
    rtbContent.AppendText("\nItem:\n");
    rtbContent.AppendText("* Title:\t" + xmlRSS["rss"]["channel"]["item"]["title"].InnerText + "\n");
    rtbContent.AppendText("* Link:\t" + xmlRSS["rss"]["channel"]["item"]["link"].InnerText + "\n");
    rtbContent.AppendText("* Latitude:\t" + xmlRSS["rss"]["channel"]["item"]["geo:lat"].InnerText + "\n");
    rtbContent.AppendText("* Longitude:\t" + xmlRSS["rss"]["channel"]["item"]["geo:long"].InnerText + "\n");
    rtbContent.AppendText("* Publishing date:\t" + xmlRSS["rss"]["channel"]["item"]["pubDate"].InnerText + "\n");
    
    // Location
    rtbContent.AppendText("\nLocation:\n");
    rtbContent.AppendText("* City:\t" + xmlRSS["rss"]["channel"]["yweather:location"].Attributes["city"].Value + "\n");
    rtbContent.AppendText("* Region:\t" + xmlRSS["rss"]["channel"]["yweather:location"].Attributes["region"].Value + "\n");
    rtbContent.AppendText("* Country:\t" + xmlRSS["rss"]["channel"]["yweather:location"].Attributes["country"].Value + "\n");
    
    // Units
    rtbContent.AppendText("\nUnits:\n");
    sUnitTemperature = "°" + xmlRSS["rss"]["channel"]["yweather:units"].Attributes["temperature"].Value;
    sUnitDistance = xmlRSS["rss"]["channel"]["yweather:units"].Attributes["distance"].Value;
    sUnitPressure = xmlRSS["rss"]["channel"]["yweather:units"].Attributes["pressure"].Value;
    sUnitSpeed = xmlRSS["rss"]["channel"]["yweather:units"].Attributes["speed"].Value;
    rtbContent.AppendText("* Temperature:\t" + sUnitTemperature + "\n");
    rtbContent.AppendText("* Distance:\t" + sUnitDistance + "\n");
    rtbContent.AppendText("* Pressure:\t" + sUnitPressure + "\n");
    rtbContent.AppendText("* Speed:\t" + sUnitSpeed + "\n");
    
    // Condition
    rtbContent.AppendText("\nCondition:\n");
    rtbContent.AppendText("* Text:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:condition"].Attributes["text"].Value + "\n");
    sTempVal = xmlRSS["rss"]["channel"]["item"]["yweather:condition"].Attributes["code"].Value;
    rtbContent.AppendText("* Code:\t" + sTempVal + " (" + ConditionCodeToString(sTempVal) + ")\n");
    rtbContent.AppendText("* Temp:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:condition"].Attributes["temp"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* Date:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:condition"].Attributes["date"].Value + "\n");
    
    // Wind
    rtbContent.AppendText("\nWind:\n");
    rtbContent.AppendText("* Chill:\t" + xmlRSS["rss"]["channel"]["yweather:wind"].Attributes["chill"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* Direction:\t" + xmlRSS["rss"]["channel"]["yweather:wind"].Attributes["direction"].Value + "°" + "\n");
    rtbContent.AppendText("* Speed:\t" + xmlRSS["rss"]["channel"]["yweather:wind"].Attributes["speed"].Value + " " + sUnitSpeed + "\n");
    
    // Atmosphere
    rtbContent.AppendText("\nAtmosphere:\n");
    rtbContent.AppendText("* Humidity:\t" + xmlRSS["rss"]["channel"]["yweather:atmosphere"].Attributes["humidity"].Value + "%" + "\n");
    float fVisibility = float.Parse(xmlRSS["rss"]["channel"]["yweather:atmosphere"].Attributes["visibility"].Value, System.Globalization.CultureInfo.CreateSpecificCulture(sLanguage));
    fVisibility /= 100.0f;
    rtbContent.AppendText("* Visibility:\t" + fVisibility.ToString() + sUnitDistance + "\n");
    rtbContent.AppendText("* Pressure:\t" + xmlRSS["rss"]["channel"]["yweather:atmosphere"].Attributes["pressure"].Value + sUnitPressure + "\n");
    sTempVal = xmlRSS["rss"]["channel"]["yweather:atmosphere"].Attributes["rising"].Value;
    rtbContent.AppendText("* Rising:\t" + sTempVal + " (" + RisingCodeToString(sTempVal) + ")\n");

    // Astronomy
    rtbContent.AppendText("\nAstronomy:\n");
    rtbContent.AppendText("* Sunrise:\t" + xmlRSS["rss"]["channel"]["yweather:astronomy"].Attributes["sunrise"].Value + "\n");
    rtbContent.AppendText("* Sunset:\t" + xmlRSS["rss"]["channel"]["yweather:astronomy"].Attributes["sunset"].Value + "\n");
    
    // Forecast current day
    rtbContent.AppendText("\nForecast current day:\n");
    rtbContent.AppendText("* Day:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["day"].Value + "\n");
    rtbContent.AppendText("* Date:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["date"].Value + "\n");
    rtbContent.AppendText("* Low:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["low"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* High:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["high"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* Text:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["text"].Value + "\n");
    sTempVal = xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].Attributes["code"].Value;
    rtbContent.AppendText("* Code:\t" + sTempVal + " (" + ConditionCodeToString(sTempVal) + ")\n");
    
    // Forecast next day
    rtbContent.AppendText("\nForecast next day:\n");
    rtbContent.AppendText("* Day:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["day"].Value + "\n");
    rtbContent.AppendText("* Date:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["date"].Value + "\n");
    rtbContent.AppendText("* Low:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["low"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* High:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["high"].Value + sUnitTemperature + "\n");
    rtbContent.AppendText("* Text:\t" + xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["text"].Value + "\n");
    sTempVal = xmlRSS["rss"]["channel"]["item"]["yweather:forecast"].NextSibling.Attributes["code"].Value;
    rtbContent.AppendText("* Code:\t" + sTempVal + " (" + ConditionCodeToString(sTempVal) + ")\n");
    
    // Description (simple HTML)
    rtbContent.AppendText("\nDescription (simple HTML):\n");
    rtbContent.AppendText(xmlRSS["rss"]["channel"]["item"]["description"].InnerText + "\n");
}
/// <summary>
/// konvertiert den Code für Rising (0,1,2) zu einem string
/// </summary>
/// <param name="sRisingCode">0, 1, 2</param>
/// <returns>string</returns>
private string RisingCodeToString(string sRisingCode)
{
    string sRC = string.Empty;

    switch (sRisingCode)
    {
        case "0": sRC = "steady";
            break;
        case "1": sRC = "rising";
            break;
        case "2": sRC = "falling";
            break;
    }

    return sRC;
}
/// <summary>
/// konvertiert Condition zu string
/// </summary>
/// <param name="sConditionCode">Condition</param>
/// <returns>string</returns>
private string ConditionCodeToString(string sConditionCode)
{
    string sCC = string.Empty;

    switch (sConditionCode)
    {
        case "0": sCC = "tornado";
            break;
        case "1": sCC = "tropical storm";
            break;
        case "2": sCC = "hurricane";
            break;
        case "3": sCC = "severe thunderstorms";
            break;
        case "4": sCC = "thunderstorms";
            break;
        case "5": sCC = "mixed rain and snow";
            break;
        case "6": sCC = "mixed rain and sleet";
            break;
        case "7": sCC = "mixed snow and sleet";
            break;
        case "8": sCC = "freezing drizzle";
            break;
        case "9": sCC = "drizzle";
            break;
        case "10": sCC = "freezing rain";
            break;
        case "11": sCC = "showers";
            break;
        case "12": sCC = "showers";
            break;
        case "13": sCC = "snow flurries";
            break;
        case "14": sCC = "light snow showers";
            break;
        case "15": sCC = "blowing snow";
            break;
        case "16": sCC = "snow";
            break;
        case "17": sCC = "hail";
            break;
        case "18": sCC = "sleet";
            break;
        case "19": sCC = "dust";
            break;
        case "20": sCC = "foggy";
            break;
        case "21": sCC = "haze";
            break;
        case "22": sCC = "smoky";
            break;
        case "23": sCC = "blustery";
            break;
        case "24": sCC = "windy";
            break;
        case "25": sCC = "cold";
            break;
        case "26": sCC = "cloudy";
            break;
        case "27": sCC = "mostly cloudy (night)";
            break;
        case "28": sCC = "mostly cloudy (day)";
            break;
        case "29": sCC = "partly cloudy (night)";
            break;
        case "30": sCC = "partly cloudy (day)";
            break;
        case "31": sCC = "clear (night)";
            break;
        case "32": sCC = "sunny";
            break;
        case "33": sCC = "fair (night)";
            break;
        case "34": sCC = "fair (day)";
            break;
        case "35": sCC = "mixed rain and hail";
            break;
        case "36": sCC = "hot";
            break;
        case "37": sCC = "isolated thunderstorms";
            break;
        case "38": sCC = "scattered thunderstorms";
            break;
        case "39": sCC = "scattered thunderstorms";
            break;
        case "40": sCC = "scattered showers";
            break;
        case "41": sCC = "heavy snow";
            break;
        case "42": sCC = "scattered snow showers";
            break;
        case "43": sCC = "heavy snow";
            break;
        case "44": sCC = "partly cloudy";
            break;
        case "45": sCC = "thundershowers";
            break;
        case "46": sCC = "snow showers";
            break;
        case "47": sCC = "isolated thundershowers";
            break;
        case "3200": sCC = "not available";
            break;
    }

    return sCC;
}