IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

FastReport Discussion :

Erreur avec FastReport


Sujet :

FastReport

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 438
    Par défaut Erreur avec FastReport
    Bonjour,
    Cela fait plusieurs jours que je me bats avec FastReport 6.8.4 dans un projet avec Delphi 10.4.2 Community sous W10.

    Les démos fonctionnent sans problème...
    Dans mon projet j'alimente le Report via un UserDataSet car les données ne viennent pas d'une base de données.
    Voici un projet minimal. Dans le Getdata je n'ai rien mis, c'est juste pour voir si je passe dans cette boucle. La procédure sera remplie ensuite et c'est un projet juste pour pouvoir simplement vous montrer où est mon soucis.
    TestFR.zip

    J'ai connecté ma bande "Master Detail" avec mon "userdataset" mais j'ai cette erreur à l’exécution du report seul ou du projet.
    Nom : ErreurFR.png
Affichages : 113
Taille : 16,3 Ko

    Où est mon erreur ?
    Merci d'avance.
    Bernard

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 438
    Par défaut
    A force de gratter j'ai fini par trouver : j'avais essayé un TagStr sur le memo Titre, il était resté et c'est ça qui me causait le Pb. Pourquoi ???? je n'ai pas cherché.

    J'ai encore un soucis :
    Les TfrxMemoView passent bien dans le OnGetValue pour se faire remplir et cela fonctionne parfaitement.
    Par contre dans ma bande MasterData j'ai une image que je veux remplir à la volée : Picture1 du type TfrxPictureView.

    Dans un post de 2021 SergioMaster donnait une méthode en 2 temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm122.frxReport1BeforePrint(Sender: TfrxReportComponent);
    begin
    frxImage:=FrxReport1.FindObject('picture1') as TfrxPictureView;
    end;

    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm122.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    var S : TFileStream;
    begin
    if SameText(VarName,'Col1') then Value:=StringGrid1.Cells[0,l];
    if SameText(VarName,'Col2') then Value:=StringGrid1.Cells[1,l];
    if SameText(VarName,'Col3') then
       begin
    //     Value:='C:\Users\serge\OneDrive\images\hermioneloire.jpg';
         if assigned(frxImage) then frxImage.Picture.LoadFromFile('C:\Users\serge\OneDrive\images\hermioneloire.jpg');
       end;
    end;
    que j'ai adapté à mon besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure TFen_PresenterResultats.FeuilleCommentairesBeforePrint(
      Sender: TfrxReportComponent);
    begin
         frxImage:=FeuilleCommentaires.FindObject('picture1') as TfrxPictureView;
    end;
     
    procedure TFen_PresenterResultats.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    begin
         if Pos(VarName,'Titre')>0 then Value:='Titre : '+DatasPhotos1[frxUserDataSet1.RecNo].Titre;
         if Pos(VarName,'Notes')>0 then Value:='Notes : '+DatasPhotos1[frxUserDataSet1.RecNo].N1 +' - '
                                                         +DatasPhotos1[frxUserDataSet1.RecNo].N2 +' - '
                                                         +DatasPhotos1[frxUserDataSet1.RecNo].N3;
         if Pos(VarName,'Classement')>0 then Value:='Classement : '+DatasPhotos1[frxUserDataSet1.RecNo].Place;
         if Pos(VarName,'Picture1')>0 then
            if assigned(frxImage) then frxImage.Picture.LoadFromFile(DatasPhotos1[frxUserDataSet1.RecNo].Fichier);
    end;

    Mon soucis c'est que je ne passe jamais dans le GetValue pour remplir l'image ?? Picture1 doit être défini autrement que par le nom de l'objet ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 517
    Billets dans le blog
    65
    Par défaut
    Impossible pour moi d'ouvrir le fastreport (erreur abstraite).
    Est-il possible de fournir le .fr3

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 438
    Par défaut
    Bonjour Sergio,

    J'ai résolu le pb de l'image sur mon application cible, pas sur le fichier joint, en ajoutant un mémo invisible dans le report mais qui me permet de déclencher le remplissage de l'image.

    De plus je ne comprend pas pourquoi le OnGetData du UserDataSet n'est jamais déclenché et qu'il faut utiliser celui du Report lui même pour pouvoir passer les données.
    En PJ le .fr3

    Merci
    Fichiers attachés Fichiers attachés

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 517
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    De plus je ne comprend pas pourquoi le OnGetData du UserDataSet n'est jamais déclenché
    peut-être parce que le userdataset n'est pas lié
    Nom : Capture.PNG
Affichages : 95
Taille : 23,2 Ko

    PS. perso je n'aime pas trop ces if Pos(VarName,.... les fonctions contains, containstext, sametext seraient mieux AMHA

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 438
    Par défaut
    Effectivement le Dataset du TfrxReport n'est pas lié au frxUserDataSet car ce DataSet est déjà relié à la bande MasterDetail et on ne peut pas avoir le même Dataset pour les 2.

    Je crois avoir compris que le OnGetDatas du frxUserDataSet se déclenche si on déclare des "Fields', on peut relier les Memos ou autres objets du report à ces fields et là le OnGetDatas du frxUserDataSet part.
    Quelle est la meilleure méthode : pas de Fields déclarés et le OnGetDatas du frxReport ou des Fields et le OnGetDatas du frxUserDataSet ?
    Il semble qu'avec cette dernière méthode j'ai des opérations pointer invalides qui montent, il faut que je les piste.

    C'est un vrai casse tête FastReport et la doc n'aide pas à grand chose, pas plus que les exemples.
    S'il y a une méthode efficace, je suis preneur !!

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 517
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Il a fallu que je replonge un peu, car je n'utilise pas souvent des FrxDataSetUsers !

    Pour moi, à partir du moment où on a des données "structurées" l'utilisation d'un frxDatasetUser se justifie, seul inconvénient ce ne sont pas des champs tels que l'on entendrait par là dans le sens où ce ne seront que des chaines.

    Dans le cadre du besoin, je déclarerai les champs Titre,Notes,Classement,Picture (nom du fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
      private
        { Déclarations privées }
        i : integer;
        frximage : TFrxPictureView;
      public
        { Déclarations publiques }
      end;
     
    var
      Form4: TForm4;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm4.frxReport1BeforePrint(Sender: TfrxReportComponent);
    begin
    frxImage:=FrxReport1.FindObject('picture1') as TfrxPictureView;
    end;
     
    procedure TForm4.Button1Click(Sender: TObject);
    begin
    frxReport1.PrepareReport();
    frxReport1.ShowPreparedReport;
    end;
     
    procedure TForm4.frxUserDataSet1First(Sender: TObject);
    begin
    i:=1;
    end;
     
    procedure TForm4.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    begin
    if Sametext(VarName,'Titre') then Value:='One '+i.toString;
    if Sametext(VarName,'Notes') then Value:='Two '+i.toString;
    if Sametext(VarName,'Classement') then Value:='Three '+i.toString;
    if Sametext(VarName,'Picture') AND assigned(frxImage) AND FileExists(<nomimage>)  then frxImage.Picture.LoadFromFile(<nomImage>);
    end;
     
    procedure TForm4.frxUserDataSet1Next(Sender: TObject);
    begin
    Inc(i);
    end;
    En relisant le code adapté #2 je remarque qu'il y a confusion entre contenu du TfrxmemoView et données !

    Ma question est donc, comment sont récupérées les données ? IMHO c'est là que le bât blesse, si dans un stringgrid rempli manuellement alors cette technique pourrait fonctionner, sinon, ce qui est ma technique la plus souvent utilisée, un FDmemTable et un frxDBDataset est bien plus adapté

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 438
    Par défaut
    Bonjour,
    Merci pour le plongeon !
    Les données viennent de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         TDataPhoto = class
             TypeClassement : Integer;// 1 meilleures photos, 2 gros ecarts, 3 moins bonnes
             Fichier, Titre, Place, N1, N2, N3, Total, Ecart, Auteur, Club : string;
         end;
     
         TDatasPhotos = Tlist<TDataPhoto>;
     
    var DatasPhotos1,DatasPhotos2,DatasPhotos3, DatasPhotosActive : TDatasPhotos;
    et je les passe à mon report comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TFen_PresenterResultats.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    begin
         if Pos(VarName,'Titre')>0 then Value:='Titre : '+DatasPhotosActive[frxUserDataSet1.RecNo].Titre;
         if Pos(VarName,'Notes')>0 then
         begin
              Value:='Notes : '+DatasPhotosActive[frxUserDataSet1.RecNo].N1 +' - '
                                                              +DatasPhotosActive[frxUserDataSet1.RecNo].N2 +' - '
                                                              +DatasPhotosActive[frxUserDataSet1.RecNo].N3;
              if DatasPhotosActive[frxUserDataSet1.RecNo].TypeClassement=2 then //gros écarts
              begin
                   Value:=Value+' Ecarts Max = '+ DatasPhotosActive[frxUserDataSet1.RecNo].Ecart;
              end;
         end;
         if (Pos(VarName,'Classement')>0) and (DatasPhotosActive[frxUserDataSet1.RecNo].TypeClassement<>2) then
              Value:='Classement : '+DatasPhotosActive[frxUserDataSet1.RecNo].Place;
         if Pos(VarName,'Photo')>0 then
            if assigned(frxImage) then frxImage.Picture.LoadFromFile(DatasPhotosActive[frxUserDataSet1.RecNo].Fichier);
    end;
    Je crois avoir compris (c'est ce que j'ai fait) que si on déclare des Fields dans le UserDataSet c'est le OnGetDatas de ce dataset qui part et si on déclare seulement des noms (Ex : [<Element>] ) dans le texte des memos c'est le OnGetDatas du frxReport qui part.

    En résumé j'ai réussi à faire ce dont j'avais besoin.
    Le but de la création de ce report étant d'avoir un document modifiable (cible visée .odt ou .doc) qui devrait être envoyé aux juges pour remplir la zone "Commentaires".
    Les exportations du report m'ont beaucoup déçues :
    PDF : Ok tout est bon, image parfaite du preview
    ODT : seule le texte et le format du report, pas d'image
    DOC : idem ODT
    RTF : idem ODT
    ODS(Excel libreoffice) : idem ODT
    XLS : OK.

    Heureusement il y en a un autre que PDF qui fonctionne !!
    Je trouve aussi la génération du rapport très longue, l'importation des images ralenti beaucoup le process.
    Je vais essayer de passer par un TMemoryStream et charger les JPG en quart ou demi résolution ce qui devrait gagner du temps.

    Concernant ta remarque sur les contains, containstext, sametext effectivement c'est mieux mais au début avec mes essais j'avais des noms avec des customer. ajoutés ou des guillemets ou pas et la recherche du contenu partiel était plus simple. A fignoler...

Discussions similaires

  1. Erreur Avec Interbase
    Par smokemon dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2004, 08h24
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 16h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 16h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 22h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 01h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo