1
votes

Comment faire une recherche avec plusieurs champs de saisie non obligatoires?

Je voudrais demander comment faire un filtrage de recherche de base dans un écran de sélection qui a plusieurs champs d'entrée qui ne sont pas obligatoires.

J'ai essayé de le faire en utilisant plusieurs instructions IF suivies de clauses WHERE qui résout mon problème actuel mais ce n'est pas tout à fait correct, si je travaille avec seulement quelques entrées (2 pour le moment, 'ID' et 'Number'), le code n'est pas trop long, mais s'il dépasse 10 ou plus faites-le de cette façon

Ce que j'ai essayé jusqu'à présent était à peu près comme ceci:

IF lv_id IS INITIAL and lv_nr IS INITIAL.

     SELECT * from DBase INTO TABLE Local_Table.

ELSEIF lv_id IS NOT INITIAL AND lv_nr IS INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE ID = lv_nr.

ELSEIF lv_id IS INITIAL AND lv_nr IS NOT INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE Number = lv_nr.

ELSEIF lv_id IS NOT INITIAL AND lv_nr IS NOT INITIAL.

     SELECT * from DBase INTO TABLE Local_Table WHERE ID = lv_id AND Number = lv_nr.

Le résultat attendu est que la recherche soit exécutée correctement en n'ayant pas input ou plusieurs entrées non obligatoires, sans avoir à écrire un code très long au cas où le nombre d'entrées serait élevé.


0 commentaires

3 Réponses :


0
votes

Qu'en est-il de cette approche avec des conditions where concaténées?

DATA:
  lv_where TYPE string.


IF lv_id IS NOT INITIAL.
    CONCATENATE ' AND ID' space '=' space '"' lv_id '"' INTO lv_where.
ENDIF. 

IF lv_nr IS NOT INITIAL.
    CONCATENATE ' AND Number' space '=' space '"' lv_nr '"' INTO lv_where.
ENDIF.

IF lv_where IS NOT INITIAL.
    SHIFT lv_where By 5 PLACES. " to remove leading _AND_ (
ENDIF.

SELECT * from DBase INTO TABLE Local_Table WHERE (lv_where).


3 commentaires

Je suis désolé de ne pas comprendre comment cette approche réduirait le code si j'avais plus de 10 champs de saisie?


@Mick vous n'avez pas besoin d'avoir toutes les variantes de combinaisons entre vos fichiers d'entrée. Vous ne pouvez pas faire de code court car dans n'importe quel scénario, vous devez écrire une requête SQL avec plus de 10 conditions dans le pire des cas et vous devez d'une manière ou d'une autre définir cette requête complexe. Si vous regardez les autres réponses, vous verrez que dans tous les cas, vous irez avec plusieurs IF ou avec une clause Where qui contient toutes vos colonnes avec SELECT-OPTIONS définies par exemple


@Mick, soutiens Sergey. La requête dynamique peut être votre seule option si vous avez des critères de recherche contradictoires, qui se croisent ou s'influencent mutuellement. Les Seltabs avec instructions IN conviennent à la plupart des cas, mais pas à tous



3
votes

vous pouvez utiliser l'opérateur IN dans votre clause WHERE lorsque vous avez plusieurs conditions.

Vous devez d'abord définir une table de sélection pour chaque paramètre et les remplir ou les laisser vides.

select * from dbaste into table local_table where id in gt_selopt
                                        and number in gt_selopt_2 .

Vous devez le faire pour chaque paramètre que vous souhaitez interroger. Et votre requête ressemblerait à ceci

types: begin of myselopt ,
       sign type char1 ,
       option type char2 ,
       low type ... (depends on the type you want select)
       high type ... ,
    end of myselopt .

types : t_selopt type table of myselopt .   

data: gt_selopt type t_selopt ,
      gt_selopt_2 type t_selopt_2 . #needs to be defined first 

if lv_id is not initial .
    insert value #( sign = 'I' option = 'EQ' low = lv_id ) into table gt_selopt .
endif . 

if lv_nr is not initial .
    insert value #( sign = 'I' option = 'EQ' low = lv_nr ) into table gt_selopt_2 .
endif .


1 commentaires

Cela pourrait être un peu plus court avec DATA range_ids LIKE RANGE OF lv_id. range_ids = COND # (WHEN lv_id N'EST PAS INITIAL ALORS VALUE # ((sign = 'I' option = 'EQ' low = lv_id)).



1
votes

Vous pouvez définir vos champs de saisie comme SELECT-OPTIONS (avec l'option NO INTERVALS NO-EXTENSION optionnelle pour imiter l'aspect de PARAMETERS ). Ensuite, utilisez simplement l'opérateur IN dans votre clause WHERE :

REPORT.

DATA: your_ztable TYPE your_ztable.

SELECT-OPTIONS: s_id FOR your_ztable-id     NO INTERVALS NO-EXTENSION,
                s_nr FOR your_ztable-number NO INTERVALS NO-EXTENSION.

AT SELECTION-SCREEN.

  SELECT * FROM your_ztable
    WHERE id   IN @s_id
    AND number IN @s_nr
    INTO TABLE @DATA(local_table).


0 commentaires