Réinitialisation d'un champ auto incrément
Résolu
iris1984
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
solilog Messages postés 273 Date d'inscription Statut Membre Dernière intervention -
solilog Messages postés 273 Date d'inscription Statut Membre Dernière intervention -
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
S'il vous plait aidez-moi si quelqu'un a une idée
Merci
PS: la BDD utilisée est mysql
A voir également:
- Sql réinitialiser auto_increment
- Reinitialiser pc - Guide
- Reinitialiser pc sans mdp - Guide
- Réinitialiser manette ps4 - Guide
- Réinitialiser chromecast - Guide
- Reinitialiser iphone - Guide
12 réponses
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
ma function est testée, ...
Et dans ton code, il est où le SQL pour chercher le dernier record créé ?
Bonne journée.
solilog
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;
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;
Ça fait longtemps que j'ai pas fait de delphi mais tu ne peux pas faire un truc comme ça ?
Et ensuite tu remet le champ à 1 en updatant la base.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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.
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.
Bonsoir,
tu ajoute sur ta form un tQuery renommé ici qry1 avec le SQL ci dessous.
Ca devrait aller.
solilog
--
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
--
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.
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.