Produire un fichier texte a partir d'une table paradox [Résolu]

dounga66 10 Messages postés lundi 20 septembre 2004Date d'inscription 26 septembre 2009 Dernière intervention - 22 sept. 2009 à 07:35 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 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);
Afficher la suite 

7 réponses

Répondre au sujet
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 24 sept. 2009 à 23:34
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 18 oct. 2009 à 10:21
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 22 sept. 2009 à 10:45
0
Utile
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.
Commenter la réponse de cs_Delphiprog
dounga66 10 Messages postés lundi 20 septembre 2004Date d'inscription 26 septembre 2009 Dernière intervention - 23 sept. 2009 à 07:41
0
Utile
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}
Commenter la réponse de dounga66
dounga66 10 Messages postés lundi 20 septembre 2004Date d'inscription 26 septembre 2009 Dernière intervention - 26 sept. 2009 à 16:02
0
Utile
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.
Commenter la réponse de dounga66
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 26 sept. 2009 à 17:14
0
Utile
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.
Commenter la réponse de cs_Delphiprog
dounga66 10 Messages postés lundi 20 septembre 2004Date d'inscription 26 septembre 2009 Dernière intervention - 26 sept. 2009 à 21:59
0
Utile
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]))
Commenter la réponse de dounga66

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.