Über abapguru

Informatiker. Braucht es mehr Worte?

…und los!

Endlich ist es soweit, es geht los. Erste Station heute, Flughafen Frankfurt (nach 4 Stunden mit der Bahn). Dann um 21:55 Uhr in den Flieger nach Singapur (da war ich dort erst vor vier Wochen ?). Endstation Brisbane, Australien, ca. 12 + 8 + 7 Stunden später…

Cheers ?

Auszeit

Nach längerer Zeit und Stillschweigen hier melde ich mich auch mal wieder zurück. Diesmal aber auch gleich mit guten Neuigkeiten im Gepäck – gönne mir mal eine zweimonatige Pause. Obendrauf werde ich diese beiden Monate nicht in Deutschland verbringen. In den nächsten Wochen, es geht am 04.11. schon los, erfahrt ihr hier immer mal wieder einen aktuellen Stand und vielleicht das ein oder andere Foto.

Bis dahin, weiter mit den Vorbereitungen.

Verbindung mit Python-LibNoDave und einer Siemens Logo 0BA7

Um mittels Python eine Verbindung zu einer Siemens LOGO! 0BA7 herstellen zu können, sind einige Schritte erforderlich. Ich persönlich habe diese unter Linux (Debian) durchgeführt. Später soll dies alles auf einem Raspberry PI (oder ähnliches Board) ebenfalls lauffähig sein.
Prinzipiell ist es allerdings bei der Verwendung von Python und LibNoDave egal, welches OS verwendet wird. Also nun zum eingemachten.

LibNoDave und Python-LibNoDave heruntergeladen und von den Quellen kompilliert*. Mit folgendem Beispiel-Coding kann man eine erste Verbindung zur LOGO! herstellen.

from libnodave import *

dave = libnodave()
# IP-Adresse der LOGO - Port ist immer 102
dave.open_socket('10.173.24.100', 102)
# Default-Werte (geklaut aus dem Demo-Programm)
dave.new_interface('IF1', daveProtoMPI, daveProtoISOTCP, daveSpeed187k)
# Timeout-Wert von 10 Sekunden? Doku ist das halbe Leben... :)
dave.set_timeout(10)
# Verbindung zur CPU aufbauen, MPI, Rack = 1, Slot = 0 (LOGO benötigt genau diese Werte)
dave.connect_plc(2, 1, 0)
# Aktuellen Wert des ersten Ausgangs (Q1) lesen 
print('output Q1 value %s' % dave.get_output_byte(0)) 
# Verbindung wieder schliessen - es kann nur eine offene Verbindung geben
dave.disconnect()

Hoffe es hilft jemanden – habe mir diese paar Zeilen Quelltext selbst mühsam aus dem wirren C-Coding des Demo-Programms zusammenstöpseln müssen. Frustrationspotential definitiv vorhanden. 😀

Update:

LibNoDave von den Quellen kompillieren bedeutet den „üblichen make-dreisatz“.

git clone git://github.com/netdata/libnodave.git
cd libnodave
make
sudo make install

Bei Python-LibNoDave sieht es ähnlich etwas anders aus.

git clone git://github.com/netdata/python-libnodave
python setup.py install

Weiterleitung auf SSL-Proxy (all-inkl.de)

Um unter Apache eine Weiterleitung auf einen SSL-Proxy (all-inkl.de) zu erreichen, sind folgende Zeilen in der .htaccess nötig.

RewriteEngine on
#Falls kein HTTPS aufgrufen wurde...
RewriteCond %{HTTPS} off
#...und die Anfrage nicht von der Domain des Proxy kommt
RewriteCond %{HTTP:X-FORWARDED-SERVER} !^ssl-account\.com$ [NC]
#leite weiter auf den Proxy
RewriteRule ^(.*)$ https://ssl-account.com/meineDomain.de/$1 [R=301,L]

Vielen Dank an dieser Stelle an Daniel – http://zeit-zu-handeln.net/2012/01/allgemein/automatischer-redirect-zu-ssl-proxy-bei-all-inkl/

Auslieferung / Transport über BAPI anlegen

Um im ERP eine Auslieferung in Bezug zu einem Kundenauftrag anzulegen, ist folgender BAPI nötig.

Edit: Der BAPI wurde mittlerweile umbenannt und lautet jetzt BAPI_OUTB_DELIVERY_CREATE_SLS. Danke an Dovahkiin (siehe Kommentare)

DATA lt_sales_order_items TYPE TABLE OF bapidlvreftosalesorder.
DATA ls_sales_order_item LIKE LINE OF lt_sales_order_items.

ls_sales_order_item-ref_doc = lf_vbeln_ka.
APPEND ls_sales_order_item TO lt_sales_order_items.

CALL FUNCTION 'BAPI_OUTBOUND_DELIVERY_CREATE_SLS'
  IMPORTING
    delivery          = lf_vbeln_lf
  TABLES
    sales_order_items = lt_sales_order_items[]
    return            = lt_return[].

Einen Transport zur Auslieferung erstellt man über folgenden BAPI.

DATA lt_itemdata TYPE TABLE OF bapishipmentitem.
DATA ls_itemdata LIKE LINE OF lt_itemdata.
DATA ls_headerdata TYPE bapishipmentheader.

ls_headerdata-shipment_type    = lf_shtyp. " Transporttyp
ls_headerdata-trans_plan_pt    = lf_tplst. " Transportdispostelle
ls_headerdata-service_agent_id = lf_tdlnr. " Spediteur
ls_headerdata-status_plan      = 'X'.      " Status des TA setzen
ls_headerdata-status_checkin   = 'X'.

ls_itemdata-delivery  = lf_vbeln_lf.
ls_itemdata-itenerary = 1.
APPEND ls_itemdata TO lt_itemdata.

CALL FUNCTION 'BAPI_SHIPMENT_CREATE'
  EXPORTING
    headerdata = ls_headerdata
  TABLES
    itemdata   = lt_itemdata[]
    return     = lt_return[].

 

Inline Deklarationen von Variablen unter ABAP

Nach meinem Besuch des DSAG Treffens AK NetWeaver Development in Walldorf am 29.11. habe ich wieder ein paar nette Features mitnehmen dürfen. Eines der besten davon sind „inline Deklarationen“ im ABAP Code. Wer sich im Moment nichts darunter vorstellen kann, dem hilft vielleicht folgendes Beispiel.

Wer kennt es nicht? Innerhalb von TRY-CATCH-ENDTRY Konstrukten will man die geworfene Exception fangen und z.B. den Text auswerten. Die bisherige Schreibweise  (< ABAP 7.4) dafür ist wie folgt.

DATA:
  lo_exception TYPE REF TO cx_root.

TRY.
    me->raise_exception( ).

  CATCH cx_root INTO lo_exception.
    me->process_exception( lo_exception ).
    RETURN.

ENDTRY.

Ab ABAP 7.4 (Beta-Version kommt noch im Dezember! Ramp-Up dann Q1/2013) kann das Exception-Handling dann wie folgt aussehen.

TRY.
    me->raise_exception( ).

  CATCH cx_root INTO DATA(lo_exception).
    me->process_exception( lo_exception ).
    RETURN.

ENDTRY.

Ist doch deutlich knackiger als obiger Code, oder? 🙂

Ähnlich funktioniert auch die Definition von Variablen an einer beliebigen Stelle im Coding.

DATA(lf_test) = 'Wert'.

Vorsicht ist allerdings beim Gültigkeitsbereich der Variablen geboten. Eine z.B. innerhalb einer Schleife deklarierten Variable hat auch ausserhalb der Schleife Gültigkeit! Dieser Tatsache ist sich die SAP bewusst, will aber (anscheinend) an der Situation nichts ändern. Vielleicht ja dann in ABAP 7.5? 😉

ABAP Dokumentation in Popup darstellen

Um einen Doku-Text in einem Popup darzustellen, sind folgende Zeilen ABAP nötig.

  DATA:
   lt_ltext             TYPE          tlinetab,
   lt_exclude           TYPE TABLE OF hlpfcode,
   ls_help_info         TYPE          help_info.

  CALL FUNCTION 'HELP_DOCULINES_SHOW'
    EXPORTING
      help_infos = ls_help_info
    TABLES
      excludefun = lt_exclude[]
      helplines  = lt_ltext[].