Produire un fichier texte a partir d'une table paradox

Résolu
dounga66 Messages postés 10 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 26 septembre 2009 - 22 sept. 2009 à 07:35
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 18 oct. 2009 à 10:21
Salut tt le monde; je veux produire un fichier texte a partir d'une table paradox ou Query , mon problème c'est que que je n'arrive pas a limiter la taille de chaque colonne dans le fichier texte.
exemple:
colonne1 5
colonne2 25
colonne3 10
.
.
.
j'ai essayé avec ça mais pas de résultat
les colonnes collées

procedure TForm1.Button3Click(Sender: TObject);
var
fic : TextFile;
i : Integer;
begin
AssignFile(fic, 'C:\test.txt');
Rewrite(fic);
with Query1 do begin
open;
First;
Query1.DisableControls; // eviter de re-peindre l'écran
while not Eof do begin
for i:=0 to FieldCount - 1 do begin
if i > 0 then Write(fic, '');// le séparateur un blanc
Write(fic, Fields[i].AsString);
end;
WriteLn(fic);
Next;
end;
end;
Query1.EnableControls;
CloseFile(fic);

7 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
24 sept. 2009 à 23:34
Comme je n'ai pas compris si tu souhaitais imposer la largeur des colonnes ou utiliser la taille des champs dans l'ensemble de données renvoyées par la requête, je te propose le code suivant qui fixe la largeur des colonnes en fonction du type de champ :

procedure TForm1.btnCreateFileClick(Sender: TObject);
var
  fic: TextFile;
  i: Integer;
  Field: TField;
begin
  AssignFile(fic, 'C:\test.txt');
  try
    Rewrite(fic);
    writeln(fic, '[header]');
    with Query1 do
    try
      open;
      First;
      DisableControls; // eviter de re-peindre l'écran
      while not Eof do begin
        for i := 0 to FieldCount - 1 do begin
          if i > 0 then Write(fic, ';'); // le séparateur un blanc
          field := fields[i];
        //chaines sur 15 caractères
          if field is TStringField then
            Write(fic, format('%15.15s', [field.AsString]))
          else if field is TIntegerField then
          // entiers sur 15 caractères
            write(fic, field.asInteger: 15)
          else if field is TFloatField then
          // réels sur 10 caractères dont 2 décimales
            write(fic, field.asFloat: 10: 2)
          else if field is TDateTimeField then
            write(fic, FormatDateTime('YYYY-mm-dd', field.AsDateTime));
        end;
        WriteLn(fic);
        Next;
      end;
    finally
      EnableControls;
    end;
  finally
    writeLn(fic, '[footer]');
    CloseFile(fic);
  end;
end;


Pour faciliter la lecture du fichier de sortie, j'ai délibérément remplacé l'espace par un point virgule (genre export CSV).

Si ce n'est pas cela que tu souhaites, fais le nous savoir.

[<a href="http://2999.lapetition.be/ 8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne]
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 oct. 2009 à 10:21
Salut,

1- "est ce qu'il y a une autre méthode (sans le Query) " ?
Oui, mais elle est assurément beaucoup moins efficace : parcourir chaque enregistrement d'un ensemble de données et totaliser avec du code côté application. A éviter...

2- "est ce qu'on peut faire un teste sur le nom champ ou l'index fields "
Oui :
if field.name = 'yyy' the ...
ou, en utilisant un index :
if field = Table1.Fields[index] then ...

Bonne continuation.

8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 sept. 2009 à 10:45
La taille des colonnes du fichier texte est-elle en rapport avec la taille des champs de la table ?

Merci d'utiliser la balise [code]

[<a href="http://www.lapetition.be/en-ligne/justice-pour-mambo-4817.html Justice pour mambo]
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
dounga66 Messages postés 10 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 26 septembre 2009
23 sept. 2009 à 07:41
merci pour la réponse

Pour la première ligne du fichier la taille des colonnes du fichier texte n'est pas en rapport avec la taille des champs de la table le reste des lignes en rapport avec ma table.

voici la structure de mon fichier.

entête {sur une seule ligne aucun rapport avec ma table}
corps {sur plusieurs lignes en rapport avec ma table}
fin {sur une seul ligne aucun rapport avec ma table}
0

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

Posez votre question
dounga66 Messages postés 10 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 26 septembre 2009
26 sept. 2009 à 16:02
Merci Delphiprog

grasse à votre aide j'ai réglé mon problème .
une dernière question:
est ce que on peut faire un total (somme) sur un champ de d'un fichier texte (valeurs).

mm question sur champ de type string d'un Query.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 sept. 2009 à 17:14
OK,

Faire une somme sur des valeurs numériques, on sait tous faire mais sur un champ alpha, là je ne vois pas où tu veux en venir

Pour répondre à ta question, soit tu connais la position du/des champs à totaliser, soit tu veux faire un total en fonction du nom du champ. Merci de préciser.

Si tu veux faire un total à partir des données d'un fichier texte, no problem, tu lis la valeur littérale, tu transtypes (avec un minimum de précaution) et tu ajoutes au total, ceci pour chaque ligne du fichier. Dis moi si tu souhaites le faire à partir du fichier généré ci-dessus.

Là où j'ai du mal à comprendre ce que tu souhaites faire, c'est que tu parles de fichier texte et de champ. Le mélange des deux notions est plutôt déroutant.

[<a href=http://2999.lapetition.be/ 8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne]
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
dounga66 Messages postés 10 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 26 septembre 2009
26 sept. 2009 à 21:59
merci pour les remarques

je vous signale que je suis débutant et je m'exprime mal en français.

j'ai exporté les données d'une table vers un fichier texte,
et pour tester si l'exportation a été faite sans erreurs je veux totaliser la colonne montant du fichier texte pour comparer le résultat avec le total du champ montant de ma table déjà calculé.

autres questions:

1- pour totaliser le champ total de ma table j'ai procédé
select sum(montant) from table1 where ...

est ce qu'il y a une autre méthode (sans le Query)
-----------------

2- if field is TStringField then

Write(fic, format('%15.15s', [field.AsString]))

est ce qu'on peut faire un teste sur le nom champ ou l'index fields
exemple :
if FieldByName('nom') then ???
Write(fic, format('%15.15s', [field.AsString]))
0
Rejoignez-nous