[59136] in SAPr3-news

home help back first fref pref prev next nref lref last post

Variablen-, Ablauf- oder Logikproblem

daemon@ATHENA.MIT.EDU (St. Kother)
Tue Mar 27 05:13:44 2007

To: sapr3-news@mit.edu
Date: Tue, 27 Mar 2007 11:13:26 +0200
From: "St. Kother" <steffen.kother@gmx.net>
Message-ID: <56s5hnF296u5sU1@mid.individual.net>
Reply-To: steffen.kother@gmx.net

Hallo Leute,

unabhängig von der Problematik mit der alten Materialnummer (MARA-BISMT) 
habe ich in meinem Programm noch einen Haken entdeckt. Den Quellcode 
findet ihr unter meiner Signatur. Entwickelt wird noch unter R/3 4.6C.

Für das Ändern, Löschvormerkung und Wiederholungsdruck verwende ich 
jedesmal die gleiche Funktion zur Ausgabe des ALV-Grid. Zum Verwursteln 
der markierten Zeilen, habe ich einen GUI-Status mit einer 
Ausführen-Drucktaste definiert. Soweit, sogut.

Das Problem oder vllt. besser Phänomen äußert sich so:
Aufrufen des Vorgangs "Ändern" und ALV-Grid unverändert, d.h. ohne 
Markierung(en) über Ausführen-Drucktaste verlassen.
Ggf. auch mehrmals wiederholen.
Aufrufen des Vorgangs "Löschkennzeichen setzen" und im ALV-Grid Zeile(n) 
markieren und über Ausführen-Drucktaste verlassen.

Es wird kein Datensatz mit dem Löschkennzeichen versehen, es kommt keine 
Statusmeldung und es wird auch kein Fehler ausgegeben.

Ich kann den Ursprung leider nicht eingrenzen, komme auch mittels 
Debugging nciht weiter. Wäre super, wenn sich jemand von euch mal meines 
Problems annehmen könnte bzw. über den Quelltext schaut...

Mit bestem Dank
-- 
Steffen

*&---------------------------------------------------------------------*
*& Report Z_BARCODEDRUCK                                               *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Programm zur Erzeugung und Verwaltung von Barcodetiketten           *
*& Version 0.2 / 16.01.2007 by Steffen Kother                          *
*&---------------------------------------------------------------------*
*& ToDos:
*& - Erledigt  - Erzeugen des Prüfzeichens und Anhängen an Barcode
*& - Erledigt  - Drucken des Etiketts vervollständigen, inkl. Barcode
*& - Erledigt  - Komplettieren des Formulars
*& - Erledigt  - Ändern von Datensätzen
*& - Erledigt  - Löschenkennzeichen bei Datensätzen
*& - Erledigt  - Reorganisieren der Datensätze
*& - Erledigt  - Wiederholungsdruck von Etiketten
*& - Erledigt  - Auswertungen ermöglichen - kann entfallen, da Tabelle
*&               mindestens mit TC SQVI verarbeitet werden kann
*& - Erledigt  - Tabelle erweitern um Spalte "Menge in BME"
*& - Erledigt  - Tabelle korrigieren nach "Menge in KG"
*& - Erledigt  - Mengenumrechnungen
*&---------------------------------------------------------------------*

report z_barcodedruck.

* Einbindung des Type-Pools "slis" - enthält Datentypen zur
* Kommunikation mit ALV-Grid
type-pools slis.

* Benötigte Tabellen
tables: mara,
         makt,
         itcpo.

* Unveränderliche Werte.
constants: c_pal   value  4, "Länge Palettennummer
            c_matnr value  7, "Länge Materialnummer
            c_menge value  6, "Länge Mengenangabe
            c_lager value  3, "Länge Lagerorts
            c_charg value  6. "Länge Charge

* Returncodes der einzelnen Unterprogramme
data: rc_validate type i value is initial, "Rückgabewert Validierung
       rc_alv      type i value is initial. "Rückgabewert ALV-Grid

* Zeichenkettenlängen der Barcodeeingaben
data: l_pal   type i,
       l_matnr type i,
       l_menge type i,
       l_lager type i,
       l_charg type i.

* Flag des Vorgangs
data: f_change type i value is initial. "Flag Barcodeänderung

* Variablen zur Laufzeit
data: l_count type i. "Datensatzzähler

* Definieren der Formularvariablen
data: palette  like zbarcodedruck-palette,
       material like zbarcodedruck-material,
       menge    like zbarcodedruck-menge,
       menge2   like zbarcodedruck-menge2,
       menge3   like zbarcodedruck-menge3,
       menge4   like menge3,
       eme      like zbarcodedruck-eme,
       lager    like zbarcodedruck-lager,
       charge   like zbarcodedruck-charge,
       datum    like zbarcodedruck-erstellt,
       text     like zbarcodedruck-text,
       barcode  like zbarcodedruck-barcode,
       kurztext like makt-maktx,
       len_kurz type i.

* Zur Verwendung von Druckoptionen
   data: l_str_itcpo like itcpo.

* Variablen zur Arbeit mit der Datentabelle
   data: l_str_barcodedruck type zbarcodedruck,
         l_tab_barcodedruck type standard table of zbarcodedruck.

* Erzeugung der Struktur "t_str_barcodedruckx" mit den Feldern:
* MARK, CLIENT, ID, BARCODE, PALETTE, MATERIAL, MENGE, MENGE2, usw.
*
* Benötigt für ALV-Grid
   types: begin of t_mark,
            mark type c,
          end of t_mark,
          begin of t_str_barcodedruckx.
                include structure zbarcodedruck.
   include type t_mark.
   types: end of t_str_barcodedruckx.

* Variablen für das ALV-Grid
   data: l_dis               type disvariant,
         l_str_layout        type slis_layout_alv,
         l_str_exit_by_user  type slis_exit_by_user,
         l_tab_barcodedruckx type standard table of t_str_barcodedruckx,
         l_str_barcodedruckx type t_str_barcodedruckx.

* Feldsymbole zur Arbeit mit der Datentabelle
   field-symbols: <l_str_barcodedruck>  type zbarcodedruck,
                  <l_str_barcodedruckx> type t_str_barcodedruckx.

* Hauptmenü des Programms als Bild 100, Inhalt als Block B100
selection-screen begin of screen 100.
   selection-screen begin of block b100 with frame title text-001.
     parameters:
       p_add    type c radiobutton group b100 default 'X',
       p_change type c radiobutton group b100,
       p_delete type c radiobutton group b100,
       p_clear  type c radiobutton group b100,
       p_print  type c radiobutton group b100.
   selection-screen end of block b100.
selection-screen end of screen 100.

* Eingabemaske für Palettendaten als Bild 200, Inhalt als Block B200
selection-screen begin of screen 200.
   selection-screen begin of block b200 with frame title text-002.
     parameters:
       p_pal    type z_bc_palette,
       p_matnr  type mara-matnr,
       p_menge  type z_bc_menge,
       p_me_bme type c radiobutton group b200 default 'X',
       p_me_kg  type c radiobutton group b200,
       p_lager  type z_bc_lager,
       p_charg  type z_bc_charge,
       p_text   type z_bc_text,
       p_datum  type z_bc_erstellt default sy-datum,
       p_grund  type z_bc_text.
   selection-screen end of block b200.
selection-screen end of screen 200.

* Hauptprogramm mit Durchlauf bis Abbruch
do.
* Anzeige des Hauptmenüs
   call selection-screen 100.

* Überprüfung des System-Rückgabewertes
   if sy-subrc <> 0.
     exit.
   elseif p_add = 'X'.
     perform z_barcodedruck_add.
   elseif p_change = 'X'.
     perform z_barcodedruck_change.
   elseif p_delete = 'X'.
     perform z_barcodedruck_delete.
   elseif p_clear = 'X'.
     perform z_barcodedruck_clear.
   elseif p_print = 'X'.
     perform z_barcodedruck_reprint.
   endif.
enddo.

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_add
*&---------------------------------------------------------------------*
*       Zeigt das Erfassungsfenster an, fügt Datensätze in die Tabelle
*       ein und gibt das Etikett aus
*----------------------------------------------------------------------*
form z_barcodedruck_add.

* Erfassungsprogramm mit Durchlauf bis Abbruch
   do.
*   Zurücksetzen des Änderungsflags
     f_change = 0.

*   Anzeige der Erfassungsmaske
     call selection-screen 200 starting at 30 5.

*   Überprüfen des Rückgabewertes
     if sy-subrc <> 0.
*     Erfassung abbrechen und Rückkehr zum Hauptmenü
       exit.
     else.
*     Eingaben validieren
       perform z_barcodedruck_validate
         using p_pal
               p_matnr
               p_menge
               p_lager
               p_charg
               p_datum
               ''.

*     Ausführung in Abhängigkeit des Returncodes der Validierung
       if rc_validate = 0.
*       Auf vorhandene identische Einträge prüfen
         select *
           from zbarcodedruck
           into table l_tab_barcodedruck
          where palette  = p_pal
            and material = p_matnr
            and charge   = p_charg.

*       Auswertung des Prüfergebnisses
         if sy-dbcnt > 0.
*         Meldungsausgabe bei existierenden Datensatz
           message i000(z_barcodedruck) with p_pal p_matnr p_charg.
         else.
*         Materialkurztext aus Tabelle MAKT holen
           select single maktx
             into makt-maktx
             from makt
            where matnr = p_matnr and
                  spras = 'DE'.

*         Eineindeutige Id erzeugen
           call function 'GUID_CREATE'
             importing ev_guid_32 = l_str_barcodedruck-id.

*         Barcodeinformationen an Struktur übergeben
           l_str_barcodedruck-palette       = p_pal.
           l_str_barcodedruck-material      = p_matnr.
           l_str_barcodedruck-menge         = p_menge.
           l_str_barcodedruck-lager         = p_lager.
           l_str_barcodedruck-charge        = p_charg.
           l_str_barcodedruck-text          = p_text.
           l_str_barcodedruck-erstellt      = p_datum.
           l_str_barcodedruck-name_erstellt = sy-uname.
           l_str_barcodedruck-systemdatum   = sy-datum.

*         Umrechnungsfaktor nach KG aus Tabelle MARA holen
           select single ntgew meins
             into (mara-ntgew, mara-meins)
             from mara
            where matnr = p_matnr and
                  meins <> 'KG'.

*         Nullwerte verhindern
           if mara-ntgew is initial.
             mara-ntgew = 1.
           endif.

*         Mengen und Mengeneinheiten zuordnen
           if p_me_bme = 'X'.
             l_str_barcodedruck-menge2 = p_menge / 10.
             l_str_barcodedruck-menge3 = ( p_menge / 10 ) * mara-ntgew.
             l_str_barcodedruck-eme    = mara-meins.
           else.
             l_str_barcodedruck-menge2 = ( p_menge / 10 ) / mara-ntgew.
             l_str_barcodedruck-menge3 = p_menge / 10.
             l_str_barcodedruck-eme    = 'KG'.
           endif.

*         Erzeugung der Barcodezeichenkette
           perform z_barcodedruck_create
             using p_pal
                   p_matnr
                   p_menge
                   p_lager
                   p_charg
                   p_datum.

*         Einfügen der Daten in die Tabelle
           insert zbarcodedruck from l_str_barcodedruck.

*         Meldungsausgabe für Fehler oder Erfolg
           if sy-subrc <> 0.
             message e005(z_barcodedruck).
           else.
             message s001(z_barcodedruck).

*           Aufrufen der Druckroutine und Ausgeben des Etiketts
             perform z_barcodedruck_print
               using l_str_barcodedruck-palette
                     l_str_barcodedruck-material
                     l_str_barcodedruck-menge
                     l_str_barcodedruck-menge2
                     l_str_barcodedruck-menge3
                     l_str_barcodedruck-eme
                     l_str_barcodedruck-lager
                     l_str_barcodedruck-charge
                     l_str_barcodedruck-erstellt
                     l_str_barcodedruck-text
                     l_str_barcodedruck-barcode
                     makt-maktx.
           endif.

         endif.
       endif.
     endif.
   enddo.

endform.                    " z_barcodedruck_add

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_change
*&---------------------------------------------------------------------*
*       Gibt die Datentabelle mittels ALV-Grid aus und nach
*       Auswahl eines Datensatzes wird das Erfassungsfenster für
*       das Ändern angezeigt
*----------------------------------------------------------------------*
form z_barcodedruck_change.

* Setzen des Änderungsflags für Abfrage des Änderungsgrunds
   f_change = 1.

* Bereitstellung der Tabellendaten zur Auswahl mittels ALV-Grid
   perform z_barcodedruck_alv_grid.

* Abarbeitung der vom ALV-Grid zurückgelieferten Tabelle
   if rc_alv = 0.

*   Durchlaufen der zurückgelieferten Tabelle
     loop at l_tab_barcodedruckx assigning <l_str_barcodedruckx>.

*     Prüfung, ob Änderung anfeordert
       if <l_str_barcodedruckx>-mark = 'X'.

*       Zuweisen der Daten an das Änderungsfenster
         move <l_str_barcodedruckx>-palette         to p_pal.
         move <l_str_barcodedruckx>-material        to p_matnr.
         move <l_str_barcodedruckx>-menge           to p_menge.
         move <l_str_barcodedruckx>-lager           to p_lager.
         move <l_str_barcodedruckx>-charge          to p_charg.
         move <l_str_barcodedruckx>-text            to p_text.
         move <l_str_barcodedruckx>-erstellt        to p_datum.
         move <l_str_barcodedruckx>-grund_aenderung to p_grund.

*       Aufruf der Eingabemaske solange bis die Daten valide sind
         rc_validate = 1.
         while not rc_validate is initial.

*         Änderungsfenster anzeigen
           call selection-screen 200 starting at 30 5.

*         Überprüfung des Rückgabewertes
           if sy-subrc <> 0.
*           Änderungsvorgang für Datensatz abbrechen
             exit.
           else.
*           Eingaben validieren
             perform z_barcodedruck_validate
               using p_pal
                     p_matnr
                     p_menge
                     p_lager
                     p_charg
                     p_datum
                     p_grund.
           endif.
         endwhile.

*       Ausführung in Abhängigkeit des Returncodes der Validierung
         if rc_validate = 0.
*         Materialkurztext aus Tabelle MAKT holen
           select single maktx
             into makt-maktx
             from makt
            where matnr = p_matnr and
                  spras = 'DE'.

*         Neue eineindeutige Id erzeugen
           call function 'GUID_CREATE'
             importing ev_guid_32 = l_str_barcodedruck-id.

*         Barcodeinformationen an Struktur übergeben
           l_str_barcodedruck-palette         = p_pal.
           l_str_barcodedruck-material        = p_matnr.
           l_str_barcodedruck-menge           = p_menge.
           l_str_barcodedruck-lager           = p_lager.
           l_str_barcodedruck-charge          = p_charg.
           l_str_barcodedruck-text            = p_text.
           l_str_barcodedruck-aenderung       = sy-datum.
           l_str_barcodedruck-erstellt        = p_datum.
           l_str_barcodedruck-name_aenderung  = sy-uname.
           l_str_barcodedruck-grund_aenderung = p_grund.

*         Umrechnungsfaktor nach KG aus Tabelle MARA holen
           select single ntgew meins
             into (mara-ntgew, mara-meins)
             from mara
            where matnr = p_matnr and
                  meins <> 'KG'.

*         Nullwerte verhindern
           if mara-ntgew is initial.
             mara-ntgew = 1.
           endif.

*         Mengen und Mengeneinheiten zuordnen
           if p_me_bme = 'X'.
             l_str_barcodedruck-menge2 = p_menge / 10.
             l_str_barcodedruck-menge3 = ( p_menge / 10 ) * mara-ntgew.
             l_str_barcodedruck-eme    = mara-meins.
           else.
             l_str_barcodedruck-menge2 = ( p_menge / 10 ) / mara-ntgew.
             l_str_barcodedruck-menge3 = p_menge / 10.
             l_str_barcodedruck-eme    = 'KG'.
           endif.

*         Erzeugung der Barcodezeichenkette
           perform z_barcodedruck_create
             using p_pal
                   p_matnr
                   p_menge
                   p_lager
                   p_charg
                   p_datum.

*         Aktualisieren des entsprechenden Datensatzes
           update zbarcodedruck
              set id              = l_str_barcodedruck-id
                  barcode         = l_str_barcodedruck-barcode
                  palette         = l_str_barcodedruck-palette
                  material        = l_str_barcodedruck-material
                  menge           = l_str_barcodedruck-menge
                  menge2          = l_str_barcodedruck-menge2
                  menge3          = l_str_barcodedruck-menge3
                  eme             = l_str_barcodedruck-eme
                  lager           = l_str_barcodedruck-lager
                  charge          = l_str_barcodedruck-charge
                  text            = l_str_barcodedruck-text
                  erstellt        = l_str_barcodedruck-erstellt
                  aenderung       = l_str_barcodedruck-aenderung
                  name_aenderung  = l_str_barcodedruck-name_aenderung
                  grund_aenderung = l_str_barcodedruck-grund_aenderung
            where id = <l_str_barcodedruckx>-id.

*         Meldungsausgabe bei Erfolg und Fehler, ggf. Druck
           if sy-subrc = 0.
             message s010(z_barcodedruck).

*           Aufrufen der Druckroutine und Ausgeben des Etiketts
             perform z_barcodedruck_print
               using l_str_barcodedruck-palette
                     l_str_barcodedruck-material
                     l_str_barcodedruck-menge
                     l_str_barcodedruck-menge2
                     l_str_barcodedruck-menge3
                     l_str_barcodedruck-eme
                     l_str_barcodedruck-lager
                     l_str_barcodedruck-charge
                     l_str_barcodedruck-erstellt
                     l_str_barcodedruck-text
                     l_str_barcodedruck-barcode
                     makt-maktx.
           else.
             message e011(z_barcodedruck).
           endif.
         endif.
       endif.
     endloop.
   endif.

endform.                    " z_barcodedruck_change

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_delete
*&---------------------------------------------------------------------*
*       Setzen des Löschkennzeichens ungültig erklärter Barcodes
*----------------------------------------------------------------------*
form z_barcodedruck_delete.

* Bereitstellung der Tabellendaten zur Auswahl mittels ALV-Grid
   perform z_barcodedruck_alv_grid.

* Abarbeitung der vom ALV-Grid zurückgelieferten Tabelle
   if rc_alv = 0.
     l_count = 0.

*   Durchlaufen der zurückgelieferten Tabelle
     loop at l_tab_barcodedruckx assigning <l_str_barcodedruckx>.

*     Relevanten Datensatz mit Löschkennzeichen versehen
       if ( <l_str_barcodedruckx>-mark = 'X' ) and
          ( <l_str_barcodedruckx>-loesch_kennz = '' ).
         update zbarcodedruck
            set loesch_kennz = 'X'
          where id = <l_str_barcodedruckx>-id .
         l_count = l_count + 1.
       endif.
     endloop.

*   Ausgabe der Anzahl markierter Datensätze
     message s006(z_barcodedruck) with l_count.
   endif.

endform.                    " z_barcodedruck_delete

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_clear
*&---------------------------------------------------------------------*
*       Löschen der markierten Datensätze
*----------------------------------------------------------------------*
form z_barcodedruck_clear.

* Endgültiges Löschen aller markierten Datensätze
   delete from zbarcodedruck where loesch_kennz = 'X'.

* Auswertung des System-Rückgabewertes
   if sy-subrc = 0.
     message s007(z_barcodedruck) with sy-dbcnt.
   else.
     message s008(z_barcodedruck).
   endif.

endform.                    " z_barcodedruck_clear

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_reprint
*&---------------------------------------------------------------------*
*       Druckt markierte Einträge erneut aus
*----------------------------------------------------------------------*
form z_barcodedruck_reprint.

* Bereitstellung der Tabellendaten zur Auswahl mittels ALV-Grid
   perform z_barcodedruck_alv_grid.

* Abarbeitung der vom ALV-Grid zurückgelieferten Tabelle
   if rc_alv = 0.

*   Durchlaufen der zurückgelieferten Tabelle
     loop at l_tab_barcodedruckx assigning <l_str_barcodedruckx>.

*     Relevanten Datensatz mit Löschkennzeichen versehen
       if <l_str_barcodedruckx>-mark = 'X'.
*       Materialkurztext aus Tabelle MAKT holen
         select single maktx
           into makt-maktx
           from makt
          where matnr = <l_str_barcodedruckx>-material and
                spras = 'DE'.

*       Aufrufen der Druckroutine und Ausgeben des Etiketts
         perform z_barcodedruck_print
           using <l_str_barcodedruckx>-palette
                 <l_str_barcodedruckx>-material
                 <l_str_barcodedruckx>-menge
                 <l_str_barcodedruckx>-menge2
                 <l_str_barcodedruckx>-menge3
                 <l_str_barcodedruckx>-eme
                 <l_str_barcodedruckx>-lager
                 <l_str_barcodedruckx>-charge
                 <l_str_barcodedruckx>-erstellt
                 <l_str_barcodedruckx>-text
                 <l_str_barcodedruckx>-barcode
                 makt-maktx.
       endif.
     endloop.
   endif.

endform.                    " z_barcodedruck_reprint

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_validate
*&---------------------------------------------------------------------*
*       Überprüfung auf leere Eingaben, vorhandene Materialnummer
*       bzw. Lagerort und Rückgabe eines Returncodes rc_add_validate
*----------------------------------------------------------------------*
*      -->P_P_PAL   Palettennummer
*      -->P_P_MATNR Materialnummer
*      -->P_P_MENGE Menge
*      -->P_P_LAGER Lagerort
*      -->P_P_CHARG Charge
*      -->P_P_DATUM Erfassungsdatum
*----------------------------------------------------------------------*
form z_barcodedruck_validate using p_p_pal
                                    p_p_matnr
                                    p_p_menge
                                    p_p_lager
                                    p_p_charg
                                    p_p_datum
                                    p_p_grund.

* Zur Validierung benötigte Tabellen
   data: l_tab_mara  type standard table of mara,
         l_tab_lgort type standard table of t001l.

* Returncode zurücksetzen
   rc_validate = 0.

* Leere Eingabefelder oder fehlerhafte Eingaben abfangen
* Palettennummer
   l_pal = strlen( p_p_pal ).
   if l_pal < c_pal.
     rc_validate = 1.
   endif.

* Palettengewicht
   if p_p_menge is initial.
     rc_validate = 1.
   endif.

* Palettencharge
   l_charg = strlen( p_p_charg ).
   if l_charg < c_charg.
     rc_validate = 1.
   endif.

* Erfassungsdatum
   if p_p_datum is initial.
     rc_validate = 1.
   endif.

* Änderungsgrund
   if not f_change is initial and p_p_grund is initial.
     rc_validate = 1.
     message i009(z_barcodedruck).
   endif.

* Materialnummer gegen Tabelle MARA prüfen wenn angegeben
   if not p_p_matnr is initial.
     select *
       from mara
       into table l_tab_mara
      where matnr = p_p_matnr.

     if sy-dbcnt is initial.
       rc_validate = 1.
       message i003(z_barcodedruck).
     endif.
   else.
     rc_validate = 1.
   endif.

* Lagerort gegen Tabelle T001L prüfen wenn angegeben
   if not p_p_lager is initial.
     select *
       from t001l
       into table l_tab_lgort
     where lgort = p_p_lager.

     if sy-dbcnt is initial.
       rc_validate = 1.
       message i004(z_barcodedruck).
     endif.
   else.
     rc_validate = 1.
   endif.

endform.                    " z_barcodedruck_validate

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_create
*&---------------------------------------------------------------------*
*       Erzeugt den Barcodestring
*----------------------------------------------------------------------*
*      -->P_P_PAL   Palettennummer
*      -->P_P_MATNR Materialnummer
*      -->P_P_MENGE Menge
*      -->P_P_LAGER Lagerort
*      -->P_P_CHARG Charge
*      -->P_P_DATUM Erfassungsdatum
*----------------------------------------------------------------------*
form z_barcodedruck_create using p_p_pal
                                  p_p_matnr
                                  p_p_menge
                                  p_p_lager
                                  p_p_charg
                                  p_p_datum.

* Variable zur Erzeugung des Barcodestrings
   data: d_menge type string,       "Aufnhame der num. Menge als String
         d_char  type c value '.',  "Variable mit optionalem Inhalt
         d_len   type i.            "Ermittelte Länge der Materialnummer

* Ermitteln der Länge der Materialnummer
   while not d_char is initial.
     d_char = p_p_matnr+d_len(1).
     d_len  = d_len + 1.
   endwhile.

* Korrektur des Zählers
   d_len = d_len - 1.

* "Konvertieren" der numerischen Menge in einen String
   d_menge = p_p_menge.

* Setzen des Zählers und Anpassung der Menge
   if d_len < c_matnr.
     d_len = c_matnr - d_len.
*   Verschieben der Menge um x Stellen nach rechts
     do d_len times.
       shift d_menge right.
     enddo.
   endif.

* Barcodezeichenkette erzeugen
   concatenate p_p_pal
               p_p_matnr
               d_menge
               p_p_lager
               p_p_charg
          into l_str_barcodedruck-barcode.

* Ermitteln des Prüfzeichens
   perform z_barcodedruck_get_checksign.

endform.                    " z_barcodedruck_create

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_get_checksign
*&---------------------------------------------------------------------*
*       Ermittelt das Prüfzeichen für Code 39
*----------------------------------------------------------------------*
form z_barcodedruck_get_checksign.

   data: checkstring(43) type c, "43 Zeichen (0..42)
         bc_leng         type i, "Länge Barcode
         bc_char         type c, "Barcodezeichen
         bc_chari        type i, "Barcodezeichenoffset
         bc_sum          type i, "Summe Barcodezeichen
         rest            type i, "Rest bc_sum mod 43
         bc_sign         type c. "Prüfzeichen

* Aus Druckerhandbuch
   checkstring = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%'.

* Ermittlung Länge Barcodezeichenkette und durchlaufen dieser
   bc_leng  = strlen( l_str_barcodedruck-barcode ).
   while bc_chari < bc_leng.
*   Zeichen an Offset
     bc_char = l_str_barcodedruck-barcode+bc_chari(1).

*   Ermittlung des Zeichenwertes
     if bc_char eq ''.
       sy-fdpos = 38.
     else.
       search checkstring for bc_char.
     endif.

*   Aufaddierung der Gesamtwertigkeit
     bc_sum = bc_sum + sy-fdpos.

*   Offset erhöhen
     bc_chari = bc_chari + 1.
   endwhile.

* Restermittlung mittels Modulo 43
   rest    = bc_sum mod 43.

* Ermittlung des Zeichen entsprechend des Rests
   bc_sign = checkstring+rest(1).

* Barcodezeichenkett mit Prüfzeichen bilden
   concatenate l_str_barcodedruck-barcode
               bc_sign
          into l_str_barcodedruck-barcode.

endform.                    " z_barcodedruck_get_checksign

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_print
*&---------------------------------------------------------------------*
*       Ausdrucken des Etiketts
*----------------------------------------------------------------------*
*      -->P_L_STR_BARCODEDRUCK_PALETTE  Palettennummer
*      -->P_L_STR_BARCODEDRUCK_MATERIAL Materialnummer
*      -->P_L_STR_BARCODEDRUCK_MENGE    Menge
*      -->P_L_STR_BARCODEDRUCK_LAGER    Lagerort
*      -->P_L_STR_BARCODEDRUCK_CHARGE   Charge
*      -->P_L_STR_BARCODEDRUCK_ERSTELLT Erfassungsdatum
*      -->P_L_STR_BARCODEDRUCK_BARCODE  Barcodezeichenkette
*----------------------------------------------------------------------*
form z_barcodedruck_print using p_l_str_barcodedruck_palette
                                 p_l_str_barcodedruck_material
                                 p_l_str_barcodedruck_menge
                                 p_l_str_barcodedruck_menge2
                                 p_l_str_barcodedruck_menge3
                                 p_l_str_barcodedruck_eme
                                 p_l_str_barcodedruck_lager
                                 p_l_str_barcodedruck_charge
                                 p_l_str_barcodedruck_datum
                                 p_l_str_barcodedruck_text
                                 p_l_str_barcodedruck_barcode
                                 p_makt-maktx.

* Wertzuweisung an die Formularvariablen
   palette  = p_l_str_barcodedruck_palette.
   material = p_l_str_barcodedruck_material.
   menge    = p_l_str_barcodedruck_menge.
   menge2   = p_l_str_barcodedruck_menge2.
   menge3   = p_l_str_barcodedruck_menge3.
   eme      = p_l_str_barcodedruck_eme.
   lager    = p_l_str_barcodedruck_lager.
   charge   = p_l_str_barcodedruck_charge.
   datum    = p_l_str_barcodedruck_datum.
   text     = p_l_str_barcodedruck_text.
   barcode  = p_l_str_barcodedruck_barcode.
   kurztext = p_makt-maktx.
   len_kurz = strlen( kurztext ).

   if eme <> 'KG'.
     menge4 = menge2.
   else.
     menge4 = menge3.
   endif.

* Vorbelegung von Ausgabeoptionen
   l_str_itcpo-tdimmed    = 'X'.      "Sofort ausgeben
   l_str_itcpo-tdnewid    = 'X'.      "Neuer Spoolauftrag
   l_str_itcpo-tddest     = sy-pdest. "Ausgabegerät abhängig von Benutzer
   l_str_itcpo-tdtitle    = barcode.  "Dialogtitel
   l_str_itcpo-tdcovtitle = barcode.  "Deckblatttitel

* Die Formularverarbeitung öffnen
   call function 'OPEN_FORM'
        exporting
             device                      = 'PRINTER'
             dialog                      = 'X'
             form                        = 'Z_BARCODEDRUCK'
             options = l_str_itcpo
        exceptions
             canceled                    = 1
             device                      = 2
             form                        = 3
             options                     = 4
             unclosed                    = 5
             mail_options                = 6
             archive_error               = 7
             invalid_fax_number          = 8
             more_params_needed_in_batch = 9
             spool_error                 = 10
             others                      = 11.

   if sy-subrc <> 0.
     message id sy-msgid type sy-msgty number sy-msgno
       with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   endif.

* Aktivieren des Textelementes 'DETAILS_A'
   call function 'WRITE_FORM'
        exporting
             element                  = 'DETAILS_A'
             window                   = 'DETAILSA'
        exceptions
             element                  = 1
             window                   = 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.

   if len_kurz > 30.
*   Aktivieren des Textelementes 'KURZTEXT_A_SMALL
     call function 'WRITE_FORM'
          exporting
               element                  = 'KURZTEXT_A_SMALL'
               window                   = 'MAKTXA'
          exceptions
               element                  = 1
               window                   = 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.
   else.
*   Aktivieren des Textelementes 'KURZTEXT_A_LARGE
     call function 'WRITE_FORM'
          exporting
               element                  = 'KURZTEXT_A_LARGE'
               window                   = 'MAKTXA'
          exceptions
               element                  = 1
               window                   = 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.
   endif.

* Aktivieren des Textelementes 'TEXT_A'
   call function 'WRITE_FORM'
        exporting
             element                  = 'TEXT_A'
             window                   = 'TEXTA'
        exceptions
             element                  = 1
             window                   = 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.

* Aktivieren des Textelementes 'BARCODE_A'
   call function 'WRITE_FORM'
        exporting
             element                  = 'BARCODE_A'
             window                   = 'BARCODEA'
        exceptions
             element                  = 1
             window                   = 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.

* Aktivieren des Textelementes 'DETAILS_B_SMALL'
   call function 'WRITE_FORM'
        exporting
             element                  = 'DETAILS_B'
             window                   = 'DETAILSB'
        exceptions
             element                  = 1
             window                   = 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.

   if len_kurz > 30.
*   Aktivieren des Textelementes 'KURZTEXT_B_SMALL'
     call function 'WRITE_FORM'
          exporting
               element                  = 'KURZTEXT_B_SMALL'
               window                   = 'MAKTXB'
          exceptions
               element                  = 1
               window                   = 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.
   else.
*   Aktivieren des Textelementes 'KURZTEXT_B_LARGe'
     call function 'WRITE_FORM'
          exporting
               element                  = 'KURZTEXT_B_LARGE'
               window                   = 'MAKTXB'
          exceptions
               element                  = 1
               window                   = 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.
   endif.

* Aktivieren des Textelementes 'TEXT_B'
   call function 'WRITE_FORM'
        exporting
             element                  = 'TEXT_B'
             window                   = 'TEXTB'
        exceptions
             element                  = 1
             window                   = 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.

* Aktivieren des Textelementes 'BARCODE_B'
   call function 'WRITE_FORM'
        exporting
             element                  = 'BARCODE_B'
             window                   = 'BARCODEB'
        exceptions
             element                  = 1
             window                   = 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.

   if len_kurz > 30.
*   Aktivieren des Textelementes 'MAIN_PART_SMALL'
     call function 'WRITE_FORM'
          exporting
               element                  = 'MAIN_PART_SMALL'
               window                   = 'MAIN'
          exceptions
               element                  = 1
               window                   = 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.
   else.
*   Aktivieren des Textelementes 'MAIN_PART_LARGE'
     call function 'WRITE_FORM'
          exporting
               element                  = 'MAIN_PART_LARGE'
               window                   = 'MAIN'
          exceptions
               element                  = 1
               window                   = 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.
   endif.

* Aktivieren des Textelementes 'MAIN_PART_DETAILS'
   call function 'WRITE_FORM'
        exporting
             element                  = 'MAIN_PART_DETAILS'
             window                   = 'MAIN'
        exceptions
             element                  = 1
             window                   = 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.

* Das benötigte (Default-)Formular wieder beenden
   call function 'END_FORM'
        exceptions
             unopened                 = 1
             bad_pageformat_for_print = 2
             spool_error              = 3
             others                   = 4.

   if sy-subrc <> 0.
     message id sy-msgid type sy-msgty number sy-msgno
       with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   endif.

* Die Formularverarbietung schliessen
   call function 'CLOSE_FORM'
        exceptions
             unopened                 = 1
             bad_pageformat_for_print = 2
             send_error               = 3
             spool_error              = 4
             others                   = 5.

   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.                    " z_barcodedruck_print

*&---------------------------------------------------------------------*
*&      Form z_barcodedruck_alv_grid
*&---------------------------------------------------------------------*
*       Bereitstellung des Tabelleninhaltes als ALV-Grid
*----------------------------------------------------------------------*
form z_barcodedruck_alv_grid.

* Löschen der Inhalte in Tabelle und Struktur
   clear l_tab_barcodedruck.
   clear l_tab_barcodedruckx.
   clear l_str_barcodedruckx.

* Auslesen der Datentabelle in die Tabelle "l_tab_barcodedruck" mit
* zusätzlichem Feld MARK (und Anpassung der Palettenmenge)
   select * from zbarcodedruck into table l_tab_barcodedruck.
   loop at l_tab_barcodedruck assigning <l_str_barcodedruck>.
     move-corresponding <l_str_barcodedruck> to l_str_barcodedruckx.
     append l_str_barcodedruckx to l_tab_barcodedruckx.
   endloop.

* Optimierung der Spaltenbreite
   l_str_layout-colwidth_optimize = 'X'.

* Fenstertext festlegen
   l_str_layout-window_titlebar = text-003.

* Festlegen des Zustandsfeldes für das ALV-Grid
   l_str_layout-box_fieldname = 'MARK'.

* Weitere Layoutoptionen
   l_str_layout-zebra        = 'X'.
   l_str_layout-numc_sum     = 'X'.

* Name des Reportsa für individuelle Konfigurationen
   l_dis-report = sy-repid.

* ALV-Grid-Funktion aufrufen
   call function 'REUSE_ALV_GRID_DISPLAY'
     exporting
       i_callback_program                = l_dis-report
       i_callback_pf_status_set          = 'CB_ALV_PF_SET_STATUS'
       i_callback_user_command           = 'CB_ALV_USER_COMMAND'
       i_structure_name                  = 'ZBARCODEDRUCK'
       is_layout                         = l_str_layout
       i_save                            = 'A'
       is_variant                        = l_dis
     importing
       es_exit_caused_by_user            = l_str_exit_by_user
     tables
       t_outtab                          = l_tab_barcodedruckx
     exceptions
       program_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.

* ALV-Grid verlassen
   case 'X'.
     when l_str_exit_by_user-exit.
       rc_alv = 1.
       exit.
     when l_str_exit_by_user-back or l_str_exit_by_user-cancel.
       rc_alv = 2.
       exit.
   endcase.

endform.                    " z_barcodedruck_alv_grid

*&---------------------------------------------------------------------*
*&      Form cb_alv_user_command
*&---------------------------------------------------------------------*
*       Auswerten gedrückter Tasten
*----------------------------------------------------------------------*
*      -->r_ucomm
*      -->rs_selfield
*----------------------------------------------------------------------*
form cb_alv_user_command using r_ucomm     like sy-ucomm
                                rs_selfield type slis_selfield.

   if r_ucomm = 'EXECUTE'.
     rs_selfield-exit = 'X'.
   endif.

endform.                    " cb_alv_user_command

*&---------------------------------------------------------------------*
*&      Form cb_alv_pf_set_status
*&---------------------------------------------------------------------*
*       Erzeugt einen neuen Dialogstatus wegen zusätzlicher
*       Funktionalität
*----------------------------------------------------------------------*
*      -->rt_extab
*----------------------------------------------------------------------*
form cb_alv_pf_set_status using rt_extab type slis_t_extab.

   set pf-status 'STANDARD_FULLSCREEN' excluding rt_extab.

endform.                    " cb_alv_pf_set_status

home help back first fref pref prev next nref lref last post