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

Requete SQL SERVER et paramètres

3 réponses
Avatar
rdautin
Bonjour à tous
un petit pb surement idiot mais ...
Pour passer des parametres à une requete, j'utilise depuis des annes la
combine suivante :
dans un module par exemple :
Public mavariable as string
puis une petite fonction:
public function get_mavariable()
get_mavariable=mavariable
end function
Ensuite c'est tout simple, en paramètre de la requête on met comme critère
get_mavariable() on renseigne la variable et le tour est joué.
Ca permet notamment d'utiliser la même requête n'importe où dans l'appli.

C'est également valable si on écrit du code sql, par exemple dans un
formulaire
mavariable=me!codcli
me.recordsource="select * from factures where codeclient=get_mavariable()"
Donc très pratique

Il suffit à chaque fois de renseigner la variable

Bon, le petit cours etant terminé, j'ai basculé une appli vers SQLServer.
Et là gros pb la petite combine ne fonctionne pas
Après moult recherches, je ne trouve pas la simplissime solution
Quelq'un peut-il m'aider ?

3 réponses

Avatar
J-Pierre
Bonsoir,

Je crois que la bonne solution est d'utiliser une procédure stockée. C'est plus sûr, et l'exécution est plus rapide. Vu
l'exemple que tu donnes, il me semble que tu devrais modifier ton appli: Dans ton formulaire principal, mettre un
sous-formulaire. Dans le sous-formulaire, mettre comme source une procédure stockée, passer les paramètres par la propriété
Input Parameters, exemple:
@codeClient int = [Forms]![MonForm]![code_client], @refClient varchar(20) = [Forms]![MonForm]![reference_client]
Evidemment, les paramètres définis ici doivent correspondre à ceux définis dans la procédure stockée.
Et faire des Me.MonSousForm.Requery.

Il y a tout un chapitre dans l'aide en ligne, à lire impérativement.

Voilà aussi en VBA un exemple d'appel à une procédure stockée et le début de la procédure stockée elle-même. Cette procédure
stockée en exécute plein d'autres, comme c'était un peu long, j'ai ai enlevé une grande partie, j'espère que ça restera clair
:-)

J-Pierre
__________________________________________________________________
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
cnn.BeginTrans
DoCmd.Hourglass True

/*..........plein de trucs qui justifient le BeginTrans

cnn.Errors.Clear

Dim cmd As New ADODB.Command
Dim retCode As ADODB.Parameter, retMess As ADODB.Parameter, noProjet As ADODB.Parameter
Dim PMQparm As ADODB.Parameter, BATparm As ADODB.Parameter, LIVparm As ADODB.Parameter

' Set up a command object for the stored procedure.
Set cmd.ActiveConnection = cnn
cmd.CommandText = "P007_creationDossier"
cmd.CommandType = adCmdStoredProc

' Set up a return parameter.
Set retCode = cmd.CreateParameter("Return", adInteger, adParamReturnValue)
cmd.Parameters.Append retCode

' Set up an output parameter.
Set retMess = cmd.CreateParameter("Output", adVarChar, adParamOutput, 200)
cmd.Parameters.Append retMess

' Set up an input parameter.
Set noProjet = cmd.CreateParameter("Input", adInteger, adParamInput)
cmd.Parameters.Append noProjet
noProjet.Value = Me.T001_no_projet

' Set up an input parameter.
Set PMQparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append PMQparm

If Not IsNull(Me.PMQdate) And Me.PMQdate <> "" Then
PMQparm.Value = ConvDateUS(Me.PMQdate)
Else
PMQparm.Value = Null
End If

' Set up an input parameter.
Set BATparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append BATparm
BATparm.Value = ConvDateUS(Me.BATdate)

' Set up an input parameter.
Set LIVparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append LIVparm
LIVparm.Value = ConvDateUS(Me.LIVdate)

On Error Resume Next
cmd.Execute
On Error GoTo 0

If retCode = 0 Then
DoCmd.Hourglass False
cnn.CommitTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Nouveau dossier ouvert", vbOKOnly, "CRÉATION D'UN DOSSIER"
Else
DoCmd.Hourglass False
cnn.RollbackTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Erreur pendant la création du dossier" & vbCrLf & _
" code retour : " & retCode & vbCrLf & _
" message d'erreur: " & retMess
Exit Sub
End
_______________________________________________________________
Alter PROCEDURE P007_creationDossier
@outmess varchar(200) OUTPUT, @noProjet int,
@PMQparm datetime , @BATparm datetime , @LIVparm datetime
AS

DECLARE @retCode INT
SET @retCode = 0
SET @outmess = ''

/*----------------------------------------------T020_infographie-------------------------------------------------------- */
EXEC @retCode = P007_T020_infographie$new @noProjet = @noProjet,
@PMQparm = @PMQparm, @BATparm = @BATparm, @LIVparm = @LIVparm

IF @retCode <> 0
BEGIN
SET @outmess = 'Error while creating project ' + CONVERT(varchar(9), @noProjet) + ' into "T020_infographie".'
RETURN @retCode
END

/* etc.........
____________________________
"rdautin" a écrit dans le message de news:

Bonjour à tous
un petit pb surement idiot mais ...
Pour passer des parametres à une requete, j'utilise depuis des annes la
combine suivante :
dans un module par exemple :
Public mavariable as string
puis une petite fonction:
public function get_mavariable()
get_mavariable=mavariable
end function
Ensuite c'est tout simple, en paramètre de la requête on met comme critère
get_mavariable() on renseigne la variable et le tour est joué.
Ca permet notamment d'utiliser la même requête n'importe où dans l'appli.

C'est également valable si on écrit du code sql, par exemple dans un
formulaire
mavariable=me!codcli
me.recordsource="select * from factures where codeclient=get_mavariable()"
Donc très pratique

Il suffit à chaque fois de renseigner la variable

Bon, le petit cours etant terminé, j'ai basculé une appli vers SQLServer.
Et là gros pb la petite combine ne fonctionne pas
Après moult recherches, je ne trouve pas la simplissime solution
Quelq'un peut-il m'aider ?



Avatar
rdautin
Bonjour,

merci pour ta reponse, je connaissais les éléments que tu me donnes mais ce
n'est pas exactement le sens de ma question.
Le pb est plus général : comment passer des paramètres à une requête (ou
procédure stockée) pour toute utilisation selon besoin, par exemple remplir
une liste deroulante ou une combo.
L'exemple que je donnais pour le formulaire était un peu restrictif.




Bonsoir,

Je crois que la bonne solution est d'utiliser une procédure stockée. C'est plus sûr, et l'exécution est plus rapide. Vu
l'exemple que tu donnes, il me semble que tu devrais modifier ton appli: Dans ton formulaire principal, mettre un
sous-formulaire. Dans le sous-formulaire, mettre comme source une procédure stockée, passer les paramètres par la propriété
Input Parameters, exemple:
@codeClient int = [Forms]![MonForm]![code_client], @refClient varchar(20) = [Forms]![MonForm]![reference_client]
Evidemment, les paramètres définis ici doivent correspondre à ceux définis dans la procédure stockée.
Et faire des Me.MonSousForm.Requery.

Il y a tout un chapitre dans l'aide en ligne, à lire impérativement.

Voilà aussi en VBA un exemple d'appel à une procédure stockée et le début de la procédure stockée elle-même. Cette procédure
stockée en exécute plein d'autres, comme c'était un peu long, j'ai ai enlevé une grande partie, j'espère que ça restera clair
:-)

J-Pierre
__________________________________________________________________
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
cnn.BeginTrans
DoCmd.Hourglass True

/*..........plein de trucs qui justifient le BeginTrans

cnn.Errors.Clear

Dim cmd As New ADODB.Command
Dim retCode As ADODB.Parameter, retMess As ADODB.Parameter, noProjet As ADODB.Parameter
Dim PMQparm As ADODB.Parameter, BATparm As ADODB.Parameter, LIVparm As ADODB.Parameter

' Set up a command object for the stored procedure.
Set cmd.ActiveConnection = cnn
cmd.CommandText = "P007_creationDossier"
cmd.CommandType = adCmdStoredProc

' Set up a return parameter.
Set retCode = cmd.CreateParameter("Return", adInteger, adParamReturnValue)
cmd.Parameters.Append retCode

' Set up an output parameter.
Set retMess = cmd.CreateParameter("Output", adVarChar, adParamOutput, 200)
cmd.Parameters.Append retMess

' Set up an input parameter.
Set noProjet = cmd.CreateParameter("Input", adInteger, adParamInput)
cmd.Parameters.Append noProjet
noProjet.Value = Me.T001_no_projet

' Set up an input parameter.
Set PMQparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append PMQparm

If Not IsNull(Me.PMQdate) And Me.PMQdate <> "" Then
PMQparm.Value = ConvDateUS(Me.PMQdate)
Else
PMQparm.Value = Null
End If

' Set up an input parameter.
Set BATparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append BATparm
BATparm.Value = ConvDateUS(Me.BATdate)

' Set up an input parameter.
Set LIVparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append LIVparm
LIVparm.Value = ConvDateUS(Me.LIVdate)

On Error Resume Next
cmd.Execute
On Error GoTo 0

If retCode = 0 Then
DoCmd.Hourglass False
cnn.CommitTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Nouveau dossier ouvert", vbOKOnly, "CRÉATION D'UN DOSSIER"
Else
DoCmd.Hourglass False
cnn.RollbackTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Erreur pendant la création du dossier" & vbCrLf & _
" code retour : " & retCode & vbCrLf & _
" message d'erreur: " & retMess
Exit Sub
End
_______________________________________________________________
Alter PROCEDURE P007_creationDossier
@outmess varchar(200) OUTPUT, @noProjet int,
@PMQparm datetime , @BATparm datetime , @LIVparm datetime
AS

DECLARE @retCode INT
SET @retCode = 0
SET @outmess = ''

/*----------------------------------------------T020_infographie-------------------------------------------------------- */
EXEC @retCode = P007_T020_infographie$new @noProjet = @noProjet,
@PMQparm = @PMQparm, @BATparm = @BATparm, @LIVparm = @LIVparm

IF @retCode <> 0
BEGIN
SET @outmess = 'Error while creating project ' + CONVERT(varchar(9), @noProjet) + ' into "T020_infographie".'
RETURN @retCode
END

/* etc.........
____________________________
"rdautin" a écrit dans le message de news:

Bonjour à tous
un petit pb surement idiot mais ...
Pour passer des parametres à une requete, j'utilise depuis des annes la
combine suivante :
dans un module par exemple :
Public mavariable as string
puis une petite fonction:
public function get_mavariable()
get_mavariable=mavariable
end function
Ensuite c'est tout simple, en paramètre de la requête on met comme critère
get_mavariable() on renseigne la variable et le tour est joué.
Ca permet notamment d'utiliser la même requête n'importe où dans l'appli.

C'est également valable si on écrit du code sql, par exemple dans un
formulaire
mavariable=me!codcli
me.recordsource="select * from factures where codeclient=get_mavariable()"
Donc très pratique

Il suffit à chaque fois de renseigner la variable

Bon, le petit cours etant terminé, j'ai basculé une appli vers SQLServer.
Et là gros pb la petite combine ne fonctionne pas
Après moult recherches, je ne trouve pas la simplissime solution
Quelq'un peut-il m'aider ?








Avatar
J-Pierre
Bonjour,

Je n'ai jamais essayé de remplir une liste déroulante ou autre avec une procédure stockée lorsqu'il y a des paramètres. Pour
ce faire, j'aligne du code VBA et j'utilise ADO. Mais théoriquement, tu peux exécuter une procédure stockée, toujours en VBA,
et récupérer le recordset pour remplir ta liste déroulante.

J-Pierre

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

Bonjour,

merci pour ta reponse, je connaissais les éléments que tu me donnes mais ce
n'est pas exactement le sens de ma question.
Le pb est plus général : comment passer des paramètres à une requête (ou
procédure stockée) pour toute utilisation selon besoin, par exemple remplir
une liste deroulante ou une combo.
L'exemple que je donnais pour le formulaire était un peu restrictif.




Bonsoir,

Je crois que la bonne solution est d'utiliser une procédure stockée. C'est plus sûr, et l'exécution est plus rapide. Vu
l'exemple que tu donnes, il me semble que tu devrais modifier ton appli: Dans ton formulaire principal, mettre un
sous-formulaire. Dans le sous-formulaire, mettre comme source une procédure stockée, passer les paramètres par la propriété
Input Parameters, exemple:
@codeClient int = [Forms]![MonForm]![code_client], @refClient varchar(20) = [Forms]![MonForm]![reference_client]
Evidemment, les paramètres définis ici doivent correspondre à ceux définis dans la procédure stockée.
Et faire des Me.MonSousForm.Requery.

Il y a tout un chapitre dans l'aide en ligne, à lire impérativement.

Voilà aussi en VBA un exemple d'appel à une procédure stockée et le début de la procédure stockée elle-même. Cette
procédure
stockée en exécute plein d'autres, comme c'était un peu long, j'ai ai enlevé une grande partie, j'espère que ça restera
clair
:-)

J-Pierre
__________________________________________________________________
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
cnn.BeginTrans
DoCmd.Hourglass True

/*..........plein de trucs qui justifient le BeginTrans

cnn.Errors.Clear

Dim cmd As New ADODB.Command
Dim retCode As ADODB.Parameter, retMess As ADODB.Parameter, noProjet As ADODB.Parameter
Dim PMQparm As ADODB.Parameter, BATparm As ADODB.Parameter, LIVparm As ADODB.Parameter

' Set up a command object for the stored procedure.
Set cmd.ActiveConnection = cnn
cmd.CommandText = "P007_creationDossier"
cmd.CommandType = adCmdStoredProc

' Set up a return parameter.
Set retCode = cmd.CreateParameter("Return", adInteger, adParamReturnValue)
cmd.Parameters.Append retCode

' Set up an output parameter.
Set retMess = cmd.CreateParameter("Output", adVarChar, adParamOutput, 200)
cmd.Parameters.Append retMess

' Set up an input parameter.
Set noProjet = cmd.CreateParameter("Input", adInteger, adParamInput)
cmd.Parameters.Append noProjet
noProjet.Value = Me.T001_no_projet

' Set up an input parameter.
Set PMQparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append PMQparm

If Not IsNull(Me.PMQdate) And Me.PMQdate <> "" Then
PMQparm.Value = ConvDateUS(Me.PMQdate)
Else
PMQparm.Value = Null
End If

' Set up an input parameter.
Set BATparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append BATparm
BATparm.Value = ConvDateUS(Me.BATdate)

' Set up an input parameter.
Set LIVparm = cmd.CreateParameter("Input", adDate, adParamInput)
cmd.Parameters.Append LIVparm
LIVparm.Value = ConvDateUS(Me.LIVdate)

On Error Resume Next
cmd.Execute
On Error GoTo 0

If retCode = 0 Then
DoCmd.Hourglass False
cnn.CommitTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Nouveau dossier ouvert", vbOKOnly, "CRÉATION D'UN DOSSIER"
Else
DoCmd.Hourglass False
cnn.RollbackTrans
Set cmd = Nothing
cnn.Close
Set cnn = Nothing
MsgBox "Erreur pendant la création du dossier" & vbCrLf & _
" code retour : " & retCode & vbCrLf & _
" message d'erreur: " & retMess
Exit Sub
End
_______________________________________________________________
Alter PROCEDURE P007_creationDossier
@outmess varchar(200) OUTPUT, @noProjet int,
@PMQparm datetime , @BATparm datetime , @LIVparm datetime
AS

DECLARE @retCode INT
SET @retCode = 0
SET @outmess = ''

/*----------------------------------------------T020_infographie-------------------------------------------------------- */
EXEC @retCode = P007_T020_infographie$new @noProjet = @noProjet,
@PMQparm = @PMQparm, @BATparm = @BATparm, @LIVparm = @LIVparm

IF @retCode <> 0
BEGIN
SET @outmess = 'Error while creating project ' + CONVERT(varchar(9), @noProjet) + ' into "T020_infographie".'
RETURN @retCode
END

/* etc.........
____________________________
"rdautin" a écrit dans le message de news:

Bonjour à tous
un petit pb surement idiot mais ...
Pour passer des parametres à une requete, j'utilise depuis des annes la
combine suivante :
dans un module par exemple :
Public mavariable as string
puis une petite fonction:
public function get_mavariable()
get_mavariable=mavariable
end function
Ensuite c'est tout simple, en paramètre de la requête on met comme critère
get_mavariable() on renseigne la variable et le tour est joué.
Ca permet notamment d'utiliser la même requête n'importe où dans l'appli.

C'est également valable si on écrit du code sql, par exemple dans un
formulaire
mavariable=me!codcli
me.recordsource="select * from factures where codeclient=get_mavariable()"
Donc très pratique

Il suffit à chaque fois de renseigner la variable

Bon, le petit cours etant terminé, j'ai basculé une appli vers SQLServer.
Et là gros pb la petite combine ne fonctionne pas
Après moult recherches, je ne trouve pas la simplissime solution
Quelq'un peut-il m'aider ?