Réinitialisation d'un champ auto incrément [Résolu/Fermé]

Signaler
Messages postés
5
Date d'inscription
jeudi 21 août 2014
Statut
Membre
Dernière intervention
25 septembre 2014
-
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
-
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

Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
315
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
28 avril 2016
53
Salut,
Tu peux nous montrer le morceau de code que tu utilises ?
Messages postés
5
Date d'inscription
jeudi 21 août 2014
Statut
Membre
Dernière intervention
25 septembre 2014

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;
Messages postés
315
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
28 avril 2016
53
Ç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.
Messages postés
5
Date d'inscription
jeudi 21 août 2014
Statut
Membre
Dernière intervention
25 septembre 2014

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
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
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.
Messages postés
5
Date d'inscription
jeudi 21 août 2014
Statut
Membre
Dernière intervention
25 septembre 2014

salut,

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

iris.
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
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
--
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
2
Salut Iris1984,
Tu l'as ta réponse, l'as-tu testée ?
solilog
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.
Messages postés
5
Date d'inscription
jeudi 21 août 2014
Statut
Membre
Dernière intervention
25 septembre 2014

salut,

Merci beaucoup solilog ça a marché

Iris
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
2
Salut,
Alors tu peux fermer ton post.
solilog