IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Champ de type String en date [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut Champ de type String en date
    Bonjour
    Dans une table d'un fichier Dbase(DBF) j’ai un champ date nommé DatFact de type texte qui se présente comme suite 20041012 (2004 pour l’année,10 pour le mois et le 12 pour le jour)
    en vba dans une requête(Recordset) je voudrais récupéré ce champ au format date 12/10/2004
    J’ai essayé avec rst.Open "select StrReverse(DatFact) from matable" et ça n’a pas marchait.
    Comment faire pour contourner ce problème.

    Merci.

    Abed_H

  2. #2
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    Extraire les différentes parties de ta date que tu concatènera ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select right(datfact,2) & "/" & mid(datfact,5,2) & "/" & left(datfact,4) as datefacture
    from ...
    je ne suis pas sûr si la fonction SUBSTRING est prise en charge par dbase ou Access tu peut l'essayer sinon

  3. #3
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 914
    Points : 4 814
    Points
    4 814
    Par défaut
    crée une fonction publique
    qui prend le string en argument
    qui te retourne une date
    dans laquelle
    tu extrais l'année, le mois et le jour
    et tu utilises la fonction dateSerial() (voir F1)


  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    merci à vous deux
    Bonne journée

  5. #5
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 914
    Points : 4 814
    Points
    4 814
    Par défaut
    Si tu es parvenu à ton résultat, merci de cliquer Résolu

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Re,
    micniv j'ai testé ta proposition et ça n'a pas marché peux-tu corrigé l'erreur
    un message apparait disant :Erreur d’exécution ‘-2147217865 (80040e37)
    File ‘covdate.prg’ does not exist

    voici ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oRst.Open "Select Factures.NumAb,Abonne.RaiSoc,covdate(Factures.DatFact),Factures.Monttc From Factures Inner Join Abonne " & _
                    "On Factures.NumAb=Abonne.NumAb Where  Factures.Paiement='T' Order By 1", strConn, adOpenKeyset, adLockOptimistic
    voici la fonction personnalisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function covdate(dd)
    a = Right(dd, 2)
    b = Mid(dd, 5, 2)
    c = Left(dd, 4)
    covdate = DateSerial(c, b, a)
    End Function
    merci encore une fois

    Abed_H

  7. #7
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    je ne pense pas qu'il te soit possible de créer une fonction VBA et de l'appeler dans une requête SQL.

    je suppose que quand micniv a parlé de créer une fonction il a pensé à l'appeler après récupération des données issues de l'exécution de ta première requête.

    en attendant sa confirmation, qu'est ce qui se passe quand tu exécute une requête semblable à celle que j'ai proposé plutôt?

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 914
    Points : 4 814
    Points
    4 814
    Par défaut
    Oui, Nsanabi, il est possible de créer une fonction VBA et de l'appeler dans une requête SQL.

    La fonction suivante, déclarée dans un module standard, marche correctement :
    (je sais pas programmer sans définir les variables)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function convdate(ByVal dd As String) As Date
    ' dd : au format date "20041012"
        Dim a As Long, b As Long, c As Long
        a = Right(dd, 2)
        b = Mid(dd, 5, 2)
        c = Left(dd, 4)
        convdate = DateSerial(c, b, a)
    End Function
    dans la requete (Access ! ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT idPointage, sdat, convdate([sdat]) AS Date1
    FROM t_poinT2;


  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonjour nabil,micniv
    ça n'a pas marché dans ma requête, micniv toujours la même erreur avec le deuxième code :Erreur d’exécution ‘-2147217865 (80040e37)
    File ‘covdate.prg’ does not exist


    la proposition de nabil dise incompatibilité de type
    merci beaucoup à vos réponses et bonne journée à vous deux.

    Abed_H

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Citation Envoyé par Abed_H Voir le message
    Bonjour nabil,micniv
    çErreur d’exécution ‘-2147217865 (80040e37)
    File ‘covdate.prg’ does not exist


    Non mais attends: un fichier .prg est un fichier contenant du code Dbase!!! De quel logiciel lances-tu ta fonction et si tu la lance depuis Access, où l'as-tu écrite.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonjour
    je lance ma fonction depuis vba Access c'est normal !
    en utilisant le provider vfpoledb si ça fait différence.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Ouais en gros tu utilise ADODB et la commande Execute je suppose...

    La fonction doit être créée dans un Module Access et la table Dbase doit être liée. Puis tu utilise la fonction et tout marche normalement. Ensuite:

    Citation Envoyé par Abed_H Voir le message

    ‘covdate.prg’

    Ben il y a aussi un problème d'orthographe. Ta fonction s'appelle convdate et là il y a une erreur sur un fichier covdate...

    Il est clair qu'il manque un gros bout de code quand même. Je ne pense pas que l'erreur provienne du petit bout de code que tu as mis sur ce topic...
    Par exemple comment est exécuté la requête (certainement avec du ADODB avec le Provider vfpoledb)....

  13. #13
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 914
    Points : 4 814
    Points
    4 814
    Par défaut
    Il y a visiblement une difficulté de contexte ...
    Puisque tu exploites le résultat de la requete via un recordset, je te suggère de retirer la fonction de la requette et de l'appliquer sur la collonne du recordset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    dat1= convdate(rst!strdat)
    ...

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    je m'excuse pour ma réponse tardive
    Bonsoir Psychopathe,micniv
    effectivement si je l'applique sur la colonne du recordset donne bien le résultat entendu mais dans une requête ne marche pas.
    merci et bonne soirée

    Abed_H

  15. #15
    Membre éclairé Avatar de nsanabi
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Points : 678
    Points
    678
    Par défaut
    effectivement si je l'applique sur la colonne du recordset donne bien le résultat entendu mais dans une requête ne marche pas.
    comme je l'ai dis plutôt.
    pour nous simplifier un peu plus la tache montre nous le bout de code où tu crée ta connection ton recordset et la requête.

    si l'utilisation de la fonction sur la colonne du recodset te conviens, merci de marquer resolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. formater un champ de type string (Displayformat string)
    Par algeriano.29 dans le forum Delphi
    Réponses: 0
    Dernier message: 10/05/2015, 11h39
  2. Concaténation de champs de type string et integer ou long
    Par scrutin dans le forum Langage SQL
    Réponses: 15
    Dernier message: 15/11/2011, 09h40
  3. Conversion d'un type string vers date
    Par projetM dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 27/11/2008, 14h09
  4. Bean populate quand type String devient Date
    Par Mister Nono dans le forum Struts 1
    Réponses: 5
    Dernier message: 12/09/2007, 12h03
  5. [CR] les champs de type string
    Par yvescollet dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 05/10/2004, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo