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

Bases de données Delphi Discussion :

Prochain code libre


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Prochain code libre
    Bonjour à tous,

    J'ai une table client dont la clé primaire est Alphanumérique
    Code....Nom
    1....Marcel
    2....José
    4....Alfred

    Si je fais cette procédure tout ce passe bien :

    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
    function ProchainCodeLibre(Table, Champ: String; Option: Byte): Integer;
    Begin
      result := 0;
      With ModuleDeDonnee.ADOQueryX do
      Begin
        if Option = 1 then
    //....
    //....
        end;
        if Option = 2 then
        Begin
          SQL.Clear;
          SQL.Add('SELECT Last('+Table+'.'+Champ+') AS LastDeCode FROM '+ Table);
          Try
            Try
              Open;
              Result := Fields.Fields[0].AsInteger + 1;
            Except
              MessageDlg(Application.Title + ' a généré une erreur pendant l''éxécution de : '
              +#10+#13 + SQL.Text
              +#10+#13 + 'Noter ce message et contacter le service Technique', mtError, [mbOk], 0);
            end;
          Finally
            Close;
          end;
        end;
      end;
    end;
    Mon probleme est que si la table client ressemble plutôt à çela :
    Code..........Nom
    1...............Marcel
    2...............José
    4...............Alfred
    MT.............Mathieu

    J'ai donc une erreur sur la ligne :
    Result := Fields.Fields[0].AsInteger + 1;

    forcément puisque 'MT' n'est pas numérique.

    J'aurais aimé qu'il me retourne 'MU' par exemple.

    Ma question :
    Connaissez vous un moyen simple pour trouver le prochaine code dispo ? d'un champs alohanumérique.
    Où suis-je obligé de tester les cas alpha et numérique séparer pour sortir un code ?

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    voila pourquoi les champs de types chaînes ne sont pas autorisés en temps que clé auto-incrémentales dans les SGBD en général.

    Si tu veux faire simple, tu dois te décider entre soit avec une clé uniquement avec des caractères (majuscule ou minuscule ONLY) ou encore plus simplement avec une clé entière.

    En tout les cas mixer les deux sera le plus compliqué à réaliser.

    Pour le cas de la clé chaîne, récupère le dernier caractère, convertit le ASCII et ajoute lui 1. Si le code ASCII dépasse le 'Z' alors tu dois ajouter un 'A' en fait de chaîne sinon fait passer à la lettre suivante le dernier caractère.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    à mon avis y a pas un moyen simple et prêt à l'emploi donc tu devrais faire ça manuellement mais ça ne paraît pas si compliqué. tu as l'évènement onNewRecord qui peut être intéressant dans ton cas, donc tu dois extraire le dernier caractère puis l'incrémenter après une petite conversion.

    Bonne chance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Merci pour vos commentaires, c'était pour savoir si il existait une méthode toute faite où si je devais faire par routine.

    Pour répondre à Aka
    "voila pourquoi les champs de types chaînes ne sont pas autorisés en temps que clé auto-incrémentales"
    C'est une idée reçue. Aucune base n'interdit cela. Même si je te rejoints dans le principe, il existe des cas et surtout en gestion de facture ou devis, où la création d'un client rends plus simple les liaisons interlogiciels avec des champs Alphanumérique en clé primaire.
    D'ailleur c'est mon cas, en fait ce champs ne viens pas de ma base je suis dépendant d'un logiciel, par lequel je récupère les données pour les intégrer dans mon logiciel et il se trouve que le champs Code de la table client est alphanumerique je suis donc obligé d'y passer, et cela n'ai pas si grave en soit.

    Je vais comme tu le suggère passer en ASCII pour ajouter 1, mais viens un autre problème :
    Mon champs code (imposé) est de taille 6 caractères, quand j'atteinds 'Z' il faut que je créer 'AA' puis quand j'atteinds 'AZ' alors 'BA' puis pour aller plus loin quand j'ai 'ZZ' je doit alors faire 'AAA'

    Il y a t-il un moyen simple de détecter le nombre de lettre pour eventuellement passer à 3 lettres si 'ZZ' ou rester à 2 si < à 'ZZ'

    Existe-t-il une fonctionne pour cela ?

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Attention à ne pas déformer mes propos. Aucune base n'interdit de mettre un champ de type chaîne ou autre (sauf peut-être BLOB) en tant que clé primaire mais par contre seuls certains type de colonnes peuvent recevoir une clé auto-incrémentale et généralement les champs chaîne n'y sont pas autorisé.

    Il n'existe pas de fonction toute faite pour faire cet auto-incrément pour une chaîne mais en voici une que j'ai codé, attention non-testé :

    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
    function AutoCode( LastCode: String ): String;
    var
     Cpt: Integer;
     Incrementer: Boolean;
    begin
      If LastCode = '' Then
       return LastCode = 'A';
     
      Incrementer := True;
      Cpt := Length(LastCode);
      Result := '';
     
      While Incrementer and (Cpt > 0) Do
       If Ord(LastCode[Cpt]) = 90 Then
       begin
        Result := 'A' + Result;
        Dec( Cpt );
       end
       Else
       begin
        Result := Chr( Ord(LastCode[Cpt]) + 1 ) + Result;
        Incrementer := False;
        Dec( Cpt );
       end;
     
      If Cpt > 0 Then
       Result := Copy( LastCode, 1, Cpt ) + Result
      Else If Incrementer Then
       Result := 'A' + Result;
     
    end;
    Note que cette fonction suppose que tout les caractères sont compris entre le 'A' majuscule et le 'Z' majuscule. Note aussi qu'il n'y a pas de test sur une quelconque limite de taille pour la chaîne de caractères.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/09/2011, 23h24
  2. Réponses: 4
    Dernier message: 14/12/2008, 20h13
  3. Réponses: 2
    Dernier message: 12/12/2006, 17h42
  4. MMORPG : Ryzom peut être libre (code et data)
    Par PatB38 dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 05/12/2006, 11h15
  5. Réponses: 5
    Dernier message: 10/06/2006, 11h10

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