PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème de requête multi insert
Problème de requête multi insert
Débuté par duduu, 23 mai 2017 06:36 - 7 réponses
Posté le 23 mai 2017 - 06:36
Bonjour,

Je fais appel à vous car je ne trouve pas de réponse à ma question.

Je débute sur Windev et SQL.

J'ai créer sur windev une interface qui me permet de renseigner des champs tel que le nom, le prénom, l'age d'une personne etc.
Quand je rentre ces informations dans mon interface, j'aimerais qu'elles soit enregistré dans 3 tables de ma base de données.

Exemple :

J'ai trois tables :

Adherants : Nom_adh, prenom_adh, Ville, CP, Age, debut_Contrat, Centre_adh.
Centre : Centre_adh, ville_centre, Type_contrat, Nom_adh, prenom_adh
Contrat : Type_contrat, Nom_adh, prenom_adh, Duree_contrat

Les informations que je dois entrer :

Dans ma feuille :

Nom de l'adhérant : (nom du champs :N_adherant)
Prénom de l'adhérant : (nom du champs :P_adherant)
Ville de l'adhérant : (nom du champs :Ville_adherant)
CP : (nom du champs :CP_adherant)
Age : (nom du champs :Y_adherant)

Dans la table "TableSouscription" de ma feuille :

Début de contrat : (nom du champs :debut_contrat)
Centre : (nom du champs :Centre_contrat)
Ville du centre : (nom du champs : Ville_Centre)
type de contrat : (nom du champs : Typ_Contrat)
Durée d'engagement : (nom du champs : Duree_Engagement)

J'ai fais cette requête :

SQL est une chaine
RequetSQL est une source de données
TableSupprimetout(TableSouscription)

SQL="INSERT INTO adherants (Nom_adh, prenom_adh, Ville, CP, Age, debut_Contrat, Centre_adh) VALUES (N_adherant, P_adherant, Ville_adherant, CP_adherant, Y_adherant,
TableSouscription.debut_contrat, TableSouscription.Centre_contrat)"

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Centre (Centre_adh, ville_centre, Type_contrat, Nom_adh, prenom_adh) VALUES (TableSouscription.Centre_contrat, TableSouscription.Ville_Centre,
TableSouscription.Typ_Contrat, N_adherant, P_adherant)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Contrat (Type_contrat, Nom_adh, prenom_adh, Duree_contrat) VALUES (TableSouscription.Typ_Contrat, N_adherant, P_adherant, TableSouscription.Duree_Engagement)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

J'ai commenté les deux dernières requêtes pour voir si les informations s'enregistrait au moins dans ma table Adherants mais rien ne s'enregistre...

Merci d'avance pour votre aide.
Posté le 23 mai 2017 - 08:12
Bonjour,
La base quand on utilise une fonction, est de tester le code de retour, et
le cas échéant de renvoyer un message d'erreur pour indiquer ce qui ne va
pas.
Si tu le fais ici, ton problème sera rapidement réglé.

Frédéric.

"duduu" a écrit dans le message de groupe de discussion :
20179aac459bf6aa25bf743c5e9800d0f37a@news.pcsoft.fr...

Bonjour,

Je fais appel à vous car je ne trouve pas de réponse à ma question.

Je débute sur Windev et SQL.

J'ai créer sur windev une interface qui me permet de renseigner des champs
tel que le nom, le prénom, l'age d'une personne etc.
Quand je rentre ces informations dans mon interface, j'aimerais qu'elles
soit enregistré dans 3 tables de ma base de données.

Exemple :

J'ai trois tables :

Adherants : Nom_adh, prenom_adh, Ville, CP, Age, debut_Contrat, Centre_adh.
Centre : Centre_adh, ville_centre, Type_contrat, Nom_adh, prenom_adh
Contrat : Type_contrat, Nom_adh, prenom_adh, Duree_contrat

Les informations que je dois entrer :

Dans ma feuille :

Nom de l'adhérant : (nom du champs :N_adherant)
Prénom de l'adhérant : (nom du champs :P_adherant)
Ville de l'adhérant : (nom du champs :Ville_adherant)
CP : (nom du champs :CP_adherant)
Age : (nom du champs :Y_adherant)

Dans la table "TableSouscription" de ma feuille :

Début de contrat : (nom du champs :debut_contrat)
Centre : (nom du champs :Centre_contrat)
Ville du centre : (nom du champs : Ville_Centre)
type de contrat : (nom du champs : Typ_Contrat)
Durée d'engagement : (nom du champs : Duree_Engagement)

J'ai fais cette requête :

SQL est une chaine
RequetSQL est une source de données
TableSupprimetout(TableSouscription)

SQL="INSERT INTO adherants (Nom_adh, prenom_adh, Ville, CP, Age,
debut_Contrat, Centre_adh) VALUES (N_adherant, P_adherant, Ville_adherant,
CP_adherant, Y_adherant,
TableSouscription.debut_contrat, TableSouscription.Centre_contrat)"

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Centre (Centre_adh, ville_centre, Type_contrat, Nom_adh,
prenom_adh) VALUES (TableSouscription.Centre_contrat,
TableSouscription.Ville_Centre,
TableSouscription.Typ_Contrat, N_adherant, P_adherant)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Contrat (Type_contrat, Nom_adh, prenom_adh, Duree_contrat)
VALUES (TableSouscription.Typ_Contrat, N_adherant, P_adherant,
TableSouscription.Duree_Engagement)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

J'ai commenté les deux dernières requêtes pour voir si les informations
s'enregistrait au moins dans ma table Adherants mais rien ne s'enregistre...

Merci d'avance pour votre aide.
Membre enregistré
1 923 messages
Popularité : +53 (65 votes)
Posté le 23 mai 2017 - 08:58
Bonjour,

Avec "TableSupprimetout(TableSouscription)", tu vides ta table et donc tu n'as plus rien à insérer...

--
Bon dev,
Jean-Pierre
Membre enregistré
182 messages
Popularité : +10 (10 votes)
Posté le 23 mai 2017 - 09:51
Au vu de la syntaxe des requêtes, tout est disposé comme s'il n'y avait que des entiers.
Exemple sur certains champs qui, je pense, doivent renvoyer des chaines :

SQL="INSERT INTO adherants (Nom_adh, prenom_adh, Ville, CP, Age, debut_Contrat, Centre_adh) VALUES ("' + N_adherant + '", "' + P_adherant + '", "' + Ville_adherant + '", CP_adherant, Y_adherant, TableSouscription.debut_contrat, TableSouscription.Centre_contrat)"

Je vous laisse voir le reste, mais je suis quasi certain que c'est dû à ça.
De même, n'oubliez pas d'échapper les chaines susceptibles de contenir des guillemets simples.

Exemple :

sParsed = Remplace(sParsed, "'", "\'")
Posté le 23 mai 2017 - 17:45
Merci pour vos réponses ! en effet cela fonctionne beaucoup mieux ...
Cependant j'ai encore des bugs et on m'a conseillé de me tourner vers la méthode "Pour toute ligne" mais j'ai encore un souci.

Voici mon code :
//Pour insérer les informations dans la table ADHERANTS

POUR TOUTE ligne de TableSouscription
HRAZ(ADHERANTS)

ADHERANTS=nom_adh
ADHERANTS=prenom_adh
(etc)
ADHERANTS= TableSouscription.debut_contrat
(etc)

Dans ce code cela ne fonctionne pas car toutes mes données ne sont pas issues de TableSouscription. J'ai donc commenté la première ligne mais cela ne fonctionne pas.

J'ai bien-sure essayé de faire une partie POUR TOUTE ligne de TableSouscription et une autre POUR TOUTE ligne de Ma_Feuille mais cela ne fonctionne pas car je ne peux pas faire un POUR TOUTE ligne sur ma feuille ...

Pouvez-vous m'aiguiller svp ?

Je vous remercie encore pour votre aide.
Membre enregistré
182 messages
Popularité : +10 (10 votes)
Posté le 23 mai 2017 - 19:41
Sinon, pourquoi ne pas faire deux tableaux, puis récupérer les données depuis ces tableaux ?
C'est un peu confus je l'admets ^^.
Mais en tout cas, c'est comme ça que je procéderais dans ce type de situation :).
Message modifié, 23 mai 2017 - 19:45
Posté le 23 mai 2017 - 23:46
duduu a formulé la demande :
Bonjour,

Je fais appel à vous car je ne trouve pas de réponse à ma question.

Je débute sur Windev et SQL.

J'ai créer sur windev une interface qui me permet de renseigner des champs
tel que le nom, le prénom, l'age d'une personne etc.
Quand je rentre ces informations dans mon interface, j'aimerais qu'elles soit
enregistré dans 3 tables de ma base de données.

Exemple :

J'ai trois tables :

Adherants : Nom_adh, prenom_adh, Ville, CP, Age, debut_Contrat, Centre_adh.
Centre : Centre_adh, ville_centre, Type_contrat, Nom_adh, prenom_adh
Contrat : Type_contrat, Nom_adh, prenom_adh, Duree_contrat

Les informations que je dois entrer :

Dans ma feuille :

Nom de l'adhérant : (nom du champs :N_adherant)
Prénom de l'adhérant : (nom du champs :P_adherant)
Ville de l'adhérant : (nom du champs :Ville_adherant)
CP : (nom du champs :CP_adherant)
Age : (nom du champs :Y_adherant)

Dans la table "TableSouscription" de ma feuille :

Début de contrat : (nom du champs :debut_contrat)
Centre : (nom du champs :Centre_contrat)
Ville du centre : (nom du champs : Ville_Centre)
type de contrat : (nom du champs : Typ_Contrat)
Durée d'engagement : (nom du champs : Duree_Engagement)

J'ai fais cette requête :

SQL est une chaine
RequetSQL est une source de données
TableSupprimetout(TableSouscription)

SQL="INSERT INTO adherants (Nom_adh, prenom_adh, Ville, CP, Age,
debut_Contrat, Centre_adh) VALUES (N_adherant, P_adherant, Ville_adherant,
CP_adherant, Y_adherant,
TableSouscription.debut_contrat, TableSouscription.Centre_contrat)"

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Centre (Centre_adh, ville_centre, Type_contrat, Nom_adh,
prenom_adh) VALUES (TableSouscription.Centre_contrat,
TableSouscription.Ville_Centre,
TableSouscription.Typ_Contrat, N_adherant, P_adherant)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

SQL="INSERT INTO Contrat (Type_contrat, Nom_adh, prenom_adh, Duree_contrat)
VALUES (TableSouscription.Typ_Contrat, N_adherant, P_adherant,
TableSouscription.Duree_Engagement)

HExécuteRequêteSQL(RequetSQL,hRequêteDéfaut,SQL)
HLibèreRequête(RequetSQL)

J'ai commenté les deux dernières requêtes pour voir si les informations
s'enregistrait au moins dans ma table Adherants mais rien ne s'enregistre...

Merci d'avance pour votre aide.


Tu passes 3 chaines contenants des requêtes SQL fausses...
Windev ne va pas deviner par magie ce qu'il faut remplacer dans tes
requêtes SQL par des vraies valeurs...

En outre, utiliser Windev de nos jours et en être encore à des requêtes
SQL de cette forme... une lecture de la doc peut être et le guide
d'autoformation?
Posté le 24 mai 2017 - 00:52
Il faut que tu choisisses une méthode et que tu t'y tiennes.
Avec une instruction SQL // Insert, on t'a donné des très bons conseils... mais tu changes complètement de méthode.

Tu as choisi de faire :
HRAZ(ADHERANTS)

ADHERANTS=nom_adh
ADHERANTS=prenom_adh
(etc)
ADHERANTS= TableSouscription.debut_contrat
(etc)


Si tu avais un minimum de bases en informatique (Windev ou n'importe quel autre langage), tu saurais que les différentes lignes adhérant = ... sont incohérentes.

La meilleure chose que tu puisses faire, c'est de suivre l'autoformation sur Windev. Et dans la foulée, une formation sur SQL. J'ai peur que ça ne suffise pas, parce qu'il faudrait au préalable une formation au raisonnement.