Microsoft 365 VBA: remplacer la date manquante

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

J'écris une requêté VBA SQL et je souhaite remplacer une date (timestamp) manquante par une date future:

VB:
Dim dt As Date
   dt = #12/31/2999 11:00:00 AM#

Mais mon code ne marche pas :
Code:
RECSET2.Open "select distinct sup.CD_RGA, sup.LB_COURT, sum(MT_EA) as EA_total" & _
    " from SEA_SUPPORT sr left join (select is_support,is_rga,d_fin_bis as COALESCE(d_fin,dt) from SUPPORT_RGA2 group by is_support,is_rga,d_fin having  max(d_fin_bis) = (d_fin_bis)) drsupp" & _
    " on sr.is_support=drsupp.is_support left join RGA sup on drsupp.IS_RGA=sup.IS_RGA" & _

Voici l'erreur :

1662140520303.png


Le code
VB:
case d_fin when NULL then #12/31/2999 11:00:00 AM# else d_fin end
ne marche pas aussi.

Merci pour votre aide !

Merci pour vos conseils.
 
Dernière édition:

dysorthographie

XLDnaute Accro
Non COALESCE fonction pour toutes les lignes
VB:
COALESCE(d_fin,To_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis

En revanche je n'arrive pas à comprendre comment on peut avoir un DISTINCT, un SUM , un GRIUP BY et un HAVING dans la même requête ?

Le DISTING est entinomique avec une requête de statistique !

12/31/2999 11:00:00 AM
Tu envoies un message aux générations futures ?

Les terriens parlent aux marsiens.
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci beaucoup ! Si je veux remplacer toutes les valeurs manquantes il faut utiliser case when ?
Non COALESCE fonction pour toutes les lignes
VB:
COALESCE(d_fin,To_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis

En revanche je n'arrive pas à comprendre comment on peut avoir un DISTINCT, un SUM , un GRIUP BY et un HAVING dans la même requête ?

Le DISTING est entinomique avec une requête de statistique !


Tu envoies un message aux générations futures ?

Les terriens parlent aux marsiens.
Non COALESCE fonction pour toutes les lignes
VB:
COALESCE(d_fin,To_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis

En revanche je n'arrive pas à comprendre comment on peut avoir un DISTINCT, un SUM , un GRIUP BY et un HAVING dans la même requête ?

Le DISTING est entinomique avec une requête de statistique !


Tu envoies un message aux générations futures ?

Les terriens parlent aux marsiens.
En fait, j’ai plusieurs d_fin par is_support. S’il y a la d_fin à vide je dois la choisir, sinon je prends la d_fin la plus récente. Pour cela je veux remplacer la d_fin vide par une date future afin d’appliquer MAX pour choisir la date. J’ai une requête qui marche sur SAS mais je n’arrive pas à la traduire en VBA. :)
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,
cette exemple je l'ai créé sur Sql Serveur j'ai pas Oracle!
VB:
select COALESCE(NULL,(select max(frm2.d_fin)  from [SUPPORT_RGA2] FRM2 WHERE FRM2.[is_support] =FRM1.[is_support]) ,'Pas Trouvé')grr from [SUPPORT_RGA2] FRM1

Merci, en fait, je ne veux pas afficher 'Pas Trouvé', je voulais traduire ce code SAS:

... from
left join (select is_support,
case d_fin when . then "31DEC2999"d else d_fin
end as d_fin_bis
from SUPPORT_RGA2
group by is_support
having
or max(b.d_fin_bis) = b.d_fin_bis) as b
on a.is_support = b.is_support
:)
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Si cette requête fonction sur sql manager elle devrait fonctionner dans VBA bien sur il faut remplacer les doubles côte ["]par des simples côté [']
Merci, je doute sur la COALESCE(NULL,(select max(frm2.d_fin)). En faite, je voulais remplacer tout d'abord les valeurs manquantes par 31/12/2999 est ensuite faire applique max par is_support.
Par exemple pour IS_SUPPORT 10234 je peux avoir d_fin "23/12/2001 00:00:00, 19/12/2000 00:00:00, 03/09/2022 00:00:00 et . (NULL). Dans ce cas je dois choisir le . (la ligne avec la valeur NULL).
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
En fait ce n'es pas là max qu tu veux mais la dernière même si elle est nulle?
La date la plus récente ou la date avec la valeur manquante. Je peux avoir aussi, par exemple, la d_fin pour un is_support comme 13/09/2021 00:00:00 . (NULL) . (NULL) 13/09/2021 : dans ce cas je dois retenir les deux lignes avec les valeurs manquantes.

Voici le code SAS qui marche :
VB:
proc sql;
    create table OL as select distinct  c.cd_rga, c.lb_court as Libelle_rga,
        sum(a.mt_ea) as EA_total  
    from SEA_SUPPORT as a
        left join (select is_support,d_fin, is_rga,
           case d_fin when . then '31DEC2999:00:00:00'dt else d_fin
             end as d_fin_bis format datetime20.
           from SUPPORT_RGA2
            group by is_support having  max(d_fin_bis) = (d_fin_bis))  as b
                on a.is_support=b.is_support
            left join RGA as c on b.is_rga=c.is_rga
                where a.s_type_support="UC"  and substr(a.police,1,1) ne "Z"
                    group by c.cd_rga
    ;
quit;
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Merci, je doute sur la COALESCE(NULL,(select max(frm2.d_fin)). En faite, je voulais remplacer tout d'abord les valeurs manquantes par 31/12/2999 est ensuite faire applique max par is_support.
Par exemple pour IS_SUPPORT 10234 je peux avoir d_fin "23/12/2001 00:00:00, 19/12/2000 00:00:00, 03/09/2022 00:00:00 et . (NULL). Dans ce cas je dois choisir le . (la ligne avec la valeur NULL).

J'ai l'impression que la fonction coalesce ne fonctionne pas en VBA :

J'ai essaye une simple requête : extraire les is_support et d_fin en remplaçant les d_fin manquantes par " & dt &" (dt= #12/31/2999 11:00:00 AM#) :

J'ai appliqué : case d_fin when NULL then " & dt & " else d_fin end as d_fin_bis je reçois l'erreur "mot-clé absent".
J'ai essayé iif(d_fin = '' OR ISNULL(d_fin),'" & dt & "',d_fin) as d_fin_bis from.. l'erreur v'est "parenthèse de droite absent".
Pour le coalesce(d_fin," & dt & ") as d_fin_bis l'erreur c'est "parenthèse de droite absent".

Est-ce que vous connaissiez comment on peut remplacer la d_fin manquantes format timestamp dans la requête VBA Adodb ? Merci pour votre aide, je suis complétement bloquée :(
 

dysorthographie

XLDnaute Accro
bonjour,
essai d'exécuter le code poste #2 avec ta connexion Oracle!
VB:
Sub test()
Dim dt As String, Rs As Object
dt = "12/31/2999 11:00:00 AM"
Sql = "Select COALESCE(NULL,NULL,TO_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis from FROM DUAL;"
Set Rs = ConnectionOracle.Execute(Sql)
End Sub
tu peux faire un Clik droit sur RS et dans le menu tu sélectionnes ajouter à l'espion

execute en pas à pas touche [F8]
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
bonjour,
essai d'exécuter le code poste #2 avec ta connexion Oracle!
VB:
Sub test()
Dim dt As String, Rs As Object
dt = "12/31/2999 11:00:00 AM"
Sql = "Select COALESCE(NULL,NULL,TO_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis from FROM DUAL;"
Set Rs = ConnectionOracle.Execute(Sql)
End Sub
tu peux faire un Clik droit sur RS et dans le menu tu sélectionnes ajouter à l'espion

execute en pas à pas touche [F8]
Merci ! J'aurais une question : pourquoi dans COALESCE(NULL,NULL,TO_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) la colonne d_fin n'est pas indiquée ? En fait, je voulais lire les valeur du champs d_fin et remplacer la valeur manquante par 12/31/2999 11:00:00 AM.
 

VBA_dev_Anne_Marie

XLDnaute Occasionnel
bonjour,
essai d'exécuter le code poste #2 avec ta connexion Oracle!
VB:
Sub test()
Dim dt As String, Rs As Object
dt = "12/31/2999 11:00:00 AM"
Sql = "Select COALESCE(NULL,NULL,TO_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis from FROM DUAL;"
Set Rs = ConnectionOracle.Execute(Sql)
End Sub
tu peux faire un Clik droit sur RS et dans le menu tu sélectionnes ajouter à l'espion

execute en pas à pas touche [F8]
J'ai exécuté cette ligne mais elle ne marche pas : RECSET2.Open "select distinct drsupp.is_support, COALESCE(d_fin,NULL,TO_DATE('" & dt & "','mm/DD/YYYY HH:MI:SS AM')) as d_fin_bis " & _ ... :(
 

Statistiques des forums

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