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

VBA Access Discussion :

fonction dans une requete [AC-2016]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut fonction dans une requete
    Bonjour,

    J'ai une fonction autonumber qui fonctionne bien dans un formulaire pour incrémenter un champ.
    ex:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![F_document_vente_bon_livraison]!VTE_N_BL = AutoNumber_vente_bl("T_vente_bon_livraison", "VTE_N_BL", Forms![F_document_vente_bon_livraison]!Agence_1ere_lettre & "VL", 5)

    Je souhaite mettre à jour les champs d'une table.
    Mon idée était de mettre à jour la table avec cette même fonction mais ça ne fonctionne pas

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cdb4 As String
    cdb4 = "UPDATE T_abo_vendu_prepa SET T_abo_vendu_prepa.N_facture_abo = AutoNumber_abo_prepa_n_facture("t_abo_vendu_cumul", "N_facture_abo", "BVC", 5)"
    DoCmd.RunSQL cdb4

    VBA me dis que j'ai une erreur de compilation.
    Une idée sur la correction ou sur la façon de faire

    Merci d'avance

    Loïc

  2. #2
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 960
    Par défaut
    bonjour,
    certainement à cause du guillemet et du caractère de concaténation manquants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cdb4 As String
    cdb4 = "UPDATE T_abo_vendu_prepa SET T_abo_vendu_prepa.N_facture_abo = " & AutoNumber_abo_prepa_n_facture("t_abo_vendu_cumul", "N_facture_abo", "BVC", 5)
    DoCmd.RunSQL cdb4
    ou doubler les guillemets à l'intérieur d'autres guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cdb4 As String
    cdb4 = "UPDATE T_abo_vendu_prepa SET T_abo_vendu_prepa.N_facture_abo = (AutoNumber_abo_prepa_n_facture(""t_abo_vendu_cumul"", ""N_facture_abo"", ""BVC"", 5))"
    DoCmd.RunSQL cdb4

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut
    Merci pour la réponse.

    Je n'ai plus de msg erreur de compilation.

    Par contre, Il m'ouvre une fenêtre "entrer une valeur de paramètre" avec ma valeur à insérer. Il me demande donc de renseigner la valeur.

    Nom : param.png
Affichages : 189
Taille : 3,2 Ko

  4. #4
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 960
    Par défaut
    il faudrait poster le code de la fonction AutoNumber_abo_prepa_n_facture

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut
    La voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Function AutoNumber_abo_prepa_n_facture( _
      ByVal T_abo_vendu_cumul As String, _
      ByVal N_facture_abo As String, _
      Optional ByVal strFormat As String = "", _
      Optional ByVal intDigits As Integer = 4, _
      Optional ByVal dtDate As Date = #1/1/100#)
     
    ' Quelques variables...
    On Error GoTo AutoNumber_abo_prepa_n_factureErr
    Dim varMarkers As Variant, varMark As Variant
    Dim strCriteria As String
    Dim strNum As String, lngNum As Long, strPart As String
     
    ' Quelques retraitements...
    If dtDate = #1/1/100# Then dtDate = Now()
    ACH_N_facture = "[" & N_facture_abo & "]"
    strFormat = Replace(strFormat, "'", "''")
     
    ' Marqueurs à remplacer
    varMarkers = Array("YYYY", "YY", "Q", "MM", "WW", "DD")
    For Each varMark In varMarkers
      ' Formater la date et l'injecter dans le template
      strPart = Format(dtDate, varMark, vbMonday, vbFirstFourDays)
      strFormat = Replace(strFormat, "[" & varMark & "]", Format(strPart, String(Len(varMark), "0")))
    Next
     
    ' On cherche la valeur maximale déjà employée dans la table
    strCriteria = N_facture_abo & " LIKE '" & strFormat & "*'"
    strNum = Nz(DMax(N_facture_abo, T_abo_vendu_cumul, strCriteria), "")
     
    ' On crée le nouveau numéro
    lngNum = IIf(strNum = "", 1, Val(Mid(strNum, Len(strFormat) + 1)) + 1)
    strFormat = strFormat & Format(lngNum, String(intDigits, "0"))
     
    ' Valeur finale
    AutoNumber_abo_prepa_n_facture = strFormat
    Exit Function
     
    AutoNumber_abo_prepa_n_factureErr:
      MsgBox "Erreur : " & Err.Description, vbCritical
      AutoNumber_abo_prepa_n_facture = ""
      Exit Function
    End Function

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 960
    Par défaut
    la fonction AutoNumber_abo_prepa_n_facture renvoie un type non déclaré, il est donc Variant par défaut et prendra le type de la variable retournée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AutoNumber_abo_prepa_n_facture = strFormat
    comme strFormat est de type String, essaie de mettre des guillemets et les doubler car on a déjà des guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim cdb4 As String
    cdb4 = "UPDATE T_abo_vendu_prepa SET T_abo_vendu_prepa.N_facture_abo =""" & (AutoNumber_abo_prepa_n_facture("t_abo_vendu_cumul", "N_facture_abo", "BVC", 5)) & """"
    DoCmd.RunSQL cdb4

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 137
    Par défaut
    Bonjour,

    Tout simplement en faisant passer l'id de l'enregistrement updater dans un nouveau paramètre de la fonction. Comme ceci :

    Je viens de voir que ton appel à la fonction en VBA était fait dans VBA au lien de la requête. Les requêtes accèdent parfaitement au fonction utilisateur du moment qu'elles sont Publique et déclaré dans un module standard si ça touche le contenu de la table il est préférable de l'y intégrer. Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim cdb1 As String
    cdb1 = "INSERT INTO T_abo_vendu_cumul ( [N° Type d'abo], [N° produit], [N° famille de produit], [N° Client], [n° Client Site], [Description abo], Date_Début_Abo, Date_fin_abo, Durée, Encours, Nb, [Px vente], [Px achat], Param1, N_facture_abo ) "
    cdb1 = cbl1 & " SELECT T_abo_vendu.[N° Type d'abo], T_abo_vendu.[N° produit], T_abo_vendu.[N° famille de produit], T_abo_vendu.[N° Client], T_abo_vendu.[n° Client Site], T_abo_vendu.[Description abo] , T_abo_vendu.Date_Début_Abo, T_abo_vendu.Date_fin_abo, T_abo_vendu.Durée, T_abo_vendu.encours, T_abo_vendu.Nb, T_abo_vendu.[Px vente], T_abo_vendu.[Px achat], T_abo_vendu.Param1, "
    cdb1 = cbl1 & " AutoNumber_abo_cumul_n_facture('t_abo_vendu_cumul', 'N_facture_abo', 'BVC', 5, [Id_Abo]) as N_facture From T_abo_vendu"
    DoCmd.RunSQL cdb1
    Il est fort possible que cela suffise à régler ton problème. En tout cas c'est quelque chose qui est assez commun. Si ce n'est pas suffisant tente ma solution.
    Change [Id_Abo] par le nom de ta colonne id de la table.
    Dans ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function AutoNumber_abo_prepa_n_facture( _
      ByVal T_abo_vendu_cumul As String, _
      ByVal N_facture_abo As String, _
      ByRef Id_Facture as long, _
      Optional ByVal strFormat As String = "", _
      Optional ByVal intDigits As Integer = 4, _
      Optional ByVal dtDate As Date = #1/1/100#)
    ...
    Comme je l'ai déjà indiqué inutile d'utiliser l'id dans la fonction.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  8. #8
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut
    Bonjour Loufab,

    J'ai une erreur d'incompatibilité de type dès que je rentre :
    dans la fonction

    Le champ N_abo est un numauto

    Bonne journée

    Loïc

  9. #9
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut
    elgordopresto,

    Penses-tu que dans ta fonction, je peux rajouter une clause where?
    Je m'explique:
    J'ai une table abos_vendus relié à une table abos_vendus_details. (pour un client, j'ai plusieurs abonnements)
    Je souhaite dupliquer les enregistrements
    de la table abos_vendus et abos_vendus_details
    vers les tables abos_vendus_facturés et abos_vendus_facturés_details

    Seuls les enregistrements comprenant au moins un champ "a_facturer" coché "oui" de la table abos_vendus_details doivent être copiés.

    Je souhaite donc rajouter à ta fonction cette condition.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Dim rst as DAO.Recordset, rst2 as DAO.Recordset, strF as string
    Set rst = currentdb.openrecordset("Ma_Table_Ou_Se_Trouve_Les_Donnees_A_Ajouter")
    While Not rst.EOF
    strF = MaFonctionQuiRetourneLeBonNumeroDeFacture()
    set rst2 = currentdb.openrecordset("Ma_Table_Ou_Je_Veux_Ajouter_Des_Donnees")
    rst2.AddNew
    rst2!NumeroDeFacture = strF
    rst2!Champ1_Destination = rst!Champ1_Origine
    rst2!Champ2_Destination = rst!Champ2_Origine
    ' et ainsi de suite avec tous les champs à peupler de la table d'origine vers la table de destination
    rst2.update
    rst2.close
    set rst2 = nothing
    rst.movenext
    wend
    rst.close
    set rst = nothing
    Si tu (ou quelqu'un) a une idée.

    Merci

    Loïc

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 137
    Par défaut
    Citation Envoyé par loul404 Voir le message
    Bonjour Loufab,

    J'ai une erreur d'incompatibilité de type dès que je rentre :
    dans la fonction

    Le champ N_abo est un numauto

    Bonne journée

    Loïc
    En effet l'appel ne correspond pas au contrat de la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function AutoNumber_abo_prepa_n_facture( _
      ByVal T_abo_vendu_cumul As String, _
      ByVal N_facture_abo As String, _
      ByRef Id_Facture as long, _
      Optional ByVal strFormat As String = "", _
      Optional ByVal intDigits As Integer = 4, _
      Optional ByVal dtDate As Date = #1/1/100#)
    Id_facture est en 3ème position alors que dans l'appel il est en 5ème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AutoNumber_abo_cumul_n_facture('t_abo_vendu_cumul', 'N_facture_abo', 'BVC', 5, [Id_Abo])
    Remet ça dans le bon ordre et tu n'auras plus de message.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 113
    Par défaut
    @loul404 : Oui, dans tes jeux de données (recordset) tu peux affecter soit un object existant de ta base de données (une table ou une requête) mais tu peux aussi utiliser directement un code SQL que tu peux construire de manière dynamique. Je te mets un exemple ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Dim i as long, strSQL as string, rst as DAO.recordset
     
    ' Récupération de ma variable
    i = inputbox("Veuillez saisir le numéro de la facture :","Numéro de facture") 
     
    ' Création du code SQL avec intégration de notre variable
    strSQL = "SELECT * FROM MaTable WHERE IDFACTURE=" & i & ";" 
     
    ' Création du jeu de données avec ma condition
    set rst = currentdb.openrecordset(strSQL)
    rst.edit
    rst!champ1 = "blablabla"
    ' Etc...
    rst.update
    rst.close
    set rst = nothing
    A partir de là, tu devrais pouvoir adapter à ton cas personnel...

  12. #12
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 16
    Par défaut
    Merci les amis !

    Je teste dès que possible

    Bon WE

    Loïc

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

Discussions similaires

  1. fonction dans une requete
    Par Msysteme dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/02/2010, 12h42
  2. fonctions dans une requete introuvable
    Par Krusty22 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/05/2008, 09h22
  3. Réponses: 6
    Dernier message: 09/02/2006, 19h00
  4. Etat en fonction d'une requete dans un formulaire
    Par Cablan dans le forum Access
    Réponses: 5
    Dernier message: 16/11/2005, 15h25
  5. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15

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