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

IHM Discussion :

Création d'un numéro inexistant


Sujet :

IHM

  1. #1
    Membre régulier
    Création d'un numéro inexistant
    Bonjour,

    Je croyais que ma ligne fonctionnait mais ce n'est pas le cas.

    Je veux débuter à partir de 15 000, la première fois, le no 15001 est offert, je créé ma transaction, tout est beau.

    2e essai, il me redonne le no 15001 qui existe déjà.

    Voici ma ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Me.No_trans = CStr((15000) + Nz(DCount("[no]", "transaction", "[no] Like '" & 15000 & "*'"), 0) + 1)


    Merci de votre aide!

  2. #2
    Expert confirmé
    Bonjour,

    C'est normal, like '15000*' ne trouve pas '15001' par exemple mais seulement ce qui commence par 15000

    Pourquoi ne pas faire un dcount simple ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Me.No_trans = CStr((15000) + Nz(DCount("*", "transaction"), 0) + 1)


    2 remarques :
    - appeler un champ no c'est pas une bonne idée
    - si la clé est numérique il vaut mieux utiliser un champ entier (pour les tris, le classement...)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre régulier
    Pour ce qui est du champs No, je n'y peux rien, il était là et je dois vivre avec.

    Je peux utiliser ta formulation sans problème en autant que :

    - entre 1 et 100 000
    - N'existe pas dans le fichier: transaction
    - Fonctionne en multi-usager

    Merci bien!

  4. #4
    Membre régulier
    Je viens d'essayer ta formule et ça me donne toujours 16645.

  5. #5
    Expert confirmé
    Citation Envoyé par fourniey Voir le message
    Je viens d'essayer ta formule et ça me donne toujours 16645.
    Je suppose que cela veut dire qu'il y a déja 1645 lignes dans la table transaction numérotées avec une autre règle

    Par ailleurs il faut être sûr de trouver un n° qui n'est pas déjà pris car j'imagine que c'est une clé unique
    Je te suggère d'utiliser
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    select cstr(max(1*no)+1) from transaction where isnumeric(no) and len(no)=5 and no>='15000' and no<='99999'
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  6. #6
    Membre régulier
    Oui, c'est une clé unique, les numéros au-dessus de 100 000 sont imposés par un autre système.

    dans le création de requête,j'obtiens une erreur.

  7. #7
    Membre expert
    Salut
    Une solution en vba via un btn de commande et partant du principe que [no] est numérique
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Commande10_Click()
    Dim StrSQL As String
        StrSQL = "INSERT INTO transaction (no)"
        StrSQL = StrSQL & "SELECT DMax('no', 'transaction', 'no > ' & 14999 & ' AND ' & 'no <' & 100000)+1 AS Expr1"
        CurrentDb.Execute StrSQL, dbFailOnError
    End Sub

  8. #8
    Membre régulier
    Ça me donne erreur 3314 :

    Vous devez entrer une valeur dans le champs Transaction.no

    Ce que je ne veux pas faire, je veux le nouveau numéro dans la variable dans un champs (no_trans)

    J'ai tellement essayé n'importe quoi que je m'y retrouves plus

    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
    Private Sub txt_no_Click()
            'Me.txt_no = (15000 + Nz(DCount("[no]", "Transaction", "[no] Like '" & 15000 & "*'"), 0) + 1)
    '        Me.txt_no = Nz(DCount("[no]", "Transaction", "[no] Like '" & 15000 & "*'"), 0)
             'Me.txt_no = Int((15000 - 1000 + 1) * Rnd + 1000)
             'Me.txt_no = CStr((15000) + Nz(DCount("*", "transaction"), 0) + 1)
     
    'Me.txt_no = Nz(DMax("no", "Transaction"), 0) + 1
     
    'Me.txt_no = CStr((10000) + Nz(DCount("No", "transaction"), 0) + 1)
     
     
    'Dim StrSQL As String
    '    StrSQL = "INSERT INTO transaction (no)"
    '    StrSQL = StrSQL & "SELECT DMax('no', 'transaction', 'no > ' & 14999 & ' AND ' & 'no <' & 100000)+1 AS Expr1"
    '    CurrentDb.Execute StrSQL, dbFailOnError
     
     
     
     
     
     
    'MsgBox ("No trouvé : " & txt_no)
     
     
    End Sub

  9. #9
    Membre expert
    Pour ma part, j'ai compris
    transaction = table
    no = champ numérique qui est incrémenté de +1 entre 15000 et 100000.

  10. #10
    Membre régulier
    Effectivement

    Transaction est la table

    No est le champs numérique de la table

    No_trans est la variable que je dois alimenter de 15000 à 100 000 et ce numéro ne doit pas exister.

    J'ai un bouton pour le formulaire qui permet d'ajouter une transaction et dont j'alimente plusieurs champs selon la transaction à faire.

  11. #11
    Expert éminent sénior
    bonsoir,
    pour rappel, comme l'a indiqué nico84:
    appeler un champ no c'est pas une bonne idée
    vu que No est un mot réservé (et qui correspond à la valeur booléenne 0, Non en français), il est fortement conseillé d'entourer le champ par des crochets: [No]
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  12. #12
    Membre régulier
    Je comprends mais je dois vivre avec ce nom de champs puisqu'il provient de l'historique.

  13. #13
    Expert éminent sénior
    Citation Envoyé par fourniey Voir le message
    Je comprends mais je dois vivre avec ce nom de champs puisqu'il provient de l'historique.
    j'avais compris, pour autant, l'essentiel reste de bien mettre les crochets dans les expressions dans les solutions qu'on te propose (même si, je te le concède, ce devrait être fait par ceux qui te postent les solutions)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  14. #14
    Membre régulier
    Ça me donne toujours une erreur de compilation sur DMax : Attendu : Case

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub txt_no_Click()
        Dim StrSQL As String
        'StrSQL = "INSERT INTO transaction (no)"
        SELECT DMax("[no]", 'transaction', "[no] > " & 14999 & ' AND ' & "[no] <" & 100000)+1 AS txt_no
     
     
        CurrentDb.Execute StrSQL, dbFailOnError
     
        'MsgBox ("No trouvé : " & txt_no)
    End Sub

  15. #15
    Membre régulier
    Plus d'erreur de compilation, mais à l'exécution, j'ai une erreur 3075

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub txt_no_Click()
        Dim StrSQL As String
        'StrSQL = "INSERT INTO transaction (no)"
        StrSQL = "SELECT DMax([no], 'transaction', [no] >  & 14999 & ' AND ' & [no] < & 100000)+1 AS txt_no"
     
        CurrentDb.Execute StrSQL, dbFailOnError
     
        'MsgBox ("No trouvé : " & txt_no)
    End Sub

  16. #16
    Expert éminent sénior
    bonsoir,
    Select implique obligatoirement un objet table, sinon il faut utiliser Values:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim StrSQL As String
        StrSQL = "INSERT INTO transaction (no) Values(DMax('[no]', 'transaction', '[no] > 14999 AND [no] < 100000')+1")

    [EDIT] en réalité ce sont les caractères de concaténation (&) et la ligne de code en commentaire (insert into ...) qui doivent provoquer l'erreur, il sont inutiles si les valeurs ne sont pas des variables, le code ci-dessous doit aussi fonctionner
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    StrSQL = "INSERT INTO transaction (no) SELECT DMax('[no]', 'transaction', '[no] > 14999 AND [no] < 100000')+1 As txt_no"
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  17. #17
    Membre régulier
    Je ne peux pas faire de Insert car il y a des champs obligatoires et ça provoque une erreur.

    C'est pour ça que j'avais enlevé le Insert.

  18. #18
    Expert éminent sénior
    bonsoir,
    et cela te sert à quoi de tenter d'exécuter une requête sélection avec CurrentDb.Execute, étant donné que seules les requêtes action sont autorisées avec cette commande ?
    Si c'est pour alimenter le champ du formulaire txt_no, il suffit d'utiliser directement DMax:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Me.txt_no =  DMax("[no]","transaction","[no] > 14999 AND [no] < 100000") + 1
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  19. #19
    Membre régulier
    Cette ligne me donne toujours le numéro 100 000

  20. #20
    Expert éminent sénior
    en effet, je n'ai fait que reprendre le code donné par hyperion13. Qu'es-ce que tu attends comme résultat, c'est à dire quel est le critère de sélection pour avoir la bonne donnée? car je ne comprend pas trop les explications données précédemment :
    Je veux débuter à partir de 15 000, la première fois, le no 15001 est offert, je créé ma transaction, tout est beau.

    2e essai, il me redonne le no 15001 qui existe déjà.
    d'ailleurs personne n'a l'air de comprendre vraiment sinon la solution serait déjà donnée ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

###raw>template_hook.ano_emploi###