IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[forms9i]Concaténation données


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 83
    Par défaut [forms9i]Concaténation données
    Bonsoir,

    j'ai un champ concaténéNAME_DEPTNO_ENAME_SALAIRE_DATESYS qui change ou mis à jour en fonction des données.
    Par exemple
    - Si au début j'ai SALES_30_MARTIN_1250_06042006 pour valeur de ce champ
    cela veut dire que dans le département 30, il y a Martin avec un salaire de 1250.
    - Si j'ajoute ALLEN dans ce département
    la référence devrait être comme celui-ci SALES_30_MARTIN_ALLEN_1250_1600_07042006

    - Si j'ajoute encore WARD la référence prend son nom mais puisqu'il y a déjà un salaire de 1250,
    on n'y concatène plus le salaire de WARD, donc on y autorise pas le doublon.

    référence finale: SALES_30_MARTIN_ALLEN_WARD_1250_1600_07042006

    Comment faire dans ce cas pour faire la concaténation de ces données à chaque mis à jour?
    Merci.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    ce serait pas plus simple d'avoir un vrai modéle de données (département/salarié) et concaténer les salariés d'un département à l'affichage...

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 83
    Par défaut
    mais c'est pas ça que je voulais y arriver mais le principe.
    Je traite un projet beaucoup plus compliqué et c'est pour m'expliquer seulement que j'ai pris ces exemples.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    peu importe... il me semble que si tu as ce genre de problèmatique c'est que le modèle de données est incorrecte... et pour tout dire je vois mal comment tu peux t'en sortir

  5. #5
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut Re: [forms9i]Concaténation données
    Citation Envoyé par ramaro
    - Si j'ajoute encore WARD la référence prend son nom mais puisqu'il y a déjà un salaire de 1250,
    on n'y concatène plus le salaire de WARD, donc on y autorise pas le doublon.

    référence finale: SALES_30_MARTIN_ALLEN_WARD_1250_1600_07042006
    Gros gros problème à mon avis : comment tu sais que WARD a un salaire de 1250 ? il pourrait très bien avoir un salaire de 1600 avec cette écriture là ? Donc soit ton exemple est mal choisi, soit ton modèle est pas bon. 1 personne <-> 1 salaire.

    Un doublon ça sera plutôt 2 personnes, ou 2 * (1 personne + 1 salaire), mais 2 fois un salaire ce ne DOIT pas être considéré comme un doublon.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 83
    Par défaut
    bonsoir à tous

    je veux reformuler ma question,

    j'ai une chaine de caractères composée de plusieurs sous-chaines concatenées avec des tirets-bas(_) ma_chaine : = 'xx_xxxy_xxxi_ya'.

    je veux ajouter des nouvelles sous-chaines à ma_chaine, mais il y a des conditions pour cet ajout,

    si la sous-chaine que je veux ajouter ne figure pas dans ma_chaine, alors on peut ajouter cette sous-chaine au debut de ma_chaine.

    ne rien faire sinon

    exemple:
    on ne peut ajouter le sous-chaine 'xxxy' à ma chaine parce que 'xxxy' y est déjà.

    par contre on peut ajouter 'aaab' et dans ce cas ma_chaine devient ' aaab_
    xx_xxxy_xxxi_ya'

    Comment doit-je proceder?

    Merci.

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if instr (machaine, ss_chaine) = 0
       and (substr (machaine, instr (machaine, ss_chaine) - 1, 1) = '_'
            or substr (machaine, instr (machaine, ss_chaine) +length(ss_chaine), 1) = '_') then
       machaine := ss_chaine || ma_chaine;
    end if;

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') <> 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;

  9. #9
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par McM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') <> 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;
    Cela ne fonctionne pas dans tous les cas : avec l'exemple donné si la sous-chaine est xx ou ya

  10. #10
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par plaineR
    Citation Envoyé par McM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') <> 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;
    Cela ne fonctionne pas dans tous les cas : avec l'exemple donné si la sous-chaine est xx ou ya
    Pardon, on a faux depuis le début (c'est ta faute PlaineR) faut tester le = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') = 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;
    Et ça marche parfaitement vu que je concatène '_' avant et après les chaines.

  11. #11
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 83
    Par défaut
    Je sais pas si cet autre explication vous aidera.
    Voici donc mon code au début, à chaque fois que je selectionne une ligne par des cases à cocher(form), il récupère les valeurs de champ1 et champs 2 et
    je recupère à la fin MA_CHAINE(les chaines CHAINE1-2-3 sont prédéfinies).

    [
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    FUNCTION MA_CHAINE RETURN VARCHAR2 IS
     
    	 string_nom VARCHAR2(250) := ' '; --champ
    	 string_nom1 VARCHAR2(100); --champ1
    	 string_nom2 VARCHAR2(100); --champ2
    BEGIN
      GO_BLOCK('liste');
      First_Record;
      LOOP
        IF :liste.check <> 0 or :liste.check is null
        THEN
          --champ1
     
          IF string_nom1 IS NULL
          THEN 
            string_nom1 := :liste.valeur_champ1;
          ELSE
            IF instr(  string_nom1,nvl(:liste.valeur_champ1,'') )= 0
            THEN
              string_nom1 :=   string_nom1 ||'_'||:liste.valeur_champ1;
            ELSE
              string_nom1 :=   string_nom1 ;
    	END IF;
          END IF;
     
    	 --champ2
     
          IF   string_nom2 IS NULL
          THEN 
            string_nom2 := :liste.valeur_champ2;
          ELSE
            IF instr(  string_nom2,nvl(:liste.valeur_champ2,'') )= 0
            THEN
              string_nom2 :=   string_nom2 ||'_'||:liste.valeur_champ2;
    	ELSE
              string_nom2 :=   string_nom2 ;
    	END IF;
          END IF;
    	  	--
        END IF;
        EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
        Next_Record;
      END LOOP;
      IF string_nom1 IS NOT NULL
      THEN
        string_nom1 := '_'||  string_nom1;
      END IF;
      IF   string_nom2 is not null 
      THEN
        string_nom2 := '_'||  string_nom2;
      END IF;
      string_nom := 'CHAINE1'||  string_nom1||  string_nom2||'_'||'CHAINE2'||'_'||'CHAINE3';
      First_Record;
      RETURN string_nom;
    END;
    Mais là c'est la création au début, maintenant MA_CHAINE existe avec les champs concaténées, et je voudrais recupérer des autres valeurs pour CHAMP1 et CHAMP2 cette fois-ci en ajout, donc MA_CHAINE doit être mise à jour en fonction des champs que je vais selectionner.
    S'il existe déjà dans MA_CHAINE avec les valeur_champ1(string_nom1) et valeur_champ2(string_nom2),
    ne rien faire
    sinon
    j'en rajoute.

    Merci

  12. #12
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par McM
    Citation Envoyé par plaineR
    Citation Envoyé par McM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') <> 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;
    Cela ne fonctionne pas dans tous les cas : avec l'exemple donné si la sous-chaine est xx ou ya
    Pardon, on a faux depuis le début (c'est ta faute PlaineR) faut tester le = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF INSTR('_' || machaine || '_', '_' || ss_chaine || '_') = 0
    THEN 
       machaine := ss_chaine || '_' || ma_chaine;
    END IF;
    Et ça marche parfaitement vu que je concatène '_' avant et après les chaines.


    [EDIT] J'ai corrigé mon message initial pour qu'il ne porte pas à confusion. [/EDIT]

  13. #13
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ramaro : C'est quoi le but de cette fonction ?
    Car parcourir tout le bloc à chaque fois que tu sélectionnes une ligne, c'est pas top.

    De plus, ton test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF INSTR(  string_nom2,NVL(:liste.valeur_champ2,'') )= 0
    n'est pas blindé :
    Si tu as string_nom2 = 'XXX_AAA' et que champ2 = 'XX', tu le mets pas à jour.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/11/2006, 16h34
  2. Concaténation ne donne pas le résultat attendu
    Par artotal dans le forum Langage
    Réponses: 4
    Dernier message: 12/05/2006, 01h37
  3. comment concaténer les enregistrements d'un champ donné ???
    Par c_moi_c_moi dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 23/03/2006, 16h11
  4. Réponses: 9
    Dernier message: 23/08/2005, 16h29
  5. Réponses: 2
    Dernier message: 14/05/2004, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo