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

Composants VCL Delphi Discussion :

Problème avec Firedac


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut Problème avec Firedac
    Bonjour à tous,
    J'ai un DBGrid qui affiche une table de ma BDD SQLite. Pour effectuer un traitement sur 1 ou plusieurs enregistrements (des lignes donc), sur proposition de SergioMaster (il y a longtemps) j'ai créé un champ Print qui sert à marquer ces enregistrements par un X (par exemple). Ce X est utilisé dans plusieurs requêtes SQL.
    Ce champ est invisible et se vide automatiquement dès le traitement terminé. Tout fonctionne bien avec Zeosdbo.
    J'ai essayé avec les contrôles Firedac TFDConnection et TFDQuery. Le champ Print ne se vide pas, autrement dit la ou les X restent présentes et peuvent induire des erreurs pour d'autres requêtes SQL.
    Dans le TFDConnection je choisis l'option FetchOptions > Mode > fmAll.
    Merci encore une fois pour votre aide.
    Cordialement

  2. #2
    Rédacteur/Modérateur

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

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

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

    Je ne comprends pas la question (et pourtant)
    Quelle est la requête en question et y a-t-il un FDUpdateSQL associé ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Bonjour SergioMaster,
    Voici la procédure de marquage de l'enregistrement :
    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
    procedure TMainForm.mnSelectionQSOClick(Sender: TObject);
    var
     i : integer;
     aBookmark : TBookmark;
    begin
      inherited;
      if DBGrid1.SelectedRows.Count > 0 then
      begin
        with DBGrid1.DataSource.DataSet do
        begin
          for i := 0 to DBGrid1.SelectedRows.Count-1 do
          begin
            DBGrid1.DataSource.Dataset.GotoBookmark(DBGrid1.SelectedRows.Items[i]);
            ABookmark := Datas.QContacts.GetBookMark;
            Datas.QContacts.Edit;
            Datas.QContacts.FieldByName('Print').Value := 'X';
            Datas.QContacts.Post;
            Datas.QContacts.DisableControls;
            Datas.QContacts.Refresh;
            Datas.QContacts.GotoBookmark(ABookmark);
            Datas.QContacts.EnableControls;
          end;
        end;
    end;
    end;
    et celle qui l'utilise pour, par exemple, sortir un état du ou des enregistrement(s) sélectionné(s) :
    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 TMainForm.impQSOselectionnesClick(Sender: TObject);
    begin
    mnSelectionQSOClick(self);
      With Datas.QReport do
      begin
        SQL.Clear;
        SQL.Add('SELECT * from tblContacts WHERE Print LIKE '+QuotedStr('X' + '%'));
        Open;
      end;
      with TReport.Create(nil) do
        try
          RLLabel1.Caption := 'Liste des ' + Format('%d', [Datas.QReport.RecordCount]) + ' contacts marqués';
          RLReport1.Preview;
        finally
        Destroy;
      end;
    mnDeselectionQSOClick(self);
    DBNavigator1Click(self,nbRefresh);
    end;
    Et non je n'ai pas de FDUpdateSQL associé, novice que je suis en Firedac.

    Plus clairement dit, je souhaite que le champ Print soit vidé à la fin du traitement.

    Merci.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Dommage de ne pas faire des UPDATE en SQL au lieu de ce vilain Bookmark\Edit

    On dirait que vous utilisiez un champ dans le cache sans le commiter
    Un champ virtuel serait préférable ou alors utiliser une TRANSACTION avec une sorte d'équivalent à ON COMMIT DELETE ROWS (ORACLE)

    Vous devriez utiliser une table temporaire uniquement visible par la session pour selectionner vos données
    Cela ne fonctionnera jamais dans un environnement multi-utilisateur votre système.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Alors premièrement ma question sera la colonne Print existe ou non dans tblContacts ?
    Car, je ne comprends pas trop cette phrase "Ce champ est invisible et se vide automatiquement dès le traitement terminé. "

    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Add('SELECT * from tblContacts WHERE Print LIKE '+QuotedStr('X' + '%'));
    m'indiquerait que oui
    P.S, pas très joli cette requête et largement améliorable si c'est fdquery
    un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FDQuery.Open('SELECT * from tblContacts WHERE Print='+QuotedStr('X'));
    Fera le même job à moindre code

    J'ai quand même voulu faire un test avec inexistence de la colonne en procédant ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT EmployeeID,LastName,FirstName,title, CAST(' '  AS CHAR(1)) PRINT FROM  Employees
    (database fddemo.db)
    en définissant les champs et en mettant la requête cachedupdate=true, en mettant le champ Print à ReadOnly:=False
    un code comme celui-ci (sans même m'occuper de multiselection)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm6.DBGrid1CellClick(Column: TColumn);
    begin
    if SameText(Column.FieldName,'Print') then
      begin
        FdQuery1.Edit;
        if FDQuery1PRINT.AsString='X' then fdQuery1PRINT.Clear
                                      else fdQuery1PRINT.asString:='X';
        FdQuery1.Post;
      end;
    end;
    fait l'affaire quant à la sélection des trucs à imprimer une fois fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm6.Button1Click(Sender: TObject);
    begin
    FDQuery1.CancelUpdates; // merci CacheUpdates=True
    end;
    évite tout ce truc de beginupdate/réouverture et repositionnement/endupdate


    Idem puisque programme VCL, plutôt que de voir un X en colonne print, j'utiliserai un vieux truc pour afficher à la place une case à cocher il y a cette FAQ mais j'ai plutôt en tête cette solution, à envisager aussi le composant smdbgrid

    avec ce code en mettant DefaulDrawGrid à false
    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
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
     r : Trect;
    begin
    if SameText(Column.FieldName,'Print') then
     begin
      r.Top:=Rect.Top+1;
      r.Bottom:=Rect.Bottom-1;
      r.Left:=Rect.Left+1;
      r.Right:=Rect.Right-1;
      (Sender as TDBGrid).Canvas.FillRect(r);
      DrawFrameControl((Sender as TDBGrid).Canvas.Handle,r,DFC_BUTTON,
       IfThen(FDQuery1PRINT.asString='X',DFCS_CHECKED,DFCS_BUTTONCHECK));
     end
    else DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
    end;
    on obtient
    Nom : Capture.PNG
Affichages : 249
Taille : 15,6 Ko



    pour le Report, comme je ne sais pas trop quel est le générateur ... Pour l'instant, je botte en touche.
    Mais s'il s'agit de fastreport j'écrirais de ne pas faire de SQL et de tester par script pascal si la ligne doit être imprimée ou non

  6. #6
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 219
    Par défaut
    Je me suis mal exprimé. Oui le champ Print existe dans tblContacts (c'était d'ailleurs votre suggestion à l'époque). La colonne est juste rendu non visible dans le DBGrid puisque je n'interviens pas du tout, ni pour marquer la ligne par un X ni pour supprimer le X en fin de traitement. C'est pourquoi les cases à cocher ne conviennent pas, la colonne étant non visible.
    J'avais essayé de me passer de la X en exécutant le traitement par simple sélection de la ou des ligne(s). Mais je n'ai pas su lancer un traitement par simple sélection de ligne. La X dans la colonne Print est indispensable en l'état du code.
    Mon seul problème est de vider le champ Print en fin de traitement avec Firedac, car Zeos le fait très bien. Peut-être un Update... Qu'en pensez-vous ?
    Vous me direz : continuez avec Zeos puisque ça fonctionne ! Certes, mais je suis curieux et tenace
    Merci pour vos creusements de cerveau.
    Cordialement

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Oui le champ Print existe dans tblContacts (c'était d'ailleurs votre suggestion à l'époque).
    époque lointaine dont je ne me souviens pas
    Citation Envoyé par f5jcg_Lulu Voir le message
    Mon seul problème est de vider le champ Print en fin de traitement avec Firedac
    un FDConnexion.ExecSQL('UPDATE tblContacts SET PRINT=NULL');mais pas besoin si FDQuery est en CacheUpdate,
    auquel cas FDQuery.CancelUpdates; suffit

    Vous me direz : continuez avec Zeos puisque ça fonctionne !
    non, car Firedac est mieux sur beaucoup de points (macros, Open etc...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Delphi Firedac SQLite et les commit
    Par duss57 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/09/2018, 14h30
  2. SQLite+Firedac, problème avec des strings !
    Par SergioMaster dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/05/2016, 11h57
  3. [XE8] découverte, problème avec firedac
    Par frantzgac dans le forum EDI
    Réponses: 8
    Dernier message: 06/07/2015, 14h30
  4. [XE5] Problème de lecture de blob MySQL avec FireDAC
    Par Achillée dans le forum Bases de données
    Réponses: 0
    Dernier message: 17/03/2015, 13h19
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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