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

 Delphi Discussion :

question utilisation BDD, SQL (trop difficile de trouver un titre qui resume)


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut question utilisation BDD, SQL (trop difficile de trouver un titre qui resume)
    Bonjour a tous,

    J'ai une question, peut être triviale pour les experts de la base de donnée, mais insoluble pour moi.
    Voila, je suis en train de programmer une appli permettant de faire des relevés météo. Ces relevés sont stockés dans une bdd firebird.
    Son fonctionnement est simple : je choisi un jour et une requête SQL me récupère les données de ce jour précis. Jusque la, tout roule. Le pb est que je suis obligé d'appliquer les modifications à la bdd chaque fois que je change de jour (logique vu le fonctionnement d'un SQLQuery), sinon je les perds.
    Seulement voila, moi je voudrais pouvoir travailler "en 2 temps" disons.
    En gros, je voudrais que les modifs relatives à un jour ne s'appliquent qu'à un datasource intermédiaire, de façon à pouvoir changer de jour sans perdre les modifs, et ne les enregistrer dans la bdd qu'une fois toutes les modifs effectuées

    Je sais pas trop si c'est clair pour vous.

    en gros ça ferais un sorte de truc comme ça:
    - chargement de toute la bdd dans un datasource
    - requête SQL sur le datasource chaque fois que je choisi un jour
    - enregistrement automatique des modifications dans le datasource fois que je change de jour
    - à la sortie du prog ou lorsqu'on clique sur 'enregistrer', enregistrement du datasource dans la bdd

    Alors qu'en ce moment, ça fais ça
    - requête SQL sur la bdd chaque fois que je choisi un jour
    - enregistrement automatique des modifications dans la bdd chaque fois que je change de jour

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    salut

    il faut passer par un table temporaire
    1°) Tu creer une table temporaire (#tmp)
    2°) Tu recupere les donnée tu les met dans ta table (#tmp)
    3°) une fois toutes tes modif effectuer soit tu valid soit tu annule
    4°) mise a jour de la table reel si validation

    Pour ce faire il doit y avoir un identifiant unique sur ta table de donnée d'origine
    ce seras lui qui nous permettra de mettre a jour les champs autre que la cle


    @+ phil

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 163
    Points : 82
    Points
    82
    Par défaut
    je ne suis qu'un débutant et je ne sais pas si cela est judicieux de ma part mais en lisant ton post deux idées me viennent a l'esprit :

    1. il se pourrait qu'il existe un système de session comme lorsque l'on fait la gestion d'un panier pour une appli web

    2. stocker a chaque changement les informations dans un tableau de type structuré puis sur clic du bouton enregistrer lire se tableau et faire toute les mises à jour nécessaires

    en espérant t'aider

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    il faut passer par un table temporaire
    1°) Tu creer une table temporaire (#tmp)
    2°) Tu recupere les donnée tu les met dans ta table (#tmp)
    3°) une fois toutes tes modif effectuer soit tu valid soit tu annule
    4°) mise a jour de la table reel si validation

    Pour ce faire il doit y avoir un identifiant unique sur ta table de donnée d'origine
    ce seras lui qui nous permettra de mettre a jour les champs autre que la cle


    @+ phil
    Oui c'est bien ce que j'aimerai faire, mais comment?

    je pensais faire un truc comme ca, est-ce que ca peut marcher?:
    bdd -> SQLQuery (ou je prend tout) -> datasource -> SQLQuery2 (ou je prend qu'une journée) > datasource2

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Une solution serait d'utiliser la notion de transaction :
    Tu inities la transaction (souvent avec un BeginTrans), tu fais toutes tes modifs et tu valides (avec un commit) quand tu as terminé toutes tes modifs ou quand tu changes de jour...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    désolé mais la je nage... Ca dépasse mes connaissance en delphi

    Un petit exemple ne seraitpas de refus

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 196
    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 196
    Points : 41 425
    Points
    41 425
    Billets dans le blog
    63
    Par défaut
    en gros voici ce que tu dois faire :

    au début du programme tu commences une tansaction
    (comment ? eh bien cela va dépendre des composants (de la bibliothèque de connexion serait le terme exact) que tu utilises pour te connecter à firebird ?)
    faire toutes tes manips
    en fin de programme , demander confirmation des modifications et si oui :

    Faire un Commit sinon un Rollback de la transaction

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par iznogoud_23 Voir le message
    Bonjour a tous,

    J'ai une question, peut être triviale pour les experts de la base de donnée, mais insoluble pour moi.
    Voila, je suis en train de programmer une appli permettant de faire des relevés météo. Ces relevés sont stockés dans une bdd firebird.
    Son fonctionnement est simple : je choisi un jour et une requête SQL me récupère les données de ce jour précis. Jusque la, tout roule. Le pb est que je suis obligé d'appliquer les modifications à la bdd chaque fois que je change de jour (logique vu le fonctionnement d'un SQLQuery), sinon je les perds.
    Seulement voila, moi je voudrais pouvoir travailler "en 2 temps" disons.
    En gros, je voudrais que les modifs relatives à un jour ne s'appliquent qu'à un datasource intermédiaire, de façon à pouvoir changer de jour sans perdre les modifs, et ne les enregistrer dans la bdd qu'une fois toutes les modifs effectuées

    Je sais pas trop si c'est clair pour vous.

    en gros ça ferais un sorte de truc comme ça:
    - chargement de toute la bdd dans un datasource
    - requête SQL sur le datasource chaque fois que je choisi un jour
    - enregistrement automatique des modifications dans le datasource fois que je change de jour
    - à la sortie du prog ou lorsqu'on clique sur 'enregistrer', enregistrement du datasource dans la bdd

    Alors qu'en ce moment, ça fais ça
    - requête SQL sur la bdd chaque fois que je choisi un jour
    - enregistrement automatique des modifications dans la bdd chaque fois que je change de jour
    Salut. je me permet de poser quelques question :
    1° Est ce que la base de donnée est utilisée par plusieurs application ?
    - Si oui, il y a un risque que 2 personnes fassent la même chose donc il peut y avoir confusion sur les données.
    - Si non, je pense que tu devrais utiliser un TClientDataset/TDatasetprovider couplé à un TDataset. Les modifications seront recensé dans le TCLientDataset. Une fois que tu veux enregistrer, tu fais juste applyupdate et le TClientDataset fera le reste.

    A+

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    en gros voici ce que tu dois faire :

    au début du programme tu commences une tansaction
    (comment ? eh bien cela va dépendre des composants (de la bibliothèque de connexion serait le terme exact) que tu utilises pour te connecter à firebird ?)
    faire toutes tes manips
    en fin de programme , demander confirmation des modifications et si oui :

    Faire un Commit sinon un Rollback de la transaction
    pourquoi pas, mais je me demande : dois-je initier une trasaction pour chaque modification et toute les appliquer à la fin?

    Citation Envoyé par Andry Voir le message
    Salut. je me permet de poser quelques question :
    1° Est ce que la base de donnée est utilisée par plusieurs application ?
    - Si oui, il y a un risque que 2 personnes fassent la même chose donc il peut y avoir confusion sur les données.
    - Si non, je pense que tu devrais utiliser un TClientDataset/TDatasetprovider couplé à un TDataset. Les modifications seront recensé dans le TCLientDataset. Une fois que tu veux enregistrer, tu fais juste applyupdate et le TClientDataset fera le reste.

    A+
    Non, la bdd ne peut être utilisée que par une seule personne a la fois.
    En fait, c'est déjà plus ou moins ce que je fait. Voila ma programmation actuelle:
    -un TSQLConnection pointant sur mon fichier BDD
    -un TSQLQuery avec lequel je sélectionne les données relative a la journée choisie par l'utilisateur (Select * from releve where jour = "jour choisi")
    -un TClientDataSetProvider dont le dataset est le SQLQuery
    -un TClientDataSet dont le provider est TClientDataSetProvider
    -un TDataSource

    Le hic c'est que je suis obligé de faire un applyupdate (et donc demander une confirmation à l'utilisateur) à chaque changement de jour, car, si je change de jour, cela réinitialise mon DataSet.
    En gros, je voudrais plus ou moi avoir un 1er dataset contiennant toute la bdd et avoir la possibilité de faire un second SQLQuery pour selectionner un jour sur ce dataset (et stocker ceci dans un second dataset). Mon premier applyupdate se ferai sur dataset 2 (serais automatique et appliquerait les modif de dataset2 sur dataset1) et le second applyupdate concernerait dataset1 a la fermeture du programme.

    Désolé d'être si peu clair, pour moi ca parais évident expliqué comme ca, mais je me doute que c'est pas facile a comprendre quand on a pas le projet en tête.

    EDIT : en ecrivant tout ceci, je pense peut-etre à une autre solution. Est-il possible de filtrer les données d'un dataset à afficher dans un DBGrid? Autrement dit, un DBGrid peut-il afficher juste une pertie seulement d'un dataset? Si oui, la solution serait peut-etre de selectionner toute ma bdd dans le dataset, et ensuite filtrer ce dataset pour n'afficher que le jour choisi dans le DBGrid...

    EDIT2 : Bon ben ma grande amie la touche F1 viens de me donner la solution je pense. Il est bien possible de filtrer un dataset. Je vais donc creuser de ce coté là. Je met pas "résolu" pour le moment, j'attend juste de voir si cette piste fonctionne. Je suis néanmoins ouvert à toute autre proposition, ca permet toujours d'apprendre . Merci

  10. #10
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    je pense que l'idée d'anapurna est aussi valable :
    Il suffit d'ajouter une table identique METEOTEMP au table contenant les infos météo METEO plus un champs qui vas servir de flag de modification.
    1ère étape : Tu copie tous les elements de METEO dans METEOTEMP(par ex au démarrage de l'appli).
    2ème étape : Tu affiche METEOTEMP via un dataset
    3ème étape : A chaque modification, tu met une code dans la colonne flag de METEOTEMP
    4ème étape : A chaque demande d'enregistrement, tu Update les lignes de METEO avec les lignes modifié de METEOTEMP.
    5ème étape : Tu efface les données de METEOTEMP (quand tu quitte l'appli)
    Ceci n'est q'une idée.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 196
    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 196
    Points : 41 425
    Points
    41 425
    Billets dans le blog
    63
    Par défaut
    pourquoi pas, mais je me demande : dois-je initier une trasaction pour chaque modification et toute les appliquer à la fin?
    non une seule transaction (comme indiqué) ce qui est ton objectif à moins que je ne me trompe

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Chercheur - Programmeur amateur
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur - Programmeur amateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Points : 39
    Points
    39
    Par défaut
    Bon ben la methode dataset qui contient tout+filtrage des enregistrements+applications des changements a la fin semble fonctionner.
    Il me reste cependant un petit souci (qui j'arriverai a contourner, mais de facon peu élégante) : est-il possible de trier les enregistrements d'un dataset par rapport à un champs? (sans recourir à SQLQuery)?

    Merci d'avance

    EDIT: je passe en resolu, car j'ai trouvé une solution qui marche super
    merci a tous

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

Discussions similaires

  1. [SQL-Server] Tache planifiée script PHP utilisant connexion à BDD SQl Server
    Par flo73 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/02/2012, 16h03
  2. SQL Requête difficile sur BDD
    Par rkade dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/09/2011, 08h47
  3. Utilisation d'une BDD SQL.SERVER 2005
    Par mampa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/02/2011, 11h58
  4. question bdd sql
    Par ing1312 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/10/2009, 14h10
  5. Trop de mémoire utilisée par SQL Server
    Par sylvie75 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/08/2006, 12h46

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