Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2011, 12h24   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Par défaut INSERT INTO NOT IN

Bonjour,

Je voudrais savoir si la requête que j'execute en VBA est correcte, car en effet celle-ci ne semble pas réagir (aucun message d'erreur).
Voici la fameuse requête :

Code :
1
2
3
4
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
SELECT '" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " 
FROM T_PlanningRepos WHERE DateJ NOT IN 
(SELECT DateJ FROM T_Planning WHERE idEmploye=" & req.Fields(0) & ")
Merci de votre temps et de votre aide
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h59   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
La structure de la requête semble correct (sur le plan SQL, je ne connais pas le VB).

le fait qu'il n'y ait pas de message d'erreur me semble plutôt une bonne nouvelle, non ?


Reste à savoir si elle est exécutée !
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h04   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Je pense que l'erreur viendrait des valeurs du SELECT.
En effet, ce sont des valeurs saisies est donc je pense qu'elle ne font pas partie d'une table.
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h07   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
la syntaxe

Code :
1
2
INSERT INTO ... ()
SELECT ....
est une syntaxe correcte.

Evidemment certaines règles doivent être appliquées
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h47   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
En fait, cette requête permet de remplir la table des repos en fonction de l'emploi du temps de l’employé.

Exemple

MICHEEL M. travaille le 04/07/2011 et le 06/07/2011 il aura donc comme repos les dates suivantes :
05/07/2011, 07/07/2011, 08/07/2011, 09/07/2011, 10/07/2011
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h03   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
d'accord,

mais
Citation:
Je voudrais savoir si la requête que j’exécute en VBA est correcte, car en effet celle-ci ne semble pas réagir (aucun message d'erreur).
as tu testé cette requête (sous quel SGBD ?) ? [sans le VB]

a priori elle doit fonctionner...


As tu, sous VB, lancé l’exécution de la requête ?
Si oui, les insertions sont-elles effectuées ?

Normalement ce type de requête ne renvoie aucune info à l'utilisateur (sauf erreur), ce n'est pas comme un SELECT
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h32   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
La requête est bien exécutée mais aucune valeur n'est présente dans la table désirée.
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h34   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
tu fais bien un commit ..?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h39   #9
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 085
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 085
Points : 1 883
Points : 1 883
Bonjour,
Je note que dans la clause Select, aucune colonne de la table T_Planning n'est reprise. Donc si le select renvoie plusieurs lignes, toutes auront les mêmes valeurs.
Avec un peu de chance tu as dans les colonnes insérées une clé unique, et le fait de tenter d'insérer plusieurs lignes identiques fait échouer la requête.

Commence par lancer le Select seul pour voir ce qui est renvoyé.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h44   #10
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
En fait je voudrais insérer les valeurs suivantes :

Code :
1
2
'" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & "
dans la table T_PlanningRepos en fonction du critère "NOT IN".
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 14h50   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Pour faire simple, je voudrais pouvoir faire ça :

Code :
1
2
3
4
5
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
VALUES ('" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " )
WHERE DateJ NOT IN 
(SELECT DateJ FROM T_Planning WHERE idEmploye=" & req.Fields(0) & ")
mais je sais que ce n'est pas la bonne syntaxe.

Merci encore de vos réponses
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h09   #12
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 085
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 085
Points : 1 883
Points : 1 883
Bonjour,
A tester:
Code SQL :
1
2
3
4
5
6
7
8
 
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
SELECT '" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " 
FROM dual
except
SELECT DateJ, " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " FROM T_Planning WHERE idEmploye=" & req.Fields(0) & "

Tatayo
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h16   #13
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Message d'erreur retourné :

"Erreur de syntaxe dans la clause FROM"

Merci
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h24   #14
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Citation:
Envoyé par Vetter Voir le message
Pour faire simple, je voudrais pouvoir faire ça :

Code :
1
2
3
4
5
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
VALUES ('" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " )
WHERE DateJ NOT IN 
(SELECT DateJ FROM T_Planning WHERE idEmploye=" & req.Fields(0) & ")
mais je sais que ce n'est pas la bonne synthaxe.

Merci encore de vos réponses
cette syntaxe est incorrecte, la précédente écriture l’était (voir ce lien)
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h51   #15
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Citation:
Envoyé par tatayo Voir le message
Bonjour,
A tester:
Code SQL :
1
2
3
4
5
6
7
8
 
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
SELECT '" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " 
FROM dual
except
SELECT DateJ, " & req.Fields(0) & ", 
'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " FROM T_Planning WHERE idEmploye=" & req.Fields(0) & "

Tatayo
J'ai fais une recherche et j'en ai conclu que l'erreur vient du fait que la table "DUAL" n'existe pas dans access.

Merci de ton aide
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 15h53   #16
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Citation:
Envoyé par dehorter olivier Voir le message
cette syntaxe est incorrecte, la précédente écriture l’était (voir ce lien)
Oui je sais mais j'aurais tellement voulu qu'elle soit correcte.
C'était seulement pour faire comprendre ce que je voulais.
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h02   #17
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
as tu essaye la proposition de tatayo ?

a savoir : n'utiliser que la clause SELECT pour voir ce quelle renvoie comme information ?

et voir ainsi s'il n'y a pas de doublons
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h24   #18
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
En fait, quand j’exécute le code VBA, ci dessous :

Code :
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
34
35
36
37
 
Private Sub GenRepos_Click()
 
    Dim db AS DAO.DATABASE
    Dim req, req2 AS DAO.Recordset
    Dim sql, sql2 AS String
    Dim j AS Integer
 
 
    SET db = CurrentDb()
    sql = "SELECT T_Planning.idEmploye, T_Planning.DateJ FROM T_Planning 
    WHERE T_Planning.Semaine='" & Me!NumSem.Value & "' AND T_Planning.Annee=" & Year(Me!DateD.Value)
    SET req = db.OpenRecordset(sql)
    DoCmd.SetWarnings False
 
    While NOT req.EOF
        FOR j = 0 TO 6
            IF estEnRepos(req.FIELDS(0), DateAdd("d", j, Me!DateD.Value)) = 0 Then
 
                IF req.FIELDS(1) <> DateAdd("d", j, Me!DateD.Value) Then
 
                    IF doublon(req.FIELDS(0), DateAdd("d", j, Me!DateD.Value)) = 0 Then
                        DoCmd.RunSQL ("INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
                        VALUES ('" & DateAdd("d", j, Me!DateD.Value) & "', 
                        " & req.FIELDS(0) & ", 'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & ")")
                    End IF
                Else
                    DoCmd.RunSQL ("DELETE FROM T_PlanningRepos 
                    WHERE DateJ LIKE '" & DateAdd("d", j, Me!DateD.Value) & "' AND idEmploye=" & req.FIELDS(0))
                End IF
            End IF
        Next j
        req.MoveNext
    Wend
 
    DoCmd.SetWarnings True
End Sub
celui fonctionne mais seulement si 1 employé travaille pendant un jour par semaine.
Si plus de 1 jours alors il est en repos toute la semaine.
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h37   #19
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
re

j'ai plus l'impression qu'il s'agit plus d'un problème lié à VB

la requête :
Code :
1
2
3
4
INSERT INTO T_PlanningRepos(DateJ, idEmploye, Repos, Semaine, Annee) 
SELECT '" & DateAdd("d", j, Me!DateD.Value) & "', " & req.Fields(0) & ", 'R', '" & Me!NumSem.Value & "', " & Year(Me!DateD.Value) & " 
FROM T_PlanningRepos WHERE DateJ NOT IN 
(SELECT DateJ FROM T_Planning WHERE idEmploye=" & req.Fields(0) & ")
est normalement correct

mais j'ai un doute sur :
Citation:
SET req = db.OpenRecordset(sql)
Mais je ne connais rien en VB C'est le Open qui me chagrine. normalement c'est une opération en écriture, et là cette fonction ne fait-elle pas que des choses en lecture ?

comment sont gérées les transactions (mais peut être sont elles implicites )
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 16h43   #20
Invité de passage
 
Inscription : janvier 2011
Messages : 40
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 40
Points : 4
Points : 4
Le "Open" est seulement utilisé pour la sélection.
Pour les insertion, les delete, etc on utilise DoCmd.RunSQL( " ... ")
Vetter est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h48.


 
 
 
 
Partenaires

Hébergement Web