[59136] in SAPr3-news
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