Monday, December 14, 2009

Dynamische Suchhilfe für ein Feld

Wenn zu einem Feld zur Design-Zeit die Typbelegung noch nicht bekannt ist
(z.B. Partner bei Qualitätsmeldungen), muss die Suchhilfe zur Laufzeit
angebunden werden. Dies ist über den FuBa F4IF_FIELD_VALUE_REQUEST
möglich. Diesem kann ein Referenztabellenfeld übergeben werden, für das er
dann die F4-Hilfe anzeigt.

Thursday, October 29, 2009

Verbuchung bei QM-Maßnahmen

Beim Anlegen von Qualitätsmeldungen (QM01) können Folgeaktivitäten
definiert werden (Customizing). Damit für das Anlegen von Bestellungen
auch der Belegfluss fortgeschrieben wird, muss die Folgeaktivität DELIVERY
ablaufen. Diese wird über das Katalog-Customizing (QS41) definiert.

Thursday, October 22, 2009

Texte (sprachunabhängig) ablegen

Über die Transaktion so10 können Texte angelegt/gepflegt werden. Mittels
des FuBa Read_Text können Sie wieder ausgelesen werden.

Thursday, October 1, 2009

Suchhilfe mit Mehfachfeldfüllung

Suchhilfen, bei denen abhängige Felder auch gefüllt werden sollen (z.B.
Belegposition und Belegnummer), haben ihre Tücken. Voraussetzung ist, dass
beider Felder in der Suchhilfe als Exportparameter vorkommen und die
Bezeichner in Suchhilfe, Suchfunktion (z.B. View) und Report/Dynpro
identisch sind.
Beide Felder müssen in ein und derselben Struktur/Tabelle vorkommen, die
als Referenztyp für die Variablendeklaration verwendet wird. In diese muss
die selbsterstellte Suchhilfe nochmal explizit angegeben werden (Herkunft
der Suchhilfe: 'explizite Suchhilfeanbindung am Feld').
Bei Erstellung eines Selektionsscreens als Dynpro muss als Variable eines
Tables-Statement verwendet werden. Nur dann funktionieren die
Abhängigkeiten und das paralle Füllen der Felder.

Monday, September 14, 2009

Textelement/-symbole für Report finden

Der Forumsbeitrag geht auf die Frage ein, wie man Textelemente eines
Reports ausliest und in welchen Tabellen sie abgelegt sind:
https://forums.sdn.sap.com/message.jspa?messageID=7216948
Funktionsbaustein READ_TEXT_ELEMENTS gibt alle Textsymbole eines Reports
zurück. Mit dem ABAP-Befehl 'READ TEXTPOOL' hat die gleiche Funktionalität.

Thursday, September 10, 2009

Transaktion für (Pflege-)View

Für einen (Pflege-)View kann mittels der SE93 eine eigene Transaktion
erstellt werden. Das Häkchen 'Einstiegsbild übersprüngen' sollte aktiv
sein. Für die Vorschlagswerte ist auf jeden Fall ein Wert für das
Dynprofeld VIEWNAME anzugeben. Das Feld UPDATE kann mit einem 'X' belegt
werden. Der SM30-Selektionsbildschirm erscheint dann nicht. Will man
diesen haben, muss stattdessen das Feld UPDATE_LTD gefüllt werden.

Thursday, September 3, 2009

CALL SELECTION-SCREEN

Statt "CALL SELECTION-SCREEN" kann auch "LEAVE TO SCREEN 0" verwendet
werden. Damit können Probleme mit den OK-Codes und Endlosschleifen beim
Screen-Aufruf verhindert werden.

Thursday, August 27, 2009

Encoding

Für Änderungen des Encodings ist die Klasse CL_ABAP_CONV_OBJ nützlich
(mehr Infos über die Klassendokumentation).
Der Report RSCP0032 kann für Tests und Informationsgewinnung rund um
Encoding genutzt werden.
Die Funktionsbausteine ECATT_CONV_STRING_TO_XSTRING und
ECATT_CONV_XSTRING_TO_STRING können für Transformationen genutzt werden.
In der Tabelle TCP00 sind die Codepages aufgeführt.

FORM decode_response USING pi_xstring type xstring CHANGING pie_string
type string.
DATA: lo_eref TYPE REF TO cx_transformation_error,
lv_errstr TYPE string,
lo_converter TYPE REF TO cl_abap_conv_obj.

* ändern des Encoding auf ISO-8859-1 (nur das versteht Inforate)
CREATE OBJECT lo_converter
EXPORTING
incode = '1133' " ISO-8859-1
outcode = '4103' " UTF-8
EXCEPTIONS
invalid_codepage = 1
internal_error = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CALL METHOD lo_converter->convert
EXPORTING
inbuff = pi_xstring
outbufflg = 0
IMPORTING
outbuff = pie_string
EXCEPTIONS
internal_error = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.

Tuesday, August 18, 2009

Problem Import WSDL von Fremdsystem

Manche externe Systeme haben Probleme, die WSDL eines SAP-Webservices zu
importieren. Dies kann u.a. an den policy-tags liegen. In diesem Fall
hilft es, in der WSDL-URL 'ws_policy' durch 'standard' zu ersetzen.

Wednesday, July 22, 2009

Webservice Consumer

Ein Video-Tutorial zur Erstellung eines Webservice-Clients findet man
unter:
https://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/media/uuid/20eb3174-41ab-2a10-a383-907faf60eed3

Wenn das Einlesen einer WSDL-URL nicht funktioniert oder eine
Fehlermeldung beim Aufruf des Services auftritt, kann das damit
zusammenhängen, dass die Proxy-Einstellungen im SAP falsch/ungepflegt
sind. Dazu die SICF aufrufen und die Einstellungen unter
Client/Proxyeinstellungen vornehmen.

Tuesday, July 14, 2009

System Traces

Die Logs/Traces im System können über die SM21 aufgerufen werden. Hier
findet man auch die RFC-Developer Traces, die den Netzwerkverkehr
protokollieren.

Tuesday, June 23, 2009

Dynprotextarea für Anzeige

CONSTANTS: gc_ne0 TYPE i VALUE '1',
gc_eq0 TYPE i VALUE '0',
gc_line_length TYPE i VALUE '100'.

CREATE OBJECT go_custom_container
EXPORTING
container_name = 'CC_INFO'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

CREATE OBJECT go_editor
EXPORTING
parent = go_custom_container
wordwrap_mode =
cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = gc_line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true.

go_editor->set_readonly_mode( gc_ne0 ).
go_editor->set_statusbar_mode( gc_eq0 ).
go_editor->set_toolbar_mode( gc_eq0 ).

Monday, June 22, 2009

Pflegeviewvariante für Tabelle

Üblicherweise legt man für Tabellen einen Pflegedialog an (SE54). Um zu
erreichen, dass nur bestimmte Datensätze bzw. Spalten angezeigt werden,
kann eine Pflegeview-Variante erzeugt werden. Auch dafür die SE54
aufrufen. Als Referenz für die Variante nimmt man den zuvor erzeugten
Pflegeview.

Über die SE93 kann man eine Transaktion anlegen, über die man den
Pflegedialog direkt aufrufen kann ohne über die SM30 gehen zu müssen.

Friday, June 19, 2009

Sonderzeichen und Codepage

Beim Einlesen von Textfiles, z.B. mit
cl_gui_frontend_services=>gui_upload, kann es zu Problemen mit der
Codierung kommen und Sonderzeichen werden falsch dargestellt. Weiß man die
Codepage des Dokuments kann diese dem Leseprogramm mitgegeben werden und
die Zeichen werden korrekt umgesetzt.
In der Tabelle TCP00A sind Codepages und die internen SAP-ID's abgelegt.

Tuesday, June 16, 2009

Nachricht an anderen SAP-User schicken

Mit dem Funktionsbaustein TH_POPUP kann eine Systemnachricht an einen
anderen User geschickt werden. Diese erscheint als Pop-up auf seinem
Bildschirm.

Thursday, May 28, 2009

Tabellen änderbar machen

Tabellen, deren Einträge standardmäßig nicht editierbar sind in der SE16
können über einen Trick dennoch geändert werden. Im Kommandofeld muss
dafür '&sap_edit' eingegeben werden.

Tuesday, May 19, 2009

Texttabelle zu Tabelle finden

Um die Texttabelle zu einer transparenten Tabelle zu finden, kann der
Funktionsbaustein DDUT_TEXTTABLE_GET verwendet werden.

Thursday, April 23, 2009

Datei auf Applikationsserver umbenennen

Eine Datei auf dem Applikationsserver kann per ABAP umbenannt werden
(Kontrolle mit AL11). Dafür und andere File-Kommandos ist die Klasse
CL_ISH_AT_EDI_FILETRANSFER nützlich.
Beispielcode:

DATA: lo_edi TYPE REF TO cl_ish_at_edi_filetransfer,
ls_exppath TYPE rnwat_edi_filcom.

ls_exppath-exppathtype = 'S'.
ls_exppath-exppath = '/usr/sap/GLD/DVEBMGS00/work/'.

CREATE OBJECT lo_edi
EXPORTING
is_exppath = ls_exppath.

CALL METHOD lo_edi->rename_file
EXPORTING
i_filename_src = 'altes_file.xml'
i_filename_dest = 'neues_file.doc'
EXCEPTIONS
error_renaming_file = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE: / 'File successfully renamed'.
ENDIF.

Friday, April 17, 2009

Eigenes IDoc bauen

Ein eigenes IDoc kann mit der Transaktion WE30 erstellt werden. Ggf.
müssen vorher neue Segmente mit WE31 angelegt werden.
Kann das IDoc keinem bestehenden Nachrichtentyp zugeordnet werden, muss
für die Ein- und Ausgangsverarbeitung zusätzlich ein eigener
Nachrichtentyp erstellt werden. Hierfür die Transaktion WE81 verwenden.
Dem Nachrichtentyp wird dann mit Transaktion WE82 das neue IDoc zugeordnet.

Der Name des IDocs sollte 8 Zeichen nicht überschreiten, damit
Funktionsbausteine, die für Ein-/Ausgangsverarbeitung benutzt werden,
damit umgehen können. Einige alte aber noch aktive FuBa's wie
MASTER_IDOC_DISTRIBUTE verwenden das alte Kontrollsatzformat EDIDC, das
nur Namen mit max. 8 Zeichen unterstützen.

Tuesday, April 14, 2009

Tabelle in CSV-Format umwandeln

Um Tabellen in das CSV-Format umzuwandeln (Zellwerte mit Seperator, z.B.
Semikolon, getrennt), kann der Funktionsbaustein SAP_CONVERT_TO_CSV_FORMAT
verwendet werden.


TYPES ly_text_data(4096) TYPE c.
DATA: lt_datatable TYPE STANDARD TABLE OF ...,
lv_filename TYPE string,
lt_csv TYPE STANDARD TABLE OF ly_text_data,
lv_csv_line TYPE ly_text_data,
lv_errortext TYPE string.

[...]

* Catch system exceptions:
CATCH SYSTEM-EXCEPTIONS
open_dataset_no_authority = 1
dataset_cant_open = 2
dataset_write_error = 3
dataset_cant_close = 4
OTHERS = 99.

* Open dataset:
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE
ENCODING DEFAULT "4.7
MESSAGE lv_errortext.

IF sy-subrc <> 0.
IF lv_errortext IS INITIAL.
lv_errortext = 'Error on opening file'. "#EC NOTEXT
ENDIF.

MESSAGE lv_errortext TYPE 'E'.
ENDIF.

* convert result table into csv format
CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT'
TABLES
i_tab_sap_data = lt_datatable
CHANGING
i_tab_converted_data = lt_csv
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

* Transfer data:
LOOP AT lt_csv INTO lv_csv_line.
TRANSFER lv_csv_line TO lv_filename.
ENDLOOP.

* Close dataset:
CLOSE DATASET lv_filename.
ENDCATCH.

* Check for error:
CASE sy-subrc.
WHEN 1.
MESSAGE 'No authority' TYPE 'E'. "#EC NOTEXT
WHEN 2.
MESSAGE 'Can not open file' TYPE 'E'. "#EC NOTEXT
WHEN 3.
MESSAGE 'File write error' TYPE 'E'. "#EC NOTEXT
WHEN 4.
MESSAGE 'Can not close file' TYPE 'E'. "#EC NOTEXT
WHEN OTHERS.
MESSAGE 'Error on creating file' TYPE 'E'. "#EC NOTEXT
ENDCASE.

Monday, April 6, 2009

Senden DEBITOR (Kunde) per IDoc

Kundenstammdaten können per IDoc verteilt werden. Ein aktives Versenden
ist mit der Transaktion BD12 möglich
Mittels des Porttyps (ABAP-PSS) kann ein eigener Funktionsbaustein
eingebunden werden, der das IDoc verarbeiten kann. Als Vorlage kann der
FuBa own_function verwendet werden.

Friday, March 20, 2009

Verfügbarkeit von Artikel/Material

Es kann der aktuelle Bestand geprüft werden. Dafür sind der FuBa
BESTAND_AKTUELL bzw. der BAPI BAPI_MATERIAL_AVAILABILITY geeignet.

Die derzeit lieferbare Menge (ATP) kann davon aber abweichen, da hier der
Bestand um aktuelle Aufträge/Lieferungen bereinigt ist. Ein FuBa, der die
Übersicht aus der Transaktion MD04 liefert, ist
MD_STOCK_REQUIREMENTS_LIST_API.
Dieser liefert alle Informationen im Detail. Ist nur die reine ATP-Menge
von Interesse kann auf den unterliegenden FuBa AVAILABILITY_CHECK
zurückgegriffen werden. Die Parameter sind allerdings nicht einfach zu
setzen. Am besten setzt man hier einen Breakpoint und ruft dann die
Transaktion MD04 auf.

Ein minimaler Aufruf ist so möglich:
DATA: lt_atpcs TYPE TABLE OF atpcs,
ls_atp TYPE atpcs.

ls_atp-matnr = '000000000000000208'.
ls_atp-werks = '1000'.
ls_atp-prreg = 'BO'.
ls_atp-bdter = '20090320'.
ls_atp-trtyp = 'H'.
ls_atp-idxatp = '1'.
ls_atp-resmd = 'X'.
ls_atp-chkflg = 'X'.

APPEND ls_atp TO lt_atpcs.

CALL FUNCTION 'AVAILABILITY_CHECK'
TABLES
p_atpcsx = lt_atpcs.

Thursday, March 19, 2009

Beschreibung von Typen und Strukturen

Der describe Befehl liefert leider viele wichtige Informationen zu
Feldern/Typen nicht. Dafür sind die Klassen CL_ABAP_TYPEDESCR bzw.
CL_ABAP_STRUCTDESCR sehr hilfreich. Mit Letzterer kann man u.a. eine
Struktur beschreiben lassen und erhält eine Liste mit allen Feldnamen und
ihren Längen.

data: o_structdescr type ref to cl_abap_structdescr,
t_component type abap_compdescr_tab.

o_structdescr ?= cl_abap_typedescr=>describe_by_data( pe_data ).
t_component = o_structdescr->components.


Es kann auch versucht werden, den FuBa REUSE_ALV_FIELDCATALOG_MERGE zu
verwenden.

Datenkonvertierung internes/externes Format

Für die Konvertierung von Daten vom internen in das externe Format
(Stichwort führende Nullen) bzw. andersherum können die Funktionsbausteine
CONVERSION_EXIT_ALPHA_INPUT bzw. CONVERSION_EXIT_ALPHA_OUTPUT verwendet
werden.

Für Datumswerte sind die FuBas CONVERSION_EXIT_PDATE_OUTPUT bzw.
CONVERSION_EXIT_PDATE_INPUT zu verwenden.

Für viele Datenformate/Domänen sind Konvertierungsroutinen hinterlegt
(siehe SE11). Über Dopppelklick auf diese können die
Konvertierungsroutinen ermittelt werden, sprich welche FuBa's verwendet
werden.

Wednesday, March 11, 2009

Programmierung für SD-Preisfindung

Die Preisfindung wird beim Anlegen/Ändern eines Auftrags durchlaufen. Der
Endpreis wird beeinflusst durch Umsatzsteuer, Rabatte, u.a. Über
Customizing und Programmierung können hierbei kundeneigene Spezialitäten
umgesetzt werden. Mit der Transaktion VOFM können diese Einstellungen
vorgenommen werden (Bedingungen, Formeln, etc.)

Belegen von IDoc-Feldern

Wenn ein IDoc an das ERP geschickt werden soll, müssen die Segmente und
Felder korrekt gefüllt sein. Die Struktur eines IDocs kann über die
Transaktion WE60 besorgt werden. Hier muss der Basic Type des IDocs (z.B.
ORDERS05) angegeben werden.
Die Doku kann auch als XML-Schema erstellt werden.

Der Funktionsbaustein IDOC_CREATE_OILORD wandelt einen Kundenauftrag in
die IDoc-Struktur um. Mit Hilfe von Debugging kann die Belegung der Felder
gut nachvollzogen werden.

Folgende Transaktionen sind weiterhin hilfreich:
WE09 - IDoc Suche
BD87 - IDoc Queue
WE19 - Testwerkzeug für IDoc Verarbeitung, es können die Werte eines
bestehenden IDocs für Testzwecke verändert werden
WE64 - Vorgangscodes von Partnervereinbarungen
WE20 - Partnervereinbarungen
WE21 - Ports in der IDoc Verarbeitung