Réinitialisation d'un champ auto incrément

Résolu/Fermé
iris1984 Messages postés 5 Date d'inscription jeudi 21 août 2014 Statut Membre Dernière intervention 25 septembre 2014 - 21 août 2014 à 11:09
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 25 sept. 2014 à 17:30
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
A voir également:

12 réponses

solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 2
23 sept. 2014 à 05:18
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
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 58
21 août 2014 à 12:20
Salut,
Tu peux nous montrer le morceau de code que tu utilises ?
0
iris1984 Messages postés 5 Date d'inscription jeudi 21 août 2014 Statut Membre Dernière intervention 25 septembre 2014
21 août 2014 à 12:35
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
CptRomaiin Messages postés 315 Date d'inscription mercredi 23 octobre 2013 Statut Membre Dernière intervention 28 avril 2016 58
Modifié par CptRomaiin le 21/08/2014 à 12: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.
0

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

Posez votre question
iris1984 Messages postés 5 Date d'inscription jeudi 21 août 2014 Statut Membre Dernière intervention 25 septembre 2014
24 août 2014 à 09:59
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
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 2
8 sept. 2014 à 13:44
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
iris1984 Messages postés 5 Date d'inscription jeudi 21 août 2014 Statut Membre Dernière intervention 25 septembre 2014
Modifié par iris1984 le 8/09/2014 à 16:19
salut,

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

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

Merci beaucoup solilog ça a marché

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