J'ai une table avec BUKRS, GJAHR, MONAT et je veux sélectionner le MAX GJAHR & MONAT comme suit:
BUKRS GJAHR MONAT 5555 2019 09 5555 2019 10 5555 2019 11 5555 2020 02
Donc, dans le tableau, nous avons:
SELECT MAX( concat( gjahr, monat ) ) AS year_monat FROM zfiou_percentage INTO data(lv_year_month) WHERE bukrs = '5555' AND concat( gjahr, monat ) <= '202001' GROUP BY year_monat.
Comment puis-je obtenir la ligne 5555 2019 11
?
3 Réponses :
La concaténation des deux colonnes comme vous le prévoyez n'est possible qu'à partir de la version 7.50, comme indiqué par la documentation . Quelle est votre version?
Si vous ne pouvez pas le faire fonctionner ou si vous ne disposez pas de la version ABAP requise, vous pouvez effectuer les opérations suivantes. Pour plus d'informations, consultez sous-requêtes .
DATA: p_bukrs TYPE bukrs, lt_result TYPE TABLE OF zfiou_percentage. SELECT * FROM zfiou_percentage INTO CORRESPONDING FIELDS OF TABLE lt_result WHERE bukrs = p_bukrs AND gjahr >= ALL ( SELECT gjahr FROM zfiou_percentage WHERE bukrs = p_bukrs ) AND monat >= ALL ( SELECT monat FROM zfiou_percentage WHERE bukrs = p_bukrs AND gjahr >= ALL ( SELECT gjahr FROM zfiou_percentage WHERE bukrs = p_bukrs ) ).
Modifier : (Bien sûr, vous pouvez également sélectionner vos données en plusieurs étapes, en utilisant
SELECT
et SELECT ... FOR TOUTES LES ENTRÉES ...
, ou SELECT
et LOOP
. Vous devrez réfléchir et tester quelle solution sera la plus efficace, la plus simple à comprendre et la plus adaptée pour votre problème.)
Incluez éventuellement la condition <= 202001: AND (gjahr <'2020' OR gjahr = '2020' AND monat <= '01')
. NB: il est possible de tester la requête ci-dessus en R / 3 ou S / 4 en remplaçant ZFIOU_PERCENTAGE
par BKPF
.
La question est de savoir comment faire quand gjahr = 2019 et monat = 06. Ici, le résultat est 2019 & 02.
Wow! Très beau mais trop compliqué, la concaténation dans itab le sélectionnera deux fois plus rapide.
SELECT gjahr AS year, monat AS month FROM zfiou_percentage INTO TABLE DATA(selected_maxes) WHERE bukrs = '5555' AND ( gjahr < '2020' OR gjahr = '2020' AND monat <= '01' ) ORDER BY gjahr DESC, monat DESC UP TO 1 ROWS. DATA(selected_max) = selected_maxes[ 1 ]. DATA(max_date) = |{ selected_max-year }{ selected_max-month }|.
Ce n'est pas correct car il recherche en 2019 monat <= 1, à savoir subrc = 4. J'ai oublié: ORDER BY ne fonctionne pas.
Vous ne pouvez pas utiliser ORDER BY
et SELECT SINGLE
dans la même instruction
Ha! Pouvez-vous croire que je n'ai jamais remarqué ça? :-) JUSQU'À 1 RANGÉES devrait cependant produire à peu près la même chose.
Les colonnes de l'année et du mois ( GJAHR
et MONAT
) sont des colonnes numériques text (caractères de 0 à 9), mais MAX
n'accepte qu'une colonne numérique (pas de texte), vous pouvez donc utiliser CAST
pour convertir ces "textes" en nombres comme suit:
SELECT MAX( CAST( gjahr AS DEC ) * 100 + CAST( monat AS DEC ) ) AS year_monat FROM bkpf WHERE bukrs = '3001' AND concat( gjahr, monat ) <= '202001' INTO @DATA(lv_year_month).
Il a été testé dans un système ABAP 7.52 SP 1.
NB: la fonction CAST
n'accepte le type DEC
que depuis ABAP 7.50. J'utilise la table BKPF
au lieu de zfiou_percentage
car elle existe dans tous les systèmes R / 3, ECC, S / 4.
Merci Sandra. La meilleure solution.
Pourquoi multipliez-vous exactement l'année par 100?
@Sasku par 100 car Open SQL attend un nombre pour MAX
, donc le mois juin (06) de l'année 2020 serait transformé comme to_number ('2020') * 100 + to_number ('06 ')
= 202006, alors MAX
peut fonctionner.
Ah ok. Merci pour l'explication.
Qu'est-ce que vous obtenez actuellement avec votre code?
Malheureusement, ce MAX (concat (gjahr, monat)) ne fonctionne pas.
Quelle version ABAP utilisez-vous?
ABAP 7.52 SP02 sur HANA.
Comment exactement "ne fonctionne-t-il pas"? Le programme ne se compile-t-il pas, y a-t-il un message d'erreur ou la sortie ne correspond-elle pas à ce que vous attendez?