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 :

Tester si une vue Existe et la creer sinon


Sujet :

Bases de données Delphi

  1. #1
    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 Tester si une vue Existe et la creer sinon
    Salut à tous.
    J'utilise SQL Server actuellement pour mes log de stat.
    Or, mes requêtes sont tellement complexes que j'ai du utiliser des vues pour avoir le resultat attendue.
    Je voudrais donc savoir comment tester si une view existe et le créer à partir de mon programme.
    Dans la même foulé, quelle compos ADO utilisé ?

    Merci
    On progresse .....

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Vu qu'une vue est considérée comme une table, il te suffit soit :

    - Methode bourrin : de faire une requete simple sur la vue, si elle n'existe pas, ca te retournera une exception et la tu lances la création de ta vue.
    - Methode Mieux : de récupérer la liste des tables présentes dans ta base de données (GetTableNames avec un AdoConnection), puis de vérifier qu'elle existe.

    Sinon une dernière méthode un peu plus élaboré -> Utilises les procédures stockées :

    - Vérifie et créer la/les vue/s
    - Fait les calculs
    - Retourne l'ensemble des données.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    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
    En faites, j'utilise ce code pour verifier que la vue existe, le supprime et le recrée
    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
     
      With TAdoQuery.Create(Nil) do
      try
        try
          Connection := DM.Conn_SQL;
          SQL.Add('if exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[VW_STK]'') and OBJECTPROPERTY(id, N''IsView'') = 1) 
    drop view [dbo].[VW_STK]');
          ExecSQL;
          SQL.Clear;
          SQL.Add('CREATE VIEW dbo.VW_STK AS ');
          SQL.Add('SELECT     AR_Ref AS Produit, SUM(AS_QteSto) AS Stock');
          SQL.Add('FROM dbo.F_ARTSTOCK');
          SQL.Add('WHERE     (DE_No IN (1, 6, 7))');
          SQL.Add('GROUP BY AR_Ref');
          ExecSQL;
          SQL.Clear;
          ....
        Except
          MessageDlg('Erreur lors de la création des vues', mtError, [mbOK], 0);
        end;
      finally
        Free;
      end;
    Ce code fonctionne mais, comme le logiciel est supposé être en environnement multiposte, ça risque de ne pas fonctionner au cas ou quelqu'un est dessus.
    Alors j'ai biduouller comme ceci mais ça ne marche pas
    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
      With TAdoQuery.Create(Nil) do
      try
        try
          Connection := DM.Conn_SQL;
          SQL.Add('if Not exists (select * from dbo.sysobjects where id = object_id(N''[dbo].[VW_STK]'') and OBJECTPROPERTY(id, N''IsView'') = 1) ');
          SQL.Add('CREATE VIEW dbo.VW_STK AS ');
          SQL.Add('SELECT     AR_Ref AS Produit, SUM(AS_QteSto) AS Stock');
          SQL.Add('FROM dbo.F_ARTSTOCK');
          SQL.Add('WHERE     (DE_No IN (1, 6, 7))');
          SQL.Add('GROUP BY AR_Ref');
          ExecSQL;
          SQL.Clear;
          ......
        Except
          MessageDlg('Erreur lors de la création des vues', mtError, [mbOK], 0);
        end;
      finally
        Free;
      end;
    Et l'erreur est au niveau de CREATE VIEW

    MErci
    On progresse .....

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Et le même code en procédure stockées ca fait l'erreur ?

    Sinon pour le premier code :

    Peux tu ou as tu un moyen d'identifier un utilisateur ?
    si oui, pourquoi ne pas créer une vue au nom de l'utilisateur + nom de la vue (Plus de problème de multipost), il faut juste penser à détruire les vue commencant par le nom de l'utilisateur à la fin du traitement.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    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
    Bon, j'ai modifier mon code SQl comme suit et apparament ça fonctionne
    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
    With TAdoQuery.Create(Nil) do
      try
        try
          Connection := DM.Conn_SQL;
          SQL.Add('select * from dbo.sysobjects where id = object_id(N''[dbo].[VW_STK]'') and OBJECTPROPERTY(id, N''IsView'') = 1'); 
         ExecSQL;
          If IsEmpty then
    begin
          SQL.Clear;
          SQL.Add('CREATE VIEW dbo.VW_STK AS ');
          SQL.Add('SELECT     AR_Ref AS Produit, SUM(AS_QteSto) AS Stock');
          SQL.Add('FROM dbo.F_ARTSTOCK');
          SQL.Add('WHERE     (DE_No IN (1, 6, 7))');
          SQL.Add('GROUP BY AR_Ref');
          ExecSQL;
          SQL.Clear;
          ....
        Except
          MessageDlg('Erreur lors de la création des vues', mtError, [mbOK], 0);
        end;
      finally
        Free;
      end;
    On progresse .....

  6. #6
    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
    Bon, j'ai modifier mon code SQl comme suit et apparament ça fonctionne
    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
    With TAdoQuery.Create(Nil) do
      try
        try
          Connection := DM.Conn_SQL;
          SQL.Add('select * from dbo.sysobjects where id = object_id(N''[dbo].[VW_STK]'') and OBJECTPROPERTY(id, N''IsView'') = 1'); 
        ExecSQL;
         If IsEmpty then
         begin
            SQL.Clear;
            SQL.Add('CREATE VIEW dbo.VW_STK AS ');
            SQL.Add('SELECT     AR_Ref AS Produit, SUM(AS_QteSto) AS Stock');
            SQL.Add('FROM dbo.F_ARTSTOCK');
            SQL.Add('WHERE     (DE_No IN (1, 6, 7))');
            SQL.Add('GROUP BY AR_Ref');
            ExecSQL;
            SQL.Clear;
         end;
          ....
        Except
          MessageDlg('Erreur lors de la création des vues', mtError, [mbOK], 0);
        end;
      finally
        Free;
      end;
    La ça marche.

    Merci pour tes conseils
    On progresse .....

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Citation Envoyé par Andry
    Ce code fonctionne mais, comme le logiciel est supposé être en environnement multiposte, ça risque de ne pas fonctionner au cas ou quelqu'un est dessus.
    Alors j'ai biduouller comme ceci mais ça ne marche pas
    As-tu mis en place les transactions ?
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  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
    Question transaction sur SQL Server, je ne sais pas trop.
    Mais je vais y fouller vu que j'ai vais beaucoup travailler avec.
    En tous cas, le problème a été résolu cette fois ci.

    Merci
    On progresse .....

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

Discussions similaires

  1. Tester si une données existe deja
    Par mael94420 dans le forum ASP
    Réponses: 1
    Dernier message: 18/10/2005, 17h09
  2. Tester qu'une valeur existe dans une "liste"
    Par Oluha dans le forum Langage
    Réponses: 12
    Dernier message: 04/08/2005, 23h01
  3. Réponses: 2
    Dernier message: 20/05/2005, 10h18
  4. MDI => Tester si une fenêtre existe déjà ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/04/2005, 21h41
  5. Tester qu'une date existe
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/03/2005, 10h37

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