Nach Parameter Selektieren Thema ist als GELÖST markiert

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 / 11 / 8 / 0 ) » 10. Jan 2019 10:36

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


Re: Nach Parameter Selektieren

Beitrag von zzcpak (Expert / 641 / 5 / 55 ) » 10. Jan 2019 10:47

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 / 11 / 8 / 0 ) » 10. Jan 2019 10:51

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 / 123 / 36 / 35 ) » 10. Jan 2019 10:56

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 / 199 / 48 / 16 ) » 10. Jan 2019 10:59

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 / 11 / 8 / 0 ) » 10. Jan 2019 11:08

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 / 32 / 3 / 7 ) » 10. Jan 2019 11:26

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 / 1052 / 122 / 230 ) » 10. Jan 2019 11:49

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 / 11 / 8 / 0 ) » 10. Jan 2019 11:52

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 / 1052 / 122 / 230 ) » 10. Jan 2019 12:07

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

Aktuelle Forenbeiträge

Langtext zur Exception
vor 46 Minuten von a-dead-trousers 11 / 96
Adobe LiveCycle Designer - Ausblenden Text auf letzter Seite
vor 2 Stunden von a-dead-trousers 4 / 91
Welche Entwicklertools?
vor 17 Stunden von LostDarkness 2 / 922
Werksspezifische Konfiguration kopieren
vor 19 Stunden von eleve 2 / 48
Removal of left space - next to a docking container
vor 19 Stunden von Haemma83 16 / 114

Unbeantwortete Forenbeiträge

BAPI_PO_CREATE1 und Einkaufsinfosatz
vor 3 Tagen von SweetRuedi 1 / 81
WCOCO: Gruppe für Betragsfelder 0S01
vor 5 Tagen von SAP_ENTWICKLER 1 / 52
CAS-Nr.: Chemical Abstracs Service
vor einer Woche von SAP_ENTWICKLER 1 / 92
Interaktives Skript, Rolle IC-Manager
vor 3 Wochen von erubadhron86 1 / 129