Incrementation sur champ alphanumerique

Résolu
pize67 Messages postés 7 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 4 avril 2010 - 21 oct. 2009 à 08:31
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 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

13 réponses

JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
21 oct. 2009 à 10:00
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!!
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
21 oct. 2009 à 12:35
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!
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
22 oct. 2009 à 09:44
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)
3
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
22 oct. 2009 à 10:24
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)
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
21 oct. 2009 à 10:44
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:
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
21 oct. 2009 à 10:51
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
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
21 oct. 2009 à 10:54
A veut pô passer... tant pis, je garde ma fonction piske c'est comme ça!!
0
pize67 Messages postés 7 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 4 avril 2010
21 oct. 2009 à 11:21
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.
0
pize67 Messages postés 7 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 4 avril 2010
22 oct. 2009 à 09:03
Merci mais....

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

s:= VarToStr(FieldByName('NomDuChamp').Value);
0
pize67 Messages postés 7 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 4 avril 2010
22 oct. 2009 à 10:29
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.
0
pize67 Messages postés 7 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 4 avril 2010
22 oct. 2009 à 10:38
Mon champ est de type chaine A(PARADOX)
0
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
22 oct. 2009 à 12:08
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)
0
Rejoignez-nous