Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ecrire en SQL

5 réponses
Avatar
Michel B
Bonjour,

J'ai une requéte ajout a introduire dans du VBA, ne sachant pas ecrire en
SQL
d'habitude je fais la requéte classique puis, en copie le code SQL dans une
macro "executer SQL' et enfin
j'enregistre la macro en "module" qui me génére le code correspondant.

DoCmd.RunSQL bla bla bla

Cela marche très bien.

Cette fois le code SQL de la requéte est trop long pour une macro, je ne
peux donc pas générer le code et ne sais pas l'écrire en direct.

INSERT INTO TEMP ( maxi )
SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence
FROM Année_Adherent
GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure
HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison]) AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));


Si l'un d'entre vous pouvais ce pencher dessus.

D'avance merci

Michel

5 réponses

Avatar
Fabien
Michel B a écrit :
Bonjour,

J'ai une requéte ajout a introduire dans du VBA, ne sachant pas ecrire en
SQL
d'habitude je fais la requéte classique puis, en copie le code SQL dans une
macro "executer SQL' et enfin
j'enregistre la macro en "module" qui me génére le code correspondant.

DoCmd.RunSQL bla bla bla

Cela marche très bien.

Cette fois le code SQL de la requéte est trop long pour une macro, je ne
peux donc pas générer le code et ne sais pas l'écrire en direct.

INSERT INTO TEMP ( maxi )
SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence
FROM Année_Adherent
GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure
HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison]) AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));


Si l'un d'entre vous pouvais ce pencher dessus.

D'avance merci

Michel




Salut
Passe directement dans le module Vba et ecris ta Sub
Sub Masub()
Docmd.runsql "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING
((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison]) AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
end Sub
et voilà ;-)
Avatar
Michel B
Bonjour Fabien
et marci pour le coup de main.
Cela fonctionne, mais ......

Le numéro renvoyé aprés le 0015 est le 16 et il me le faut sur 4 chiffres
0015, 0016, 0017 etc.
J'ai remplacé ([maxi] LONG) par ([maxi] String) cela n'a rien changé.
que doit t'on modifier dans la code pour cela ?
Il faut que je te dise que le code résultant est une adaptation d'une
récupération.

Encore merci

-------------------------------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("maxi", "temp") + 1
Else
'attribution d'un numéro de licence par défaut
Lic.Value = 1
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
Resume Next
End If
End Sub




"Fabien" a écrit dans le message de news:


Salut
Passe directement dans le module Vba et ecris ta Sub
Sub Masub()
Docmd.runsql "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING ((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
end Sub
et voilà ;-)


Avatar
Fabien
Pour ma part je jouerais avec la commande format([Nomduchamp],"0000")
pour l'affichage. Peu importe comment c'est stocké dans la table,
l'essentiel c'est qu'a l'affichage tu retrouves le format qui te plait

Michel B a écrit :
Bonjour Fabien
et marci pour le coup de main.
Cela fonctionne, mais ......

Le numéro renvoyé aprés le 0015 est le 16 et il me le faut sur 4 chiffres
0015, 0016, 0017 etc.
J'ai remplacé ([maxi] LONG) par ([maxi] String) cela n'a rien changé.
que doit t'on modifier dans la code pour cela ?
Il faut que je te dise que le code résultant est une adaptation d'une
récupération.

Encore merci

-------------------------------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("maxi", "temp") + 1
Else
'attribution d'un numéro de licence par défaut
Lic.Value = 1
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
Resume Next
End If
End Sub




"Fabien" a écrit dans le message de news:


Salut
Passe directement dans le module Vba et ecris ta Sub
Sub Masub()
Docmd.runsql "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING ((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
end Sub
et voilà ;-)






Avatar
Michel B
Ca marche,

Je l'ai fais passer par une table intermédiaire et cela fonctionne impec.
Encore merci pour l'aide

Cordialement
Michel

PS : le code définitif

------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
DoCmd.RunSQL "SELECT Format([number1],""0000"") AS [Number], [Maxi]+1 AS
Number1 INTO TEMP1 FROM TEMP; ", -1

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("Number", "temp1")
Else
'attribution d'un numéro de licence par défaut
Lic.Value = "0001"
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
DoCmd.RunSQL "DELETE * FROM TEMP1"
Resume Next
End If
End Sub




"Michel B" a écrit dans le message de news:
4857beac$0$6059$
Bonjour Fabien
et marci pour le coup de main.
Cela fonctionne, mais ......

Le numéro renvoyé aprés le 0015 est le 16 et il me le faut sur 4 chiffres
0015, 0016, 0017 etc.
J'ai remplacé ([maxi] LONG) par ([maxi] String) cela n'a rien changé.
que doit t'on modifier dans la code pour cela ?
Il faut que je te dise que le code résultant est une adaptation d'une
récupération.

Encore merci

-------------------------------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("maxi", "temp") + 1
Else
'attribution d'un numéro de licence par défaut
Lic.Value = 1
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
Resume Next
End If
End Sub




"Fabien" a écrit dans le message de news:


Salut
Passe directement dans le module Vba et ecris ta Sub
Sub Masub()
Docmd.runsql "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING ((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
end Sub
et voilà ;-)






Avatar
Fabien
Michel B a écrit :
Ca marche,

Je l'ai fais passer par une table intermédiaire et cela fonctionne impec.
Encore merci pour l'aide

Cordialement
Michel

PS : le code définitif

------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
DoCmd.RunSQL "SELECT Format([number1],""0000"") AS [Number], [Maxi]+1 AS
Number1 INTO TEMP1 FROM TEMP; ", -1

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("Number", "temp1")
Else
'attribution d'un numéro de licence par défaut
Lic.Value = "0001"
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
DoCmd.RunSQL "DELETE * FROM TEMP1"
Resume Next
End If
End Sub




"Michel B" a écrit dans le message de news:
4857beac$0$6059$
Bonjour Fabien
et marci pour le coup de main.
Cela fonctionne, mais ......

Le numéro renvoyé aprés le 0015 est le 16 et il me le faut sur 4 chiffres
0015, 0016, 0017 etc.
J'ai remplacé ([maxi] LONG) par ([maxi] String) cela n'a rien changé.
que doit t'on modifier dans la code pour cela ?
Il faut que je te dise que le code résultant est une adaptation d'une
récupération.

Encore merci

-------------------------------------

Private Sub Actif_AfterUpdate()

On Error GoTo err_Actif_AfterUpdate

If Actif.Value And IsNull(Lic.Value) Then
DoCmd.SetWarnings False
DoCmd.RunSQL "CREATE TABLE TEMP ([maxi] LONG)"
DoCmd.RunSQL "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING (((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"

If Not IsNull(DLookup("maxi", "temp")) Then
'attribution d'un numéro d'Attestation par incrémentation
Lic.Value = DLookup("maxi", "temp") + 1
Else
'attribution d'un numéro de licence par défaut
Lic.Value = 1
End If

DoCmd.RunSQL " DROP TABLE TEMP"
DoCmd.SetWarnings True
Else
'rien
End If

Exit Sub

err_Actif_AfterUpdate:

If Err = 3376 Then
Resume Next
ElseIf Err = 3010 Then
DoCmd.RunSQL "DELETE * FROM TEMP"
Resume Next
End If
End Sub




"Fabien" a écrit dans le message de news:


Salut
Passe directement dans le module Vba et ecris ta Sub
Sub Masub()
Docmd.runsql "INSERT INTO TEMP ( maxi ) " & _
"SELECT Max(Année_Adherent.N°Licence) AS MaxDeN°Licence " & _
"FROM Année_Adherent " & _
"GROUP BY Année_Adherent.Saison, Année_Adherent.N°Structure " & _
"HAVING ((Année_Adherent.Saison)=[Formulaires]![Accueil]![Saison])
AND
((Année_Adherent.N°Structure)=[Formulaires]![Structures]![Sous_AdherentsActif].[Form]![N°Structure]));"
end Sub
et voilà ;-)









Merci pour le retour,
Bon courage ;-) pour la suite ..