PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WEBDEV 2024 → Requête multi-base
Requête multi-base
Iniciado por FAVARD / Parc nation, abr., 25 2024 8:31 AM - 2 respostas
Membro registado
1 mensagem
Publicado em abril, 25 2024 - 8:31 AM
Bonjour,

Nous travaillons sur des bases PostgreSQL.
Nous avons deux bases de données distinctes.
Dans postgreSQL nous utilisons la notion de table distante pour lier des données entre les deux bases.

Dans la base prod nous avons une table de liaison action_x_commune. Elle contient les champs suivants :
code_insee
id_action

Dans la base ref_pnrun nous avons une table contenant les communes, avec les champs :
code_insee (clef unique)
nom_officiel (nom de la commune)

Nous souhaitons simplement réaliser une requête qui pour chaque action de action_x_commune retourne le nom de la commune associé à l'identifiant de l'action. En principe très simple. Sauf que Webdev ne gère pas les tables distantes.

Le seul exemple de gestion multi-base que j'ai trouvé https://doc.pcsoft.fr/?2034010, propose de combiner deux sources de données issues chacune d'une base différente en exécutant une troisième requête pour assurer la liaison entre les enregistrements des deux bases.

Voici mon code :
sMaReq1 est une chaîne = [
SELECT
action_x_communes.code_insee,
action_x_communes.id_action
FROM
action_x_communes
]
sMaReq1 = ChaîneConstruit(sMaReq1, "LIMIT 1, 10")
SD1 est une Source dede Données
SI PAS HExécuteRequêteSQL(SD1,SRV_DEV_DB_Prod,hRequêteDéfaut,sMaReq1) ALORS
Erreur(HErreurInfo())
SINON
Info("La requête contient " + HNbEnr(SD1) + " enregistrements.")
FIN

sMaReq2 est une chaîne =
[
SELECT
commune.code_insee,
commune.nom_officiel AS nom_commune
FROM
commune
]
sMaReq2 = ChaîneConstruit(sMaReq2, "LIMIT 1, 10")
SD2 est une Source dede Données
SI PAS HExécuteRequêteSQL(SD2,SRV_DEV_DB_Ref_pnrun,hRequêteDéfaut,sMaReq2) ALORS
Erreur(HErreurInfo())
SINON
Info("La requête contient " + HNbEnr(SD2) + " enregistrements.")
FIN


sMaReq3 est une chaîne = ChaîneConstruit("SELECT * FROM %1, %2 WHERE %1.%3 = %2.%3", SD1, SD2,"code_insee")
SD3 est une Source dede Données
SI PAS HExécuteRequêteSQL(SD3,SRV_DEV_DB_Ref_pnrun,hRequêteSansCorrection,sMaReq3) ALORS
Erreur(HErreurInfo())
SINON
Info("La requête contient " + HNbEnr(SD3) + " enregistrements.")
FIN



Les deux premières requêtes retournent des sources de données correctes.
En revanche l'exécution de la troisième requête retourne le message d'erreur suivant :





Même message si j'utilise l'autre connexion.
Avez vous des pistes pour solutionner le problème ?
Webdev est il incompatible avec une distribution multi-base des données ?
Merci pour votre aide.
Publicado em abril, 25 2024 - 10:56 AM
Hello,

Pour ma part j'utilise les dblink de postgresql quand j'ai besoin de faire des requêtes entre différentes bases.

select
dominante__net_peu
from
t_caract_sous_par_for
left join dblink('host=localhost user=gisuser password=gisuser dbname=''donnees_communes''' , 'select * from t_natures_peuplement') t_natures_peuplement (id__nat_peu integer, code__nat_peu character varying(20), libelle__nat_peu character varying(100), dominante__net_peu character varying(20), couleur__nat_peu integer)
on t_caract_sous_par_for.valeur__car_sou_par_for::integer=t_natures_peuplement.id__nat_peu
where
id__geo_sou_par_for=%1
and cle__car_sou_par_for = 'ActuelNaturePeuplement'
Publicado em abril, 25 2024 - 11:08 AM
Bonjour ,

Peut être une piste , met un HOuvreConnexion (SRV_DEV_DB_Ref_pnrun) avant ton HExécuteRequêteSQL(SD3,SRV_DEV_DB_Ref_pnrun,hRequêteSansCorrection,sMaReq3)

Cordialement.