Incrémenter un numéro de série

Résolu
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010 - 4 févr. 2008 à 17:21
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010 - 7 févr. 2008 à 08:21
   Salut tout le monde, j'ai fait du DELPHI dans mon jeune temps mais je ne sais pas comment peut-on incrémenter un numéro de série contenant des lettres et des chiffres. Je veux juste incrémenter les chiffres...les lettres ne changent pas..

Mon numéro de série est du type CD20080001
et je voudrais incrémenté du type
CD20080002
CD20080003
CD20080004
**********
**********
CD20080101

etc....

   En effet je veux juste incrémenter les quatres derniers chiffres en rouge...
Merci de me laisser un petit message ou cas ou vous avez une solution...
a+

11 réponses

dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
5 févr. 2008 à 09:52
bonjour,
function Copy(S;Index,Count:Integer):string;

Dom
3
BernieNoel68 Messages postés 92 Date d'inscription vendredi 12 octobre 2007 Statut Membre Dernière intervention 20 novembre 2009 1
4 févr. 2008 à 17:41
En imaginant que nombre soit ta variable de comptage...

-------------------------------------------------------------------
var nombre : integer;

NumSerie := 'CD2008' + FormatFloat("0000", nombre) ;
nombre := nombre + 1 ;

-------------------------------------------------------------------
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 févr. 2008 à 19:31
type
  pSerialNum = ^TSerialNum;
  TSerialNum = record
    A : char;
    B : char;
    C : word;
    D : word;
  end;
  TSerialString = string[10];

function SerialMake(const cA, cB: char; const wC, wD: word): TSerialNum;
begin
  result.A := cA;
  result.B := cB;
  result.C := wC;
  result.D := wD;
end;

procedure SerialIncD(var Serial: TSerialNum; const i: word = 1);
begin
  inc(Serial.D, i);
end;

function SerialToStr(const Serial: TSerialNum): TSerialString;
begin
  with Serial do
    result := A + B + format('%.4d%4d',[C,D]);
end;

function StrToSerial(const SerialStr : TSerialString): TSerialNum;
begin
  result.A := SerialStr[1];
  result.B := SerialStr[2];

  result.C := word(IntToStr(
SerialStr[3]+
SerialStr[4]+
SerialStr[5]+
SerialStr[6]
)));

  result.D := word(IntToStr(
SerialStr[7]+
SerialStr[8]+
SerialStr[9]+
SerialStr[10]
)));


end;

function CheckSerial(const Serial: TSerialNum): boolean;
begin
  with Serial do    result :(A 'C') and
              (B = 'D') and
              (C = 2008) and
              ((D >= 1) and (D <= 9999));
end;

 

<hr size="2" width="100%" />
http://deefaze.gnomz.com
0
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010
5 févr. 2008 à 08:32
J'ai omis de préciser que mon dernier numéro de série était dans une base de données donc cela ressort de ma requete de la forme :

id := CD20080003

donc comment faire pour séparé "CD2008" de "0003" ?????

ensuite je ferai "0003+1".... et le tour est joué mais personne ne connais une fonction pour couper une chaine en deux la ou l'on veut????
0

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

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
5 févr. 2008 à 17:37
Attention aux accès concurrentiels...

cantador
0
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010
6 févr. 2008 à 08:42
pourquoi attention aux acces concurrentiels???
moi sa marche c'est quoi le souci???
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 févr. 2008 à 15:03
cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 févr. 2008 à 15:04
Trois clients en réseaux déclenchent en même temps une insertion.
Examine les résultats..
cantador
0
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010
6 févr. 2008 à 16:30
Oui je vois ce que tu veux dire le numéro de commande sera le même pour les trois commande...
C'est vrai que sa peut poser des problèmes, mais dans mon cas c'est en général le même utilisateur qui entrera les commandes donc pas possibilité de doublons...

Mais par curiosité et pour ma culture générale, j'aimerai bien connaitre la facon de gérer ce genre de probleme...
Si tu peux me poster un message concernant ceci sa serait sympa...

merci d'avance cantador
a+
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
6 févr. 2008 à 17:53
Si tu as un seul utilisateur, le problème est réglé..
et la situation est durable alors même pas besoin de serveur..tu colles le programme et la base le tout sur un seul poste.
Le Multi-Utilisateurs en réseau, c'est bcp + chaud..
tout dépend aussi du type de SGBD...
Il y a tellement de cas de figures possibles qu'il est difficile de tout décrire..


Mais juste par exemple dans ton cas :


En principe, on gérer les clés primaires par des champs auto-incrémentals
du coup, on se débarrasse de la gestion du + 1 et aussi des conflits de partage
(ce qui n'est pas rien)


C'est la machine qui fait tout.


Mais évidemement cela n'empêche nullement d'afficher un champ calculé qui
pourrait être une concaténation du style 'CD2008' + IntToStr(NumIncrement).


Mais tu as choisi de gérer une clé composite et dans le cas d'une mise en réseau.
il faudra attendre la fin de chaque validation avant d'en attaquer une autre.
Autrement dit il faudra faire une boucle d'attente qu'on peut traiter à la manière rude:

  ok := 0;
  cree := false;
  while True do
  begin
    try
      DataModule.Query1.Post;
      cree := true;
      break;
    except
      if ok = 3 then
      begin
        showmessage('Vous ne pouvez pas créer de fiche pour l'' instant, essayez plus tard.');
        DataModule.Query1.Cancel;
        break;
      end;
      ok := ok + 1;
    end;
  end;

@+
cantador
0
76julien Messages postés 58 Date d'inscription lundi 14 janvier 2008 Statut Membre Dernière intervention 4 juin 2010
7 févr. 2008 à 08:21
Salut cantador, 
   Merci pour l'info, je ne vais pas me servir de sa de suite mais je conserve la source pour plus tard (sa peut toujours servir ...) !!
   Encore merci !!
   @+ pour un nouveau pbm qui sait !!
0
Rejoignez-nous