PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Delete & jointure
Delete & jointure
Iniciado por shunky_119, 26,jun. 2019 10:46 - 6 respuestas
Publicado el 26,junio 2019 - 10:46
Bonjour,

Des questions/problèmes se pose à moi, je viens donc voir si vous avez déjà croiser ceux-ci.

Je suis en Windev 24 et utilisant des fichiers HyperFile

Je souhaite réalisé un DELETE sur plusieurs tables à la fois.
Voici ma requête:

DELETE
FROM Famille
JOIN Secteur ON (Secteur.IDSecteur = Famille.IDSecteur)
JOIN TypeFonction ON (TypeFonction.IDSecteur = Secteur.IDSecteur)
JOIN Parametrage_mail ON (Parametrage_mail.IDSecteur = Secteur.IDSecteur)
LEFT JOIN Regle_Specif ON (Regle_Specif.IDParametrage = Parametrage_mail.IDParametrage)
WHERE Secteur.Code_Secteur = %1

Le %1 est remplacé avec un ChaineConstruit.

Le résultat que j'obtiens est le suivant :
Il efface bien les tables Famille, Secteur, TypeFonction et Parametrage_mail. Regle_Specif est effacé aussi si il contient des données. Sur le papier tout est effacé selon les conditions. Cependant, si la table Regle_Specif n'a pas d'enregistrement (renvoi null) alors j'obtiens une erreur : "L'enregistrement n°<-1> se trouve en dehors du fichier <Regle_Specif>."
Les enregistrements des tables Famille, Secteur, TypeFonction, Parametrage_mail sont eux bien effacés...

Mes questions :
- Pourquoi cette erreur est-elle remontée ?
- Pourquoi les enregistrements sont bien effacés si la requête renvoie une erreur ?
- Dans cette même requête, on ne peut pas spécifier sur quelle table appliquer le DELETE ? Impossible de faire "DELETE Secteur FROM Famille JOIN Secteur ..." C'est pourtant de cette façon que fonctionne les autres moteurs SQL non ?

Bonne journée
Miembro registrado
299 mensajes
Publicado el 26,junio 2019 - 12:17
Pour ma part je ferais un delete par table et j'enfermerais le tout dans une transaction
Mensaje modificado, 26,junio 2019 - 12:18
Miembro registrado
4.361 mensajes
Publicado el 26,junio 2019 - 12:33
Bonjour,
Cela ne proviendrait-il pas des contraintes de l'analyses ("Suppression interdite s'il existe des données dans la tables reliée")

--
Il y a peut être plus simple, mais, ça tourne
Publicado el 04,julio 2019 - 16:16
Bonjour,

Pas de contraintes activées.

J'ai en effet opté pour la solution de un delete par table, mais toutes ces questions m'intriguent, je souhaitais savoir si quelqu'un avait des réponses car cela me semble être une des bases du langage SQL.
Mais bon il semble que cela soit un mystère...

Windev a beau être "pratique" il trouve ses limites très rapidement...
Miembro registrado
2.682 mensajes
Publicado el 05,julio 2019 - 09:40
HFSQL a ses raisons que la raison ne connait pas...

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
299 mensajes
Publicado el 05,julio 2019 - 09:51
Si seule la table Famille est impactée par le delete une autre solution est de faire un Select imbriqué
DELETE from Famille
where IDFamille in
(
select distinct Famille.IDFamille
FROM Famille
JOIN Secteur ON (Secteur.IDSecteur = Famille.IDSecteur)
JOIN TypeFonction ON (TypeFonction.IDSecteur = Secteur.IDSecteur)
JOIN Parametrage_mail ON (Parametrage_mail.IDSecteur = Secteur.IDSecteur)
LEFT JOIN Regle_Specif ON (Regle_Specif.IDParametrage = Parametrage_mail.IDParametrage)
WHERE Secteur.Code_Secteur = %1
)


J'utilise souvent cette approche sous SQL Serveur.
J'imagine que HFSQL la reconnait. Cela a l'avantage de vérifier le filtre avant de l'appliquer
Mensaje modificado, 05,julio 2019 - 09:52
Publicado el 05,julio 2019 - 14:45
En effet, PC SOFT ignore beaucoup la "raison" du développement malheureusement...


MICHEL a écrit :
Si seule la table Famille est impactée par le delete une autre solution est de faire un Select imbriqué
DELETE from Famille
where IDFamille in
(
select distinct Famille.IDFamille
FROM Famille
JOIN Secteur ON (Secteur.IDSecteur = Famille.IDSecteur)
JOIN TypeFonction ON (TypeFonction.IDSecteur = Secteur.IDSecteur)
JOIN Parametrage_mail ON (Parametrage_mail.IDSecteur = Secteur.IDSecteur)
LEFT JOIN Regle_Specif ON (Regle_Specif.IDParametrage = Parametrage_mail.IDParametrage)
WHERE Secteur.Code_Secteur = %1
)


J'utilise souvent cette approche sous SQL Serveur.
J'imagine que HFSQL la reconnait. Cela a l'avantage de vérifier le filtre avant de l'appliquer


Le but était bien de tout effacé...mais pourquoi lever une erreur sur le LEFT JOIN...alors qu'il ne retourne rien...juste étonnant