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 ?
Le Having ne sert que quand on regroupe (order by ...) ( d'où l'erreur ORA-00937 retournée par Oracle ).
Vous voulez regrouper par quoi ?
Je ne répond que par mémoire, n'ayant pas/plus de base oracle ...
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
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.
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 ...
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 !
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 ...
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.
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 !
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!
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
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.