gelöst Nach Parameter Selektieren


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Nach Parameter Selektieren

Beitragvon ichse18577 » 10.01.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
ichse18577
ForumUser
 
Beiträge: 4
Registriert: 10.01.2019, 09:36
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Nach Parameter Selektieren

Beitragvon zzcpak » 10.01.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.
 

Für diese Nachricht hat zzcpak einen Dank bekommen :
ichse18577
zzcpak
Expert
 
Beiträge: 610
Registriert: 29.07.2003, 15:10
Dank erhalten: 52 mal

Re: Nach Parameter Selektieren

Beitragvon ichse18577 » 10.01.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
ichse18577
ForumUser
 
Beiträge: 4
Registriert: 10.01.2019, 09:36
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon 4byte » 10.01.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
Es gibt 10 Menschen die binär verstehen :)

Für diese Nachricht hat 4byte einen Dank bekommen :
ichse18577
4byte
Specialist
 
Beiträge: 118
Registriert: 24.10.2017, 09:16
Dank erhalten: 34 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon deejey » 10.01.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

Für diese Nachricht hat deejey einen Dank bekommen :
ichse18577
deejey
Specialist
 
Beiträge: 151
Registriert: 31.07.2016, 11:20
Dank erhalten: 10 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon ichse18577 » 10.01.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
ichse18577
ForumUser
 
Beiträge: 4
Registriert: 10.01.2019, 09:36
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon schick » 10.01.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

Für diese Nachricht hat schick einen Dank bekommen :
ichse18577
schick
ForumUser
 
Beiträge: 21
Registriert: 16.02.2018, 08:22
Dank erhalten: 4 mal
Ich bin: Berater/in

Re: Nach Parameter Selektieren

Beitragvon DeathAndPain » 10.01.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.

Für diese Nachricht hat DeathAndPain einen Dank bekommen :
ichse18577
DeathAndPain
Expert
 
Beiträge: 854
Registriert: 05.05.2006, 10:14
Dank erhalten: 197 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon ichse18577 » 10.01.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.
ichse18577
ForumUser
 
Beiträge: 4
Registriert: 10.01.2019, 09:36
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Nach Parameter Selektieren

Beitragvon DeathAndPain » 10.01.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.

Für diese Nachricht hat DeathAndPain einen Dank bekommen :
ichse18577
DeathAndPain
Expert
 
Beiträge: 854
Registriert: 05.05.2006, 10:14
Dank erhalten: 197 mal
Ich bin: Entwickler/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Preisfindung bei Änderung anstoßen
vor 55 Minuten von ewx 3 Antw.
gelöst Textaufbereitung TDLINE
vor 2 Stunden von DeathAndPain 3 Antw.
FUBA oder BAPI für VK11
vor 20 Stunden von cuncon 2 Antw.
Nach Datum sortieren
vor 52 Minuten von DeathAndPain 7 Antw.
gelöst ALE Verteilung Kundenaufträge
Gestern von SAP_ENTWICKLER 0 Antw.

  Ähnliche Beiträge beta
Programm RLLNACH1 nach Z-Tabelle selektieren lassen
13.02.2007, 14:58 von max1 0 Antw.
Select nach Parameter & Select-Options
11.07.2012, 15:38 von Unit605 4 Antw.
Materialpreise selektieren
03.06.2008, 08:42 von muggel 4 Antw.
gelöst Selektieren eines Feldes
29.08.2003, 12:10 von Thomas 4 Antw.
Selektieren des letzten timestamps
02.08.2006, 14:10 von barbara 0 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder