Auftragstexte per Datum selektieren und als Excel speichern

Posten Sie hier Tutorials & Cookbooks.

Auftragstexte per Datum selektieren und als Excel speichern

Postby Marlies1022 » Tue Mar 15, 2005 11:39 am

Hallo zusammen
Durch die ausserordentlich gute Hilfe dieses Forums konnte ich endlich Selektionsdaten aus dem SAP als lokale Exceldatei speichern. Ich möchte mein Ergebnis daher an alle Interessierten zur Verfügung stellen.

Grüsse aus der Schweiz
Dani
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. report  zsgruntxt line-size 999.
  2. ** Liste der Grunddatentexte generieren von allen Aufträgen
  3. *****************************************************************
  4. ** Aenderungen:                                                **
  5. ** DD.MM.JJ Wer: Was:                                          **
  6. ** 27.01.05 Dani Umbricht Programmanfang
  7. ** 31.01.05 Im Material_select ErfasserName mit like abfragen
  8. **          Somit kann nach S% gesucht werden -> % statt * nehmen
  9. **          Daten in eine Exceltabelle exportieren in c:\copyslot
  10. **          Die Domäne DATS hat das Format Datumsfeld (JJJJMMDD),
  11. **          dies gilt für das Datumsfeld stxh-tdfdate.
  12. ** 01.02.05 Selektion nach Datum mit between
  13. *****************************************************************
  14. tables: stxh.  "für Grunddatentexte Verweisdaten zum Cluster
  15.  
  16. selection-screen comment /1(70) text-001. "/Position(TextLänge)
  17. selection-screen uline.  "Linie über den gesamten Bildschirm
  18. parameters: gitxtid  like stxh-tdid  default 'GRUN'. "TextID
  19. parameters: gierfass(8) default 'S%'. "Erfasser
  20. parameters: givondat(8) default '20040101'. " type D. "von Datum
  21. parameters: gibisdat(8) default '20041231'. "  type D. "bis Datum
  22.  
  23. data: begin of gt_allemat occurs 999999, " war 9999
  24.         tdname(70), "Verweisfeld in den Cluster
  25.       end of gt_allemat.
  26.  
  27. * Var. für VertriebsTexte Anfang, THead und TLine sind im Dictionary
  28. data: begin of texttab occurs 2,  "SapScripts TextZeilen
  29.         tdformat like tline-tdformat,  "Formatspalte, 2Zch
  30.         tdline   like tline-tdline.    "TextZeile, 132 lang
  31. data: end of texttab.
  32. data: begin of textkopf occurs 2.
  33.         include structure thead.  "SapScripts Text Header
  34. data: end of textkopf.
  35.  
  36. * Exceltabelle definieren
  37. types: tab_type(999) type c.
  38. data: exceltab type table of tab_type.
  39.  
  40. ** ------------
  41. data: g_erstetextzeile(70). "erste Zeile des Beschriebes
  42. data: g_zweitetextzeile(70)."zweite Zeile des Beschriebes
  43. data: g_drittetextzeile(70)."dritte Zeile des Beschriebes
  44. data: g_viertetextzeile(70)."vierte Zeile des Beschriebes
  45. data: g_fuenftetextzeile(70).
  46. data: g_sechstetextzeile(70).
  47. data: g_siebtetextzeile(70).
  48. data: g_achtetextzeile(70).
  49. data: g_neuntetextzeile(70).
  50. data: textobjekt(10) type c value 'VBBP'. "Grunddaten-Text
  51. data: textid(4) type c value 'GRUN'.      "Grunddaten-Text
  52.  
  53. * Variablen für Datenausgabe
  54. data: textzeile(999). "Record der angezeigt + exportiert wird
  55.  
  56. * Variablen für Datenexport in eine TextDatei
  57. data: filegroesse type i.
  58. data: tab type x value '09'. " tabulatorzeichen
  59.  
  60. *****************************************************************
  61. *** Hauptprogramm Anfang ****************************************
  62. *****************************************************************
  63. *******************
  64.   perform material_select.         "Alle Materialien selektieren
  65.  
  66.   perform vertriebstexte_select.
  67.  
  68.   perform excel_kopfzeile.
  69.   perform excel_schreiben.
  70. *******************
  71. *****************************************************************
  72. **  Proceduren  *************************************************
  73. *****************************************************************
  74. form material_select.   "Alle Materialien selektieren
  75.  
  76.   select distinct
  77.          a~tdname           "Verweisfeld in den Cluster
  78.   into corresponding fields of table gt_allemat
  79.   from   stxh as a          "Textdatei Headertabelle
  80.   where  a~tdid =     gitxtid     "welche TextID
  81.   and    a~tdspras =  'DE'        "Sprache
  82.   and    a~tdfuser like gierfass  "Ersteller des Eintrags
  83.   and    a~tdfdate between givondat and gibisdat "Von datum - datum
  84.   and    a~mandt =    '010'.      "Mandant
  85.  
  86. *****************************************************************
  87. form vertriebstexte_select.   "Vertriebstexte selektieren
  88.   loop at gt_allemat. "TempListe durchlaufen
  89.  
  90.     perform stxh_zugriff.
  91.     if stxh-tdobject ne space or   " Text fehlt: Skip Rest
  92.        stxh-tdname   ne space or
  93.        stxh-tdid     ne space or
  94.        stxh-tdspras  ne space.
  95.        call function 'READ_TEXT'
  96.          exporting
  97.               object    = textobjekt "z.B. MVKE
  98.               name      = gt_allemat-tdname
  99.               id        = textid    "z.B. 0001
  100.               language  = 'D'        "textkopf-tdspras
  101.          importing
  102.               newheader = textkopf
  103.          tables
  104.               lines     = texttab
  105.          exceptions
  106.               not_found = 1
  107.               others    = 2.
  108.  
  109.       if  sy-subrc = 0.       "kein Fehler aus der Function
  110.         loop at texttab.
  111.           case sy-tabix.
  112.             when 1. g_erstetextzeile   = texttab-tdline.
  113.             when 2. g_zweitetextzeile  = texttab-tdline.
  114.             when 3. g_drittetextzeile  = texttab-tdline.
  115.             when 4. g_viertetextzeile  = texttab-tdline.
  116.             when 5. g_fuenftetextzeile = texttab-tdline.
  117.             when 6. g_sechstetextzeile = texttab-tdline.
  118.             when 7. g_siebtetextzeile  = texttab-tdline.
  119.             when 8. g_achtetextzeile   = texttab-tdline.
  120.             when others. exit.           " Ignore Rest
  121.           endcase.
  122.         endloop.
  123.         perform liste_schreiben. "gefundene Werte ausgeben
  124.       endif.
  125.     endif.
  126. *****************************************************************
  127. form stxh_zugriff. "Vertriebstextkopf selektieren
  128.   clear  stxh.
  129.   select single * from stxh
  130.          where   tdobject = textobjekt "z.B. MVKE
  131.            and   tdname   = gt_allemat-tdname "Key
  132.            and   tdid     = textid     "z.B. 0001
  133.            and   tdspras  = 'D'.        "Sprache
  134. *****************************************************************
  135. form liste_schreiben. "Inhalt der Internen Tabelle schreiben
  136.   data: jahr(4).
  137.   data: monat(2).
  138.   data: tag(2).
  139.   data: hilfs_string type string.
  140.   data: posnr(5).    "letze 5 Ziffern sind die PosNr
  141.   data: auftrnr(11). " Erste 11 Ziffern sind die AuftrNr
  142.  
  143. * PosNr herausschneiden, 5 Stellig Rechtsbündig
  144.   hilfs_string = stxh-tdname.
  145.   shift hilfs_string by 5 places right circular.
  146.   posnr = hilfs_string(5).
  147.  
  148. * Auftragsnummer aus dem Keyfeld rausnehmen
  149.   auftrnr = stxh-tdname(11). "Erste 11 Zeichen nehmen
  150.  
  151. * Datum vom Format YYYYMMTT richtig formatieren
  152.   jahr = stxh-tdfdate(4).  "Erste 4 Ziffern sind das Jahr
  153.   hilfs_string = stxh-tdfdate.
  154.   shift hilfs_string by 2 places right circular.
  155.   tag = hilfs_string(2).
  156.   shift hilfs_string by 2 places right circular.
  157.   monat = hilfs_string(2).
  158.  
  159. * Leerzeichen entfernen in den Strings
  160.   condense g_erstetextzeile.
  161.   condense g_zweitetextzeile.
  162.   condense g_drittetextzeile.
  163.   condense g_viertetextzeile.
  164.   condense g_fuenftetextzeile.
  165.   condense g_sechstetextzeile.
  166.   condense g_siebtetextzeile.
  167.   condense g_achtetextzeile.
  168.   condense g_neuntetextzeile.
  169.  
  170. ** alle Felder aneinanderhängen, ohne Leerzeichen dazwischen
  171.   concatenate stxh-tdid          tab "TextID z.B. GRUN
  172.               stxh-tdname        tab "Verweis in den Cluster
  173.               auftrnr            tab "Auftr Nummer
  174.               posnr              tab "PositionsNr
  175.               tag '.' monat '.' jahr tab "Datum des Auftrages
  176.               stxh-tdfuser       tab "BenutzerID
  177.               g_erstetextzeile   tab "Textzeile 1 der Grunddaten
  178.               g_zweitetextzeile  tab "Textzeile 2 der Grunddaten
  179.               g_drittetextzeile  tab
  180.               g_viertetextzeile  tab
  181.               g_fuenftetextzeile tab
  182.               g_sechstetextzeile tab
  183.               g_siebtetextzeile  tab
  184.               g_achtetextzeile   tab
  185.               g_neuntetextzeile  tab
  186.               into textzeile.
  187.  
  188.   append textzeile to exceltab. " Einzelzeile an Exceltab anhängen
  189.  
  190.   clear textzeile.              "Zurücksetzen
  191.   g_erstetextzeile   = ''.      "Zurücksetzen
  192.   g_zweitetextzeile  = ''.
  193.   g_drittetextzeile  = ''.
  194.   g_viertetextzeile  = ''.
  195.   g_fuenftetextzeile = ''.
  196.   g_sechstetextzeile = ''.
  197.   g_siebtetextzeile  = ''.
  198.   g_achtetextzeile   = ''.
  199.   g_neuntetextzeile  = ''.
  200. *****************************************************************
  201. form excel_schreiben.
  202.  
  203. * Uebertrag der Tabelle in eine lokale Datei.
  204.   call function 'DOWNLOAD'
  205.        exporting
  206.             filename                = 'c:\copyslot\Grunddatentexte.xls'
  207.             filetype                = 'ASC'  " AsciiDatei mit Tabtrenner
  208.             silent                  = 'S' "keine Frage für Dateiname
  209.        importing
  210.             filesize                = filegroesse
  211.        tables
  212.             data_tab                = exceltab "itab
  213.        exceptions
  214.             invalid_filesize        = 1
  215.             invalid_table_width     = 2
  216.             invalid_type            = 3
  217.             no_batch                = 4
  218.             unknown_error           = 5
  219.             gui_refuse_filetransfer = 6
  220.             others                  = 7.
  221.  
  222.   write: 'SY-SUBRC (Fehlercode) :', sy-subrc,
  223.        / 'Dateigrösse           :', filegroesse,
  224.        / 'Dateiname             : c:\copyslot\Grunddatentexte.xls'.
  225. *****************************************************************
  226. form excel_kopfzeile.
  227. ** alle Felder aneinanderhängen, ohne Leerzeichen dazwischen
  228.   concatenate '_TextID'      tab "TextID z.B. GRUN
  229.               'key'        tab "Verweis in den Cluster
  230.               'AuftrNr'     tab "AuftrNummer
  231.               'PosNr'       tab "PosNummer
  232.               'Datum'       tab "Datum des Auftrages
  233.               'UserID'      tab "BenutzerID
  234.               'Textzeile 1' tab "Textzeile 1 der Grunddaten
  235.               'Textzeile 2' tab "Textzeile 2 der Grunddaten
  236.               'Textzeile 3' tab
  237.               'Textzeile 4' tab
  238.               'Textzeile 5' tab
  239.               'Textzeile 6' tab
  240.               'Textzeile 7' tab
  241.               'Textzeile 8' tab
  242.               'Textzeile 9' tab
  243.               into textzeile.
  244.  
  245.   append textzeile to exceltab. " Einzelzeile an Exceltab anhängen
  246. *****************************************************************
  247.  
GeSHi ©
Marlies1022
.
.
 
Posts: 5
Joined: Mon Jan 31, 2005 11:37 am

Postby Alva1590 » Tue Mar 15, 2005 12:10 pm

Beim download hättest Du dir mit (Beispiel)

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  filetype       = 'DAT'
  2.             col_select     = 'X'
  3.             col_selectmask = 'XXXXXXX'
GeSHi ©


einiges sparen können.

Hättest nur die Downloadtabelle als Tabelle mit Felder aufbauen brauchen.

'DAT' = automatische Trennung durch TAB

Col_Sel.....: Tabellen-Überschriften mitgeben.


Auch hätte ich statt

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. clear textzeile.              "Zurücksetzen
  2.   g_erstetextzeile   = ''.      "Zurücksetzen
  3.   g_zweitetextzeile  = ''.
  4.   g_drittetextzeile  = ''.
  5.   g_viertetextzeile  = ''.
  6.   g_fuenftetextzeile = ''.
  7.   g_sechstetextzeile = ''.
  8.   g_siebtetextzeile  = ''.
  9.   g_achtetextzeile   = ''.
  10.   g_neuntetextzeile  = ''.
GeSHi ©


einfach:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   textzeile,              "Zurücksetzen
  2.   g_erstetextzeile,      "Zurücksetzen
  3.   g_zweitetextzeile,
  4.   g_drittetextzeile,
  5.   g_viertetextzeile,
  6.   g_fuenftetextzeile,
  7.   g_sechstetextzeile,
  8.   g_siebtetextzeile,
  9.   g_achtetextzeile,
  10.   g_neuntetextzeile.
GeSHi ©


genommen.
Alva1590
.....
.....
 
Posts: 4387
Joined: Mon Dec 02, 2002 3:01 pm

Postby Silke1341 » Tue Mar 15, 2005 1:24 pm

Hallo Dani,

ich finde es klasse, dass Du das Ergebnis hier gepostet hast. Leider ist nicht jeder bereit sein Wissen zu teilen.

Dennoch möchte ich eine paar Anmerkungen zu Deinem Programm machen, die als Hilfestellung dienen sollen, wie man es besser machen kann.
Bitte nicht böse sein. ;)

  • mir fehlen leider saubere Typisierungen
    Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
    1. data: textobjekt(10) type c value 'VBBP'. "Grunddaten-Text
    2. data: textid(4) type c value 'GRUN'.      "Grunddaten-Text
    3.  
    4. * besser (meiner Meinung nach ;)
    5.   textobjekt type TDOBJECT value 'VBBP', "Grunddaten-Text
    6.   textid     type TDID value 'GRUN'.      "Grunddaten-Text
    7.  
    GeSHi ©

    Eine der Stärken von SAP ist die Verwendung von bestehenden Typisierungen
  • Benutze für maskierte Selektionen trotzdem SELECT-OPTIONS
    Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
    1.   stxh.
    2.   gitxtid  LIKE stxh-tdid  DEFAULT 'GRUN'. "TextID
    3. SELECT-OPTIONS:
    4.   gierfass FOR stxh-tdfuser DEFAULT 'S*'
    5.                             OPTION cp
    6.                             NO INTERVALS "kein Interval
    7.                             NO-EXTENSION, "einzeilig
    8.   givondat FOR stxh-tdfdate DEFAULT '20040101'
    9.                             TO      '20041231'. "bis Datum
    10. SELECT DISTINCT
    11.        a~tdname           "Verweisfeld in den Cluster
    12.       INTO CORRESPONDING FIELDS OF TABLE gt_allemat
    13.       FROM   stxh AS a          "Textdatei Headertabelle
    14.       WHERE  a~tdid =     gitxtid     "welche TextID
    15.       AND    a~tdspras =  'DE'        "Sprache
    16.       AND    a~tdfuser IN gierfass  "Ersteller des Eintrags
    17.       AND    a~tdfdate IN gibisdat. "Von datum - datum
    18.  
    GeSHi ©
  • Eine Selektion nach Mandant ist nicht notwendig. Dies wird von SAP implizit gemacht und ist auch performanter
  • für eine derartige Datenstruktur würde ich eine Tabelle von Tabellen aufbauen.
    Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
    1.   TYPES:
    2.     tt_spalten TYPE string_table, "oder TABLE OF string
    3. *     Zusatz STANDARD nicht notwendig
    4.     tt_zeilen  TYPE STANDARD TABLE OF tt_spalten.
    5.  
    6.       con_tab    TYPE x LENGTH 1 VALUE '09'. "Tabulator
    7.  
    8.   DATA:
    9.     gt_zeilen  TYPE tt_zeilen,
    10.     gt_spalten LIKE LINE OF gt_zeilen, "gt => globale Tabelle
    11.     gs_spalte  LIKE LINE OF gt_spalten,
    12.  
    13.     gt_outtab TYPE string_table,
    14.     gs_outtab LIKE LINE OF gt_outtab,
    15.  
    16.     gf_tab    TYPE char1.
    17.  
    18. * kleiner Trick, um Tab-Zeichen im CONCATENATE zu benutzen
    19.   gf_tab = con_tab.
    20.  
    21. * Befüllen
    22.   gs_spalte = `<textid>`.
    23.   INSERT gs_spalte
    24.     INTO TABLE gt_spalten.
    25. * wirkt als APPEND bei STANDARD TABLE
    26.  
    27. * hier die restlichen Spalten einfügen
    28.  
    29.   INSERT gt_spalten
    30.     INTO TABLE gt_zeilen.
    31.  
    32. * Aufbau der EXCEL-CSV-Struktur
    33.   CLEAR:
    34.     gs_outtab.
    35.   LOOP AT gt_zeilen INTO gt_spalten.
    36.     LOOP AT gt_spalten INTO gs_spalte.
    37.       IF gs_outtab IS INITIAL.
    38.         gs_outtab = gs_spalte.
    39.       ELSE.
    40.         CONCATENATE
    41.           gs_outtab
    42.           gs_spalte
    43.           INTO gs_outtab
    44.           SEPARATED BY gf_tab.
    45.       ENDIF.
    46.     ENDLOOP.
    47.     INSERT gs_outtab INTO TABLE gt_outtab.
    48.     CLEAR:
    49.       gs_outtab.
    50.  
    51. * hier kommt jetzt die weitere Verarbeitung sprich der Download
    52.  
    GeSHi ©

    Der Trick dabei besteht darin, dass für jede Spalte eine Tabellenzeile angelegt wird, welche wiederum in einer Tabelle abgelegt wird.
    Damit hast Du keine Beschränkung auf eine bestimmte Anzahl von Spalten und brauchst nicht irgendwelche Zähler abfragen.
  • Verwendung des FB DOWNLOAD, der seit einiger Zeit nicht mehr verwendet werden sollte (siehe dazu Methode GUI_DOWNLOAD der ABAP-Klasse CL_GUI_FRONTEND_SERVICES oder FB GUI_DOWNLOAD)
  • da Du ohnehin nur die Grunddatentexte lesen willst, ist die Selektion von STXH (weitgehend) überflüssig
    Der einzige Vorteil ist, dass Du den Aufruf des READ_TEXT verhinderst. AUf der anderen Seite sagt der Baustein Dir schon, ob es denn zum Material einen Grunddatentext gibt. Benutze die Information!
  • es gibt (leider) noch viele weitere Punkte

PS: auch ich kenne nicht alle Möglichkeiten, in sofern könnte ein Anderer noch andere Punkte anführen.

Trotz alle dem. Du bist auf dem richtigen Weg und wrist wahrscheinlich später selbst als gute(r) LehrerIn auftreten
Silke1341
.....
.....
 
Posts: 1985
Joined: Thu Aug 19, 2004 3:20 pm

Codeverbesserungen

Postby Marlies1022 » Wed Mar 16, 2005 8:59 am

ereglam hat geschrieben:Hallo Dani,

ich finde es klasse, dass Du das Ergebnis hier gepostet hast. Leider ist nicht jeder bereit sein Wissen zu teilen.

Dennoch möchte ich eine paar Anmerkungen zu Deinem Programm machen, die als Hilfestellung dienen sollen, wie man es besser machen kann.
Bitte nicht böse sein. ;)


Hallo ereglam
Ich bin sicher nicht böse. Da ich sehr wenig in Abap programmiere und ein Anfänger bin, bin ich für Verbesserungsvorschläge bzw. Codekorrekturen sehr dankbar.
Sie zeigen mir Möglichkeiten auf, wie ich in Zukunft eine Anforderung unserer Benutzer noch besser lösen kann.

Gruess
Dani
Marlies1022
.
.
 
Posts: 5
Joined: Mon Jan 31, 2005 11:37 am

Postby Willy1492 » Wed Mar 16, 2005 9:44 am

Anonymous hat geschrieben:einfach:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   textzeile,              "Zurücksetzen
  2.   g_erstetextzeile,      "Zurücksetzen
  3.   g_zweitetextzeile,
  4.   g_drittetextzeile,
  5.   g_viertetextzeile,
  6.   g_fuenftetextzeile,
  7.   g_sechstetextzeile,
  8.   g_siebtetextzeile,
  9.   g_achtetextzeile,
  10.   g_neuntetextzeile.
GeSHi ©


genommen.

Was ist daran einfach?
Ich hätte die Felder für Zeile 1-9 in eine gemeinsame Struktur gesteckt und jede Komponente so typisiert, dass nicht jede der Definitionen geändert werden muss, wenn morgen jemand die Länge auf 72 Zeichen geändert haben möchte.

Überhaupt hätte ich mehr mit Bezug auf DDIC-Typen gearbeitet
(und dann auch ... TYPE ddictabname-fieldname statt LIKE genommen, spart Ärger).

Dann habe ich auch Statt 9 CLEAR-Anweisungen nur noch eine.
(Und in der LOOP hätte ich mir die CASE-Anweisung für SY-TABIX auch gespart und ASSIGN COMPONENT genommen.
Das CONDENSE g_erstetextzeile hätte ich in die LOOP verlagert, so dass nur noch eine Anweisung statt 9 nötig ist.)
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Willy1492 » Wed Mar 16, 2005 10:15 am

ereglam hat geschrieben:ich finde es klasse, dass Du das Ergebnis hier gepostet hast. Leider ist nicht jeder bereit sein Wissen zu teilen.

Ja.
Hoffentlich wirkt es nicht allzu abschreckend, wenn wir jetzt das veröffentlichte Programm zerpflücken.
[list][*]mir fehlen leider saubere Typisierungen
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. data: textobjekt&#40;10&#41; type c value 'VBBP'. "Grunddaten-Text
  2. data: textid&#40;4&#41; type c value 'GRUN'.      "Grunddaten-Text
  3.  
  4. * besser &#40;meiner Meinung nach ;&#41;
  5.   textobjekt type TDOBJECT value 'VBBP', "Grunddaten-Text
  6.   textid     type TDID value 'GRUN'.      "Grunddaten-Text
  7.  
GeSHi ©

Eine der Stärken von SAP ist die Verwendung von bestehenden Typisierungen
Ob man sich auf das Datenelement oder Tabellenname-Feldname bezieht, ist sicher Geschmackssache.Ich bevorzuge z.B. Bezug auf das passende Feld aus einer Tabelle, aus der das Programm auch liest ...
Auf jeden Fall hätte ich hier (und an anderen Stellen) für Konstanten CONSTANTS statt DATA genommen.

[*]Benutze für maskierte Selektionen trotzdem SELECT-OPTIONS
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   stxh.
  2.   gitxtid  LIKE stxh-tdid  DEFAULT 'GRUN'. "TextID
  3. SELECT-OPTIONS:
  4.   gierfass FOR stxh-tdfuser DEFAULT 'S*'
  5.                             OPTION cp
  6.                             NO INTERVALS "kein Interval
  7.                             NO-EXTENSION, "einzeilig
  8.  
GeSHi ©

Warum (abgesehen davon, dass die Pattern-Eingabe in einer dem Benutzer geläufigeren Form erfolgen kann)?
Und was ist ein "Gierfass"?
(Die Namenskonventionen für Globale Felder ... wurden übrigens nicht konsequent durchgehalten.)
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   givondat FOR stxh-tdfdate DEFAULT '20040101'
  2.                             TO      '20041231'. "bis Datum
  3. SELECT DISTINCT
  4.        a~tdname           "Verweisfeld in den Cluster
  5.       INTO CORRESPONDING FIELDS OF TABLE gt_allemat
  6.       FROM   stxh AS a          "Textdatei Headertabelle
  7.       WHERE  a~tdid =     gitxtid     "welche TextID
  8.       AND    a~tdspras =  'DE'        "Sprache
  9.       AND    a~tdfuser IN gierfass  "Ersteller des Eintrags
  10.       AND    a~tdfdate IN gibisdat. "Von datum - datum
  11.  
GeSHi ©

Die Parameter für Von-Und Bis-Datum korrekt zu typisieren (statt C mit Länge 8) finde ich auch besser, ebenso die Umwandlung in eine SELECT-OPTION.
Außerdem hätte ich im SELECT
-mir den Alias komplett erspart (m.E. nur bei Joins sinnvoll, um lesbarkeit zu verbessern / Schreibarbeit zu sparen
-CORRESPONDING FIELDS OF weggelassen (weil Definition der Zieltabelle zur Liste der selektierten Felder passt), das ist etwas schneller
-eher EQ als = in der WHERE-Klausel verwendet (ich finde die leichtere Unterscheidung von Vergleichs-Operator und Zuweisungs besser)
-auf keinen Fall tdspras = 'DE' verwendet
(ich finde es ärgerlich, dass SAP solche Schlampereien zulässt).
Es gibt keinen Eintrag mit tdspras = 'DE'.
(Das Feld ist vom Typ C, Länge 1).
Also entweder
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ sy-langu
GeSHi ©

oder
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ p_langu
GeSHi ©

(mit PARAMETERS p_langu TYPE sy-langu OBLIGATORY DEFAULT sy-langu.)
oder notfalls auch noch
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ 'D'
GeSHi ©


[*]Eine Selektion nach Mandant ist nicht notwendig. Dies wird von SAP implizit gemacht und ist auch performanter

Das stimmt so nicht wirklich.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.       con_tab    TYPE x LENGTH 1 VALUE '09'. "Tabulator
GeSHi ©

Schreibst Du da wirklich "LENGTH 1" hin?
Würde ich nie machen.
Und wenn ich die Default-Länge explizit angeben würde, dann eher so:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.       con_tab&#40;1&#41;    TYPE x VALUE '09'.
GeSHi ©


Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * kleiner Trick, um Tab-Zeichen im CONCATENATE zu benutzen
  2.   gf_tab = con_tab.
GeSHi ©

Der Trick funktioniert bei mir nur mit
CLEAR gf_tab WITH con_tab.
Wenn verfügbar, sollte man aber lieber auf CL_ABAP_CHAR_UTILITIES=>HORIOZONTAL_TAB zugreifen.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   INSERT gs_spalte
  2.     INTO TABLE gt_spalten.
  3. * wirkt als APPEND bei STANDARD TABLE
GeSHi ©

Dürfte aber von vielen als schwerer lesbar empfunden werden
(bei APPEND muss man nicht erst nachdenken)

Und die restlichen Anmerkungen muss ich erst mal vertagen.
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Silke1341 » Wed Mar 16, 2005 11:43 am

Frank Dittrich hat geschrieben:...
Ja.
Hoffentlich wirkt es nicht allzu abschreckend, wenn wir jetzt das veröffentlichte Programm zerpflücken.
[list][*]mir fehlen leider saubere Typisierungen
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. data: textobjekt&#40;10&#41; type c value 'VBBP'. "Grunddaten-Text
  2. data: textid&#40;4&#41; type c value 'GRUN'.      "Grunddaten-Text
  3.  
  4. * besser &#40;meiner Meinung nach ;&#41;
  5.   textobjekt type TDOBJECT value 'VBBP', "Grunddaten-Text
  6.   textid     type TDID value 'GRUN'.      "Grunddaten-Text
  7.  
GeSHi ©

...
Ob man sich auf das Datenelement oder Tabellenname-Feldname bezieht, ist sicher Geschmackssache.Ich bevorzuge z.B. Bezug auf das passende Feld aus einer Tabelle, aus der das Programm auch liest ...
Auf jeden Fall hätte ich hier (und an anderen Stellen) für Konstanten CONSTANTS statt DATA genommen.

:oops: hab ich glatt übersehen...
Frank Dittrich hat geschrieben:
[*]Benutze für maskierte Selektionen trotzdem SELECT-OPTIONS
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   stxh.
  2.   gitxtid  LIKE stxh-tdid  DEFAULT 'GRUN'. "TextID
  3. SELECT-OPTIONS:
  4.   gierfass FOR stxh-tdfuser DEFAULT 'S*'
  5.                             OPTION cp
  6.                             NO INTERVALS "kein Interval
  7.                             NO-EXTENSION, "einzeilig
  8.  
GeSHi ©

Warum (abgesehen davon, dass die Pattern-Eingabe in einer dem Benutzer geläufigeren Form erfolgen kann)?
Und was ist ein "Gierfass"?

eben wegen der geläufigeren Verwendung der Wildcards... (sehe ich als einen Beitrag zur Bedienerfreundlichkeit)
Gierfass = GI...Erfass => soll der Erfasser des Textes sein (vermute ich mal)
Frank Dittrich hat geschrieben:(Die Namenskonventionen für Globale Felder ... wurden übrigens nicht konsequent durchgehalten.)

ist auch ein Thema, was ich jetzt aber noch nicht ansprechen wollte. (ich weiß, ist auch ein wichtiges Thema ;))
Für meine Firma habe ich mal einen Entwurf angefertigt, der jetzt schon ca. 3 Seiten umfasst und wahrscheinlich immer noch nicht alle Aspekte abhandelt.
Frank Dittrich hat geschrieben:...
-auf keinen Fall tdspras = 'DE' verwendet
(ich finde es ärgerlich, dass SAP solche Schlampereien zulässt).
Es gibt keinen Eintrag mit tdspras = 'DE'.
(Das Feld ist vom Typ C, Länge 1).
Also entweder
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ sy-langu
GeSHi ©

oder
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ p_langu
GeSHi ©

(mit PARAMETERS p_langu TYPE sy-langu OBLIGATORY DEFAULT sy-langu.)
oder notfalls auch noch
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. tdspras EQ 'D'
GeSHi ©


dem kann ich auch nur zustimmen
Frank Dittrich hat geschrieben:
[*]Eine Selektion nach Mandant ist nicht notwendig. Dies wird von SAP implizit gemacht und ist auch performanter

Das stimmt so nicht wirklich.

ja, Du hast in sofern recht, als meine Bemerkung sich auf den Zusatz CLIENT SPECIFIED bezieht, der aber hier nicht verwendet wurde
Frank Dittrich hat geschrieben:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.       con_tab    TYPE x LENGTH 1 VALUE '09'. "Tabulator
GeSHi ©

Schreibst Du da wirklich "LENGTH 1" hin?
Würde ich nie machen.
Und wenn ich die Default-Länge explizit angeben würde, dann eher so:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.       con_tab&#40;1&#41;    TYPE x VALUE '09'.
GeSHi ©


umgekehrt mag ich die Klammerdeklaration nicht ;) und die Angabe LENGTH wird u.a. wohl auch von SAP empfohlen
Definitv out sind implizite Deklarationen ohne Typangabe à la
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA dummy&#40;1&#41;.
GeSHi ©

Frank Dittrich hat geschrieben:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * kleiner Trick, um Tab-Zeichen im CONCATENATE zu benutzen
  2.   gf_tab = con_tab.
GeSHi ©

Der Trick funktioniert bei mir nur mit
CLEAR gf_tab WITH con_tab.
Wenn verfügbar, sollte man aber lieber auf CL_ABAP_CHAR_UTILITIES=>HORIOZONTAL_TAB zugreifen.

hatte ich zwar auch schon dran gedacht, wollte aber OO aus dem Spiel lassen
Frank Dittrich hat geschrieben:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   INSERT gs_spalte
  2.     INTO TABLE gt_spalten.
  3. * wirkt als APPEND bei STANDARD TABLE
GeSHi ©

Dürfte aber von vielen als schwerer lesbar empfunden werden
(bei APPEND muss man nicht erst nachdenken)

wird aber so von SAP empfohlen, weil es für alle Tabellentypen (STANDARD, SORTED und HASHED) gültig ist.
Frank Dittrich hat geschrieben:
Und die restlichen Anmerkungen muss ich erst mal vertagen.


@DaniU
eine Sache habe ich noch:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.        call function 'READ_TEXT'
  2.          exporting
  3.               object    = textobjekt "z.B. MVKE
  4.               name      = gt_allemat-tdname
  5.               id        = textid    "z.B. 0001
  6.               language  = 'D'        "textkopf-tdspras
  7.          importing
  8.               newheader = textkopf
  9.          tables
  10.               lines     = texttab
  11.          exceptions
  12.               not_found = 1
  13.               others    = 2.
  14.  
GeSHi ©

Warum fragst Du den Anwender über GITEXTID nach der zu verwendenden Text-ID, wenn Du sie anschließend nicht verwendest?

Eine? Nein, doch noch 'ne zweite Sache:
Ich versuche bei Unterprogrammen die benötigten Daten per Schnittstelle zu übergeben. Damit wird klarer, was die Routine mit welchen Daten macht.
Zugriff auf globale Daten versuche ich zu vermeiden (geht halt nicht immer).
Silke1341
.....
.....
 
Posts: 1985
Joined: Thu Aug 19, 2004 3:20 pm


Return to Tutorials & Cookbooks

Who is online

Users browsing this forum: No registered users and 1 guest

cron