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

Bases de données Delphi Discussion :

[Delphi Android] Erreur inexplicable


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de Laskar
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2002
    Messages : 228
    Points : 139
    Points
    139
    Par défaut [Delphi Android] Erreur inexplicable
    Salut à tous.
    J'ai développé une application Android avec Delphi 10.3 très basique : consultation, édition et mise à jour d'une liste de participants via un téléphone. J'utilise un serveur DataSnap REST sur une machine Linux qui communique avec une base FireBird 2.5. Après quelques cheveux blancs, l'application fonctionne à peu près.
    Pour la consultation et l'insertion de nouveaux enregistrements, pas de problème. En revanche, pour la suppression, j'ai une put@#!% d'erreur dont je ne comprends pas le sens.
    Lorsque j'efface un enregistrement depuis le smartphone et que j'applique les mises à jour sur ma base distante. Ca marche. Si, dans la foulée, je supprime un second enregistrement, j'obtiens cette erreur :
    EFDException [FireDac][DApt]-400. Delete command deleted[0] instead of [1] record. Possible reasons : update table does not have PK or row identifier, record has been changed/deleted by another user.
    Je précise que ma base contient bien une clé primaire et que, évidement, aucun autre utilisateur n'utilise cette base à part moi.
    La table IDENTITE de ma base est très simple : ID (integer), NOM (varchar(30)), PRENOM (varchar(35)) et PHOTO (BLOB binaire). ID est ma clé primaire.
    Le programme client utilise une FDMemTable et les échanges entre le client et le serveur se font au format JSON conformément à toute application multi-tiers.
    J'ai fouillé des heures sur la toile en quête d'un début de solution : chou blanc !

    Un peu d'aide serait la bienvenue.
    Merci.

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    des transactions qui se mangent le nez ??
    la table aurait-elle une liaison avec une autre table qui elle, n'aurait pas de clé primaire ?

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    on dirait une sorte de conflit de conciliation
    Il n'arrive pas à supprimer l'enregistrement

    Comment supprimes-tu l'enregistrement côté Serveur ?
    As-tu fourni un TFDUpdateSQL avec un DeleteSQL spécifique ou tu laisse FireDac se débrouiller à générer la bonne requête (ayant tellement de soucis avec ADO à ce sujet, je ne plus confiance à aucune couche du genre pour faire ce boulot correctement)

    Coté Client, la donnée est bien supprimée ?

    DataSnap REST sur une machine Linux
    Une chose que je vais devoir explorer l'année prochaine, si tu dis que l'application fonctionne a peu près, c'est général ou c'est juste le bug mentionné ici ?
    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

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    attention c'est juste une indication des causes possibles de l'erreur, pas forcément La cause.
    Le message indique simplement que la ligne n'a pas été supprimée (0 de fait sur 1 demandée)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre habitué Avatar de Laskar
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2002
    Messages : 228
    Points : 139
    Points
    139
    Par défaut
    Coté client (application Android), l'enregistrement est supprimé de la FDMemTable par un simple FDMemTable.Delete. Je calcule ensuite le Delta des deux DataSets (avant et après suppression) et j'appelle la méthode serveur "ApplyUpdate" avec le résultat de ce calcul au format JSON. Ca fonctionne nickel pour les insertions. Si je supprime un enregistrement et que je fais une insertion immédiatement derrière, pas de problème. Le souci intervient quand je fais deux suppressions l'une derrière l'autre.

    Citation Envoyé par ShaiLeTroll Voir le message
    Une chose que je vais devoir explorer l'année prochaine, si tu dis que l'application fonctionne a peu près, c'est général ou c'est juste le bug mentionné ici ?
    Non, à part ce "bug" que j'espère résoudre très vite, tout marche. La machine Linux est derrière une FreeBox V6 et je viens m'y connecter depuis un smartphone Android en 4G (je pense pouvoir compiler pour iOS sans trop de difficulté).
    Devant le nombre de galères auxquelles j'ai fait face (en particulier pour le transfert des images), je n'exclus pas de faire un petit tuto.
    Pour mon problème, je fouille dans la propriété UpdateOptions de la FDMemTable qui est très peu documentée. Je vous tiens au courant de mes trouvailles.
    A+

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Laskar Voir le message
    Je calcule ensuite le Delta des deux DataSets (avant et après suppression)
    ça, ça me parait étrange, FDMemTable en CacheUpdate le fait tout seul normalement, il y a quelque chose qui m'échappe il va falloir que je relise les chapitres 12 et 13 de "Delphi in depth : Firedac"
    et retrouve les sources associées avant d'en dire plus.
    Devant le nombre de galères auxquelles j'ai fait face (en particulier pour le transfert des images), je n'exclus pas de faire un petit tuto.
    je me ferais une joie de mettre mon grain de sel lors de la correction technique
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    le chapitre 16 "Using CachedUpdate" m'a peut-être donné une piste, après le ApplyUpdates y-a t'il un CommitUpdates pour "vider" le cache il se pourrait en fait que vous essayez de détruire un enregistrement déjà effacé mais toujours indiqué comme étant à détruire

    (demo : FDBasicCache dans http://www.jensendatasystems.com/fir...acbookcode.zip)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre habitué Avatar de Laskar
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2002
    Messages : 228
    Points : 139
    Points
    139
    Par défaut
    @SergioMaster

    En nettoyant un peu le code, l'erreur a disparu. La bizarrerie, c'est que si je compile pour W32, les enregistrements sont correctement effacés (la machine Linux se trouve sur mon réseau local). En revanche, si je compile pour Android, bien que l'erreur ait disparu, les enregistrements ne sont pas effacés (rien ne se passe).
    La propriété "CachedUpdates" de ma FDMemTable est bien à TRUE. Sans conviction, j'ai tenté un FDMemTable.ApplyUpdates(-1) suivi d'un FDMemTable.CommitUpdates avant d'invoquer la méthode serveur de mise à jour sur la base. Ca ne fonctionne toujours pas.

    (note hors sujet)
    Le calcul du delta dont je parle est une fonction qui me retourne le DataSet JSON qui sera envoyé à la méthode serveur ApplyUpdates. Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TForm1.GetDeltas: TFDJSONDeltas;
    begin
        if FDMemTable.State in dsEditModes then FDMemTable.Post;
        Result := TFDJSONDeltas.Create;
        TFDJSONDeltasWriter.ListAdd(Result, 'IDENTITE', FDMemTable);
    end;
    J'ai trouvé de nombreux exemples (celui de FDBasicCache que je connaissais m'a d'ailleurs très inspiré) mais tous traitent du GET et de l'insertion. Rien concernant la suppression.
    Je creuse toujours ...

  9. #9
    Membre habitué Avatar de Laskar
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2002
    Messages : 228
    Points : 139
    Points
    139
    Par défaut
    Problème résolu. Il s'agissait d'un oubli de ma part. Voici la solution :
    Pour le OnClick du bouton "Delete" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.bSupClick(Sender: TObject);
    var
      DeltaList : TFDJSONDeltas;
    begin
        gFlag := 1; // (ça, c'est pour ma cuisine interne ...)
        FDMemTable.Delete;
        // suppression immédiate
        DeltaList := GetDeltas; 
        MyClientModule.MyServerMethods_Client.sm_ApplyUpdates(DeltaList);
        GetList; // <====== Voila ce qu'il fallait ajouter !!
    end;
    La méthode GetList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.GetList;
    Var
        JSONList: TFDJSONDataSets;
    Begin
        // Ferme la table mémoire
        FDMemTable.Close;
        // Va chercher la liste sur le serveur (au format JSON)
        JSONList := MyClientModule.MyServerMethods_Client.sm_GetList;
        // La copie dans FDMemTable
        FDMemTable.AppendData(TFDJSONDataSetsReader.GetListValue(JSONList, 0));
        // Ouvre à nouveau FDMemTable pour l'afficher dans ma ViewList
        FDMemTable.Open;
    End;
    Il fallait donc fermer et réouvrir la table après la suppression pour que ça marche. Logique.

    Merci à tous.

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

Discussions similaires

  1. [Turbo Delphi DotNet] Erreur avant de commencer
    Par bilboestpapa dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 03/03/2007, 18h07
  2. [delphi 4] erreur d'affichage apres l'ouverture d'une fiche 2 fois
    Par manu7901 dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/01/2007, 17h32
  3. Delphi 2005 : Erreur de compilation du programme
    Par bigbestboy dans le forum Langage
    Réponses: 6
    Dernier message: 03/08/2005, 18h14
  4. [Delphi.Net] Erreur de Cast ?
    Par SubZero2 dans le forum Delphi .NET
    Réponses: 15
    Dernier message: 11/07/2005, 17h00
  5. [FireBird 1.5][IB Expert][Delphi 5]Erreur Column unknown
    Par Jean73 dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/08/2004, 08h33

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