Honda CB400

Spritmonitor.de

Unsere SR500 hat uns in den vergangenen Jahren immer treue Dienste geleistet und ist ist noch immer gut in Schuss. Dennoch sollte nun ein Motorrad mit E-Starter angeschafft werden da meine Frau mit dem Kickstarter der SR nicht gut zurecht kam. Als dann in der Nähe unseres Wohnortes eine CB400 verkauft wurde, sind wir an einem Sonntag im Oktober zu Besichtigung ausgerückt.

Der erste Eindruck war schon mal was besonders – eine rote CB400 aus dem Jahr 1979. Also sogar noch etwas älter als die SR, aber in Ordnung. Eine kleine Schwäche für Motorräder dieser Epoche kann ich nicht leugnen. Da der Preis stimmte, haben wir sie gekauft. Im November ist sie dann, nach Inspektion und neuer Kette, vom TÜV und „ohne erkennbare Mängel“ mit neuer Plakette und Kennzeichen zugelassen worden.

mod_safe on/off

Nach einer initialen JOOMLA!-Installation per ftp, wird später ein Problem auftreten wenn weitere Komponenten installiert werden sollen. Das liegt an der Einstellung mod_safe on, hiermit soll verhindert werden, dass ein Script auf fremde Bereiche des Servers zugreifen kann. Dies soll ein Sicherheitsrisiko bei mehreren virtuellen Servern auf einer Hardwareplattform vermeiden. Die eigene Joomla-Installation läuft ja unter einem anderen User als Bspw. der eigene ftp-User. Einen Weg aus dem Dilemma erschließt sich mit der Möglichkeit, JOOMLA zu veranlassen, den ftp-User statt des Server-Users zu benutzen. Dazu muss man die Parameter in der Konfiguration eintragen.

Auf der Registerkarte SERVER sind im unteren drittel die ftp Zugangsdaten einzutragen.

Wichtig! Der Punkt im Feld Stammverzeichnis ist kein Fliegendreck. Ohne eine gültige Pfadangabe des root-Verzeichnisses funktioniert das nicht. Da sich mein ftp-User auf einen eigenen Benutzerbereich bezieht, habe ich hier den Punkt eingetragen. Im Normalfall kann das aber auch z.B. /httpdocs sein. Am besten ausprobieren.

eigenes favicon in JOOMLA!

Ein eigenes favicon auf seiner Webseite zu platzieren ist gar nicht so schwer. Dazu muss man zunächst ein icon erstellen. Dieses sollte am Ende ein 16×16 oder 32×32 Pixel großes Icon sein. Hier möchte ich anhand eines Beispiels veranschaulichen wie das im Fall einer JOOMLA!-Installation realisiert werden kann.

1. erstellen eins Logos mit OpenOfficeDraw.

zunächst wird das gewünschte Logo in beliebiger Größe erstellt, indem entweder grafische oder alphanumerische Komponenten angeordnet werden. Hier habe ich mir einfach ein Logo aus zwei Buchstaben erstellt.


Wenn dieser Entwurf OK ist, sollte dieses Bild in eine Bitmap umgewandelt werden. Also, die Grafik markieren, mit der rechten Maustaste das Kontextmenü aufrufen und den Schritt “Umwandeln –> In Bitmap” auswählen.


Anschließend sollte die Grafik gespeichert werden. Dabei ist zu beachten, dass nicht das Dokument, sondern nur die Grafik gespeichert wird. Also wieder das Kontextmenü aufrufen und den Schritt “Als Grafik speichern” auswählen.


So, nun kann OpenOfficeDraw beendet werden. Das zuschneiden des Bildes wird mit Gimp ausgeführt, das geht zwar prinzipiell auch mit OpenOfficeDraw aber dort nicht Pixelgenau. In Gimp geöffnet, kann das Bild zurecht geschnitten und auf eine Größe von 32×32 Pixel skaliert werden.


Nun noch das Bild im Format .ico als favicon.ico speichern.

2. Das Icon in das Verzeichnis auf dem Webserver kopieren.

Am besten mit einem FTP-Client wie FileZilla o.ä. wird die Datei in das Verzeichnis des JOOMLA!-templates kopiert.

3. Nachdem ggfs. der Cache gelöscht und die Webseite neu geladen worden ist, wird das so erstellte eigene Icon sowohl in der URL-Zeile wie auch auf dem Tabstrip des Browsers angezeigt.

Änderungsbelege suchen

Beispiel: Suche nach Änderungsbelegen von Equipment.

Das Programm zur Suche von Änderungsbelegen über die Transaktion SA38 aufrufen.

AEnderungsbelege_suchen_01

Das Selektionsbild bietet verschiedene Möglichkeiten der Abgrenzungen an. Über die Objektklasse lässt sich eine Einschränkung vornehmen, hier werden die Änderungsbelege der Stammdaten zum Equipment (Objektklasse EQUI) ausgewählt. Eine weitere Klasse wäre IFLO für Änderungsbelege des Technischen Platzes.

AEnderungsbelege_suchen_02

Das Ergenbis kann sich sehen lassen.

AEnderungsbelege_suchen_03

 

Joomla! Tipps Installation und Umzug

Einige Hoster bieten den Service, das CMS per Knopfdruck zu installieren. Leider sind das manchmal nur alte Versionen. Alternativ kann die Installation aber auch selbst durchgeführt werden.

Wenn man Joomla! also selbst installieren möchte, sollte folgendermaßen vorgegangen werden.

Vorraussetzungen:

  • Internetzugang
  • Webspace bei einem Hoster mit Zugangsdaten
  • Ggfs. Eine registrierte Wunschdomäne unter der die Seite später erreichbar sein sollte
  • Webbrowser (Firefox; IE; etc.), der Webbrowser sollte Cookies akzeptieren (kann man später ja wieder ausschalten)
  • ftp-Client (Empfehlung: FileZilla)
  • das aktuelle Joomla!-Paket mit deutschem Sprachpaket von einem Downloadserver herunter laden

Vorgehen:

  • das Joomla!-Paket muss zunächst entpackt werden.
  • Das entstandene Unterverzeichnis (z.B. Joomla_1.5.15-Stable-Full_Package_German) wird nun per ftp an den Webserver übertragen. In unserem Fall in das Verzeichnis /httpdocs
  • Der weitere Installationsvorgang wird mit dem Webbrowser gemacht. Da die Installation auf dem Server mit einem anderen User läuft, müssen wir zunächst die Dateirechte ändern. Alle Rechte auf Dateien und Verzeichnisse müssen auf 0777  gesetzt sein, sonst bekommt man nur Fehlermeldungen. Später ist es natürlich wichtig, dass die Rechte wieder auf 0755 gesetzt sind.
  • Mit der Administrationskonsole der Webanbieters muss noch eine Datenbank angelegt werden. Datenbankname, Benutzer und Passwort werden während der Installation noch benötigt.
  • Nun wird die  Url aufgerufen, z.B. www.up-tendyra.de oder bei einer Subdomäne z.B. test.up-tendyra.de (ohne www.)
  • Jetzt sollte der Installationsvorgang gestartet werden.
  • Am Ende muß das Verzeichnis „Installation“ auf dem Webserver gelöscht werden.
  • Nicht vergessen, Verzeichnisrechte erst mal alle auf 0755 setzen, dann sukzessive Verzeichnisse wie z.B. tmp höher setzen, bis alles wieder funktioniert.

Template installieren:

  • Template entpacken und per ftp in das entsprechende Verzeichnis hochladen.
  • Ggfs. Die Installationsroutine in der Administrationsoberfläche ausführen. War hier aber nicht nötig. (Es werden wohl keine Datenbankeinträge geschrieben)

 

Komponenten installieren

Wenn der Eigentümer der Verzeichnisse und Dateien nicht der Webdienst ist, z.B. vorher Dateien mit FileZilla hochgeladen (Benutzer ). Das Installationstool von Joomla läuft aber unter dem User wwwrun – temporär die Verzeichnissrechte auf 777 setzen.

Liste der Verzeichnisse:

 

Joomlapack:

also eigentlich steht es schon alles hier beschrieben. Grob stimmt deine Reihenfolge, aber eben nur grob. Folgendes Vorgehen:

Joomlapack installieren (Fehlermeldung 135 ignorieren)
Einstellungen von JoomlaPack prüfen (MySQL-Kompatibilität ok? Temp- und Backupordner beschreibbar?=
Backupmachen
Runterladen und zip-Datei prüfen (kann ich sie öffenen, sind alle Dateien drin?)

Für die Rückspielung würde ich folgendes Vorgehen vorschlagen:
1. „alten Kram“ auf dem Server löschen
2. ausgepackte Dateien aus der Zip-Datei hochladen
3. auf www.deine-domain.de/install -> den Anweisungen (wie bei einer Installation) folgen.
4. Alles prüfen
5. Spaß haben (hoffentlich!)

Eigene Erfahrung bei Serverumzug:

  • Mit Joomlapack alle Files sichern (.tar.gz)
  • Mit Jommlapack Datenbank sichern

 

Alternativ

  • Komplette Verzeichnisstruktur kopieren
  • Mit mysqldump Datenbank sichern (z.B. >Joomla.sql)

Restore

  • Zuvor kopierte Verzeichnisstruktur auf den Zielserver übertragen
  • mysql – CREATE DATABASE galaxy_food COLLATE utf8_general_ci;
  • mysql –uroot -p galaxy_food < Joomla.sql
  • Konfiguration tmp (Konfiguration-Server) und Ausgabeverzeichnis (Jommlapack) anpassen.

 

Anschließend hat man sogar das Joomlapack zur Verfügung.

 

Ergänzung 2010-11-10:

  • Phänomen: Einige Symbole werden nicht angezeigt z.B. Schließen von Fenster, weiterführende Symbole usw. Dazu habe ich im Web (weiß nicht mehr wo) folgendes gefunden: IF you are using Virtuemart and you have problems while trying to view the virtuemart admin panel or frontend product view, then the main problem is FETCHSCRIPT.php , which Virtuemart uses for gzipping the css and js files. So, here is a perfect solution for that: The fix for this is to force the usefetchscript OFF all the time by adding the following line near the top of the config file: /administrator/components/com_virtuemart/virtuemart.cfg.php $_REQUEST[‚usefetchscript‘] = „0“;
  • nach dem Umzug auf eine andere Domäne, wurden die Links nicht richtig umgesetzt. Die URL zeigte den Domänennamen mehrfach hintereinander an. Abhilfe war hier: in der configuration.php den Eintrag var $live-site = ‚www.eigeneDomain.de‘; nach var $live-site = “; zu ändern.
  • Die Konfigurationslinks im Administrationsbereich des Virtuemart verwiesen noch auf die originalen Seiten. Hier mussten in der Datei administrator/components/com_virtuemart/virtuemart.cfg.php die Verweise zur eigenen Domain editiert werden.
  • Ansonsten verwende ich jetzt den Nachfolger von Joomlapack -> Akeeba Backup.
  • Sollte die Datenbank direkt aus einem SQL-Script angelegt werden, so kann es sein, dass man die Zeichenkodierung anders einstellen muss z.B. utf8 oder Latin2 (Zentraleuropa).

 


Tipp aus dem Forum:

Bricht phpMyAdmin beim Export der DB ab, so ist diese evtl. zu groß.

Lösung: Ein Verzeichnis anlegen, welches die Rechte 777 besitzt. Dort eine PHP-Datei folgenden Inhalts anlegen:

system("/usr/bin/mysqldump -uUSERNAME -pPASSWORT -h ihr.datenbankserver.de DATENBANKNAME > /VOLLER_PFAD/dump.sql", $fp);
if ($fp==0) echo "Daten exportiert"; else echo "Es ist ein Fehler aufgetreten";

Im Browser aufrufen. Das Script erzeugt eine Datei dump.sql, welche die komplette DB enthält.

Re-Import: Voraussetzung natürlich die dump.sql ist noch im angegebenen Verzeichnis vorhanden. Folgendes Script verwenden:

system("/usr/bin/mysql -uUSERNAME -pPASSWORT -h Ihr.Datenbank.Server.de DATENBANKNAME < /VOLLER_PFAD/dump.sql", $fp); 
if ($fp==0) echo "Daten importiert"; else echo "Es ist ein Fehler aufgetreten";

So sollten sich auch große DBs in den Griff bekommen lassen 🙂

 

Favicon.ico

Im Verzeichnis /httpdocs/images

Logo im Template Chamaeleon:

Ich möchte im Kopfbereich mein eigenes Logo anzeigen lassen und zwar transparent!

 

Vorraussetzung:

  • Bild .jpg oder ähnliches Format ist vorhanden
  • Bild hat z.B. einen weißen Hintergrund
  • Grafikprogramm Gimp

 


  • in Gimp das Bild öffnen
  • Auswahl nach Farbe – man wählt hier die Hintergrundfarbe. Wenn diese Farbe auch in der später anzuzeigenden Grafik vorhanden ist – aufpassen!
  • Die Auswahl invertieren – nun hat man alles was zur eigentlichen Grafik gehört markiert
  • Die Auswahl nun in den Zwischenspeicher  kopieren

 


  • Neues Bild erzeugen – mindest. In der Größe wie das Bild das sich im Zwischenspeicher befindet – WICHTIG! Hintergrund = Transparent
  • Den Zwischenspeicher einfügen

 

  • Das Bild skalieren – da das endgültige Bild 80 Pixel hoch sein soll, die Höhe also auf 80px einstellen
  • Alles Auswählen und in den Zwischenspeicher kopieren

 


 

  • Wieder ein neues Bild anlegen, nun in der endgültigen Größe von 960 x 80 Pixel mit transparentem Hintergrund
  • Den Zwischenspeicher einfügen
  • Das Bild zurecht rücken
  • Speichern unter dem Format .png oder .gif. (Empfehlung .png.) – .jpg ist nicht geeignet da dieses Format keine Transparenz unterstützt

interne Bestellung anlegen

FORM INT_BEST  TABLES
TEKPO STRUCTURE BEKPO
TEKET STRUCTURE BEKET
TEKKN STRUCTURE EKKNU
TKOMV STRUCTURE KOMV
USING  I_EKKO STRUCTURE EKKO
NEBP_EBELN TYPE ZNEBP_BELEGE-NEBP_EBELN
NB_EBELN TYPE ZNEBP_BELEGE-NB_EBELN.
*                  CHANGING
*                         PAR1.

*  Welche Materialnummer soll denn für die interne Bestellung gelten?
CLEAR I_LIFNR_TAB[].
SELECT * FROM ZNEBP_LIEFERANT INTO I_LIFNR_TAB. „Lieferant ableiten
APPEND I_LIFNR_TAB.
ENDSELECT.
LOOP AT I_LIFNR_TAB.
IF I_EKKO-EKGRP BETWEEN I_LIFNR_TAB-EKGRP_LOW AND I_LIFNR_TAB-EKGRP_HIGH.
I_MATERIAL = I_LIFNR_TAB-MABNR.
I_SPARTE   = I_LIFNR_TAB-SPARTE.
ENDIF.
ENDLOOP.

*  SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_WERT WHERE
*    KART EQ ‚MATINT1‘.
*  IF SY-SUBRC EQ 0.
*    I_MATERIAL = I_WERT.
*  ELSE.
*    CLEAR TBEST_RETURN[].
*    TBEST_RETURN-MESSAGE = ‚Materialnummer in der Tabelle ZNEBP_KONSTANTE ist nicht gepflegt‘.
*    CALL FUNCTION ‚Z_POPUP_RETURN_PARAM‘
*      TABLES
*        RETURN = TBEST_RETURN.
*  ENDIF.
* Welche Mengeneinheit wird verwendet?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_MEINS WHERE
KART EQ ‚MEINS_PUR‘.
IF SY-SUBRC 0.
I_MEINS = ‚ZPR‘. „Standardwert
ENDIF.

“ Ermitteln des Nettopreises aus 1 EUR + Zuschläge
CLEAR I_COND[].
* Zuschläge Sparte
PERFORM ZUSCHLAG_ERMITTELN.
*  SELECT * FROM A998 INNER JOIN KONP ON KONP~KNUMH = A998~KNUMH
*    INTO CORRESPONDING FIELDS OF I_COND WHERE
*          A998~KAPPL =  ‚V‘
*    AND   A998~KSCHL IN (‚ZCZ‘,’ZOHZ‘)
*    AND   DATBI      >= SY-DATUM
*    AND   SPART      =  10.
*    APPEND I_COND.
*  ENDSELECT.
**  Zuschlag Material übersteuert die Sparte
*  SELECT SINGLE * FROM A996 INNER JOIN KONP ON KONP~KNUMH = A996~KNUMH
*    INTO CORRESPONDING FIELDS OF I_COND WHERE
*         A996~KAPPL =   ‚V‘
*    AND  A996~KSCHL IN  (‚ZCZ‘,’ZOHZ‘)
*    AND  DATBI      >=  SY-DATUM
*    AND  MATNR      =   I_WERT.
*  APPEND I_COND.

*  CLEAR I_COND_KBETR.
* Wenn Zuschlag auf Materialebene vorhanden, dann lösche hier den Zuschlag
* auf Spartenebene
*  SORT I_COND BY MATNR DESCENDING.
*  DELETE ADJACENT DUPLICATES FROM I_COND COMPARING KSCHL.

*  LOOP AT I_COND.
*    I_COND_KBETR = I_COND_KBETR + I_COND-KBETR.
“ in der Tabelle KONP ist der Prozentsatz um eine Dezimalstelle nach
“ rechts verrutscht. Z.B. KBETR = 44,80 => 4,480 %
*    I_COND_KBETR = I_COND_KBETR / 10.
“ so, nun den absoluten Betrag errechnen
*   I_NETPR = 1 + 1 * ( I_COND_KBETR / 100 ).
*    I_COND-I_NETPR = 1. “ der Zuschlag wird direkt der Menge zugegeben
*    MODIFY I_COND.
*  ENDLOOP.

“ BAPI-Strukturen initialisieren
CLEAR POHEADER.
CLEAR POHEADERX.
CLEAR POITEM[].
CLEAR POITEMX[].
CLEAR POACCOUNT[].
CLEAR POACCOUNTX[].
CLEAR POSCHEDULE[].
CLEAR POSCHEDULEX[].
CLEAR POADDRDELIVERY[].
“ Kopfdaten übernehmen
POHEADER-COMP_CODE = ‚1000‘.
POHEADER-DOC_TYPE = ‚NEBP‘.
*  POHEADER-VENDOR = I_EKKO-LIFNR.
* Wenn die ext. Bestellnummer mit 45… beginnt, dann ist die aufrufende
* Quelle die Bestellschreibung, sonst Aufwandbuchung
* In dieser Abhängigkeit wird entweder das Materialcenter als Lieferant eingetragen
* oder der Lieferant wird aus der Ableitung gezogen.
CLEAR I_BEST.
FIND FIRST OCCURRENCE OF ‚4‘ IN NB_EBELN MATCH OFFSET OFFS.
IF SY-SUBRC = 0 AND OFFS EQ 0.
I_BEST = ‚X‘.
ENDIF.
FIND FIRST OCCURRENCE OF ’63‘ IN NB_EBELN MATCH OFFSET OFFS.
IF SY-SUBRC = 0 AND OFFS EQ 0.
I_BEST = ‚X‘.
ENDIF.

IF I_BEST = ‚X‘. „es ist also eine Bestellung
*    SELECT * FROM ZNEBP_LIEFERANT INTO I_LIFNR_TAB. „Lieferant ableiten
*      APPEND I_LIFNR_TAB.
*    ENDSELECT.
LOOP AT I_LIFNR_TAB.
IF I_EKKO-EKGRP BETWEEN I_LIFNR_TAB-EKGRP_LOW AND I_LIFNR_TAB-EKGRP_HIGH.
POHEADER-VENDOR = I_LIFNR_TAB-LIFNR.
POHEADER-PUR_GROUP = I_LIFNR_TAB-EKGRP_INT.
ENDIF.
ENDLOOP.
*    POHEADER-VENDOR = ‚0080453100‘.

ELSE.
POHEADER-VENDOR = I_EKKO-LIFNR.
POHEADER-PUR_GROUP = I_EKKO-EKGRP.
ENDIF.
POHEADER-PURCH_ORG = ‚200‘.
*  POHEADER-PUR_GROUP = ‚910‘.
POHEADER-ITEM_INTVL = ‚0000‘.
POHEADER-PMNTTRMS = ‚ZN00‘.

POHEADERX-COMP_CODE = ‚X‘.
POHEADERX-DOC_TYPE = ‚X‘.
POHEADERX-ITEM_INTVL = ‚X‘.
POHEADERX-VENDOR = ‚X‘.
POHEADERX-PMNTTRMS = ‚X‘.
POHEADERX-PURCH_ORG = ‚X‘.
POHEADERX-PUR_GROUP = ‚X‘.
POHEADERX-PMNTTRMS = ‚X‘.

“ Positionsdaten
LOOP AT TEKPO.
*   SD-Auftrag zur Position bereits fakturiert?
PERFORM CHECK_PURPO
TABLES I_FAKT
USING
NEBP_EBELN
TEKPO-EBELP.
*   Bestellposition kostenlos?
IF TEKPO-UMSON = ‚X‘.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
*    Kontierungsartfilter
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_KOART[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_KOART-SIGN, P_KOART-OPTION, P_KOART-LOW, P_KOART-HIGH) WHERE
FART = ‚KOART‘.
APPEND P_KOART.
ENDSELECT.

IF NOT TEKPO-KNTTP IN P_KOART.
*     Wenn der SD-Beleg zu dieser Position bereits fakturiert wurde,
*     dann darf er nie den Status NV erhalten.
READ TABLE I_FAKT WITH KEY POS = TEKPO-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

*    Positionstypfilter
*    Customizing lesen
CLEAR I_PSTYP.
SELECT SINGLE * FROM T163Y
INTO CORRESPONDING FIELDS OF I_PSTYP WHERE
PSTYP = TEKPO-PSTYP.
IF SY-SUBRC 0.
I_PSTYP-EPSTP = ‚ ‚.
ENDIF.

CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_PSTYP[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_PSTYP-SIGN, P_PSTYP-OPTION, P_PSTYP-LOW, P_PSTYP-HIGH) WHERE
FART = ‚PSTYP‘.
APPEND P_PSTYP.
ENDSELECT.

IF NOT I_PSTYP-EPSTP IN P_PSTYP.
READ TABLE I_FAKT WITH KEY POS = TEKPO-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKPO-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.
*   Zuschlag für Sparte oder Material? —————————————
*   Centerzuschlag
PERFORM ZUSCHLAG.
*    CLEAR I_COND.
*    READ TABLE I_COND WITH KEY MATNR = I_MATERIAL KSCHL = ‚ZCZ‘ INTO I_COND.
*    IF SY-SUBRC 0.  „kein Materialzuschlag, dann Spartenzuschlag
*      READ TABLE I_COND WITH KEY SPART = SPARTE KSCHL = ‚ZCZ‘ INTO I_COND.
*    ENDIF.
*    I_COND_KBETR    =   I_COND_KBETR + I_COND-KBETR.
**   Overheadzuschlag
*    CLEAR I_COND.
*    READ TABLE I_COND WITH KEY MATNR = I_MATERIAL KSCHL = ‚ZOHZ‘ INTO I_COND.
*    IF SY-SUBRC 0.  „kein Materialzuschlag, dann Spartenzuschlag
*      READ TABLE I_COND WITH KEY SPART = SPARTE KSCHL = ‚ZOHZ‘ INTO I_COND.
*    ENDIF.
*    I_COND_KBETR    =   I_COND_KBETR + I_COND-KBETR.
*    I_COND_KBETR = I_COND_KBETR / 10.
*    I_NETPR = 1.
*   ————————————————————————–
POITEM-PO_ITEM = TEKPO-EBELP.
*   Text und Menge aus externer Bestellung übernehmen
CLEAR C_MENGE.
WRITE TEKPO-MENGE TO C_MENGE.
CONCATENATE C_MENGE TEKPO-TXZ01 INTO POITEM-SHORT_TEXT SEPARATED BY SPACE.
*    POITEM-SHORT_TEXT = TEKPO-TXZ01.
POITEM-MATERIAL = I_MATERIAL.
POITEM-EMATERIAL = I_MATERIAL.
POITEM-DELETE_IND = TEKPO-LOEKZ.
POITEM-PLANT = ‚200‘.
*    POITEM-MATL_GROUP = ‚91000‘.
READ TABLE TKOMV INTO I_TKOMV WITH KEY
KSCHL = ‚NAVS‘
KPOSN = TEKPO-EBELP.
“ Nettowert + MwSt
POITEM-QUANTITY = ( I_TKOMV-KAWRT +  I_TKOMV-KBETR ) * ( 1 + ( I_COND_KBETR / 100 ) ).

POITEM-PO_UNIT = I_MEINS.
POITEM-PO_UNIT_ISO = I_MEINS.
POITEM-ACCTASSCAT = TEKPO-KNTTP.
POITEM-TAX_CODE = ‚N0‘.

POITEM-NET_PRICE = I_NETPR.
*    POITEM-ITEM_CAT = TEKPO-PSTYP.
POITEM-ITEM_CAT = ‚ ‚.
POITEM-TRACKINGNO = NB_EBELN.
POITEM-DELETE_IND = TEKPO-LOEKZ.
*    POITEM-PERIOD_IND_EXPIRATION_DATE = ‚T‘.
APPEND POITEM.

POITEMX-PO_ITEM = TEKPO-EBELP.
POITEMX-PO_ITEMX = ‚X‘.
POITEMX-SHORT_TEXT = ‚X‘.
POITEMX-MATERIAL = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
POITEMX-PLANT = ‚X‘.
POITEMX-MATL_GROUP = ‚X‘.
POITEMX-QUANTITY = ‚X‘.
POITEMX-PO_UNIT = ‚X‘.
POITEMX-PO_UNIT_ISO = ‚X‘.
POITEMX-ACCTASSCAT = ‚X‘.
POITEMX-TAX_CODE = ‚X‘.
POITEMX-NET_PRICE = ‚X‘.
POITEMX-ITEM_CAT = ‚X‘.
POITEMX-TRACKINGNO = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
*    POITEMX-PERIOD_IND_EXPIRATION_DATE.
APPEND POITEMX.
“ Anlieferadresse
POADDRDELIVERY-PO_ITEM = TEKPO-EBELP.
POADDRDELIVERY-ADDR_NO = TEKPO-ADRN2.
APPEND POADDRDELIVERY.
*    poaddrdeliveryX-POITEM = ‚X‘.
*    poaddrdeliveryX-addr_no = ‚X‘.
ENDLOOP.

“ Kontierungsdaten
LOOP AT TEKKN.
* SD-Auftrag zur Position fakturiert?
*    READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
*    IF SY-SUBRC = 0.
*      CONTINUE.
*    ENDIF.
*    Filter über Sachkonto
“ führende Nullen entfernen
I_SAKTO_C = TEKKN-SAKTO.
SHIFT I_SAKTO_C LEFT DELETING LEADING ‚0‘.
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_SAKTO[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_SAKTO-SIGN, P_SAKTO-OPTION, P_SAKTO-LOW, P_SAKTO-HIGH) WHERE
FART = ‚SAKTO‘.
APPEND P_SAKTO.
ENDSELECT.

IF NOT I_SAKTO_C IN P_SAKTO.
READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKKN-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

*    Ende Filter Sachkonto
*    Filter nach Innenauftrag
IF NOT TEKKN-AUFNR IS INITIAL.
I_AUFNR_C = TEKKN-AUFNR.
SHIFT I_AUFNR_C LEFT DELETING LEADING ‚0‘.
CLEAR TBEST_RETURN[].
CLEAR MSG.
CLEAR P_AUFNR[].
SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH
FROM ZNEBP_FILTER
INTO (P_AUFNR-SIGN, P_AUFNR-OPTION, P_AUFNR-LOW, P_AUFNR-HIGH) WHERE
FART = ‚AUFNR‘.
APPEND P_AUFNR.
ENDSELECT.

IF NOT I_AUFNR_C IN P_AUFNR.
READ TABLE I_FAKT WITH KEY POS = TEKKN-EBELP LOCK = ‚X‘.
IF SY-SUBRC 0.
UPDATE ZNEBP_BELEGE SET NEBP_EBELN = ‚NV‘
WHERE NB_EBELN = NB_EBELN
AND NB_POS = TEKKN-EBELP.
COMMIT WORK AND WAIT.
CONTINUE.
ENDIF.
ENDIF.

ENDIF.
* Ende Filter Innenauftrag
POACCOUNT-PO_ITEM = TEKKN-EBELP.
POACCOUNT-SERIAL_NO = SY-TABIX.
READ TABLE TKOMV INTO I_TKOMV WITH KEY
KSCHL = ‚NAVS‘
KPOSN = TEKKN-EBELP.
*   bei Mehrfachkontierung muß der Wert (Bruttobetrag) prozentual
*   aufgeteilt werden.
IF  TEKKN-VPROZ IS INITIAL.
I_VPROZ = 1.
ELSE.
I_VPROZ = TEKKN-VPROZ / 100.
ENDIF.
READ TABLE POITEM INTO I_POITEM WITH KEY
PO_ITEM = POACCOUNT-PO_ITEM.
POACCOUNT-QUANTITY = I_POITEM-QUANTITY * I_VPROZ.
*    POACCOUNT-QUANTITY = ( I_TKOMV-KAWRT + I_TKOMV-KBETR ) * I_VPROZ.
POACCOUNT-COSTCENTER = TEKKN-KOSTL.
POACCOUNT-ORDERID = TEKKN-AUFNR.
POACCOUNT-CO_AREA = ‚1000‘.
“ Sachkonto manipulieren ( 8 voranstellen)
MOVE TEKKN-SAKTO TO I_SAKTO_C.
“ führende Nullen entfernen
SHIFT I_SAKTO_C LEFT DELETING LEADING ‚0‘.
CONCATENATE ‚8‘ I_SAKTO_C INTO I_SAKTO_C.
“ mit führenden Nullen auffüllen
UNPACK I_SAKTO_C TO I_SAKTO_C.
POACCOUNT-GL_ACCOUNT = I_SAKTO_C.
*    –> eingefügt für Mehrfachkontierung
POACCOUNT-SERIAL_NO = TEKKN-ZEKKN.
*    POACCOUNT-DISTR_PERC = TEKKN-VPROZ.
POACCOUNT-COSTCENTER = TEKKN-KOSTL.
*    –> Ende Mehrfachkontierung
APPEND POACCOUNT.

POACCOUNTX-PO_ITEM = TEKKN-EBELP.
POACCOUNTX-PO_ITEMX = ‚X‘.
POACCOUNTX-SERIAL_NO = SY-TABIX.
POACCOUNTX-DELETE_IND = ‚X‘.
POACCOUNTX-QUANTITY = ‚X‘.
POACCOUNTX-COSTCENTER = ‚X‘.
POACCOUNTX-ORDERID = ‚X‘.
POACCOUNTX-CO_AREA = ‚X‘.
POACCOUNTX-GL_ACCOUNT = ‚X‘.
*    –> eingefügt für Mehrfachkontierung
POACCOUNTX-SERIAL_NO = TEKKN-ZEKKN.
*    POACCOUNTX-DISTR_PERC = ‚X‘ .
*    –> Ende Mehrfachkontierung
APPEND POACCOUNTX.
ENDLOOP.
*  Die Bestellmenge wird auf die Summe der Menge der Kontierungselemente gesetzt oder,
*  wenn kein Kontierungselement mehr übrigbleibt soll die Bestellposition auch
*  nicht angelegt werden.
LOOP AT POITEM.
READ TABLE POACCOUNT WITH KEY
PO_ITEM = POITEM-PO_ITEM.
IF SY-SUBRC 0.
*   1. Kein Kontierungselement vorhanden
DELETE POITEM.
READ TABLE POITEMX WITH KEY PO_ITEM = POITEM-PO_ITEM .
IF SY-SUBRC = 0.
DELETE POITEMX INDEX SY-TABIX.
ENDIF.
READ TABLE POADDRDELIVERY WITH KEY PO_ITEM = POITEM-PO_ITEM.
IF SY-SUBRC = 0.
DELETE POADDRDELIVERY INDEX SY-TABIX.
ENDIF.

ELSE.
*   2. Menge anpassen
CLEAR I_MENGE.
LOOP AT POACCOUNT.
IF POACCOUNT-PO_ITEM = POITEM-PO_ITEM.
I_MENGE = I_MENGE + POACCOUNT-QUANTITY.
ENDIF.
ENDLOOP.
POITEM-QUANTITY = I_MENGE.
MODIFY POITEM.
ENDIF.
ENDLOOP.

“ Einteilung
SORT TEKET BY EBELP ASCENDING.
LOOP AT TEKET.
* SD-Auftrag zur Position fakturiert?
*    READ TABLE I_FAKT WITH KEY POS = TEKET-EBELP LOCK = ‚X‘.
*    IF SY-SUBRC = 0.
*      CONTINUE.
*    ENDIF.
WRITE TEKET-EINDT TO POSCHEDULE-DELIVERY_DATE.
AT NEW EBELP.
POSCHEDULE-PO_ITEM = TEKET-EBELP.
*    nur eine Einteilung pro Bestellposition anlegen
POSCHEDULE-SCHED_LINE = ’01‘. „SY-TABIX.
POSCHEDULE-DEL_DATCAT_EXT = ‚T‘.
READ TABLE POITEM INTO I_POITEM WITH KEY
PO_ITEM = POSCHEDULE-PO_ITEM.
IF SY-SUBRC = 0.
*       Hier wird der Menge noch der
POSCHEDULE-QUANTITY = I_POITEM-QUANTITY .
APPEND POSCHEDULE.

POSCHEDULEX-PO_ITEM = TEKET-EBELP.
POSCHEDULEX-SCHED_LINE = ’01‘. „SY-TABIX. “ sonst werden immer nur neue Einteilungen hinzugefügt
POSCHEDULEX-PO_ITEMX = ‚X‘.
POSCHEDULEX-DEL_DATCAT_EXT = ‚X‘.
POSCHEDULEX-DELIVERY_DATE = ‚X‘.
POSCHEDULEX-QUANTITY = ‚X‘.
APPEND POSCHEDULEX.
ENDIF.
ENDAT.

ENDLOOP.
*  Die Einteilungsmengemenge wird auf die Summe der Menge der Kontierungselemente gesetzt oder,
*  wenn kein Kontierungselement mehr übrigbleibt soll die Einteilung auch
*  nicht angelegt werden.
LOOP AT POSCHEDULE.
READ TABLE POACCOUNT WITH KEY
PO_ITEM = POSCHEDULE-PO_ITEM.
IF SY-SUBRC 0.
*   1. Kein Kontierungselement vorhanden
DELETE POSCHEDULE.
ELSE.
*   2. Menge anpassen
CLEAR I_MENGE.
LOOP AT POACCOUNT.
IF POACCOUNT-PO_ITEM = POSCHEDULE-PO_ITEM.
I_MENGE = I_MENGE + POACCOUNT-QUANTITY.
ENDIF.
ENDLOOP.
POSCHEDULE-QUANTITY = I_MENGE.
MODIFY POSCHEDULE.
ENDIF.
ENDLOOP.

* Wenn es noch keine interne Bestellung gibt, dann wollen wir diese anlegen
IF NEBP_EBELN IS INITIAL OR NEBP_EBELN = ‚NV‘.
DESCRIBE TABLE POITEM
LINES ZEILEN.
*    offensichtlich gibt es keine Bestellposition,
*    dann wird auch keine interne Bestellung angelegt
IF ZEILEN  = 0.
EXPPURCHASEORDER = ‚NV‘.
EXPORT EXPPURCHASEORDER TO MEMORY ID ‚NEBP_EXPPURCHASEORDER‘.
EXIT.
ENDIF.
CALL FUNCTION ‚BAPI_PO_CREATE1‘
EXPORTING
POHEADER          = POHEADER
POHEADERX         = POHEADERX
MEMORY_UNCOMPLETE = “
MEMORY_COMPLETE   = “
NO_MESSAGING      = ‚X‘
NO_MESSAGE_REQ    = ‚X‘
IMPORTING
EXPPURCHASEORDER  = EXPPURCHASEORDER
TABLES
RETURN            = TBEST_RETURN
POITEM            = POITEM
POITEMX           = POITEMX
POADDRDELIVERY    = POADDRDELIVERY
POSCHEDULE        = POSCHEDULE
POSCHEDULEX       = POSCHEDULEX
POACCOUNT         = POACCOUNT
POACCOUNTX        = POACCOUNTX.

ELSE.
*    Nach Änderung der Kontierungsdaten in der externen Bestellung wird
*    zunächst das entsprechende Kontierungselement in der int. Bestellung gelöscht,
*    um dann die Kontierungsdaten erneut anzulegen.

* Zunächst mal schauen wie viele Kontierungselemente vorhanden sind.
CALL FUNCTION ‚BAPI_PO_GETDETAIL1‘
EXPORTING
PURCHASEORDER      = NEBP_EBELN
ACCOUNT_ASSIGNMENT = ‚X‘
IMPORTING
POHEADER           = POHEADER
TABLES
RETURN             = TBEST_RETURN
POITEM             = POITEMDEL
POACCOUNT          = POACCOUNTDEL
POSCHEDULE         = POSCHEDULEDEL.

* Soll eine Bestellposition gelöscht werden weil sich die Kontierungsart geändert hat?
LOOP AT POITEMDEL.
READ TABLE POITEM WITH KEY PO_ITEM = POITEMDEL-PO_ITEM.
IF SY-SUBRC 0.
MOVE-CORRESPONDING POITEMDEL TO POITEM.
POITEM-DELETE_IND = ‚L‘.
APPEND POITEM.
POITEMX-PO_ITEM = TEKPO-EBELP.
POITEMX-PO_ITEMX = ‚X‘.
POITEMX-MATERIAL = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
POITEMX-PLANT = ‚X‘.
POITEMX-MATL_GROUP = ‚X‘.
POITEMX-QUANTITY = ‚X‘.
POITEMX-PO_UNIT = ‚X‘.
POITEMX-PO_UNIT_ISO = ‚X‘.
POITEMX-ACCTASSCAT = ‚X‘.
POITEMX-TAX_CODE = ‚X‘.
POITEMX-NET_PRICE = ‚X‘.
POITEMX-ITEM_CAT = ‚X‘.
POITEMX-TRACKINGNO = ‚X‘.
POITEMX-DELETE_IND = ‚X‘.
APPEND POITEMX.
ENDIF.
ENDLOOP.
* Feststellen welcher Kontierungsbeleg bei der Änderung gelöscht werden soll
* Ist in der Vorgängerbestellung ein Kontierungselement vorhanden dass nun nicht mehr übergeben wurde weil
* im Ursprungsbeleg gelöscht?
LOOP AT POACCOUNTDEL.
READ TABLE POACCOUNT WITH KEY PO_ITEM = POACCOUNTDEL-PO_ITEM SERIAL_NO = POACCOUNTDEL-SERIAL_NO.
IF SY-SUBRC 0. “ in den neuen Kontierungselementen fehlt ein Eintrag
MOVE-CORRESPONDING POACCOUNTDEL TO POACCOUNT. “ Dann mit Löschkennzeichen aufnehmen
POACCOUNT-DELETE_IND = ‚L‘.
APPEND POACCOUNT.

POACCOUNTX-PO_ITEM = POACCOUNTDEL-PO_ITEM.
POACCOUNTX-SERIAL_NO = POACCOUNTDEL-SERIAL_NO.
POACCOUNTX-DELETE_IND = ‚X‘.
POACCOUNTX-QUANTITY = ‚X‘.
POACCOUNTX-COSTCENTER = ‚X‘.
POACCOUNTX-CO_AREA = ‚X‘.
POACCOUNTX-GL_ACCOUNT = ‚X‘.
APPEND POACCOUNTX.
ENDIF.
ENDLOOP.
*    Sind jetzt zu irgendeiner Position keine Kontierungsdaten mehr vorhanden
*    dann setzte das Löschkennzeichen in der Position.
LOOP AT POITEM.
READ TABLE POACCOUNT WITH KEY PO_ITEM = POITEM-PO_ITEM DELETE_IND = ‚L‘.
IF SY-SUBRC = 0.
POITEM-DELETE_IND = ‚L‘.
MODIFY POITEM.
ENDIF.
ENDLOOP.
*    fehlen in der Einteilung etwa noch Daten zur Position?
LOOP AT POSCHEDULEDEL.
READ TABLE POSCHEDULE WITH KEY PO_ITEM = POSCHEDULEDEL-PO_ITEM.
IF SY-SUBRC 0.
MOVE-CORRESPONDING POSCHEDULEDEL TO POSCHEDULE.
APPEND POSCHEDULE.
POSCHEDULEX-PO_ITEM = POSCHEDULEDEL-PO_ITEM.
POSCHEDULEX-SCHED_LINE = ’01‘. „SY-TABIX. “ sonst werden immer nur neue Einteilungen hinzugefügt
POSCHEDULEX-PO_ITEMX = ‚X‘.
POSCHEDULEX-DEL_DATCAT_EXT = ‚X‘.
POSCHEDULEX-DELIVERY_DATE = ‚X‘.
POSCHEDULEX-QUANTITY = ‚X‘.
APPEND POSCHEDULEX.
ENDIF.
ENDLOOP.
*    05.11.2008
*    Es werden nur noch Positionen geändert bei denen das Updateflag gesetzt ist.
LOOP AT TEKPO.
IF TEKPO-UPDKZ = ‚U‘ OR  TEKPO-UPDKZ = ‚I‘.
ELSE.
DELETE POITEM WHERE PO_ITEM = TEKPO-EBELP.
DELETE POITEMX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POACCOUNT WHERE PO_ITEM = TEKPO-EBELP.
DELETE POACCOUNTX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POSCHEDULE WHERE PO_ITEM = TEKPO-EBELP.
DELETE POSCHEDULEX WHERE PO_ITEM = TEKPO-EBELP.
DELETE POADDRDELIVERY WHERE PO_ITEM = TEKPO-EBELP.
ENDIF.
ENDLOOP.

* Bestellung ändern
CALL FUNCTION ‚BAPI_PO_CHANGE‘
EXPORTING
PURCHASEORDER     = NEBP_EBELN
POHEADER          = POHEADER
POHEADERX         = POHEADERX
MEMORY_UNCOMPLETE = “
MEMORY_COMPLETE   = “
NO_MESSAGING      = ‚X‘
NO_MESSAGE_REQ    = ‚X‘
NO_PRICE_FROM_PO  = ‚X‘
TABLES
RETURN            = TBEST_RETURN
POITEM            = POITEM
POITEMX           = POITEMX
POADDRDELIVERY    = POADDRDELIVERY
POSCHEDULE        = POSCHEDULE
POSCHEDULEX       = POSCHEDULEX
POACCOUNT         = POACCOUNT
POACCOUNTX        = POACCOUNTX.

EXPPURCHASEORDER = NEBP_EBELN.
ENDIF.

* Fehler bei der internen Bestellung?
READ TABLE TBEST_RETURN WITH KEY TYPE = ‚E‘.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘
*     IMPORTING
*        RETURN =
.
“ Bestellung wurde nicht angelegt
EXPPURCHASEORDER = “.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT          = ‚X‘
*       IMPORTING
*         RETURN        =
.
ENDIF.

*  Soll bei aktiver Budgetprüfung eine Mail versendet werden?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE  INTO I_WERT WHERE KART = ‚BUDGET‘ AND WERT = ‚X‘.
IF SY-SUBRC = 0.
READ TABLE TBEST_RETURN WITH KEY NUMBER = 629.
IF SY-SUBRC = 0.
PERFORM NACHRICHT
TABLES
TBEST_RETURN
USING
NB_EBELN.
ENDIF.
ENDIF.
EXPORT EXPPURCHASEORDER TO MEMORY ID ‚NEBP_EXPPURCHASEORDER‘.
EXPORT POITEM TO MEMORY ID ‚NEBP_NB_POITEM‘.
EXPORT TBEST_RETURN TO MEMORY ID ‚NEBP_EX_RETURN‘.

ENDFORM.                    „INT_BEST

SD-Beleg anlegen und ändern

*&———————————————————————*
*&      Form  CREATE_SD
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <--  p2        text
*———————————————————————-*
FORM CREATE_SD
*      TABLES I_VBELN
USING INT_PUR_ORDER
SUCCESS
.
*  1. lösche alte SD-Aufträge
*  2. lese die interne Bestellung
*  3. Aufteilen der Bestellung nach Debitor
*  4. anlegen von SD-Aufträgen, gruppiert nach Debitor
*  5. Tabellenpflege ZNEBP_BELEGE_SD

*  lese die Belegnummern aus Tabelle
CLEAR I_ZNEBP_BELEGE_SD[].
SELECT * FROM ZNEBP_BELEGE_SD INTO I_ZNEBP_BELEGE_SD WHERE
EBELN = INT_PUR_ORDER.
APPEND I_ZNEBP_BELEGE_SD.
ENDSELECT.
*  lösche die gelesenen SD-Aufträge
LOOP AT I_ZNEBP_BELEGE_SD.
ORDER_HEADER_CH_INX-UPDATEFLAG = ‚D‘.
CLEAR SD_RETURN[].
CALL FUNCTION ‚BAPI_SALESORDER_CHANGE‘
EXPORTING
SALESDOCUMENT               = I_ZNEBP_BELEGE_SD-NEBP_SD
*     ORDER_HEADER_IN             =
ORDER_HEADER_INX            = ORDER_HEADER_CH_INX
TABLES
RETURN = SD_RETURN
.
*    Alles klar?
READ TABLE SD_RETURN WITH KEY TYPE = ‚E‘.
*    BREAK PBOLLIG.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT = ‚X‘.
*      löschen des Eintrags aus der Referenztabelle

ENDIF.
DELETE FROM ZNEBP_BELEGE_SD WHERE
EBELN = I_ZNEBP_BELEGE_SD-EBELN
AND
NEBP_SD = I_ZNEBP_BELEGE_SD-NEBP_SD.
ENDLOOP.
COMMIT WORK AND WAIT.
CLEAR I_ZNEBP_BELEGE_SD[].

*  hole Details zur internen Bestellung
CALL FUNCTION ‚BAPI_PO_GETDETAIL1‘
EXPORTING
PURCHASEORDER      = INT_PUR_ORDER
ACCOUNT_ASSIGNMENT =
‚X‘
IMPORTING
POHEADER           = POHEADER
TABLES
RETURN = TBEST_RETURN
POITEM             = POITEM
POACCOUNT          = POACCOUNT
POSCHEDULE         = POSCHEDULE.

* Welche SD-Auftragsart soll verwendet werden?
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DOC_TYPE WHERE
KART
EQ ‚SD_DOCTYP‘.
IF SY-SUBRC 0.
I_DOC_TYPE =
‚ZI02‘. „Standartwert
ENDIF.
*  zu verwendender Buchungskreis
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_SALES_ORG WHERE
KART
EQ ‚BUKRS‘.
IF SY-SUBRC 0.
I_SALES_ORG =
‚1000‘. „Standartwert
ENDIF.
*  zu verwendender Vertriebsweg
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DISTR_CHAN WHERE
KART
EQ ‚DISTR_CHAN‘.
IF SY-SUBRC 0.
I_DISTR_CHAN =
’10‘. „Standartwert
ENDIF.
*  zu verwendende Sparte
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_DIVISION WHERE
KART
EQ ‚SPARTE‘.
IF SY-SUBRC 0.
I_DIVISION =
’10‘. „Standartwert
ENDIF.
*  zu verwendendes Werk
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_PLANT WHERE
KART
EQ ‚SD_PLANT‘.
IF SY-SUBRC 0.
I_PLANT =
‚100‘. „Standartwert
ENDIF.
*  zu verwendende Mengeneinheit
SELECT SINGLE WERT FROM ZNEBP_KONSTANTE INTO I_MEINS WHERE
KART
EQ ‚MEINS_SD‘.
IF SY-SUBRC 0.
I_MEINS =
‚ZPR‘. „Standartwert
ENDIF.

ORDER_HEADER_IN-DOC_TYPE  = I_DOC_TYPE.
ORDER_HEADER_IN-SALES_ORG = I_SALES_ORG.
ORDER_HEADER_IN-DISTR_CHAN = I_DISTR_CHAN.
ORDER_HEADER_IN-DIVISION = I_DIVISION.
ORDER_HEADER_IN-PURCH_NO_C = INT_PUR_ORDER.

ORDER_HEADER_INX-DOC_TYPE = ‚X‘.
ORDER_HEADER_INX-SALES_ORG =
‚X‘.
ORDER_HEADER_INX-DISTR_CHAN =
‚X‘.
ORDER_HEADER_INX-DIVISION =
‚X‘.
ORDER_HEADER_INX-PURCH_NO_C =
‚X‘.

SORT POITEM BY PO_ITEM.
SORT POACCOUNT BY COSTCENTER PO_ITEM.
PERFORM CLEAR_SD_TAB.
CLEAR I_VBELN[].

* Für die Aufteilung nach Debitor ist die Tabelle POACCOUNT führend
* Füllen der ersten beiden Spalten der internen Tabelle
* Nontwendig für Gruppenstufenbildung
LOOP AT POACCOUNT.
MOVE POACCOUNT-COSTCENTER TO I_POACCOUNT-COSTCENTER_S.
MOVE POACCOUNT-PO_ITEM TO I_POACCOUNT-PO_ITEM_S.
MOVE-CORRESPONDING POACCOUNT TO I_POACCOUNT.
APPEND I_POACCOUNT.
ENDLOOP.
SORT I_POACCOUNT BY COSTCENTER_S PO_ITEM_S.

LOOP AT I_POACCOUNT.
*    BREAK PBOLLIG.
READ TABLE POITEM WITH KEY
PO_ITEM = I_POACCOUNT-PO_ITEM
INTO I_POITEM.
APPEND I_POITEM.
*    ist die Position mit Löschkennzeichen versehen,
*    dann brauchen wir sie nicht weiter zu betrachten.
IF I_POITEM-DELETE_IND = ‚L‘ OR SY-SUBRC 0.
CLEAR I_POITEM[].
CONTINUE.
ENDIF.
I_MENGE = I_MENGE + I_POACCOUNT-QUANTITY.

ORDER_ITEMS_IN-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_ITEMS_IN-PO_ITM_NO = I_POITEM-PO_ITEM.
ORDER_ITEMS_IN-MATERIAL = I_POITEM-MATERIAL.
ORDER_ITEMS_IN-PLANT = I_PLANT.
ORDER_ITEMS_IN-TARGET_QTY = I_MENGE.
ORDER_ITEMS_IN-TARGET_QU = I_MEINS.
APPEND ORDER_ITEMS_IN.
ORDER_ITEMS_INX-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_ITEMS_INX-PO_ITM_NO = I_POITEM-PO_ITEM.
ORDER_ITEMS_INX-MATERIAL =
‚X‘.
ORDER_ITEMS_INX-UPDATEFLAG =
‚I‘.
ORDER_ITEMS_INX-PLANT =
‚X‘.
ORDER_ITEMS_INX-TARGET_QTY =
‚X‘.
ORDER_ITEMS_INX-TARGET_QU =
‚X‘.
APPEND ORDER_ITEMS_INX.
ORDER_SCHEDULE_IN-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_SCHEDULE_IN-SCHED_LINE = SY-TABIX.
ORDER_SCHEDULE_IN-REQ_QTY = I_MENGE.
APPEND ORDER_SCHEDULE_IN.
ORDER_SCHEDULES_INX-ITM_NUMBER = I_POITEM-PO_ITEM.
ORDER_SCHEDULES_INX-SCHED_LINE = SY-TABIX.
ORDER_SCHEDULES_INX-UPDATEFLAG =
‚I‘.
ORDER_SCHEDULES_INX-REQ_QTY =
‚X‘.
APPEND ORDER_SCHEDULES_INX.
CLEAR I_MENGE.

ORDER_PARTNERS-PARTN_ROLE = ‚AG‘.
SELECT SINGLE KUNNR FROM ZSD_ROBBKSDEB INTO I_KUNNR WHERE
KOSTL
EQ POACCOUNT-COSTCENTER AND DATBI GE SY-DATUM.
ORDER_PARTNERS-PARTN_NUMB = I_KUNNR.
CLEAR SD_RETURN[].
IF I_KUNNR IS INITIAL.
CONCATENATE ‚Debitor zur Kostenstelle:‘ I_POACCOUNT-COSTCENTER ‚fehlt in der Tabelle ZSD_ROBBKSDEB‘
INTO SD_RETURN-MESSAGE SEPARATED BY SPACE.
APPEND SD_RETURN.
*    Fall kein Debitor gepflegt ist soll eine Meldung ausgegeben werden.
CALL FUNCTION ‚Z_POPUP_RETURN_PARAM‘
TABLES
RETURN = SD_RETURN.
ENDIF.
CLEAR SD_RETURN[].
I_ORDER_EXTENSION-
STRUCTURE = ‚BAPE_VBAK‘.
IF POACCOUNT-COSTCENTER IS INITIAL.
I_ORDER_EXTENSION-VALUEPART1+
10 = ‚9999999‘.
ELSE.
I_ORDER_EXTENSION-VALUEPART1+
10 = POACCOUNT-COSTCENTER.
ENDIF.
APPEND I_ORDER_EXTENSION.
APPEND ORDER_PARTNERS.

*   bei erreichen des letzten Datensatzes zur Kostenstelle wird der Beleg angelegt.
AT END OF COSTCENTER_S.
CALL FUNCTION ‚BAPI_SALESORDER_CREATEFROMDAT2‘
EXPORTING
*           SALESDOCUMENTIN               =
ORDER_HEADER_IN               = ORDER_HEADER_IN
ORDER_HEADER_INX              = ORDER_HEADER_INX
IMPORTING
SALESDOCUMENT                 = VBELN
TABLES
RETURN = SD_RETURN
ORDER_ITEMS_IN                = ORDER_ITEMS_IN
ORDER_ITEMS_INX               = ORDER_ITEMS_INX
ORDER_PARTNERS                = ORDER_PARTNERS
ORDER_SCHEDULES_IN            = ORDER_SCHEDULE_IN
ORDER_SCHEDULES_INX           = ORDER_SCHEDULES_INX
EXTENSIONIN                   = I_ORDER_EXTENSION
.
READ TABLE SD_RETURN WITH KEY TYPE = ‚E‘.
*      BREAK PBOLLIG.
IF SY-SUBRC EQ 0.
CALL FUNCTION ‚BAPI_TRANSACTION_ROLLBACK‘.
ELSE.
CALL FUNCTION ‚BAPI_TRANSACTION_COMMIT‘
EXPORTING
WAIT = ‚X‘
*     IMPORTING
*       RETURN        =
.
*        CLEAR I_ZNEBP_BELEGE_SD[].
I_ZNEBP_BELEGE_SD-EBELN = INT_PUR_ORDER.
I_ZNEBP_BELEGE_SD-ZDEBT = I_KUNNR.
I_ZNEBP_BELEGE_SD-NEBP_SD = VBELN.
APPEND I_ZNEBP_BELEGE_SD.
*        I_VBELN = VBELN.
*        APPEND I_VBELN.
ENDIF.
PERFORM CLEAR_SD_TAB.
ENDAT.

ENDLOOP.
*  Festschreiben der Belegnummern in der Tabelle nur dann, wenn auch Sätze
*  vorhanden sind.
DESCRIBE TABLE I_ZNEBP_BELEGE_SD LINES ZEILEN.
IF ZEILEN > 0.
SUCCESS =
‚X‘.
LOOP AT I_ZNEBP_BELEGE_SD.
INSERT INTO ZNEBP_BELEGE_SD VALUES I_ZNEBP_BELEGE_SD.
ENDLOOP.
COMMIT WORK AND WAIT.
ENDIF.
ENDFORM. “ CREATE_SD

Batch-Input-Mappenprotokoll exportieren

Das Protokoll einer Batch-Input-Mappe lässt sich so ohne weiteres nicht in eine Datei exportieren, dabei kann es wichtig sein, das Protokoll für längere Zeit aufzubewahren. Um genau dies zu tun, habe ich hier einen Weg aufgezeichnet.

  1. Mit der Transaktion sm35 in die Mappenübersicht springen, dort die entsprechende Mappe auswählen und auf den Button „Protokoll“ klicken. Wichtig ist hier, keinen Doppelklick auf die Mappe. Da gelangt man zwar auch in die Protokollansicht, man hat dort aber keine Möglichkeit das Druckersymbol auszuwählen was aber für unsere Zwecke erforderlich ist.

 

     

  1. Nun einen Doppleklick auf das Protokoll
  2.  

  3. jetzt Liebevoll den Druck-Button drücken
  4. Nun stehen alle gewohnten Möglichkeiten zum Export oder Weiterverarbeitung zur Verfügung