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
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 ...
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
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 ...


C'est ce que fait Max(d_effet ), Sum(Abs(mt_brut_cie))
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
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 ...


C'est ce que fait Max(d_effet ), Sum(Abs(mt_brut_cie))
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,
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 SAS et la même syntaxe! c'est le connecteur SAS qui fige la syntaxe SQL d'ADODB pas le contraire!
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
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.
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
713

Statistiques des forums

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