Incrementation sur champ alphanumerique [Résolu]

pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 21 oct. 2009 à 08:31 - Dernière réponse : JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention
- 22 oct. 2009 à 12:08
Bonjour

Je voudrais incrementer sur un string est-ce possible et comment
j'ai une table paradox et je voudrais incrémenter par un bouton le champ du style : A1 A2 .... etc


Merci d'avance
Afficher la suite 

13 réponses

Répondre au sujet
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 21 oct. 2009 à 10:00
+3
Utile
Oui, c'est possible!

Voici 3 méthodes:

-Incrémentation de caractère:
  s:= 'A1';
  ...
  Inc(s[2]);


Là tu incrémentes simplement le 2° caractère de ta chaîne. Si tu utilises ça, il faut controler la valeur, car après le '9' (valeur 57), le prochain caractère est ':'. En + si tu veux passer à 10, 11 etc, il te faudra gérer chaque caractère séparément.

-Conversion en entier:
  intbuff:= StrToInt(MidStr(s, 2, Length(s)-1));
  Inc(intbuff);
  s:= 'A' + IntToStr(intbuff);


C'est pas très beau! Par contre plus de pb de changement de dizaine...tu gardes ta racine (ici 'A') et tu travailles sur le reste de la chaîne en le convertissant en entier. Dans ce cas, prévois une gestion d'exception sur la conversion.

-Chaîne formatée:
const
  ch= 'A%d';
var
  rang: Integer;
  ...
procedure TForm1.Btn1Click(Sender: TObject);
begin
  Inc(rang);
  s:= Format(ch, [rang]);
end;


Tu déclares ta chaîne en constante et une variable pour ton indice, puis tu incrémentes simplement ton indice avant de formater ta chaîne (au besoin, voir aide Delphi sur la fct Format).

Voilà, je pense qu'avec tout ça tu vas trouver ce qui te convient!!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 21 oct. 2009 à 12:35
+3
Utile
Bon, c'est pas très clair tout ça... je suppose forcément que 'datamodule2.Nom' est un Dataset, par contre je ne vois pas ce qu'est NomNDossard.
mais soit, tu veux donc stocker un numéro de dossard alphanumérique dans datamodule2.NomNDossard.Value. Il faut évidemment que tu changes son type en String (Quoi? Qui a parlé d'un type en string???):

var no:integer;
    s: String;
begin
  no:=StrToInt(edit2.text);
  with datamodule2.Nom do
    begin
      First;
      repeat
        Edit;
        //s est ta chaîne de caractère. Elle peut être constante,
        //renseignée dans un TEdit (s:=EditDossard.Text)
        //ou comme ici, prise dans l'enregistrement courant du Dataset.
        s:= VarToStr(FieldByName('NomDuChamp').Value);
        datamodule2.NomNDossard.Value:= s + IntToStr(no);
        Next;
        Inc(no);
      until Eof;
    end;
end;


Tu remarqueras au passage l'utilisation de l'instruction With, qui te permet de ne pas retaper à chaque fois 'datamodule2.Nom' et qui éclaircit le code...

Voilou!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 22 oct. 2009 à 09:44
+3
Utile
Quelle est la ligne qui plante?


Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 22 oct. 2009 à 10:24
+3
Utile
Tu es sûr(e)? Ca compile très bien chez moi...
L'erreur doit se situer ailleurs d'après moi... De quel type est NomNDossard?


Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 21 oct. 2009 à 10:44
0
Utile
Bon allez, soyons grand seigneur!!

Voici une fonction qui incrémente une chaine... Mais cette fct ne fonctionne pas dans les cas suivants:
-caractères après le numérique. La chaine doit être de la forme 'aaaaa12345'. S'il y a autre chose que des chiffres après le 1° numérique rencontré => EConvertError => Result:= chaîne vide.
-numérique mis en forme. Ex: 'gloubiboulga000123' renvoie
'gloubiboulga124'.

[code=pas]function IncrementeChaine(s: String): String;
var
i, j: Integer;
s1, s2:
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 21 oct. 2009 à 10:51
0
Utile
Ah.. Pti pb de mise en forme sur le post... je la refais!

Bon allez, soyons grand seigneur!!

Voici une fonction qui incrémente une chaine... Mais cette fct ne fonctionne pas dans les cas suivants:
-caractères après le numérique. La chaine doit être de la forme 'aaaaa12345'. S'il y a autre chose que des chiffres après le 1° numérique rencontré => EConvertError => Result:= chaîne vide.
-numérique mis en forme. Ex: 'gloubiboulga000123' renvoie
'gloubiboulga124'.

[code=pas]fun
Commenter la réponse de JeremyLecouvert
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 21 oct. 2009 à 10:54
0
Utile
A veut pô passer... tant pis, je garde ma fonction piske c'est comme ça!!
Commenter la réponse de JeremyLecouvert
pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 21 oct. 2009 à 11:21
0
Utile
Merci pour vos réponses

Mais comme je débute c'est un lourd comme code donc je vais vous détailler mon problème

j'avais déjà une boucle sur un champ Numérique qui fonctionne
var no:integer;
begin
no:=strtoint(edit2.text);
datamodule2.Nom.first;
repeat
datamodule2.Nom.Edit;
datamodule2.NomNDossard.Value:=no;
datamodule2.Nom.next;
inc(no);
until
datamodule2.Nom.Eof;

mais il me faudrait l'identique ou presque pour que je puisse inclure 3 lettres avant les chiffres.
dans ce que vous me proposez n'est pas aussi simple pour moi ou et comment intégrer le code???
il est clair que dans le code ci-dessus c'est un champ Numérique qui est utilisé mais je le transformerais en alphanumérique bien sûr.

Merci d'avance.
Commenter la réponse de pize67
pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 22 oct. 2009 à 09:03
0
Utile
Merci mais....

Petit souci problème de string et tstring
impossible de compiler
Commenter la réponse de pize67
pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 22 oct. 2009 à 09:45
0
Utile
Celle-ci

s:= VarToStr(FieldByName('NomDuChamp').Value);
Commenter la réponse de pize67
pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 22 oct. 2009 à 10:29
0
Utile
Bon j'ai repris le code et j'ai fait des essais
je ne rentrerai pas dans le détail mais voilà maintenant ce qui se passe
1 Aucune erreur de compil mais à l'execution si je ne met que des N° ça fonctionne mais avec Caractères et N° problème n'est pas une valeur entière correcte.
Commenter la réponse de pize67
pize67 7 Messages postés dimanche 19 février 2006Date d'inscription 4 avril 2010 Dernière intervention - 22 oct. 2009 à 10:38
0
Utile
Mon champ est de type chaine A(PARADOX)
Commenter la réponse de pize67
JeremyLecouvert 142 Messages postés mardi 27 novembre 2007Date d'inscription 10 mai 2010 Dernière intervention - 22 oct. 2009 à 12:08
0
Utile
si je ne met que des N° ça fonctionne mais avec Caractères et N° problème n'est pas une valeur entière correcte.

...
Evidemment que ça marche pas, si tu fais:
no:=strtoint(edit2.text);

il faut évidemment saisir un numérique dans le TEdit!!!
..D'où mon précédent post où je précise que ta variable s qui contient la chaîne que tu veux ajouter, tu la prends ailleurs (autre TEdit, constante déclarée en dur dans le prog, champ du Dataset, tiroir de la commode...)

Si tu veux saisir directement quelque chose du style 'toto84' dans edit2, je te suggère de relire mon premier post où je te donne 3 méthodes pour le faire, et + particulièrement la 2° qui correspond exactement à ce cas de figure.


Si l'envie te prend de travailler, assied-toi et attend qu'elle te passe! (vieux -et faux!- dicton corse)
Commenter la réponse de JeremyLecouvert

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.