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

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

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut [D10.3] Firedac Comment enregistrer dans la BDD le contenu d'un TFDMemTable
    Bonjour à tous,

    J'ai du mal avec TFDMemTable...
    Je souhaite faire quelque chose de simple :

    1- copier la structure d'une table dans un TFDMemTable (Mem) : mem.copydataset(query1,[costructure]); // Ok ça marche
    2- j'ajoute des lignes dans ma table mémoire Mem : // pas de problème
    3- je voudrais enregistrer dans la base le contenu de mon Mem. Là je coince, je ne vois pas comment faire. J'ai beau regarder la doc, je ne trouve pas !

    C'est surement très simple ?

    Merci d'avance de votre patience/indulgence.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 995
    Points : 21 041
    Points
    21 041
    Par défaut
    Du coup si c'est pour faire un cache de données sur un TSQLQuery pourquoi ne pas utiliser TFDDataSet.CachedUpdates ?

    Sinon à partir du TFDMemTable, tu peux le balayer et générer les UPDATE (voire INSERT) en SQL
    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

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

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Du coup si c'est pour faire un cache de données sur un TSQLQuery pourquoi ne pas utiliser TFDDataSet.CachedUpdates ?
    Ben, je me casse la tête (sans doute pour pas grand chose) pour une histoire de numéro de chrono en mutli-utilisateur ...

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon à partir du TFDMemTable, tu peux le balayer et générer les UPDATE (voire INSERT) en SQL
    Ah oui bien sur, mais j'imaginais qu'on pouvait tout enregistrer d'un coup avec un batchmove par exemple... mais non.

    Je vais suivre ton conseil N°2.
    Merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 594
    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 594
    Points : 33 994
    Points
    33 994
    Billets dans le blog
    49
    Par défaut
    Bonjour,

    Avec un petit coup de FDLocalSQL peut-être ou encore un FDBatchmove
    Dans le premier cas il faut mettre un FDConnection SQLite, FDLocalSQL, ajouter la table mémoire à la liste des tables (datasets du FDlocalSQL) et une requête sur la bdd
    puis faire un INSERT INTO TABLE SELECT * FROM fdmemtable, en n'oubliant pas d'activer FDlocalSQL avant

    dans le deuxième cas il faut un fdbatchmove, un fdDatasetReader, un fdDatasetWriter
    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
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 995
    Points : 21 041
    Points
    21 041
    Par défaut
    Citation Envoyé par zarbouine Voir le message
    Ben, je me casse la tête (sans doute pour pas grand chose) pour une histoire de numéro de chrono en mutli-utilisateur ...
    Perso, j'y connais rien en FireDAC, je suis en ADO et avant j'étais en Devart, le BatchMove ça doit être une bonne approche
    Ayant écrit mon générateur deux générateurs de SQL (MySQL, Oracle) à base de TClientDataSet (et son Delta), j'ai l'habitude de faire comme ça car j'aime savoir ce que mon programme produit comme SQL

    Sinon, je ne sais pas ce que c'est ce Chrono mais une SEQUENCE, TRIGGER, TRANSACTION, il y a plein de moyen pour résoudre un membre problème, chrono comme chronologie soit juste un compteur, ou chrono comme chronomètre soit du temps
    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

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

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    dans le deuxième cas il faut un fdbatchmove, un fdDatasetReader, un fdDatasetWriter
    ça j'ai essayé, et curieusement ça ne marche pas, sans planter, mais pas de mise à jour. (je n'ai pas creusé plus avant, supposant que ce n'était pas adapté à une table mémoire)

    Sinon, je ne sais pas ce que c'est ce Chrono mais une SEQUENCE, TRIGGER, TRANSACTION, il y a plein de moyen pour résoudre un membre problème, chrono comme chronologie soit juste un compteur, ou chrono comme chronomètre soit du temps
    je m'explique un peu mieux : ce chrono c'est un n° de commande (PK autoinc), et ce que je voulais éviter c'est une rupture dans ce n° si deux utilisateurs créent une commande " en même temps" et que le premier abandonne sans valider. Je suppose alors que le N° du premier est perdu (à moins que le BDD bouche les trous, je n'ai pas essayé)

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 594
    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 594
    Points : 33 994
    Points
    33 994
    Billets dans le blog
    49
    Par défaut
    Bonjour
    Citation Envoyé par zarbouine Voir le message
    ça j'ai essayé, et curieusement ça ne marche pas, sans planter, mais pas de mise à jour. (je n'ai pas creusé plus avant, supposant que ce n'était pas adapté à une table mémoire)
    AMHA, Il n'y a aucune raison qu'une table mémoire ne puisse être utilisée.
    Il eusse fallu changer dans les propriétés de FDBatchmove la valeur MaxErrors (ce qui a fait le "sans planter") et activer le log
    puis regarder le fichier log obtenu pour voir où ça coince.
    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

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 995
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 995
    Points : 21 041
    Points
    21 041
    Par défaut
    Citation Envoyé par zarbouine Voir le message
    ...c'est un n° de commande (PK autoinc),
    Je laisserais la AutoInc faire son boulot et je ne l'utiliserais pas comme identifiant externe, peu importe les trous qui ne seront jamais bouché effectivement

    deux façon de faire

    Via Delphi, une SEQUENCE dédiée, utiliser pour générer le numéro de commande au moment de la validation, celle ou l'on ne peut plus annuler

    Via un Trigger, je ferais le calcul du numéro de commande continu (un autre champ unique dans la table) et via un RETURNING, tu récupères la valeur insérée
    Cela permet que cela soit la base qui gère cela sans risque de collision avec une SEQUENCE qui n'est utilisé qu'au moment final


    Dans ces deux façons, c'est bien un champ dédié au n° de commande, non technique, calculé au moment opportun.
    Pense si un jour la règle change, on te demande un nuémro de commande daté genre YYYYMMCCC, tu n'as qu'a changer le moteur de calcul du numéro, tout le reste tout la partie intégrité PK-FK n'est pas impacté

    Tout ça manque surement de TRANSACTION COMMIT et ROLLBACK aussi pour se poser ce genre de problématique, ah oui en même temps, on y pense quand on gère soit même le SQL mais on l'oublie vite quand FireDAC fait tout.


    Mais bon tout ça me semble étrange ... je pense que l'insertion est faite dès le début du process de création de commande, cela modifie le dataSet puis ça envoie
    Et ça c'est justement ce que je ne fais jamais, j'utilise des objets business, tout est fait en mémoire et à la fin ça génère le SQL et envoie tout d'un en TRANSACTION

    et donc finaklement un CacheUpdates fait la même chose même si je préfère de loin faire ça moi même, c'est la seule chose intéressante dans l'informatique de gestion alors si on enlève ça, quel ennui.
    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

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

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je laisserais la AutoInc faire son boulot et je ne l'utiliserais pas comme identifiant externe, peu importe les trous qui ne seront jamais bouché effectivement

    Dans ces deux façons, c'est bien un champ dédié au n° de commande, non technique, calculé au moment opportun.
    Pense si un jour la règle change, on te demande un nuémro de commande daté genre YYYYMMCCC, tu n'as qu'a changer le moteur de calcul du numéro, tout le reste tout la partie intégrité PK-FK n'est pas impacté

    .
    Je n'avais pas pensé à ça ! mais oui c'est important de différencier PK-FK de la numérotation end-user !
    Très bon conseil !! Je me demande pourquoi je n'y ai pas pensé... manque de recul ! mais ça vient doucement, pas mal grâce aux conseils avisés.
    Merci beaucoup !

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

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    et donc finaklement un CacheUpdates fait la même chose même si je préfère de loin faire ça moi même, c'est la seule chose intéressante dans l'informatique de gestion alors si on enlève ça, quel ennui.
    Je ne m'ennuie pas (encore) avec les CacheUpdates... ça viendra peut-être

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/06/2007, 23h23
  2. Réponses: 2
    Dernier message: 17/04/2007, 11h44
  3. [MySQL] Savoir le nombre d'enregistrements dans la BDD
    Par achos dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/02/2007, 12h55
  4. [C#] Supprimer un enregistrement dans une BDD
    Par Filippo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/07/2006, 12h02
  5. [MySQL] Comment ecrire dans une BDD à partir d'un tableau ?
    Par weed dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 16/09/2005, 15h53

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