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

SQL Firebird Discussion :

Intégration des données externes dans une vue


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut Intégration des données externes dans une vue
    Bonjour à tous,

    J'ai une base de données "BD1" contenant les tables "ACH","PAF","VEN","PAC" , et j'ai créer une vue sur cette base de donnée comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE VIEW V1 (DAT, BON, DESCL, PRO1, DESPR1, QTE1, PUV, MTV, PAC, FAC, DESF, PRO2, DESPR2, QTE2, PUA, MTA, PAF, DESD, DEP)
    AS       
      select dat,'' as bon,'' as descl,'' as pro1,'' as despr1,null as qte1,null as puv,null as mtv,null as pac,fac,desf,pro as pro2,des as despr2,qte as qte2,pua,mht as mta,null as paf,null as dep,null as desd   from ACH  where (pro is not null)
      union all
      select dat,null as bon ,null as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,null as pac,fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,ver as paf,null as dep,null as desd   from PAF   
      union all
      select dat,bon,descl,pro as pro1,des as despr1,qte as qte1,puv,mht as mtv,null as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,null as desd,null as dep   from VEN  where (pro is not null)
      union all
      select dat,fac as bon ,?? as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,ver as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,null as desd,null as dep   from PAC 
      union all
      select dat,null as bon ,null as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,null as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,des as desd,dep   from RED where (cas<>2)and(cas<>3)   
    ;
    Mon problème est là ou j'ai mis "??", en fait la je doit recupérer une information sur une autre base de données, mais je ne sais pas comment faire

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par chekkal Voir le message
    en fait la je doit récupérer une information sur une autre base de données
    une autre base de données Firebird ou pas ? ça peut paraître évident mais non.
    On peut accéder à une autre base de données Firebird à partir de la version 2.5 à l'intérieur d'un bloc ou d'une procédure mais je ne pense pas à l'intérieur d'une vue puisqu'il s'agit d'une syntaxe PSQL
    Citation Envoyé par chekkal Voir le message
    Mon problème est là ou j'ai mis "??",
    retrouver ce ?? c'est pas vraiment la bonne méthode pour expliquer le problème
    de plus quelle est la relation entre la table PAC et la base de données externes ?

    Pour ces raisons envisager une procédure plutôt qu'une vue

    Note : il est relativement facile de créer une CTE et de faire ensuite une JOINture entre la table PAC et cette CTE
    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

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour sergio,

    En fait le ?? et la designation correspondant à un champs de la table pac,
    exple
    TABLE PAC | TABLE EXTERNE
    ....................... |......................................
    Champs référence | Désignation
    ...........................|..................................
    0001 | EURL MPBA

    si il existe une solution par procédure je suis preneur

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    une recherche dans ce forum avec ON EXTERNAL (je le fait que cela n'ai pas été fait)
    https://www.developpez.net/forums/d1...s/#post8597698
    La procédure indiquée semble correspondre exactement à tes besoins
    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 régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    une recherche dans ce forum avec ON EXTERNAL (je le fait que cela n'ai pas été fait)
    https://www.developpez.net/forums/d1...s/#post8597698
    La procédure indiquée semble correspondre exactement à tes besoins
    je l'ai déjà vu ce post et tous les poste ayant pour sujet "on external" et ça résout toujours pas mon problème. en Effet comment intégrer le "on external" directement dans mon code?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    c'est pourtant pas difficile il faut une procédure telle que celle décrite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SET TERM ^;
    CREATE PROCEDURE EXTERNVALUES returns (emp_no smallint,fullname varchar(37)) as
    begin
    FOR EXECUTE STATEMENT 'select emp_no,full_name from employee'
    ON EXTERNAL DATA SOURCE 'localhost:employee' AS USER 'sysdba' PASSWORD 'masterkey'
    INTO :emp_no,:fullname
    DO SUSPEND;
    end^
    SET TERM ;^
    et utiliser la CTE sur cette procedure pour faire une jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    union
    WITH E AS (SELECT EMP_NO,FULLNAME FROM EXTERNVALUES)
    SELECT E.EMP_NO,E.FULLNAME FROM E LEFT JOIN CLIENTS C ON C.ID=E.EMP_NO
    union
    ...
    le tout est de retranscrire avec vos colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     WITH E AS (SELECT EMP_NO,FULLNAME FROM EXTERNVALUES)
     select p.dat,p.fac,e.FullName,null,null,null,null,null,p.ver,null,null,null,null,null,null,null,null,null,null from PAC  p LEFT JOIN E ON E.EMP_NO=P.ID
    mais comme vous ne donnez pas la moitié des informations nécessaires, la structure de la table externe, le champ de référence entre la table PAC et cell-ci, une tentative de procédure par exemple difficile d'en écrire plus, je reste dans les généralités
    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
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    j'ai contourné le problème et j'ai trouvé une solution pour intégrer l'appel d'une procédure à l’intérieur d'une vue
    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
    26
    27
    28
    29
    30
    31
    32
    33
     
    ///la procedure à appler
    CREATE PROCEDURE RECU ( ANA Varchar(20) )
    RETURNS ( DESCLT Varchar(200) )
    AS
    DECLARE VARIABLE des1 varchar(200); 
    DECLARE VARIABLE chemin varchar(100);
    DECLARE VARIABLE taille smallint;
     
    BEGIN
       des1='select des from CLT where (cod='''||ana||''')and(des is not null)';
       for SELECT mon$database_name from MON$DATABASE into :chemin do
       suspend;
       taille=char_length(chemin);
       chemin='localhost:'||substring(chemin from 1 for taille-12)||'dossier.fdb';
     
       EXECUTE STATEMENT des1 ON EXTERNAL DATA SOURCE chemin AS USER 'sysdba' PASSWORD 'masterkey' INTO :desclt;
       suspend;
     
    ///////////////////
    /////la vue
    CREATE VIEW V1 (DAT, BON, DESCL, PRO1, DESPR1, QTE1, PUV, MTV, PAC, FAC, DESF, PRO2, DESPR2, QTE2, PUA, MTA, PAF, DESD, DEP)
    AS       
      select dat,'' as bon,'' as descl,'' as pro1,'' as despr1,null as qte1,null as puv,null as mtv,null as pac,fac,desf,pro as pro2,des as despr2,qte as qte2,pua,mht as mta,null as paf,null as dep,null as desd   from ACH  where (pro is not null)
      union all
      select dat,null as bon ,null as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,null as pac,fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,ver as paf,null as dep,null as desd   from PAF   
      union all
      select dat,bon,descl,pro as pro1,des as despr1,qte as qte1,puv,mht as mtv,null as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,null as desd,null as dep   from VEN  where (pro is not null)
      union all
      select dat,fac as bon ,(select des from recu(pac.ana)) as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,ver as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,null as desd,null as dep   from PAC 
      union all
      select dat,null as bon ,null as descl,null as pro1,null as despr1,null as qte1,null as puv,null as mtv,null as pac,null as fac,null as desf,null as pro2,null as despr2,null as qte2,null as pua ,null as mta,null as paf,des as desd,dep   from RED where (cas<>2)and(cas<>3)   
    ;
    le seul problème qui reste c'est que la procédure retourne 2 résultat! ce qui est impossible parce que le champ "ana" est une clé primaire et le résultat est toujours de cette manière :

    ana des
    0001
    0001 OMEGA VIA

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par chekkal Voir le message
    le seul problème qui reste c'est que la procédure retourne 2 résultat! ce qui est impossible
    Comme il y a deux SUSPEND dans cette procédure c'est on ne peux plus logique

    j'ai contourné le problème et j'ai trouvé une solution pour intégrer l'appel d'une procédure à l’intérieur d'une vue
    Qu'est-ce que c'est que cette solution de (ça m'a échappé)

    pourquoi for SELECT mon$database_name from MON$DATABASE into :chemin do sur une requête qui ne renvoi qu'un résultat ?
    le for .... do est inutile sans parler du SUSPEND qui suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       taille=char_length(chemin);
       chemin='localhost:'||substring(chemin from 1 for taille-12)||'dossier.fdb';
    AMHA il y a plus simple ou du moins sans passer par des variables supplémentaires et moyen de le faire directement dans le SELECT

    ligne 30 du code
    select dat,fac as bon ,(select des from recu(pac.ana)) as descl, .....
    vous faites donc autant de recherches (d'appel à la procédure) que de lignes de la table PAC
    sur une base de 100 lignes dans PAC vous balayez donc 100 fois votre base externe ! alors que si vous aviez fait comme je l'ai indiqué vous ne l'auriez fait qu'une seule fois
    de plus je trouve étrange de pouvoir récupérer un colonne nommé des avec la procédure qui est déclaré comme retournant une colonne nommée DESCLT !

    en corrigeant (un peu) votre procédure

    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
    CREATE PROCEDURE RECU
    RETURNS (ANA VARCAHR(20), DESCLT Varchar(200) )
    AS
    DECLARE VARIABLE des1 varchar(200); 
    DECLARE VARIABLE chemin varchar(100);
    DECLARE VARIABLE taille smallint;
     
    BEGIN
       des1='select ana,des from CLT';
       SELECT mon$database_name from MON$DATABASE into :chemin;
       taille=char_length(chemin);
       chemin='localhost:'||substring(chemin from 1 for taille-12)||'dossier.fdb';
     
       FOR EXECUTE STATEMENT des1 ON EXTERNAL DATA SOURCE chemin AS USER 'sysdba' PASSWORD 'masterkey' INTO :ANA,:desclt;
       suspend;
    END;
    et en utilisant une jointure sur une CTE dans votre vue (remplacement de la ligne 30)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     WITH C AS (SELECT ANA,DESCLT FROM RECU) 
     select p.dat,p.fac,r.DESCLT,null,null,null,null,null,p.ver,null,null,null,null,null,null,null,null,null,null from PAC P JOIN C ON P.ANA=C.ANA
    vous n'aurez qu'un seul appel à la procédure, une jointure "simple" ou INNER permettra de ne pas récupérer les lignes n'ayant pas de lien avec la table de la base externe
    pour obtenir toutes les lignes de la table PAC il faudra utiliser LEFT JOIN

    (AU PASSAGE : notez que donner des alias au champs est inutile dans une vue, et que pour l'union seul le premier SELECT compte, donc à moins d'avoir l'esprit tordu et de ne pas suivre le même ordre de colonne dans les autres SELECT éviter les alias de colonne rend la chose plus lisible)
    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

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour sergio,

    C'est vrai le problème venait du "for do" qui est été inutile d'ailleurs, et ça marche merci.

    Pour l'utilisation d'une vue à la place d'une procedure, c'est que avec une vue il ya moins de codes les colonnes à afficher sont définit au départ.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    re,
    Citation Envoyé par chekkal Voir le message
    Pour l'utilisation d'une vue à la place d'une procédure, c'est que avec une vue il y a moins de codes les colonnes à afficher sont définit au départ.
    Argument très léger ! Heureusement qu'il y a plus que ça pour justifier la création de vues
    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

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

Discussions similaires

  1. [MySQL] enregistrer des données CSV dans une BDD
    Par NicoO_O dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/11/2006, 23h10
  2. Utiliser des objets SWING dans une vue RCP
    Par manuga72 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 20/10/2006, 17h26
  3. Insérer des données Excel dans une table ACCESS
    Par anikeh dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 22h42
  4. Intégration des fichier XML dans une base de données MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    Réponses: 8
    Dernier message: 25/11/2005, 22h41
  5. Insérer des données Excel dans une base Access ?
    Par MaTHieU_ dans le forum Access
    Réponses: 3
    Dernier message: 22/06/2005, 15h11

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