Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 First and Last en ADODB VBA

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Je suis en train de coder en sql ADODB VBA. Je cherche à récupérer l'observation la plus récente (triée par date).
Pourriez-vous me donner l'exemple de la fonction First/Last en ADODB VBA ?

Merci beaucoup !
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci, j'ai commencé par le plus simple : juste une table, la db_evenemnt :

RECSET.Open "select abs(ev.mt_brut_cie) as dernier_versement from db_evenement ev" & _
" where ev.no_police = '" & NO_POLICE & "' order by ev.d_effet desc", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic

Ce code marche, dès que j'ajoute TOP 1, je reçois une erreur, comme avant : Erreur d'exécution '-2147217900 (80040e14)' ORA-00923: FROM keyword not found where expected :

Dim RECSET As New ADODB.Recordset
RECSET.Open "select TOP 1 abs(ev.mt_brut_cie) as dernier_versement from db_evenement ev" & _
" where ev.no_police = '" & NO_POLICE & "' order by ev.d_effet desc", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic


Je me demande si "TOP 1" est vraiment approprié dans ADODB.Recordset ? Merci pour votre aide.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
RE

Tu as la réponse dans le message que tu as cité : il suffit de regarder l'ordre des clauses...
Merci, j'ai commencé par le plus simple : juste une table, la db_evenemnt :

RECSET.Open "select abs(ev.mt_brut_cie) as dernier_versement from db_evenement ev" & _
" where ev.no_police = '" & NO_POLICE & "' order by ev.d_effet desc", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic

Ce code marche, dès que j'ajoute TOP 1, je reçois une erreur, comme avant : Erreur d'exécution '-2147217900 (80040e14)' ORA-00923: FROM keyword not found where expected :

Dim RECSET As New ADODB.Recordset
RECSET.Open "select TOP 1 abs(ev.mt_brut_cie) as dernier_versement from db_evenement ev" & _
" where ev.no_police = '" & NO_POLICE & "' order by ev.d_effet desc", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic


Je me demande si "TOP 1" est vraiment approprié dans ADODB.Recordset ? Merci pour votre aide.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Appartement ça n'existe pas sur Oracle !
Voilà la syntaxe pour Oracle !
Code:
select fname from MyTbl where rownum = 1
Est-ce que vous pourriez m'aider avec l'ajout de having, s'il vous plaît ? Mon code ne marche pas :

RECSET.Open "select abs(ev.mt_brut_cie) as dernier_versement from db_evenement ev, dp_classe_evt classe" & _
" where ev.no_police = '" & NO_POLICE & "' and classe.b_ea =1 and classe.b_rachat = 1 and ev.is_classe_evt=classe.is_classe_evt having count(distinct(ev.d_effet))<>1 order by ev.d_effet desc", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic

L'erreur est ORA-00937 : not a single-group group function
 

dysorthographie

XLDnaute Accro
de ce que j'ai compris de mes recherches sur internet ce serait plus ça!
VB:
" select abs(ev.mt_brut_cie) as dernier_versement" & _
" from db_evenement ev inner join  dp_classe_evt classe On ev.is_classe_evt=classe.is_classe_evt" & _
" where ev.no_police = '" & NO_POLICE & "' and classe.b_ea =1 and classe.b_rachat = 1 And rownum = 1" & _
" order by ev.d_effet desc"
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci,
C'est étrange, mais ça ne marche pas, avec rownum = 1, ça récupère la première observation avant le tri par date.

Sans rownum=1 je récupère le bon résultat, mais je me demande si cette solution est correcte.
A mon avis oui, car le Recordset retient la première observation triée.
Merci pour votre aide.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Je suis en train de regarder, mais je ne crois pas que "having" est possible dans le cas d'Adodb Recordset.
 

fanch55

XLDnaute Barbatruc
Salut à tous,
et si on combinait comme cela :
Code:
"Select * From ( " & _
"   Select Abs(ev.mt_brut_cie) As dernier_versement " & _
"              From  db_evenement   ev " & _
"        Inner Join  dp_classe_evt  classe " &  _
"        On ev.is_classe_evt=classe.is_classe_evt " & _
"        where ev.no_police='" & NO_POLICE & "'" & _
"         and classe.b_ea=1 " & _
"         and classe.b_rachat=1 " & _
"         order by ev.d_effet desc" & _
"    ) Where Rownum <= 1;"

ou

Code:
"Select * From ( " & _
"   Select Abs(ev.mt_brut_cie) As dernier_versement " & _
"              From  db_evenement   ev " & _
"        Inner Join  dp_classe_evt  classe " &  _
"        On ev.is_classe_evt=classe.is_classe_evt " & _
"        where ev.no_police='" & NO_POLICE & "'" & _
"         and classe.b_ea=1 " & _
"         and classe.b_rachat=1 " & _
"         order by ev.d_effet desc" & _
"    ) FETCH FIRST 1 ROWS ONLY;""
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci Fanch55! Peut-on implémenter aussi having count(distinct(d.effet))<>1 avant « order », cette condition ne marche pas chez moi
 

dysorthographie

XLDnaute Accro
VB:
"select dernier_versement from (" & _
"    select  abs(ev.mt_brut_cie) as dernier_versement,count(d.effet) NB" & _
"     from db_evenement ev inner join  dp_classe_evt classe On ev.is_classe_evt=classe.is_classe_evt" & _
"     where ev.no_police = '" & NO_POLICE & "' and classe.b_ea =1 and classe.b_rachat = 1 " & _
"     Group By   Abs(ev.mt_brut_cie) " & _
"     Having count(d.effet)<>1 ) " & _
"     order by ev.d_effet desc)"
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Merci !Malheureusement je reçois la même erreur : Erreur d'exécution ' -2147217900 (80040e14)' ORA-09923: FROM Keyword not found where expected. En fait, je cherche comment place la condition having(count(distinct(ev.d_effet))) dans le code.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
J'ai découpé le code pour récupérer le (count(distinct(ev.d_effet)), mais je reste curieuse de savoir comment on place "having" dans le code. Merci pour votre aide !
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci beaucoup, fanch55, le premier code marche bien.

 

Discussions similaires

Réponses
1
Affichages
641
Réponses
6
Affichages
373
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…