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

 Delphi Discussion :

Tronquer un String


Sujet :

Delphi

  1. #1
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut Tronquer un String
    Bonjour

    J'ai un string de la forme suivante

    BEGIN
    INSERT INTO CONTRAT
    (
    COD
    )
    VALUES
    (:XOLD.COD)
    );
    END TRG_CONTRAT;
    J'aimerai suprimmer la derniere ligne de façon à avoir ce-ci

    BEGIN
    INSERT INTO CONTRAT
    (
    COD
    )
    VALUES
    (:XOLD.COD)
    );
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    suivant quel critère est-ce "la dernière ligne" ? est-ce lié au CR/LF ou est-ce plus généralement un problème de syntaxe ?

    un moyen simple et de placer la chaine dans un TStringList et de supprimer la ligne de plus haut index.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    cette ligne est récupéré depuis un champs dans une vue oracle, je récupère le contenu d'un trigger et je refais une 2 eme dont je garde la truction de l'ancien, pour ce ci j'ai pas besoin de cette derniere ligne.
    Merci pour cette solution

  4. #4
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Le problème est comme la décomposer ?

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Paul t'as donné la réponse :

    un moyen simple et de placer la chaine dans un TStringList et de supprimer la ligne de plus haut index.
    "It's more fun to compute !"

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Autre possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
    st1 : string ;
    begin
    St1 := 'INSERT INTO CONTRAT (COD) VALUES (:XOLD.COD)  ); END TRG_CONTRAT;' ;
    st1 := StringReplace (st1,'END TRG_CONTRAT;','',[rfIgnoreCase]) ;

  7. #7
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Encore autre moyen, mais spécifiquement pointé sur dernière ligne :

    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
    procedure TForm1.Button2Click(Sender: TObject);
    var
      SL: TStringList;
      i: Integer;
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile('test.txt');
        Memo1.Text := SL.Text;
        i := Memo1.Lines.Count;
        if SL.Count > 1 then
        ShowMessage('Nombre de lignes contenues : '+IntToStr(i));
        SL.Delete(i -1);
        Memo1.Text := SL.Text; // Contrôle/vérif
      finally
        SL.Free;
      end;
    end;
    Edit : la même, mais avec vérification de présence exacte du libellé de cette ligne
    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
    procedure TForm1.Button2Click(Sender: TObject);
    var
      SL: TStringList;
      i: Integer;
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile('test.txt');
        Memo1.Text := SL.Text;
        i := Memo1.Lines.Count;
        if SL.Count > 1 then
        ShowMessage('Nombre de lignes contenues : '+IntToStr(i));
        if Pos('END TRG_CONTRAT;', SL[i - 1]) > 0 then
        SL.Delete(i -1);
        Memo1.Text := SL.Text; // Contrôle/vérif
      finally
        SL.Free;
      end;
    end;

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Vais mettre moi aussi mon grain de sel :p

    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
     
    var
      lst : TStringList;
      i : integer;
    begin
      lst := TStringList.create;
      try
        lst.LoadFromFile('test.txt');
        i := lst.IndexOf('END TRG_CONTRAT;');
        if i <> -1 then
          lst.Delete(i);
      finally
        lst.Free;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Vais mettre moi aussi mon grain de sel :p [...]
    Fallait pas commencer !

    Méthode plus dure que pure :

    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
    var
      SL: TStringList;
      i: Integer;
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile('test.txt');
        Memo1.Text := SL.Text;
        i := Memo1.Lines.Count;
        if SL.Count > 1 then
        ShowMessage('Nombre de lignes contenues avant : '+IntToStr(i));
        SL[i - 1] := AnsiReplaceText(SL[i - 1], AnsiLowerCase('END TRG_CONTRAT;'), '');
        Memo1.Text := SL.Text; // Contrôle/vérif
      finally
        SL.Free;
      end;
    end;

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Attention, j'ai déjà écrit un logiciel de comparaison/migration de structures de base de données. Et je peux dire que le problème peut être un rien plus complexe que supprimer la dernière ligne.

    Par exemple imaginons que le trigger ait été créé avec le script suivant :
    Code sql : 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
     
    CREATE or replace trigger  TRG_CONTRAT
      after update on MATABLE
      for each row
    BEGIN
    INSERT INTO CONTRAT
    (
    COD
    )
    VALUES
    (:XOLD.COD)
    );
    END TRG_CONTRAT;  
     
     
    -- petit commentaire de test !
    /

    Lorsque tu interroges la vue USER_TRIGGERS, le champ TRIGGER_BODY contient toute la fin du script qui a servi à créer le trigger, donc y compris le commentaire après le END TRG_CONTRAT, c'est à dire tout jusqu'au "/".

    Ici j'ai mis un commentaire à la fin pour que ce soit parlant, mais le grand classique ce sont les lignes vides après le dernier ";".
    La dernière ligne du trigger, ce n'est pas forcément le END...

  11. #11
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Merci
    c'est pour ce la que j'ai fais ce-çi

    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
    Function trait_trigger_Body(chaine : string ):string;    //  dernier End dans un Trigger
    var
      icmp : integer;
      gbl : string ;
    begin
      chaine := trim(chaine);
        For icmp := 0 to length(chaine)  do
        begin
          if chaine[icmp]+ chaine[icmp+1]+ chaine[icmp+2] = 'END' then
          Begin
            gbl := copy(chaine,0,icmp-1);
          end;
        end;
      result := gbl;
     
    end;

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Version plus courte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function trait_trigger_Body(chaine : string ):string;    //  dernier End dans un Trigger
    var
      icmp : integer;
      gbl : string ;
    begin
      chaine := trim(chaine);
      icmp  := Pos('END',chaine);
      if icmp > 1 then
        gbl := copy(chaine,1,icmp-1);
      result := gbl;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  13. #13
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    ne marche pas dans ce cas

    declare endi varchar2(20);

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Quelle solution ne fonctionne pas ???
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  15. #15
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Version plus courte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function trait_trigger_Body(chaine : string ):string;    //  dernier End dans un Trigger
    var
      icmp : integer;
      gbl : string ;
    begin
      chaine := trim(chaine);
      icmp  := Pos('END',chaine);
      if icmp > 1 then
        gbl := copy(chaine,1,icmp-1);
      result := gbl;
    end;
    ça retourne la premiere occurence de 'END', dans notre cas on a besoin de la derniere.

    Si on un trigger comme ce ci on n'aura pas la totalité

    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
    CREATE OR REPLACE TRIGGER TRG_PERSONNE
    AFTER UPDATE
    ON PERSONNE
    REFERENCING OLD AS ENDI  NEW AS XNEW 
    FOR EACH ROW
    
    
    
    BEGIN
          UPDATE DOSSIER
    			SET DOSS_PERS_NOM =: ENDI.PERS_NOM,
          WHERE DOSS_PERS_NO =: ENDI.PERS_NO,.
        
    END TRG_PERSONNE;
    On aura ce-ci

    CREATE OR REPLACE TRIGGER TRG_PERSONNE
    AFTER UPDATE
    ON PERSONNE
    REFERENCING OLD AS ENDI NEW AS XNEW
    FOR EACH ROW



    BEGIN
    UPDATE DOSSIER
    SET DOSS_PERS_NOM =: END

  16. #16
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Et un petit grain de sel de plus

    Si l'on veut supprimer le dernier END du trigger, il serait peut être bon de savoir OU il est dans la chaine. Or en partant du debut c'est beaucoup plus dur qu'en partant de la fin de la chaine. Une petite boucle se basant sur la longueur totale de la chaine à lauqelle on enlève une unité et ou on teste la présence de 'END' me semble quelque chose d'intéressant. Lorque que tu auras trouvé ton END tu auras le longueur restante.

    Voila un petit code qui recherche (en marche AVANT) la première occurence d'une chaine de caractère.

    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
    function TFonction.At(xZone, xCaractere : string) : integer;
    var xLongueur, xi, xPosition : integer;
        xTemp : string;
    begin
       xLongueur := Strlen(pChar(xZone));
       xPosition := 0;
       for xi := 1 to xLongueur do
          begin
             xTemp := LeftStr(xZone,xi);
             if RightStr(xTemp,1) = xCaractere then
                begin
                   xPosition := xi;
                   break;
                end;
          end;
       Result := xPosition;
    end;
    Tu changes le sens du FOR de to en downto et à mon avis tu vas trouver ton END
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  17. #17
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Ok Merci

    Celle-ci marche aussi

    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
    Function trait_trigger_Body(chaine : string ):string;    //  dernier End dans un Trigger
    var
      icmp : integer;
      gbl : string ;
    begin
      chaine := trim(chaine);
        For icmp := 0 to length(chaine)  do
        begin
          if chaine[icmp]+ chaine[icmp+1]+ chaine[icmp+2] = 'END' then
          Begin
            gbl := copy(chaine,0,icmp-1);
          end;
        end;
      result := gbl;
     
    end;

  18. #18
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Parfait si tu as une solution
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  19. #19
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    bizarre le comportement, vu qu'il y a un ENDI avant, pourquoi ce n'est pas sur celui la que l'effacement débute ?
    Si tu es sûr qu'il n'y aura toujours qu'un seul END [Nom de la procédure] à la fin et qu'il n'y aura pas d'autres END.
    Alors fait comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function trait_trigger_Body(chaine : string ):string;    //  dernier End dans un Trigger
    var
      icmp : integer;
      gbl : string ;
    begin
      chaine := trim(chaine);
      icmp  := Pos('END ',chaine); // un espace en plus
      if icmp > 1 then
        gbl := copy(chaine,1,icmp-1);
      result := gbl;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  20. #20
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Justement

    Il ne faut qu'elle pointe sur le dernier End seulement
    Car on pourra avoir des champs dans une table contenant end aussi "WEEKEND" par exemple et la ça plante

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tronquer une String
    Par NFHnv dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 20/12/2012, 17h44
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 15h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 10h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 13h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 16h23

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