Comment supprimer une donnée dans un fichier sequentiel

roironm - 6 oct. 2012 à 10:09
 roironm - 8 oct. 2012 à 13:28
Hello à tous,

J'aimerai supprimer un enregistrment dans un fichier seq, qqun connait la méthode pour réalisé cette action.

Merci

4 réponses

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
6 oct. 2012 à 13:03
Salut,

tu peux lire et stocker tes enregistrements dans un tableau dynamique, te positionner dans ce tableau sur l'index de l'enregistrement à supprimer, décaler les enregistrements qui suivent vers l'index inférieur, régler la longueur du tableau dynamique à Longueur - 1, puis écrire les enregistrements stockés dans le tableau dans le fichier en utilisant Rewrite.
Ça a l'air un peu complexe, mais avec un peu de méthode, ça me parait être la meilleure solution.

Bon courage.
0
Merci korgis pour ta réponse.

Cependant je n'ai pas utilisé de tableau mais seulement un deuxième fichier seq.

il me sert aussi pour les modifications donc c'est pratique.

voici le code de suppression
procedure supprimer(nom : String); {supprimer l'employer du fichier sequ}
var
  fOld, fNew : TEmpFich;
  emp : TEmploye;
begin
  AssignFile(fOld, fichierOld);
  if not FileExists(fichierOld) then Exit;
  Reset(fOld);
  //création ou utilisation de fNew qui stock les éléments non supprimés
  AssignFile(fNew,fichierNew);
  if FileExists(fichierNew) then
    Reset(fNew)
  else
    Rewrite(fNew);
  Seek(fNew,0);
  Truncate(fNew);
  Seek(fOld,0);
  while not Eof(fOld) do
    begin
       //recherche de l'élément à supprimé
       Read(fOld, emp);
       if not(emp.Nom = nom) then
         {ecriture des élément non supprimé dans le fNew}
         begin
           Write(fNew, emp);
           //ShowMessage(affEmployer(emp) + emp.Prenom + emp.Salaire + ' est copier dans le nouveau fichier');
         end;{if}
  end;{while}

  {ecraser les infos de fOld avec les infos de fNew}
  Rewrite(fOld);
  Seek(fOld,0);
  Truncate(fOld);
  Seek(fNew,0);
  while not Eof(fNew) do
    begin
     Read(fNew, emp);
     Write(fOld, emp);
  end;{while}

  CloseFile(fOld);
  CloseFile(fNew);
end;


et le code pour la modification

procedure modifier(nom : String);
var
  fichier : TEmpFich;
  emp : TEmploye;
begin

   fmPrinc.btnEnregistrerModif.Visible := True;
   {remplire les champs avec les info}
   {trouver les infos dans le fichier seq avec le nom}
   if not FileExists(fichierOld) then Exit;
   AssignFile(fichier, fichierOld);
   Reset(fichier);
   Seek(fichier,0);
   while not Eof(fichier) do
   begin
      Read(fichier, emp);
      if UpperCase(emp.nom) = UpperCase(nom) then
       begin
           fmPrinc.edNom.Text := emp.nom;
           fmPrinc.edPrenom.Text := emp.Prenom;
           fmPrinc.edSalaire.Text := emp.Salaire;
           if emp.Homme then
              fmPrinc.rdbHomme.Checked := True
           else
             fmPrinc.rdbFemme.Checked := True;
           empPourModif := emp;
       end;{if nom}
   end;{while}

   {désactivation du bouton ajout pour éviter les doublons}
   fmPrinc.btnAjouter.Enabled := False;
end;

procedure enregistrerModif;
var
  emp : TEmploye;
  fOld, fNew : TEmpFich;
begin
  {Supprimer l'ancien ref du fichier old}
  {puis ajouter la nouvelle ref dans le fichier old}
  AssignFile(fOld,fichierOld);
  AssignFile(fNew,fichierNew);
  if not FileExists(fichierOld) then Exit;
  Reset(fOld);{lecture}
  Rewrite(fNew);{ecriture}
  Seek(fOld,0);
  Seek(fNew,0);
  Truncate(fNew);

  while not Eof(fOld) do
  begin
    Read(fOld, emp);
    if not(UpperCase(emp.Nom) = UpperCase(empPourModif.Nom)) then
      Write(fNew,emp);
  end;{while}
  {l'ancien élément avec ses anciennes valeurs n'a pas été copier dans le nouveau fichier}

  {ajout de l'ancien élément avec les nouvelles valeurs dans le fichier}
  emp.Nom := fmPrinc.edNom.Text;
  emp.Prenom := fmPrinc.edPrenom.Text;
  emp.Salaire := fmPrinc.edSalaire.Text;
  emp.Homme := fmPrinc.rdbHomme.Checked;

  Write(fNew,emp);

  {Copie du new vers old}
  Rewrite(fOld);
  Seek(fOld,0);
  Truncate(fOld);
  Seek(fNew,0);
  while not Eof(fNew) do
    begin
     Read(fNew, emp);
     Write(fOld, emp);
  end;{while}
  remplirListe;
  viderChamp;
  {cacher le bouton enregistrer modif pour éviter les erreurs user}
  fmPrinc.btnEnregistrerModif.Visible := False;
  CloseFile(fOld);
  CloseFile(fNew);


end;
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
8 oct. 2012 à 11:08
Salut,
j'ai la même opinion que Korgis, je passerai par un tableau dynamique, ceci éviterai de faire une gymnastique dans les fichiers...
Et au niveau comprehension ca serait peut-être plus simple.
ex : FTableauEmploye : array of TEmploye;
@+
0
Salut,

oui c'est vrai qu'au niveau compréhension c'est pas top.

Mais j'ai découvert le TClientDataSet pour générer un .xml est-ce mieux?
0
Rejoignez-nous