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 :

[FB3] [FireDac] Erreur 400 à la suppression d'un enregistrement


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut [FB3] [FireDac] Erreur 400 à la suppression d'un enregistrement
    Bonjour à tous,

    Je cherche à migrer une vieille appli (D5 et BDE) vers firebird avec Delphi 10.3.3.
    Je suis débutant FB... j'ai réussi à créer la BD Firebird et récupéré les données

    Je me connecte bien avec un TFDConnection
    Soit deux tables CLIENTS et COMMANDES en relation par le champ NOCLI avec deux TFDTable,
    Deux grilles, et deux navigateurs
    En haut les clients, en bas les commandes du client sélectionné.
    Quand je clique sur le bouton '-' du navigateur commandes pour supprimer un enregistrement j'ai l'erreur 400.
    Je précise que la table commandes a bien un index primaire (sur le champ NUMCOM)

    J'imagine que je passe à côté d'un truc ultra simple ?

    Nom : Capture (Copy).JPG
Affichages : 72
Taille : 56,9 Ko

    Merci de votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Bonjour,

    plusieurs choses :

    Côté Firebird
    Y a t-il une contrainte de référence entre CLIENTS et COMMANDES ? (s'il n'y en a pas il devrait y en avoir une)
    ALTER TABLE COMMANDES ADD CONSTRAINT FK_CLIENT FOREIGN KEY (NUMCLI) REFRENCES CLIENTS(NUMCLI)
    ensuite il y a des choix à faire sur les
    [ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
    [ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
    Côté Delphi
    Le DBnavigator est lié à la "table détail" ou à CLIENTS ? Ce n'est pas clair.
    Je présume que la tables des COMMANDES est liée à la table CLIENTS via un TDataSet ? Perso je préfére utiliser en ce cas une query
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM COMMANDES WHERE NUMCLI=:NUMCLI  -- indiquer les colonnes à récupérer plutôt que *
    et un TFDUpdateSQL pour gérer les INSERT,UPDATE et DELETE
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Bonjour et merci de votre réponse,

    Côté Delphi
    Le DBnavigator est lié à la "table détail" ou à CLIENTS ? Ce n'est pas clair.
    Lié à la table détail, sur laquelle je tente d'effacer un enregistrement.
    Curieusement quand j'efface un client, tout se passe sans problème...mais je n'ai pas implanté l'effacement des commandes dans ce cas.

    Je pensais que la relation un à plusieurs était correctement gérée par Firedac. Apparemment ce n'est pas complètement le cas. Je vais creuser plus au niveau FB en suivant votre conseil.
    Si je place la contrainte au niveau FB, il me semble alors inutile de faire un Query sur les commandes non ? Si je comprends bien, les enregistrements de commandes seront toujours limités à ceux du client ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Bonjour,
    Citation Envoyé par zarbouine Voir le message
    Lié à la table détail, sur laquelle je tente d'effacer un enregistrement.
    Curieusement quand j'efface un client, tout se passe sans problème...mais je n'ai pas implanté l'effacement des commandes dans ce cas.
    Cela voudrait donc dire qu'il n'y a pas de contrainte référentielle ! Pas bon ça.

    Je pensais que la relation un à plusieurs était correctement gérée par Firedac. Apparemment ce n'est pas complètement le cas.
    Je n'utilise pas cette fonctionnalité de Firedac, comme je l'ai indiqué je préfère passer par les Query, très rarement les Tables qui ne sont que des query déguisées avec des options. D'ailleurs c'est peut-être dans les options de table qu'il faudra faire la recherche. Je vais faire un essai à mes moments perdus


    Si je place la contrainte au niveau FB, il me semble alors inutile de faire un Query sur les commandes non ?
    Rien à voir, il s'agit de structure et controle de la BDD
    Si je comprends bien, les enregistrements de commandes seront toujours limités à ceux du client ?
    Non, ce n'est pas au niveau FB mais au niveau de la requête
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Ok.
    Merci pour les conseils, je vais avancer dans ma compréhension de la gestion de la BDD avant de faire la migration....

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Quelques conseils supplémentaires surtout à un habitué PARADOX:
    Ajoutez une colonne auto-incrémenté "technique" à vos tables
    Pensez aux diverses contraintes possible, j'ai indiqué la contrainte de référence (FOREIGN KEY) mais vous pouvez aussi utiliser des contraintes de contrôle (CHECK)
    Sachez qu'il y a la possiblité d'avoir des colonnes calculées (COMPUTED BY) donc évitez toute colonne qui peut l'être
    - en exemple PRIXUNITAIRE, QUANTITE ,MONTANT_LIGNE devient PRIX_UNITAIRE, QUANTITE,MONTANT_LIGNE COMPUTED BY (PRIX_UNITAIRE*QUANTITE) en faisant attention au type à cuase de la précision
    Pensez que vous pouvez utiliser des TRIGGERS, des Procedures
    Bref lisez les documents Firebird
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Merci pour les conseils (très utiles pour moi qui débute dans FB, et qui ne travaillait qu'avec des tables dBase)
    J'ai avancé dans la construction de ma base FB, mis des clés primaires là où il n'y en avait pas, établi des relations "étrangères". ça marche déjà un peu mieux...
    Il y a quand même des choses que je ne pige pas encore et sur lesquelles je bloque :

    Je rencontre le problème suivant :
    Voilà ce que j'ai :
    - table CLIENTS index primaire sur champ NOCLI, autoinc -> Trigger before insert et générateur
    - table COMMANDES index primaire sur champ NUMCOM autoinc -> Trigger before insert et générateur
    - relation un à plusieurs entre commandes et clients (sur Champ NOCLI)

    Dans Delphi
    -TFDconnexion, deux TDFQuery, les clients (SELECT * FROM CLIENTS), les commandes (SELECT * FROM COMMANDES WHERE NOCLI=:NOCLI)
    -dbgrid clients et dbgrid commandes
    -navigateur clients et commandes
    Affichage des clients et des commandes ->OK

    Quand je clique sur + du navigateur clients (INSERT), le trigger est bien déclenché, NOCLI incrémenté, le Commit se fait normalement.
    Mais quand je fais un INSERT dans les commandes, le trigger ne se déclenche pas, NUMCOM est à -1 !

    Je ne pige pas pourquoi.... C'est à cause de la relation un à plusieurs ?
    Encore merci pour le coup de main et les conseils.
    Pat

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Bonjour,

    qui ne travaillait qu'avec des tables dBase
    Dbase! Ça va vous faire encore plus de changement que si c'eut été Paradox (ce que je croyais)

    2 suggestions :
    - poser la question sure le forum Firebird
    - Fournir dans la question le script de contsruction des tables (triggers inclus)

    Pourquoi ? parce que ce n'est pas vraiment Delphi qui est en jeu (même si l'accès se fait via Firedac).

    J'y répondrai volontier mais sur le forum Firebird puisqu'il s'agit avant tout d'une question de structure.
    Il sera temps ensuite de revenir sur le forum Delphi pour savoir comment obtenir le numéro auto-incrémenté, etc.
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Bonjour, merci de votre réponse !

    Oui dBase ! je sais, je me suis bien endormi, mais pour ce que je faisais ça ne marchait pas si mal

    Je pense que mon souci n'est pas au niveau FB parce que si j'utilise SQLManager pour faire un INSERT, le trigger se fait bien...
    Donc, c'est probablement que je n'utilise pas Firedac correctement !

    Nom : Capture (Copy).JPG
Affichages : 42
Taille : 37,7 Ko

    Le champ NOCLI importé de la table CLIENTS se renseigne bien mais le champ NUMCOM qui devrait s'autoincrémenter non.
    Curieux, si je retourne dans la table commandes avec SQLManager, l'enregistrement a bien été créé avec NUMCOM à -1...

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Quelles sont les diverses requêtes SQL dans le FDUpdateSQL ?
    Sans les scripts de contruction des tables, et un jeu d'essai (idem en script) je ne peux pas aider beaucoup
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #11
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Je crois que je fais trop confiance à la doc delphi !
    Je cite
    TFDUpdateSQL permet de redéfinir automatiquement les commandes de mises à jour SQL générées par les ensembles de données, mais ne permet pas d'exécuter les commandes SQL et de valider les modifications dans une base de données. L'utilisation de TFDUpdateSQL est facultative pour TFDQuery et TFDTable, car ces composants sont capables de générer automatiquement des commandes SQL et de valider des mises à jour à partir d'un ensemble de données dans une base de données.

    du coup je pensais qu'un TFDUpdateSQL n'était pas vraiment nécessaire... Donc, si je comprends bien il en faut un par TDBQuery, et générer le code SQL pour la bonne table pour chaque...
    Je vais me constituer une base FB minimaliste avec deux tables CLIENTS ET COMMANDES ne comportant que quelques champs,pour avoir une chance de m'y retrouver et tester tout ça pour bien assimiler les procédures....

    En tout cas merci de l'aide, et si ce n'est pas abuser, je reviendrai vers vous quand je me serai un peu plus avancé.

    Pat

  12. #12
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par zarbouine Voir le message
    Je crois que je fais trop confiance à la doc delphi !
    Je cite
    TFDUpdateSQL permet de redéfinir automatiquement les commandes de mises à jour SQL générées par les ensembles de données, mais ne permet pas d'exécuter les commandes SQL et de valider les modifications dans une base de données. L'utilisation de TFDUpdateSQL est facultative pour TFDQuery et TFDTable, car ces composants sont capables de générer automatiquement des commandes SQL et de valider des mises à jour à partir d'un ensemble de données dans une base de données.
    Pat
    Alors, en fait, la doc a raison, le UpdateSQL est facultatif. Pas besoin sauf si on veut changer la commande SQL...
    Mon problème venait du QUERY, j'avais merdouillé dans les propriétés.
    Pardon pour ces erreurs de débutant FB/Firedac

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 491
    Points : 33 713
    Points
    33 713
    Billets dans le blog
    45
    Par défaut
    Citation Envoyé par zarbouine Voir le message
    Alors, en fait, la doc a raison, le UpdateSQL est facultatif.
    Oui et non, dès qu'une requête contient une jointure, ou une colonne auto incrémentée ce n'est plus vraiment le cas c'est pourquoi je conseille d'utiliser TFDUpdateSQL pour contrôler ce qui est fait par "l'auto génération" et modifier ensuite comme il faut. Ensuite il faut contrôler les options car un updatewhereall va générer un code beaucoup plus "lourd" qu'un updatewherekey.

    Donc, selon mon expérience, utiliser un FDUpdateSQL est le moindre mal
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  14. #14
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 186
    Points : 136
    Points
    136
    Par défaut
    oui, je suis d'accord, ça me parait le plus raisonnable...
    Merci.

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

Discussions similaires

  1. [Delphi Berlin + Firebird3]erreur lors du suppression d'un enregistrement
    Par aimer_Delphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/04/2017, 15h24
  2. Erreur 400 en https avec firefox
    Par bambou dans le forum Apache
    Réponses: 2
    Dernier message: 08/02/2007, 18h07
  3. Réponses: 1
    Dernier message: 18/11/2006, 12h36
  4. Erreur 3167 sur suppression d'un enregistrement
    Par moustika dans le forum Access
    Réponses: 6
    Dernier message: 25/09/2006, 18h41
  5. [VB6]affichage d'une feuille modale / message d'erreur 400
    Par getea85 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 26/01/2006, 19h37

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