Anfrage

Liebe/-r Experte/-in,

ich stehe vor einer Aufgabe, die zu lösen gilt, und zwar
habe ich eine Tabelle mit dem Namen ANLA. Ich muss 3 Felder dieser Tabelle nach Vorgabe aus den Eingabeparametern updaten, und zwar die Felder ANLA-ANLKL, ANLA-KTOGR, ANLA-FELEI. Mein bisheriger Programmcode(wo man auch die einzelnen Parameter sehen kann) sieht so aus:

TABLES ANLA.

PARAMETERS: p_bukrs TYPE ANLA-BUKRS DEFAULT ‚0142‘ OBLIGATORY,
p_anlnr TYPE ANLA-ANLN1 DEFAULT ‚285‘ OBLIGATORY,
p_anlkl TYPE ANLA-ANLKL DEFAULT ‚6596‘ OBLIGATORY,
p_ktogr TYPE ANLA-KTOGR DEFAULT ‚6596‘ OBLIGATORY,
p_felei TYPE ANLA-FELEI DEFAULT ‚1700‘ OBLIGATORY.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME title text-T99.

PARAMETERS: p_test RADIOBUTTON GROUP rad1 DEFAULT ‚X‘,
p_echt RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b1.

SELECT * FROM ANLA.
WRITE:/ ANLA-ANLKL,
ANLA-KTOGR,
ANLA-FELEi.
ENDSELECT.

Per Radiobutton soll man zwischen einem Testlauf und einem Echtlauf selektieren können. Auch hier weiß ich leider nicht, wie das gehen soll.
Die Eingabeparameter müssten soweit stimmen, jedoch weiß ich nicht wie das Programm weiter aufgebaut ist bzw. wie ich weitergehen soll, ich bin ein absoluter Neuling und ich hoffe Sie können mir weiterhelfen.
Ich bedanke mich herzlichst im Voraus und verbleibe

mit freundlichen Grüßen.

Hallo Rufat,

worum geht es hier eigentlich. Ein Spielsystem hoffe ich doch. (Man sollte nie auf SAP Tabellen ein direktes Update machen) Wenn Du es aber trotzdem machen
willst könnte es so gehen:

TABLES anla.

PARAMETERS: p_bukrs TYPE anla-bukrs DEFAULT ‚0142‘ OBLIGATORY,
p_anln1 TYPE anla-anln1 DEFAULT ‚285‘ OBLIGATORY,
p_anlkl TYPE anla-anlkl DEFAULT ‚6596‘ OBLIGATORY,
p_ktogr TYPE anla-ktogr DEFAULT ‚6596‘ OBLIGATORY,
p_felei TYPE anla-felei DEFAULT ‚1700‘ OBLIGATORY.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t99.

PARAMETERS: p_test RADIOBUTTON GROUP rad1 DEFAULT ‚X‘,
p_echt RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b1.

* Testlauf
IF p_test = ‚X‘.
WRITE:/‚Folgende Einträge würden upgedatet werden:‘.
SELECT * FROM anla
WHERE bukrs = p_bukrs
AND anln1 = p_anln1.
WRITE:/ anla-anln1,
anla-bukrs,
anla-anlkl,
anla-ktogr,
anla-felei.
ENDSELECT.
ENDIF.

* Echtlauf
IF p_echt = ‚X‘.
UPDATE anla
SET anlkl = p_anlkl
ktogr = p_ktogr
felei = p_felei
WHERE bukrs = p_bukrs
AND anln1 = p_anln1.
WRITE:/ ‚Update ist erfolgt‘.
ENDIF.

Hallo,

das Feld P_echt mit einem IF abfragen (IF p_echt = ‚X‘ …
innerhalb der IF-Abfrage den modify anla … absetzen. Den Sy-Subrc abfragen ( nach dem modify ) und die Änderung ebenfalls anlisten.

Die Liste unbedingt mitr dem FI-Bereich abstimmen. Ein WP wird dies (direkte DB-Änderung) ansonsten im Abschlussbericht bemängeln.

Bitte auch unter Select-options die zu selektierenden Anlagen berücksichtigen. In Ihrem Beispiel würden alle Anlagen geändert. Kann muss aber nicht Sinnvoll sein.

Gruß

Hallo Rufat,

ich bin leider kein Spezialist der Anlagenbuchhaltung aber ich habe mal in die Transaktion AS02 geguckt:

Die Anlagenklasse ANLKL ist nicht änderbar, d.h. offenbar muß die Anlage neu angelegt / kopiert werden. Löschen geht nur, wenn noch keine Buchungen auf die Anlage erfolgt sind.

Gleiches gilt für die Kontenfindung KTOGR. Diese hängt an der Anlagenklasse und wird offenbar aus dem Customizing gezogen.

Die Bildaufbauregel hägt wohl ebenfalls an der Anlagenklasse. Für diese gilt entsprechendes.

Ein direktes hartes ändern auf der Datenbank (mittels Update) ist nicht zu empfehlen, da das Inkonsistenzen nach sich ziehen könnte.
Auch werden dann keine abhängigen Prozesse gestartet wie Änderungsbelege, Workflows oder Statistikupdates.

Alles gilt natürlich unter Vorbehalt

Michi

Hallo Peter,

erstens einmal vielen Dank für deine Hilfe, hast mir gut weitergeholfen. Nur hätte ich jetzt gerne gewusste wie ich statt dem Eingabeparameter für die Anlagennummer(ANLN1), ein SELECT OPTION erstelle, so dass das Programm mehrere, nach der Eingabe der jeweiligen Anlagennummern, die Felder ( ANLA-ANLKL, ANLA-KTOGR, ANLA-FELEI) updatet. Also den Befehl SELECT-OPTIONS so_anlnr FOR gv_anlnr kenn ich, nur reicht es ja nicht,um die Felder zu updaten, da muss noch etwas am Coding rumgeschraubt werden. Mein bisheriges Coding sieht so aus:
REPORT ZFANLKLASUPD .

*Zugriff auf die Datenbanktabelle ANLA
TABLES ANLA.

*Dummy-Variable
DATA: gv_anlnr TYPE ANLA-ANLN1,
lv_lines TYPE i.

*Definition der Pflichtfelder
PARAMETERS: p_bukrs TYPE ANLA-BUKRS DEFAULT ‚0142‘ OBLIGATORY,
p_anlkl TYPE ANLA-ANLKL DEFAULT ‚6596‘ OBLIGATORY,
p_ktogr TYPE ANLA-KTOGR DEFAULT ‚6596‘ OBLIGATORY,
p_felei TYPE ANLA-FELEI DEFAULT ‚1700‘ OBLIGATORY.

SELECT-OPTIONS so_anlnr FOR gv_anlnr.

*Selektionsbildschirm
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME title text-T99.

PARAMETERS: p_test RADIOBUTTON GROUP rad1 DEFAULT ‚X‘,
p_echt RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.

DESCRIBE TABLE so_anlnr LINES lv_lines.

*Testlauf
If p_test = ‚X‘.
WRITE:/‚Folgende Einträge würden upgedatet werden:‘.
SELECT * FROM anla
WHERE bukrs = p_bukrs
AND anln1 = gv_anlnr.
WRITE:/ anla-anln1, anla-bukrs, anla-felei.
ENDSELECT.

* Information über den Testlauf
If sy-subrc 0.
MESSAGE s000(38) with ‚Daten nicht gefunden !‘.
ENDIF.

* Echtlauf
ELSE.
UPDATE anla
SET anlkl = p_anlkl "Anlagenklasse
ktogr = p_ktogr "Kontierungsgruppe
felei = p_felei "Bildauswahl
WHERE bukrs = p_bukrs
AND anln1 = gv_anlnr.
WRITE: / ‚Update der folgenden Einträge:‘.
SELECT * FROM anla
WHERE bukrs = p_bukrs
AND anln1 = gv_anlnr.
WRITE:/ anla-anln1, anla-bukrs, anla-felei.
ENDSELECT.

* Festschreiben des Update
COMMIT WORK.

* Information über gefolgtes Update
If sy-subrc 0.
MESSAGE s000(38) with ‚Update nicht erfolgreich !‘.
ELSEIF sy-subrc = 0.
MESSAGE s000(38) with ‚Update erfolgreich durchgeführt !‘.
ENDIF.
ENDIF.

Hallo Rufat,

das wäre dann

UPDATE anla
SET anlkl = p_anlkl "Anlagenklasse
ktogr = p_ktogr "Kontierungsgruppe
felei = p_felei "Bildauswahl
WHERE bukrs = p_bukrs
*** AND anln1 = gv_anlnr.
and ANLN1 IN SO_ANLNR.

Peter

Programm
Hallo,

dazu müsste ich Dir ein komplettes Programm schreiben. Dazu fehlt mir derzeit die Zeit.

Vielleicht etwas später.

Gruss.
Wolfgang

Hallo Wolfgang,

danke für deine Antwort, hat sich aber bereits erledigt !!

Grüße

Programm
Alles klar.

Grüsse

Hallo Michi,

du hast mir schon paar mal recht gut geholfen, wofür ich mich nochmals recht herzlich bedanke. Nun stehe ich aber vor einem neuen Problem. Ich soll bestimmte Felder aus insgesamt 9 Tabellen ausgeben, wieder mal mithilfe des ALV. Da es sich um nicht transparente Tabellen handelt, konnte ich kein VIEW anlegen, und hab daher eine Struktur angelegt.
Das Programm soll wie folgt sein: Ein Parameter für den jeweiligen Bukrs, und per 4 Radio Buttons sollen 4 verschiedene Listen ausgegebn werden. Einmal die Belegarten/Nummernkreise, dann Debitoren Kontengruppen, Kreditoren Kontengruppen und als letztes noch Sachbearbeiter. Außerdem soll man ebenfalls noch per 2 SELECT-OPTION mehrere Kontenruppen angeben können für Debitoren und Kreditiroen. Mein Problem liegt in der Verknüpfung der Radiobuttons und der SELECT-OPTIONS mit den Datenbankfeldern, sodass jeweils die richtigen Felder in die ALV selektiert werden. Ich weiß, dass ich zunächst Inhalte der Datenbanktabelle in eine interne Tabelle einfügen soll, und dann eine Ereignistabelle bzw.Ausgabetabelle erstellen soll. Doch leider beherrsche ich dies noch nicht so gut, und aufgrund der Vielzahl der Tabellen erscheint mir dies doch recht komplex. In einem anderen Programm, waren es 3 Tabellen (SKA1,SKB1 und SKAT), das Include/Unterprogramm des Programms sah so aus:

FORM f_fill_tables.

DATA: lv_lines TYPE i.

CLEAR: it_ska1[], it_skb1[], it_skat[],it_tab[].

* Einträge aus SKA1-Tabelle auswählen
DESCRIBE TABLE so_ktonr LINES lv_lines.

IF lv_lines > 0.
* Selektion über Kontenplan und Kontennummer
SELECT * FROM ska1 INTO TABLE it_ska1
WHERE ktopl = p_ktplan AND saknr IN so_ktonr.

ELSE.
* Selektion nur über Kontenplan
SELECT * FROM ska1 INTO TABLE it_ska1
WHERE ktopl = p_ktplan.

ENDIF.

* passende Einträge aus der SKB1-Tabelle auswählen

DESCRIBE TABLE it_ska1 LINES lv_lines.

IF lv_lines > 0.

IF NOT p_bkreis IS INITIAL.
* Selection über Kontennummer und Buchungskreis
SELECT * FROM skb1 INTO TABLE it_skb1
FOR ALL ENTRIES IN it_ska1
WHERE saknr = it_ska1-saknr AND bukrs = p_bkreis.
ELSE.
* Selektion nur über Kontennummer
SELECT * FROM skb1 INTO TABLE it_skb1
FOR ALL ENTRIES IN it_ska1
WHERE saknr = it_ska1-saknr.
ENDIF.

* passende Bezeichnungen auswählen
SELECT * FROM skat INTO TABLE it_skat
FOR ALL ENTRIES IN it_ska1
WHERE SPRAS = sy-langu AND KTOPL = it_ska1-ktopl
AND SAKNR = it_ska1-saknr.

ENDIF.

* Ergebnistabelle zusammenbauen

LOOP AT it_skb1 INTO wa_skb1.
* Arbeitszeile initialisieren
CLEAR wa_zeile.

* Komponenten der SKB1-Tabelle übernehmen
wa_zeile-BUKRS = wa_skb1-BUKRS.
wa_zeile-SAKNR = wa_skb1-SAKNR.
wa_zeile-BEGRU = wa_skb1-BEGRU.
wa_zeile-BUSAB = wa_skb1-BUSAB.
wa_zeile-DATLZ = wa_skb1-DATLZ.
wa_zeile-ERDAT_SKB1 = wa_skb1-ERDAT.
wa_zeile-ERNAM_SKB1 = wa_skb1-ERNAM.
wa_zeile-FDGRV = wa_skb1-FDGRV.
wa_zeile-FDLEV = wa_skb1-FDLEV.
wa_zeile-FIPLS = wa_skb1-FIPLS.
wa_zeile-FSTAG = wa_skb1-FSTAG.
wa_zeile-HBKID = wa_skb1-HBKID.
wa_zeile-HKTID = wa_skb1-HKTID.
wa_zeile-KDFSL = wa_skb1-KDFSL.
wa_zeile-MITKZ = wa_skb1-MITKZ.
wa_zeile-MWSKZ = wa_skb1-MWSKZ.
wa_zeile-STEXT = wa_skb1-STEXT.
wa_zeile-VZSKZ = wa_skb1-VZSKZ.
wa_zeile-WAERS = wa_skb1-WAERS.
wa_zeile-WMETH = wa_skb1-WMETH.
wa_zeile-XGKON = wa_skb1-XGKON.
wa_zeile-XINTB = wa_skb1-XINTB.
wa_zeile-XKRES = wa_skb1-XKRES.
wa_zeile-XLOEB = wa_skb1-XLOEB.
wa_zeile-XNKON = wa_skb1-XNKON.
wa_zeile-XOPVW = wa_skb1-XOPVW.
wa_zeile-XSPEB_SKB1 = wa_skb1-XSPEB.
wa_zeile-ZINDT = wa_skb1-ZINDT.
wa_zeile-ZINRT = wa_skb1-ZINRT.
wa_zeile-ZUAWA = wa_skb1-ZUAWA.
wa_zeile-ALTKT = wa_skb1-ALTKT.
wa_zeile-XMITK = wa_skb1-XMITK.
wa_zeile-RECID = wa_skb1-RECID.
wa_zeile-FIPOS = wa_skb1-FIPOS.
wa_zeile-XMWNO = wa_skb1-XMWNO.
wa_zeile-XSALH = wa_skb1-XSALH.
wa_zeile-BEWGP = wa_skb1-BEWGP.
wa_zeile-INFKY = wa_skb1-INFKY.
wa_zeile-TOGRU = wa_skb1-TOGRU.

* Komponenten der SKA1-Tabelle füllen
READ TABLE it_ska1 INTO wa_ska1 WITH KEY saknr = wa_skb1-saknr.

IF sy-subrc = 0.

MOVE-CORRESPONDING wa_ska1 TO wa_zeile.

* dabei auch zugehörige Bezeichnungen füllen
READ TABLE it_skat INTO wa_skat WITH KEY
SPRAS = sy-langu KTOPL = wa_ska1-ktopl
SAKNR = wa_ska1-saknr.

IF sy-subrc = 0.
wa_zeile-TXT20 = wa_skat-TXT20.
wa_zeile-TXT50 = wa_skat-TXT50.
ENDIF.

ENDIF.

* gefüllte Zeile an Tabelle anhängen
APPEND wa_zeile TO it_tab.

ENDLOOP.

ENDFORM. " f_get_tables

So ähnlich muss es auch bei dem neuen Programm sein, bloß sind es diesmal 9 Tabellen^^. Ich hoffe du hast einige gute Ansätze oder ähnliche Programme, und kannst mir irgendwie behilflich sein. Falls du noch des Hauptprogramm, indem der Funktionsbaustein ALV enthalten ist, brauchst,(mit Deklarationen und Feldkatalog) kann ich dir diese gern senden. Oder die einzelnen Tabellennamen auch. Ich bedanke mich für deine großzügige Hilfe im Voraus.

Mit freundlichen Grüßen

Hallo Rufat,

bitte schicke doch das Komplettcodung.

Bitte umschließe es mit dem PRE Tag (http://www.wer-weiss-was.de/app/service/faq_navi?got…) , damit das Coding einfacher zu lesen (sieht zwar doof in der Vorschau aus aber das Ergebnis ist okay).

Michi

Ich danke dir, hat sich aber bereits erledigt.

Viele Grüße