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

VBA Access Discussion :

Requête SQL à partir du VBA via recordset


Sujet :

VBA Access

  1. #1
    Membre averti
    Homme Profil pro
    Business analyste sur une BDD
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Business analyste sur une BDD

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Par défaut Requête SQL à partir du VBA via recordset
    Bonjour,

    Je m'adresse enfin directement à ce forum, car pour une fois, je n'arrive pas à trouver mon erreur avec les différentes discussion que j'ai lues. Je dois sûrement louper quelque chose de gros.

    Je souhaite remplir une table via VBA grâce à un formulaire. Mes requêtes fonctionnent (quand je l'ai copie-colle dans la fenêtre SQL ACCESS, elles me renvoient ce que je veux). Mais soit je n'arrive pas à me servir correctement du recordset, soit... Je sais pas : Bref, voici le code.

    L'erreur apparaît sur le rsTDataAbs.Update me disant que je n'ai pas de valeur sur mon champ TDataAbs.TShiftName.
    C'est bien le cas, et je n'ai pas de valeur non plus pour les autres requêtes ouvertes avec le "openrecordset".

    Le problème est donc sur la fin du code, je pense. Au niveau de ce fameux openrecordet

    Je pensais au début que ma requête était mauvaise, mais après l'avoir testé directement dans ACCESS, je n'ai pas l'impression que cela vienne de là.



    Petites précisions :
    Le but est de saisir des congés.
    Chaque opérateur est dans une équipe, chaque équipe a un planning différent avec des temps de travail qui peuvent être différents



    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Private Sub Validationconges_Click()
     
    Dim rsTDataAbs As DAO.Recordset
    Dim LgNbLignes  As Long
    Dim RequeteJrTravailleEquipe As String
    Dim Postedujourtravaille As String
    Dim Duration As String
    Dim Shop1 As String
    Dim i As Integer
    Dim CodeOperateur As String
     
    Set db = CurrentDb()
    Set rsTDataAbs = db.OpenRecordset("TDataAbs", dbOpenDynaset)
     
    RequeteJrTravailleEquipe = "SELECT TShiftCalendar.TShiftCalDate As TShiftCalDate FROM TShiftCalendar, TOpTeam WHERE (((TOpTeam.TOPCode)=" & "'" & Me.TOpCode & "'" & ") AND ((TOpTeam.TTeamId)=[TShiftCalendar].[TTeamId]) AND ((TOpTeam.TOPTEamStartDate)<TShiftCalendar.TShiftCalDate) AND ((TOpTeam.TOPTeamEndDate)>TShiftCalendar.TShiftCalDate));"
     
    Set rcs = db.OpenRecordset(RequeteJrTravailleEquipe)
     
    With rcs
       If Not .EOF Then
          'récupération du nombre d'enregistrements https://www.developpez.net/forums/d446953/logiciels/microsoft-office/access/vba-access/affecter-resultat-d-requete-variable/
          .MoveLast
          .MoveFirst
          LgNbLignes = .RecordCount
          JrTravailleEquipedate = .GetRows(LgNbLignes)
       End If
    End With
     
    ' parcours de chaque ligne et entrer dans la boucle if pour celles correspondants à un jour travaillé par l'équipe dans la période
    For i = 0 To LgNbLignes - 1
    If JrTravailleEquipedate(0, i) <= Me.DateFin And JrTravailleEquipedate(0, i) >= Me.DateDebut Then
    JrTravailleEquipe = CStr(JrTravailleEquipedate(0, i))
     
    CodeOp = Me.TOpCode
     
    Postedujourtravaille = "SELECT TShiftCalendar.TShiftName FROM TShiftCalendar, TOPTeam WHERE (((TOPTeam.TOPCode)=" & "'" & CodeOp & "'" & ") AND ((TOPTeam.TTeamId)=[TShiftCalendar].[TTeamId]) AND ((TShiftCalendar.TShiftCalDate)=" & "#" & JrTravailleEquipe & "#" & "));"
     
    Duration = "SELECT TShiftCalendar.TShiftCalOpenTime FROM TShiftCalendar,  TOPTeam WHERE TOPTeam.TOPCode = " & "'" & CodeOp & "'" & " AND TOpTeam.TTeamId= TShiftCalendar.TTeamId AND TShiftCalendar.TShiftCalDate=" & "#" & JrTravailleEquipe & "#" & ";"
     
    Shop1 = "SELECT TShiftCalendar.TShop1Name FROM TShiftCalendar,  TOPTeam WHERE TOPTeam.TOPCode = " & "'" & CodeOp & "'" & " AND TOpTeam.TTeamId= TShiftCalendar.TTeamId AND TShiftCalendar.TShiftCalDate=" & "#" & JrTravailleEquipe & "#" & ";"
     
     
    rsTDataAbs.AddNew
    rsTDataAbs![TDataAbsDate] = JrTravailleEquipedate(0, i)
    rsTDataAbs![TOpCode] = Me.TOpCode
    rsTDataAbs![TShiftName] = CurrentDb.OpenRecordset(Postedujourtravaille, dbOpenSnapshot)
    rsTDataAbs![TShop1Name] = CurrentDb.OpenRecordset(Shop1, dbOpenSnapshot)
    rsTDataAbs![TAbsCode] = Me.TAbsCode
    rsTDataAbs![TDataAbsDuration] = CurrentDb.OpenRecordset(Duration, dbOpenSnapshot)
    rsTDataAbs![TDataAbsComment] = Me.TDataAbsComment
    rsTDataAbs![TDataAbsLocked] = False
     
    rsTDataAbs.Update
     
    End If
    Next
     
    MsgBox "Période de congés saisie"
     
    rcs.Close
    rsTDataAbs.Close
    Set rcs = Nothing
    Set rsTDataAbs = Nothing
    Erase JrTravailleEquipe
     
     
    End Sub
    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 940
    Par défaut
    Bonsoir,
    un RecordSet renvoie un jeu de données c'est à dire un ensemble de lignes d'enregistrements, pas une valeur à insérer dans un champ, c'est comme si tu essayais de mettre le contenu d'une table dans un champ.
    il faut passer pas une variable qui serait du même type que ton champ à mettre à jour, ou au moins de type Variant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    Dim vPostedujourtravaille as variant
    dim oRst1 as recordset
    set orst1 = CurrentDb.OpenRecordset(Postedujourtravaille, dbOpenSnapshot)
    	if not orst1.EOF then vPostedujourtravaille = orst1.Fields(0)
    ...	
    rsTDataAbs![TShiftName] = vPostedujourtravaille 
    ...
    J'espère au moins que chaque recordset ne renvoie qu'une seule valeur, du coup, ne serait-il pas plus simple de passer pas Dlookup en créant au préalable une requête enregistrée (car il y a plusieurs tables) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dlookup("TShiftName", "requeteAvecTShiftCalendaretTopTeam", "TOPCode='"  CodeOp & "' AND TShiftCalDate=#" & JrTravailleEquipe & "#")

  3. #3
    Membre averti
    Homme Profil pro
    Business analyste sur une BDD
    Inscrit en
    Août 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Business analyste sur une BDD

    Informations forums :
    Inscription : Août 2017
    Messages : 13
    Par défaut Merci
    Merci,

    Je pensais que vu qu'il n'y avait qu'un seul résultat à ma requête, je n'aurais pas ce problème là : raté.

    Je vais continuer de passer par des recordset parce que je n'ai pas envie de multiplier le nombre de requêtes ACCESS. Mais si on était que sur une table, c'est vrai que le DlookUp aurait été bien mieux adapté

    Sujet résolu

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

Discussions similaires

  1. Requête SQL UPDATE dans VBA
    Par Pingouin22 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 23/09/2022, 10h37
  2. Requête SQL dans un CL via Query Manager
    Par nourdine8 dans le forum AS/400
    Réponses: 10
    Dernier message: 13/11/2007, 13h15
  3. exécuter deux requêtes SQL à partir d'un bouton de commande
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/12/2006, 17h57
  4. Réponses: 2
    Dernier message: 24/08/2006, 11h02
  5. Fabriquer des requêtes sql à partir d'un document xml
    Par ktel dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 16h45

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