[ACCESS] ins. TOP utilisable avec variable ?

Résolu
16-MARCO Messages postés 8 Statut Membre -  
JM30 Messages postés 2 Statut Membre -
Bonjour à tous,

je cherche à utiliser la fonction TOP, qui permet de selectionner les x premières lignes d'une table, mais en passant x comme une variable.

Sur la base du code SQL suivant (extraction des 3 1eres lignes par ex.) :
INSERT INTO T_Prime
SELECT TOP 3 *
FROM T;

j'ai essayé sans succès les commandes suivantes :
INSERT INTO T_Prime
SELECT TOP P.p *
FROM T,P;

INSERT INTO T_Prime
SELECT TOP p.P *
FROM T,P;

INSERT INTO T_Prime
SELECT TOP (SELECT P.p FROM P) T.*
FROM T;

Merci par avance de votre aide.
Si c'est vers une solution VBA qu'il faut se diriger, j'imagine qu'il faut que je crée un module dans Access. Merci d'être alors le plus didactique sur la marche à suivre car celà est nouveau pour moi :-)
Configuration: Windows XP
Internet Explorer 6.0

5 réponses

  1. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut :-)

    Tu le récupères où, ton nombre ?
    0
  2. 16-MARCO Messages postés 8 Statut Membre
     
    Je le récupère dans une table dans la même base....

    j'ai entre temps testé une solution, qui marche, qui m'a été soufflée sur un forum "ami" (je ne sais pas quel est le terme consacré !)

    Il s'agit d'appeler par une macro une fonction définie dans un module, dont le code est
    Dim i as integer
    Dim strSQL as string
     
    i = CInt(DLookup("[p]","P"))
     
    strSQL = "INSERT INTO T_Prime
    strSQL = strSQL & " SELECT TOP " &  i & " *"
    strSQL = strSQL & " FROM T"
     
    CurrentDb.Execute strSQL
    

    ça me convient bien.

    Pour aller plus loin, j'en profite pour vous demander votre avis sur la faisabilité de faire en une seule opération la chose suivante :

    En réalité dans ma table T j'ai par exemple 100 enregistrements de 2 familles : 75 de la famille A suivis de 25 de la famille B.

    Dans ma table P j'ai pour chaque famille A et B le nombre de lignes que je dois extraire à partir de la table T, respectivement dans les familles A et B, par exemple 6 et 10.

    Comment modifier l'instruction ci-dessus pour extraire du même coup les 6 premières enre. de la table qui sont de famille A (autrement dit les lignes 1 à 6) et les 10 premiers enre. qui sont de la famille B (autrement dit les lignes 76 à 85) ?

    Merci d'avance!
    0
  3. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    J'allais te proposer un truc comme ça, une fois que tu m'aurais dit comment tu récupérais ton nombre à extraire...

    Dans le cas du paramétrage, je pense qu'il faut faire une boucle sur la table P et envoyer autant de requêtes qu'il y a de lignes...
    0
    1. 16-MARCO Messages postés 8 Statut Membre
       
      Re-

      j'ai essayé de rajouter un peu de complexité à la solution écrite ci-dessus. En réalité la sélection des x 1eres lignes ne se fera pas sur 1 seul critère (la famille), mais sur plusieurs :

      "matable" ressemblera donc à :
      famille1
      famille2
      valeur

      "param" ressemblera donc à :
      famille1
      famille2
      nombre lignes à selectionner dans "matable" lorsque les 2 critères matchent.

      j'ai modifié de la façon suivante le code de la fonction :
      Function gardemarc(famille1 As String, famille2 As String, nb As Long) As Boolean
       
      Static fam1 As String
      Static fam2 As String
      Static compteur As Long
      If fam1 = famille1 Then
         If fam2 = famille2 Then
         compteur = compteur + 1
              Else
              fam1 = famille1
              fam2 = famille2
              compteur = 1
          End If
          Else
          fam1 = famille1
          fam2 = famille2
          compteur = 1
      End If
      garde = compteur <= nb
      Exit Function
      End Function

      et la requête sql:
      SELECT matable.famille1, matable.famille2, matable.valeur
      FROM matable INNER JOIN param ON (matable.famille1=param.famille1) AND( matable.famille2=param.famille2)
      WHERE gardemarc([matable].[famille1],[matable].[famille2],[param])=True
      ORDER BY matable.famille1, matable.famille2;


      Pour autant j'ai le message d'erreur à l'execution de la requête :
      "erreur de compilation dans l'expression gardemarc([matable].[famille1],[matable].[famille2],[param])=True

      vois-tu où es l'erreur ?
      0
  4. 16-MARCO Messages postés 8 Statut Membre
     
    solution trouvée :

    créer un module "garder" à l'intérieur duquel on créé la fonction "garde"
    Function garde(famille As String, nb As Long) As Boolean
    Static fam As String
    Static compteur As Long
    If fam = famille Then
       compteur = compteur + 1
       Else
       fam = famille
       compteur = 1
    End If
    garde = compteur <= nb
    Exit Function
    End Function


    Dans la vue requête, créer une requête avec le code SQL :
    SELECT matable.famille, 
    matable.valeur
    FROM matable INNER JOIN param 
    ON matable.famille = param.famille
    WHERE garde([matable].[famille],[nb])=True
    ORDER BY matable.famille, matable.valeur;


    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. JM30 Messages postés 2 Statut Membre
     
    Bonjour,

    J'ai essayé le modèle "proposé" dans le forum mais sans succés... D'abord parque je suis débutant en ce domaine mais je pense qu'il n'est pas adaptée à mes besoins ... moins complexes.

    Alors si quelqu'un peut me donner les moyens à l'aide d'une requête et la possibilté de modifier la Fonction TOP avec une "variable" pour extraire d'une table un nombre limité d'enregistrements. Grand merci.

    J'organise une journée de formation avec des ateliers. Les ateliers ont des places limités. il me faut donc extraire un nombre d'inscrits en fonction du nombre de places disponibles dans l'atelier. En l'occurence, mon choix s'appuiera sur les premiers inscrits donc en fonction de la date d'inscription.

    Je souhaiterais pouvoir entrer le nombre de places disponible comme "variable" dans la fonction TOP.

    Table Inscription

    champs:

    Date Inscription
    Nom
    Prénom

    J'ai essayé d'utiliser la numérotation automatique mais il me faut renuméroter donc réaliser des requêtes ajouts et je trouve la méthode lourde. J'ai également utilisé le "Cumul" type compteur mais en s'appuyant sur les champs identiques cela ne fonctionne pas.

    Surtout n'oubliez pas que vous avez à faire à un débutant... soyez patient et explicatif.

    Merci beaucoup pour votre aide.

    JM30
    0