Réinitialisation d'un champ auto incrément

Résolu
iris1984 Messages postés 5 Statut Membre -  
solilog Messages postés 273 Statut Membre -
Bonjour Je suis entraine de réaliser une application sous delphi et j'ai rencontré un problème qui est le suivant: à chaque fois que j'ajoute un enregistrement je dois incrémenter un champ comme suit: numéro auto incrément slash année en cours exemple: 11/2014 chose qui est faite mais à chaque fois que l'année change je veux que le numéro se réinitialise puis s'incrémente.
S'il vous plait aidez-moi si quelqu'un a une idée
Merci
PS: la BDD utilisée est mysql

12 réponses

  1. solilog Messages postés 273 Statut Membre 2
     
    Salut,
    ma function est testée, ...
    Et dans ton code, il est où le SQL pour chercher le dernier record créé ?
    Bonne journée.
    solilog
    1
  2. CptRomaiin Messages postés 334 Statut Membre 58
     
    Salut,
    Tu peux nous montrer le morceau de code que tu utilises ?
    0
  3. iris1984 Messages postés 5 Statut Membre
     
    voici mon code:
    procedure TForm2.Button1Click(Sender: TObject);

    begin
    ADOTable1.FieldByName('Nummalade').Value:=inttostr(ADOTable1.RecordCount+1)+'/'+FormatDatetime('YYYY',now);
    ADOTable1.FieldByName('Datedentree').Value:=strtodate(formatdatetime('DD/MM/YYYY',now));

    end;
    0
  4. CptRomaiin Messages postés 334 Statut Membre 58
     
    Ça fait longtemps que j'ai pas fait de delphi mais tu ne peux pas faire un truc comme ça ?

    valeur = ADOTable1.RecordCount+1;
    if valeur > 12 then valeur = 1;
    ADOTable1.FieldByName('Nummalade').Value:=inttostr(valeur)+'/'+FormatDatetime('YYYY',now); 
    

    Et ensuite tu remet le champ à 1 en updatant la base.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. iris1984 Messages postés 5 Statut Membre
     
    salut
    j'ai tout essayé et ça marche toujour pas; y'a pas une autre solution pour que le numéro se réinitialise à chaque changement de l'année (condition sur FormatDatetime('YYYY',now))
    merci
    0
  7. solilog Messages postés 273 Statut Membre 2
     
    Salut,
    avant de te répondre (et ca va peut-être t'aider a réfléchir et trouver la solution), 3 questions :
    - le champs a construire est-il une clé dans la table ?
    - est-il possible de mettre l'année en premier ex 2014/25
    - peut-on construire le champs avec des 0 dans le nombre ex: 2014/0025, 2014/0026, pour avoir une longueur fixe ?

    Ca t'aide un peu ?

    solilog.
    0
  8. iris1984 Messages postés 5 Statut Membre
     
    salut,

    Oui pour les 3 questions et c'est une clé primaire

    iris.
    0
  9. solilog Messages postés 273 Statut Membre 2
     
    Bonsoir,
    tu ajoute sur ta form un tQuery renommé ici qry1 avec le SQL ci dessous.

    // retourne une clé au format YYYY/000000
    // composée de w_annee / w_num
    function TForm1.get_NewKey : string;
    var n_annee : string; // nouvelle annee
    a_Num, // ancien num
    Err : integer; // Si ancienne cle invalide
    a_Key : variant; // ancienne cle (complete)
    // (variant car peut être null si table vide)
    // utilise qry1 (SQL) 'SELECT MAX(JRNOPE) FROM OPE'
    begin
    n_annee := formatdatetime('YYYY', now);
    qry1.open; // cherche cle precedente
    a_Key := qry1.fields[0].value;
    qry1.close;
    if (a_Key = NULL) // NULL table vide
    or (copy(a_Key, 1, 4)<>n_annee) // Nlle annee ou clé invalide
    then a_Num := 0
    else begin
    val(copy(a_Key, 6, 6), a_Num, Err); // cherche num precedent
    // mieux que strtoint, evite try
    if Err<>0 // si Err cle invalide
    then a_Num := 0;
    end;
    result := n_annee + format('/%6.6d', [a_Num+1]);
    end;

    Ca devrait aller.
    solilog
    --
    0
  10. solilog Messages postés 273 Statut Membre 2
     
    Salut Iris1984,
    Tu l'as ta réponse, l'as-tu testée ?
    solilog
    0
  11. iris1984
     
    salut solilog,

    Oui j'ai testé ton code et j'ai fais quelques modification dessus, mais ça marche toujour pas.
    le problème maintenant est que le numéro ne s'incrémente pas; il est toujour initialisé à 1 suivi de l'année choisi (2014/000001; 2015/000001; 2016/000001;...)

    voici le code:

    procedure TForm2.Button1Click(Sender: TObject);

    var n_annee,result : string;

    a_Num,Err : integer;
    a_Key : variant;

    begin
    ADOTable1.Append;
    n_annee := formatdatetime('YYYY', now);

    a_Key := ADOTable1.fields[0].value;

    if (a_Key = NULL)or (copy(a_Key, 1, 4)<>n_annee)then
    a_Num := 0
    else
    begin
    val(copy(a_Key, 6, 6), a_Num, Err);

    if Err<>0 then
    a_Num := 0;
    end;

    result := n_annee + format('/%6.6d', [a_Num+1]);
    ADOTable1.FieldValues['Numero']:=result;

    end;

    cordialement,

    p.s: J'étais vraiment malade ces dérniers jours c'est pour cela que je ne t'es pas répondu très tôt.
    0
  12. iris1984 Messages postés 5 Statut Membre
     
    salut,

    Merci beaucoup solilog ça a marché

    Iris
    0
  13. solilog Messages postés 273 Statut Membre 2
     
    Salut,
    Alors tu peux fermer ton post.
    solilog
    0