Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/06/2011, 11h44   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 75
Points : 27
Points : 27
Par défaut Fonction personnelle et ADO

Bonjour,

Je voulais savoir si c'était possible avec ADO d'utiliser une fonction personnelle dans une requête Sql. En effet, j'ai un code du type :

Code :
Public Function ma_fonction ... end function
et la requete sql :
Code :
1
2
3
public conn as new connection 
sSql = "select ma_fonction([mon_champ]) as Expr1 from ma_table"
conn.Execute sSQL
Lors de l'exécution, j'obtiens l'erreur " Fonction 'ma_fonction' non définie dans l'expression". Pourtant, l'utilisation d'une fonction classique telle que RTRIM par exemple fonctionne....

Est-ce que c'est possible ? et si non, comment je pourrais me débrouiller ?
candrau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 12h10   #2
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Bonjour,
J'ai le même problème (voir l'un de mes derniers posts).
A priori d'après mes recherches :
- si tu fais du vba dans ACCESS pas de soucis,
- si tu appelles la requête de l'extérieur cela ne fonctionne pas.

Il faut par ailleurs faire attention à la déclaration des références dans le code vba.
Autre vérification à faire : s'assurer d'avoir la dernière version du moteur Jet dans ton système
http://support.microsoft.com/kb/239114/fr
(voir la littérature sur le sujet dans Google)

Par exemple cette requête fonctionne très bien :

Code :
1
2
3
4
5
6
 
INSERT INTO TableTemp_IllusTasksList ( Notification_, CodeGroup_, ConcatenateList_ )
SELECT FileInput_GAMS2_ZGAMS.Notification_, FileInput_GAMS2_ZGAMS.CodeGroup_, ConcIllus([Notification_])
FROM FileInput_GAMS2_ZGAMS
WHERE CodeGroup_ <> 'ZGAMS002'
GROUP BY FileInput_GAMS2_ZGAMS.Notification_, FileInput_GAMS2_ZGAMS.CodeGroup_;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function ConcIllus(szValue As Long) As String
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim vFld As String
 
Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
 
'Attention si value= string il faut préciser les ' '
rs.Open "SELECT TaskText_ as Fld FROM FileInput_GAMS2_ZGAMS WHERE [Notification_]=" & szValue & " AND [CodeGroup_]<>'ZGAMS002'", cnn, adOpenForwardOnly, adLockReadOnly
 
vFld = vbNullString
Do While Not rs.EOF
    If Not IsNull(rs!Fld) Then vFld = vFld & ", " & rs!Fld
    rs.MoveNext
Loop
 
vFld = Mid(vFld, 3)
 
Set cnn = Nothing
Set rs = Nothing
ConcIllus = vFld
 
End Function
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 14h30   #3
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 75
Points : 27
Points : 27
Oh nooooo, j'appelle de l'extérieur
mon problème est que je suis en train modifier un code que mon prédécesseur a fait, et il a tout codé en utilisant du ADO. Du coup, ça devient complexe pour moi si je dois modifier toute la structure pour fonctionner en DAO par exemple.....

Il n'y aurait pas moyen, par exemple, de récupérer la valeur renvoyée par la fonction dans une variable intermédiaire que l'on utiliserait ensuite dans la requête Sql ?
candrau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 14h43   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
DAO, ADO même chose. Pas de valeur ajoutée à utiliser l'un ou l'autre pour ton le problème.
<De l'extérieur> Quelle language ?

Il ne s'agit pas du bon topic mais je vais répondre quand même :
Tu peux récupérer le nombre de lignes impactées par une requête mais cela ne devrait pas résoudre ton problème non plus.
(Voir exemple morceau code VB.NET 2005 ci-dessous)
Code :
1
2
3
4
 
iNbModifyLines = cManageBDD.Execute("DELETE FROM MaTable")
 
iNbModifyLines = cManageBDD.RunStoredProcedure("MaQuerySQL"))
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 15h18   #5
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 75
Points : 27
Points : 27
Je travaille sur un programme extérieur qui par le biais de macros vba modifie et crée des tables access. En fait, je suis sensé inclure dans cette macro les requetes situées dans mon fichier access, afin que lorsque mon programme extérieur lance sa macro, j'ai le résultat final sans devoir passer manuellement par microsoft access.

Mais je pense que je m'explique mal ... Est-ce qu'il faudrait sinon que j'ouvre un autre recordset afin de reparcourir la table a modifier par ma fonction personnalisée, ceci afin de m'éviter de passer par l'écriture de requêtes sql?
candrau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 16h04   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Désolé, c'est vrai que ce n'est pas super clair
Je sais que c'est difficile et fastidieux de faire comprendre son besoin par écrit.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 09h59   #7
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 75
Points : 27
Points : 27
C'est bon, je me suis débrouillé en bidouillant : j'ai fait un premier recordset dans lequel j'ai récupéré le champ de ma table à modifier dans une variable tampon, j'ai modifié ensuite cette valeur directement dans ma fonction personnalisée, puis j'ai ouvert un autre recordset afin de reparcourir ma table pour y mettre à jour le champ modifié.
C'est moche et ça demande beaucoup de lignes de code pour pas grand chose, mais au moins ça fonctionne...
candrau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 14h21   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13

J'ai fais la même chose
Picasso disait qq chose du genre : <Quand je n'ai pas de jaune, je prends du vert!>
En terme de performance ce n'est pas obligatoirement plus couteux.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h35.


 
 
 
 
Partenaires

Hébergement Web