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
Bonjour,
J'ai copié bêtement mais d.effet ne correspond à aucuncun champs de aucune table !
Merci, j'ai vu la coquille. Je viens de la corriger.
Néanmoins, je reçois une erreur : Erreur d'exécution '-214717900(80040e14)';
ORA-00933: SQL command not properly ended. Voici le code corrigé :
VB:
Dim RECSET As New ADODB.Recordset
    RECSET.Open "select dernier_versement from (" & _
"    select  abs(ev.mt_brut_cie) as dernier_versement,count(ev.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(ev.d_effet)<>1 ) " & _
"     order by ev.d_effet desc)", cnn_Pegase, adOpenDynamic, adLockBatchOptimistic

Merci pour votre aide !
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonsoir Marie,
Pourriez-vous dire ce que vous cherchez exactement avec votre requête car certaines clauses semblent contradictoires ...
Bonjour,
Je voudrais retenir le dernier versement (mt_brut_cie) le plus récent par (d_effet), juste dans le cas de versements sur les dates différentes: having(count(d_effe)))<>1. Je ne sais pas comment ajouter ce having dans ADODB Recordset. Merci beaucoup pour votre aide.
 

fanch55

XLDnaute Barbatruc
Je pense que vous n'avez pas besoin de faire de Having ou de group ou de order by,
testez la requête ci-jointe
VB:
" Select  Max(d_effet ), Sum(Abs(mt_brut_cie)) " & _
"  from db_evenement " & _
"  where d_effet = ( " & _
"    select Max(d_effet) " & _
"     from       db_evenement  ev " & _
"     Inner join dp_classe_evt cl " & _
"     On ev.is_classe_evt=cl.is_classe_evt" & _
"     where ev.no_police='" & NO_POLICE & "' and cl.b_ea=1 and cl.b_rachat=1 " & _
"    ) "

Dans le cas le plus courant, vous aurez le dernier versement
Si plusieurs versements ont été faits à la même date, vous en aurez le cumul .
Pour le First, vous remplacez Max par Min ...
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci, faudrait-il mettre select Max(ev.d_effet) au lieu de select Max(d_effet) ? C'est étrange, mais je ne retrouve pas le bon résultat. Si il y a plus qu'une observation pour la date la plus récente, est-ce que ce code permet de faire le cumul de toutes ces lignes ? Merci beaucoup pour votre aide, fanch55 !
 

fanch55

XLDnaute Barbatruc
Merci, faudrait-il mettre select Max(ev.d_effet) au lieu de select Max(d_effet) ? C'est étrange, mais je ne retrouve pas le bon résultat.
d_effet n'étant présent que dans db_evenement, il n'y a pas besoin de préciser ev. , mais si vous le préférez, cela ne coute rien de le préciser , le résultat sera le même .
Vous dites que le résultat ne semble pas bon : la date ou le montant ?
vous pouvez faire un test avec Select d_effet , Abs(mt_brut_cie) en tête de requête pour voir le nombre de retours ...

Si il y a plus qu'une observation pour la date la plus récente, est-ce que ce code permet de faire le cumul de toutes ces lignes ?
C'est ce que fait Max(d_effet ), Sum(Abs(mt_brut_cie))
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
En fait, je pense que l'on récupère le max(d_effet) suite à la jointure, et on revient dans db_evenement pour trouver une date qui répond à ce max(d_effet). En fait, je souhaiterais trouver la date qui répond à max(d_effet) dans la table que l'on obtient suite à la jointure. C'est pour cela que je trouve des sum trop gros, alors qu'il y a deux ligner à sommer.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
En fait, c'est inner join entre deux tables et on somme les données les plus récentes. Je sais faire en SAS mais je n'arrive pas à transcrire en ADODB. Merci beaucoup pour votre aide !
 

dysorthographie

XLDnaute Accro
bonjour,
SAS est une interface qui te permets d'exécuter des Requêtes?

ADODB est une interface de communication entre VBA et ta base de données! il utilise le connecteur Oracle et la même syntaxe! c'est le connecteur Oracle qui fige la syntaxe SQL d'ADODB pas le contraire!

ADODB utilise les drivers fournis par Oracle
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,
Non , je parle de SAS, Statistical Analysis System, je réécrit mes requêtes dans SAS pour les comprendre en utilisant le "proc sql". Ensuite, je les traduis en ADODB VBA. Je maîtrise peu le ADODB, je n'arrive pas à traduire toutes les conditions, d'où mes questions
 

fanch55

XLDnaute Barbatruc
Exact, j'ai construit 2 petites tables avec très peu de lignes et surtout de dates.
Je me re penche sur la bonne requête ....
 

Discussions similaires

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