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
Debug.Print Sq vas copier le texte de ta requête dans la fenêtre d'exécution!
il te sufis de le copier coller dans Sql manageur pour l'évaluer et corriger le problèmes!
VB:
Dim Sql As String
Sql = " select TOP 1 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"
Debug.Print Sql
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
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"
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
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.
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
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;""
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
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)"
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
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.
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
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;""
Merci beaucoup, fanch55, le premier code marche bien.

 

Discussions similaires

Réponses
1
Affichages
713

Statistiques des forums

Discussions
315 093
Messages
2 116 122
Membres
112 666
dernier inscrit
Coco0505