KioskeaKioskeaCommentCaMarcheInscrivez-vous, c'est gratuit !
Mardi 20 mai 2008 - 21:31:39

[ACCESS] ins. TOP utilisable avec variable ?

Rechercher : dans
[ACCESS] ins. TOP utilisable avec variable ?
par 16-MARCO
 Fil de Discussions
Statut : Résolu
lundi 26 février 2007 à 11:59:01
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
Répondre à 16-MARCO  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le lundi 26 février 2007 à 16:53:18 Fil de Discussions
Salut :-)

Tu le récupères où, ton nombre ?
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par 16-MARCO, le lundi 26 février 2007 à 22:42:47 Fil de Discussions
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!
Répondre à 16-MARCO

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par blux, le mardi 27 février 2007 à 08:55:50 Fil de Discussions
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...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"
Répondre à blux

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par 16-MARCO, le samedi 3 mars 2007 à 13:40:23 Fil de Discussions 
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 ?
Répondre à 16-MARCO

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Par 16-MARCO, le vendredi 2 mars 2007 à 00:08:23 Fil de Discussions
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+
Répondre à 16-MARCO
Discussions pertinentes trouvées dans le forum
01/08 10h00[ACCESS] insertion de données dans une tableProgrammation06/08 15h1412
04/04 18h22[ubuntu] Installer et utiliser eciadslLinux/Unix06/04 19h075
08/02 18h41Utilisation variable pr appelé une feuilleProgrammation09/02 13h197
21/01 15h39[msn] 2 msn a la fois installer et utiliserInternet06/04 21h439
Plus de discussions sur « [ACCESS] ins. TOP utilisable avec variable ? » Discussion en cours Discussion fermée Problème résolu
Répondre
Titre du message :
Votre pseudo:
Votre email :
Message: 
  •  
  •  
Options: Recevoir les réponses par mail.
 

Aide