Nach Parameter Selektieren

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Nach Parameter Selektieren

Beitrag von ichse18577 (ForumUser / 41 / 15 / 3 ) »
Hallöchen Liebes Forum,
ich bin ein verzweifelter ABAP Anfänger und habe seit gestern ein kleines Problemchen.
Nämlich habe ich die Aufgabe bekommen eine Tabelle mit Schichten zu erstellen (Startzeit - Endzeit und Datum)
und dann mit Parametern (Datum - Uhrzeit) abzufragen, ob das eingegebene Datum und die eingegebene Uhrzeit in diesem Zeitrahmen vorhanden sind.

Code: Alles auswählen.

TYPES: BEGIN OF   zkn_schichten,
  mandt      TYPE zcm_shifts-mandt,
  datum      TYPE zcm_shifts-datum,
  shiftstart TYPE zcm_shifts-shift_start,
  shiftend   TYPE zcm_shifts-shift_end,
  END OF zkn_schichten.

DATA: gt_shifts     TYPE STANDARD TABLE OF zkn_schichten,
      gs_shifts     TYPE zkn_schichten,
      gs_zcm_shifts TYPE zcm_shifts.

SELECT zcm_shifts~mandt zcm_shifts~datum zcm_shifts~shift_start zcm_shifts~shift_end
  FROM zcm_shifts INTO gs_zcm_shifts
  WHERE pa_date = gs_shift-datum and pa_time BETWEEN gs_shifts-shiftstart and gs_shifts-shiftend.
  APPEND gs_shifts TO gt_shifts.
ENDSELECT.
Das ist mein Bisheriger Code
Nur finde ich nicht ganz heraus wie ich nach pa_date und pa_time abfragen kann.
Fehlermeldung dabei ist "Das Feld 'pa_date' ist unbekannt.".

Vielen Dank schon mal im voraus!!! :D

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Nach Parameter Selektieren

Beitrag von zzcpak (Expert / 673 / 5 / 67 ) »
ist das dein kompletter Code?
PA_DATE und PA_TIME sind ja dann nicht deklariert?
Ich vermute mal, die sollen vom Benutzer des Programmes eingegeben werden.

In dem Fall fehlen dann noch die entsprechenden Parameterwerte, z.B.

Code: Alles auswählen.

PARAMETERS:
  pa_date TYPE sy-datum
  pa_time TYPE sy-uzeit.

Folgende Benutzer bedankten sich beim Autor zzcpak für den Beitrag:
ichse18577


Re: Nach Parameter Selektieren

Beitrag von ichse18577 (ForumUser / 41 / 15 / 3 ) »
Danke für die schnelle Antwort.
Haha ja klar ist es deklariert ich habe den Codeschnippsel nur vergessen:

Code: Alles auswählen.

PARAMETERS: pa_date TYPE dats DEFAULT '20190103', "OBLIGATORY,
            pa_time TYPE tims. " OBLIGATORY.
Aber selbst dann ist pa_date und pa_time unbekannt

Re: Nach Parameter Selektieren

Beitrag von 4byte (Specialist / 124 / 37 / 35 ) »
Fehler liegt hier:

Code: Alles auswählen.

 WHERE pa_date = gs_shift-datum and pa_time BETWEEN gs_shifts-shiftstart and gs_shifts-shiftend.
Überdenke nochmal deine where bedingung :wink:

Grüße 4Byte

Folgende Benutzer bedankten sich beim Autor 4byte für den Beitrag:
ichse18577

Es gibt 10 Menschen die binär verstehen :)

Re: Nach Parameter Selektieren

Beitrag von deejey (Specialist / 418 / 128 / 45 ) »
Du musst die Parameter gegen die DB-Felder abfragen und nicht gegen die Struktur. Und select endselect geht auch viel besser zu lösen.

edit
ok hat sich überschnitten

Folgende Benutzer bedankten sich beim Autor deejey für den Beitrag:
ichse18577


Re: Nach Parameter Selektieren

Beitrag von ichse18577 (ForumUser / 41 / 15 / 3 ) »
Also, ich hab jetzt umgebaut.
So sieht es jetzt aus:

Code: Alles auswählen.

SELECT * FROM zcm_shifts INTO gs_zcm_shifts
  WHERE pa_date = zcm_shifts-datum AND pa_time BETWEEN zcm_shifts-shift_start AND zcm_shifts-shift_end.
  APPEND gs_shifts TO gt_shifts.
ENDSELECT.
Ich hoffe das war so gemeint, aber es bringt immer noch den selben Fehler

Re: Nach Parameter Selektieren

Beitrag von schick (ForumUser / 52 / 5 / 15 ) »
Schau dir nochmal genau deinen Select an und überlege wie dieser aufgebaut ist.

Code: Alles auswählen.

SELECT * "was soll selektiert werden? 
FROM zcm_shifts "woher soll selektiert werden?
INTO gs_zcm_shifts "wohin soll das Ergebnis der Selektion geschrieben werden?  
WHERE ... "jetzt kommt der spannende Teil 
Kurzer Auszug aus der ABAP-Schlüsselwortdokumentation zu WHERE:
Syntax
... [FOR ALL ENTRIES IN itab] WHERE sql_cond ...

Wirkung
Der Zusatz WHERE schränkt die Anzahl der Zeilen, die durch die Anweisung SELECT in die Ergebnismenge gestellt werden, durch einen logischen Ausdruck sql_cond ein. Der logische Ausdruck vergleicht den Inhalt von Spalten in der Datenbank mit dem Inhalt von Hostvariablen, Literalen oder mit dem Inhalt anderer Spalten. [...]
Schau dir diese und die weiterführenden Dinge mal an, z.b. auch sql_cond:
WHERE - sql_cond

Syntax
... { {operand1 {=|EQ|<>|NE|>|GT|<|LT|>=|GE|<=|LE}
{ operand2
| {[ALL|ANY|SOME] subquery} }}
| {operand [NOT] BETWEEN operand1 AND operand2}
| {operand1 [NOT] LIKE operand2 [ESCAPE esc]}
| {operand [NOT] IN (operand1, operand2 ...)}
| {operand [NOT] IN seltab}
| {operand IS [NOT] NULL}
| {(cond_syntax)}
| {EXISTS subquery}
| {operand [NOT] IN subquery} } ...

Wirkung

Die logischen Ausdrücke sql_cond in der WHERE-Bedingung sind ähnlich den allgemeinen logischen Ausdrücken für Kontrollanweisungen. Sie bestehen aus relationalen Ausdrücken mit Vergleichsoperatoren und mit Prädikatoperatoren. Zusätzlich können die logischen Ausdrücke einer WHERE-Bedingung dynamisch angegeben werden und es ist die Verwendung von Subqueries möglich. Mehrere relationale Ausdrücke einer WHERE-Bedingung können mit AND oder OR zu einem Ausdruck verknüpft werden. Ein logischer Ausdruck kann mit NOT negiert werden.

Für operand bzw. operand1 auf der linken Seite können angegeben werden:
◾Spalten der hinter FROM aufgeführten Datenquellen.
◾Beliebige SQL-Ausdrücke, was Literale, Hostvariablen und Hostausdrücke umfasst.
Wenn du das gelesen und verstanden hast, kommst du bestimmt selbst dahinter was der Fehler ist, dein Vergleich ist falsch du musst ihn wie folgt aufbauen:

Code: Alles auswählen.

WHERE 1 2 3
1, 2 und 3 stehen hier als Platzhalter die wie folgt zu belegen sind:

1: hier das Feld aus der DB-Tabelle das mit irgendwas verglichen werden soll
2: hier kommt der Vergleichsoperator hin z.B. "=" bzw. EQ
3: hier kommt dein Feld hin mit dem du die Tabelle vergleichen willst, z.B. ein Parameter

Folgende Benutzer bedankten sich beim Autor schick für den Beitrag:
ichse18577


Re: Nach Parameter Selektieren

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Also ganz ehrlich, Anfänger selber drauf kommen lassen ist gut und schön, aber das hier artet doch etwas oberlehrerhaft aus. An ichses Stelle würde ich jetzt den Wald vor lauter Bäumen nicht mehr sehen.

@ichse18577: Der Fehler liegt darin, dass Du pa_date auf der linken Seite des Gleichheitszeichens zu stehen hast. Dort dürfen in einer WHERE-Bedingung aber nur Felder der Tabelle stehen. In WHERE-Bedingungen muss es also immer heißen:

WHERE Feld der Datenbanktabelle = lokales Vergleichsfeld

und nicht

WHERE lokales Vergleichsfeld = Feld der Datenbanktabelle

Deswegen meckert er, da pa_date nun mal keine Spalte der Datenbanktabelle zcm_shifts ist. Du musst also nur die beiden Seiten vertauschen, dann klappt es.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ichse18577


Re: Nach Parameter Selektieren

Beitrag von ichse18577 (ForumUser / 41 / 15 / 3 ) »
Hallo,

ich bin gerade drauf gekommen.
Danke euch allen.

Code: Alles auswählen.

TYPES: BEGIN OF   zkn_schichten,
  mandt      TYPE zcm_shifts-mandt,
  datum      TYPE zcm_shifts-datum,
  shiftstart TYPE zcm_shifts-shift_start,
  shiftend   TYPE zcm_shifts-shift_end,
  END OF zkn_schichten.

DATA: gt_shifts     TYPE STANDARD TABLE OF zkn_schichten,
      gs_shifts     TYPE zkn_schichten,
      gs_zcm_shifts TYPE zcm_shifts.

PARAMETERS: pa_date TYPE dats DEFAULT '20190103', "OBLIGATORY,
            pa_time TYPE tims. " OBLIGATORY.

**********************************************************************

SELECT * FROM zcm_shifts INTO gs_zcm_shifts
  WHERE zcm_shifts~shift_start <= pa_time
  AND zcm_shifts~shift_end >= pa_time
  AND zcm_shifts~datum = pa_date.
  APPEND gs_shifts TO gt_shifts.
ENDSELECT.

**********************************************************************

IF gt_shifts IS NOT INITIAL.
  MESSAGE i003(YACM).
  ELSE.
    MESSAGE i002(YACM).
    ENDIF.

Re: Nach Parameter Selektieren

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Glückwunsch! Wunschgemäß funktionieren wird Dein Code freilich nicht, da Dein SELECT in gs_zcm_shifts selektiert und Du dann aber gs_shifts APPENDierst, ohne vorher irgendeine Form von Datenübertragung zwischen den beiden Feldern vorzunehmen. Am Ende wirst Du nur leere Zeilen in Deiner internen Ergebnistabelle haben.

Ich vermute mal, dass gs_shifts nicht exakt dieselben Spalten hat wie gs_zcm_shifts und Du nur die Spalten übernehmen möchtest, die es in beiden Strukturen gibt. Das könntest Du aber ohnehin effizienter ohne SELECT-Schleife machen, und zwar mit:

SELECT * FROM zcm_shifts INTO CORRESPONDING FIELDS OF TABLE gt_shifts
WHERE zcm_shifts~shift_start <= pa_time
AND zcm_shifts~shift_end >= pa_time
AND zcm_shifts~datum = pa_date.

Dann brauchste keinen APPEND und nix.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
ichse18577


Seite 1 von 1

Vergleichbare Themen

4
Antw.
5055
Views
Materialpreise selektieren
von MasterSAP » 02.06.2008 15:06 • Verfasst in ABAP® für Anfänger
14
Antw.
2029
Views
Berechtigungsabfragen selektieren
von Bright4.5 » 05.02.2019 09:54 • Verfasst in ABAP® für Anfänger
2
Antw.
1747
Views
Kundenhierachie selektieren
von nikibert » 08.07.2008 08:41 • Verfasst in Sales and Distribution
14
Antw.
3396
Views
Interne Tabelle selektieren
von flo1304 » 14.03.2019 09:04 • Verfasst in ABAP® für Anfänger
3
Antw.
138
Views
Selektieren von Internen Tabellen
von Micha_ela » 29.09.2022 10:27 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140