Comment tester un jour de la semaine par rapport à une date

rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015 - 8 oct. 2010 à 13:34
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015 - 11 oct. 2010 à 15:34
Bonjour,

j'épères que me trompe pas de forum
Autrement, notre ami Jack vas me gronder

Actuellement dans mon code j'ai la ClauseWHERE suivante:
Select Case Me.TypeTraitement
Case 1
'Si la date à laquelle l'ADV à saisi le nouveau délai client (v Date derniere modification des dates accuses) est > à
'la date d'envoi de l'info par la production à l'ADV (Date du jour)
'Et si la NouvelleDate  n'est pas null
'Et si la NouvelleDate (plus 2 jours) est > à (v Date modifiée accusé depart)
'Le nouveau délai doit être traité par l'ADV
ClauseWHERE = ClauseWHERE & "And [v Date derniere modification des dates accuses] < [Date du jour]  AND NouvelleDate is not null AND NouvelleDate + 2 > [v Date modifiée accusé depart]"
Case 2
ClauseWHERE = ClauseWHERE & "And NouvelleDate Is Null"
End Select



J'aimerai effectuer les test suivants, sur la NouvelleDATE:
Si c'est un lundi, mardi, mercredi ==> NouvelleDate + 2
Si c'est un jeudi, vendredi ==> NouvelleDate + 4
Si c'est un samedi ==> NouvelleDate + 3
Il y a la fonction WeekDay, mais je coince sur la façon de l'utiliser dans le code.

Puis, comment effectuer le même test sur des jours ferriés.

Merci de votre aide
Christian

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 oct. 2010 à 15:10
Je veille, je veille ...

Quel type de base de donnée ?
WeekDay te renverra un chiffre de 1 à 7, le 1 étant le lundi à condition de préciser dans la syntaxe que les semaines commencent le lundi (vbMonday = 2).

Where (   ((WeekDay(NouvelleDATE, 2) Between 1 and 3) And 
                  (DateAdd("d", 2, NouvelleDate) > [v Date modifiée...]))
       Or ((WeekDay(NouvelleDATE, 2) Between 4 and 5) And 
                  (DateAdd("d", 4, NouvelleDate) > [v Date modifiée...]))
       Or ((WeekDay(NouvelleDATE, 2) = 6) And 
                  (DateAdd("d", 3, NouvelleDate) > [v Date modifiée...])) )
A tester

Attention aussi à vérifier les espaces obligatoires devant un mot comme And (je vois que tu fais ClauseWHERE = ClauseWHERE & "And ...)
Il faut, soit l'ajouter devant le And, soit s'assurer qu'il y en ait un à la fin de la précédente syntaxe définissant ClauseWHERE

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
8 oct. 2010 à 16:51
Salut Jack,

Je vois que tu veille et fidèle au poste.

Quel type de base de donnée ?

C'est une bd Access.
Merci pour ta réponse et tes conseils.
J'effectue le test et je te tiens au courant.
j'aurai sûrement un autre post, mais avant je vais essayer de m'en sortir.

Bonne soirée
Christian
0
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
8 oct. 2010 à 19:05
Ça bloque ici:
(DateAdd("d", 2, NouvelleDate)


Erreur de compilation, Attendu: fin d'instruction
J'ai testé en déclarant une variable intervallejour, et la aussi ça bloque.


vala, vala

Christian
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 oct. 2010 à 00:03
Que met-on pour encadrer des textes en SQL ?
Pas de " mais des '
C'était pour voir si tu suivais (désolé, je n'y ai pas pensé)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
9 oct. 2010 à 09:13
Bonjour Jack,

Ne sois pas désolé.
Pour suivre, j'essaye. Cela fait 3 mois que je travaille sur Access.
Bref, avec vos conseils et les tutos j'avance.

Pour revenir sur la requête, j'ai un msg erreur 3075 "Trop d'expressions..."
Comment faire pour te faire parvenir une copie du message?

@+ et merci

Christian
0
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
9 oct. 2010 à 09:32
J'ai oublié de te dire que j'ai testé ce code suivant:
ClauseWHERE = ClauseWHERE & " And iif(Weekday(NouvelleDate)<=4,NouvelleDate +2,iif(Weekday(NouvelleDate)<=6,NouvelleDate +4,iif(Weekday(NouvelleDate)>6,NouvelleDate +3,NouvelleDate))) > [v Date modifiée accusé depart]"

Mais, j'ai des doutes sur son fonctionnement.
Il me semble qu'il bypass le test, car quand j'effectue l'extraction des données le test n'est pas effectué.
Il faudrait que je revoie cette extraction (surement un autre post, car c'est là que je galère)
Qu'en penses-tu?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 oct. 2010 à 14:43
Pense à utiliser les retours à la ligne dans tes codes :
Truc = Truc & "mon texte très " & _
              "long, voire " & _
              "très très long" & _
              "Maxi : 21 séparateurs _ dans une chaine"
Cela rendra lisible ton code sans être obligé de se déplacer latéralement.

Pas sûr que IIf soit accepté à l'intérieur d'une requète SQL.

Dans ton cas, je pense qu'il va falloir penser à faire 3 requètes distinctes, pour la simplification.
Cela te donnera 3 RecordSet, certes, mais tout dépend ce que tu fais des résultats ensuite.

Méfie-toi aussi des dates : Elles sont stockées au format US par défaut, et le moteur SQL vérifiera toujours si le format fourni peut représenter une date US, sinon, il basculera dans la date régionale, mais gare aux dates de début d'année combinés aux 12 premiers jours (qu'il confondra allégrement avec les mois)
Moultes questions du forum parlent des dates en SQL, avec diverses solutions.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 oct. 2010 à 14:47
PS : Tu utilises Weekday sans lui préciser le premier jour de la semaine : méfie-toi du résultat renvoyé (qui sera lui aussi décalé)
Sans ce paramètre, Dimanche est le chiffre 1.
0
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
10 oct. 2010 à 11:02
Bonjour Jack,

Ça plante toujours.
Pb de syntaxe ou trop d'expressions dans la clauseWHERE de WeekDay
Entre les (( )) je m'y perds.
Ci-dessous le code complet:
Public Sub RefreshQuery()

'Public car appel extérieur (frmMàJ)
Dim sql As String, ClauseWHERE As String


sql = "SELECT tblSauvegardeTraitementCauseRetard.* FROM tblSauvegardeTraitementCauseRetard"
 'Aménager la clause Where
If Not Me.chkVArLigne Then
   ClauseWHERE = ClauseWHERE & "And [vAr-ligne] like '*" & Me.txtVArLigne & "*' "
End If
If Not Me.chkVRefClient Then
    ClauseWHERE = ClauseWHERE & "And vrefclientLigne  like '*" & Me.txtVRefClient & "*' "
End If

If Not Me.chkClient Then
    ClauseWHERE ClauseWHERE & "And Client '" & Me.cmbClient & "' "
End If
If Not Me.chkADV Then
    ClauseWHERE ClauseWHERE & "And [v representant] '" & Me.cmbADV & "' "
End If
If Not Me.chkOF Then
    ClauseWHERE ClauseWHERE & "AND OF '" & Me.cmbOF & "' "
End If
Select Case Me.TypeTraitement
Case 1
'Si la date à laquelle l'ADV à saisi le nouveau délai client (v Date derniere modification des dates accuses) est > à
'la date d'envoi de l'info par la production à l'ADV (Date du jour)
'Et si la NouvelleDate  n'est pas null
'Et si la NouvelleDate  est > à (v Date modifiée accusé depart)
'Le nouveau délai doit être traité par l'ADV
ClauseWHERE = ClauseWHERE & " And [v Date derniere modification des dates accuses] < [Date du jour]  AND NouvelleDate is not null"
'Test sur la NouvelleDate: + 2 jours si c'est un lundi, mardi, mercredi
'''''''''''''''''''''''''''+ 4 jours si c'est jeudi et vendredi
'''''''''''''''''''''''''''+ 3 jours si c'est un samedi
'ClauseWHERE = ClauseWHERE & " And iif(Weekday(NouvelleDate)<=4,NouvelleDate +2,iif(Weekday(NouvelleDate)<=6,NouvelleDate +4,iif(Weekday(NouvelleDate)>6,NouvelleDate +3,NouvelleDate))) > [v Date modifiée accusé depart]"
ClauseWHERE = ClauseWHERE & " AND ( ((WeekDay(NouvelleDate, 2) Between 1 and 3) And" & _
                                        " (DateAdd('d', 2, NouvelleDate) > [v Date modifiée accusé depart]))" & _
                        " Or ((WeekDay(NouvelleDATE, 2) Between 4 and 5) And" & _
                                        " (DateAdd('d', 4, NouvelleDate) > [v Date modifiée accusé depart]))" & _
                        " Or ((WeekDay(NouvelleDate, 2) = 6) And" & _
                                        " (DateAdd('d', 3, NouvelleDate) > [v Date modifiée accusé depart])) )"
Case 2
ClauseWHERE = ClauseWHERE & " And NouvelleDate Is Null"
End Select

If Len(ClauseWHERE) = 0 Then
GoTo AménagerLaQueueSQL
Else
   ' supprimer le 1er And et Aménager la tête de clause
   ClauseWHERE = " Where " & Right(ClauseWHERE, Len(ClauseWHERE) - 3)
sql = sql & ClauseWHERE
End If
AménagerLaQueueSQL:
sql = sql & ";"
Debug.Print sql
                      
Me.Sfrm.Form.RecordSource = sql

Me.Sfrm.Form.Refresh

End Sub


j'ai remis les guillemets ouvrantes et fermantes comme toi, et ça à l'air de correspondre.
Depuis hier, j'essaye de comprendre pourquoi ça fonctionne pas.
Dur, dur

Merci d'avance

Christian
0
rch05 Messages postés 32 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 5 mars 2015
11 oct. 2010 à 15:34
Salut Jack,

J'ai résolu mon PB.

je suis resté avec la sytaxe suivante:
ClauseWHERE = ClauseWHERE & " And iif(Weekday(NouvelleDate)<=4,NouvelleDate +2,iif(Weekday(NouvelleDate)<=6,NouvelleDate +4,iif(Weekday(NouvelleDate)>6,NouvelleDate +3,NouvelleDate))) > [v Date modifiée accusé depart]"

Elle fonctionne très bien.
Je ne suis pas arrivé à faire fonctionner la tienne.

Merci de ton aide, de tes conseils et de ta patience

Christian
0
Rejoignez-nous