1
votes

Accès VBA en utilisant le jour ouvrable suivant (semaine)

J'essaie d'écrire une fonction qui remplit le jour ouvrable suivant (à l'exclusion des week-ends) dans un champ [DateCreated] d'un enregistrement. J'essayais de configurer quelque chose comme ceci:

Public Sub EndofDay_Click()
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim nConfirmation As Integer

    nConfirmation = MsgBox("Are you sure you want to complete this Task?", vbInformation + vbYesNo, "Complete Task?")
If nConfirmation = vbYes Then
'Copy Records with Status of 10 In Progress
Set rs1 = CurrentDb.OpenRecordset("tblTasks")
Set rs2 = CurrentDb.OpenRecordset("tblTasks")

rs1.MoveFirst
If Not (rs1.EOF And rs1.BOF) Or Status = 10 Then
Do Until rs1.EOF = True
    If (rs1![Status] = 10) Then
       With rs2
            .AddNew
            ![DateCreated] = WD '<---- Here
            .Update
       End With
    End If
    rs1.MoveNext
Loop
Else
'do nothing
End If

rs1.Close 'Close the recordset
Set rs1 = Nothing 'Clean up
rs2.Close 'Close the recordset
Set rs2 = Nothing 'Clean up

Forms![frmTasks].Form.Requery
Forms![frmTasks].Form.Refresh
End sub

Mais j'obtiens un argument non une erreur facultative en essayant de l'appeler.

J'utilise ce qui suit pour coder pour le récupérer:

Function WD()

'Monday
If [DateCreated] = DateAdd("d", (8 - Weekday(Date, 2))) Then '<---Debug hates this line
[DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 3)) Mod 7, Date)
'Tuesday
ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 3))) Then
[DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 4)) Mod 7, Date)
'Wednesday
ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 4))) Then
[DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 5)) Mod 7, Date)
'Thursday
ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 5))) Then
[DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 6)) Mod 7, Date)
'Friday
ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 6))) Then
[DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 2)) Mod 7, Date)
End If
End Function

Je ne suis même pas sûr que ce soit la meilleure façon d'essayer ce. Toute aide serait grandement appréciée!


3 commentaires

Weekday est déjà une fonction intégrée. Essayez de changer le nom de votre fonction.


Merci! essayé mais obtenir la même erreur.


Pourriez-vous mettre à jour votre code pour montrer ce que vous avez essayé? Vous rencontrez peut-être plus d'un problème, mais le nom de la fonction est définitivement un problème en soi.


3 Réponses :


2
votes

DateAdd prend trois arguments et vous n'en passez que deux. Le troisième argument est la date avec laquelle vous commencez.

Une fonction est conçue pour renvoyer une valeur. Généralement, vous passez un ou plusieurs arguments, puis vous attribuez le nom de la fonction au résultat et c'est ce que la fonction renvoie. Comme l'a dit @Josh Eller, Weekday est déjà un nom de fonction. Vous pouvez toujours l'utiliser, mais c'est probablement mieux si vous ne le faites pas.

Voici une façon d'écrire une fonction qui retournera le jour ouvrable suivant. Il prend une date comme argument, puis ajoute le nombre approprié de jours en fonction du jour de la semaine où la date passée est.

![DateCreated] = NextBusDay(![DateCreated])

Vous pouvez l'appeler comme p>

![DateCreated] = NextBusDay(Date)

si vous souhaitez obtenir le prochain rendez-vous professionnel après aujourd'hui. ou

Function NextBusDay(ByVal dtStart As Date)

    Dim lAdder As Long

    lAdder = 1

    If Weekday(dtStart) = 6 Then lAdder = lAdder + 2
    If Weekday(dtStart) = 7 Then lAdder = lAdder + 1

    NextBusDay = dtStart + lAdder

End Function

si vous souhaitez remplacer le champ DateCréée par la prochaine date commerciale après la date qui s'y trouve déjà.


1 commentaires

Merci pour cela fonctionne parfaitement! Je pensais qu'il devrait y avoir un moyen plus simple de le faire.



0
votes

Vous étiez proche de votre logique, mais vous avez omis l'argument de date pour la fonction DateAdd , et vous avez également tenté de redéfinir la fonction Weekday intégrée existante.

Au lieu de cela, vous pouvez condenser la logique comme suit:

Function NextWorkingDay(datDate As Date) As Date
    Dim i As Integer: i = Weekday(datDate)
    If i < 6 Then i = 8
    NextWorkingDay = datDate + 9 - i
End Function

Ici, si le jour de la semaine de la date fournie (à partir du dimanche) est supérieur à 5 (c'est-à-dire si le jour est vendredi ou samedi) la fonction ajoutera 3 jours pour vendredi et 2 jours pour samedi, sinon 1 jour sera ajouté à la date.

Cela pourrait aussi s'écrire:

Function NextWorkingDay(datDate As Date) As Date
    If Weekday(datDate) > 5 Then
        NextWorkingDay = datDate + 9 - Weekday(datDate)
    Else
        NextWorkingDay = datDate + 1
    End If
End Function


1 commentaires

Merci! Je vais essayer ça. Je sais qu'il existe de meilleures façons de faire ce que j'essayais de faire, mais comme je suis autodidacte, j'apprends toujours toutes les façons de faire ces fonctions.



0
votes

Envisagez une solution SQL pure qui peut être appelée avec DoCmd.OpenQuery . Ce faisant, vous pouvez éviter les appels de jeux d'enregistrements multiples imbriqués. Ci-dessous met à jour le champ d'origine DateCreated en ajoutant les jours nécessaires si la date arrive le vendredi-dimanche (tous en supposant que lundi début de jour de la semaine ), sinon ajoute un seul jour.

SQL

Public Sub EndofDay_Click()
    Dim nConfirmation As Integer

    nConfirmation = MsgBox("Are you sure you want to complete this Task?", _
                           vbInformation + vbYesNo, "Complete Task?")

    If nConfirmation = vbYes Then    
        DoCmd.SetWarnings False
        DoCmd.OpenQuery "myUpdateQuery"
        DoCmd.SetWarnings True
    End If
End Sub

UPDATE tblTasks
SET DateCreated = IIF(WeekDay(DateCreated, 1) = 5, DateAdd('d', 3, DateCreated), 
                      IIF(WeekDay(DateCreated, 1) = 6, DateAdd('d', 2, DateCreated), 
                           IIF(WeekDay(DateCreated, 1) = 7, DateAdd('d', 1, DateCreated), 
                               DateAdd('d', 1, DateCreated)
                               ) 
                         )
                  )


2 commentaires

Merci! J'apprends toujours à utiliser SQL et à l'intégrer dans VBA.


Vous ne savez pas ce que vous voulez dire car vous n'avez pas besoin d'utiliser SQL dans le code de tentative. Remarque: les requêtes stockées s'exécutent souvent plus efficacement que la chaîne VBA SQL car le moteur d'accès enregistre le meilleur plan d'exécution et aucun jeu d'enregistrements n'est ouvert ici.