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 :

Charger une table en tableau de variable [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut Charger une table en tableau de variable
    Bonjour à tous,

    ceci est mon premier post, et sûrement pas le dernier, sur Développez.net.

    j'ai recherché sur le net une solution à ma problématique, en vain. la voici :

    je développe une application dans laquelle j'ai besoin de charger une table (Access) en tableau de variables.

    sous excel, il est possible de le faire très rapidement avec l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableau = Range (cell1, cell2).value
    je recherche une instruction similaire permettant de charger une table.

    Actuellement, je passe par une boucle qui balaye chaque champ de la table pour alimenter le tableau... Je ne vous dis pas le temps de chargement pour des tables de 2 millions de lignes...

    J'espère que l'un d'entre vous aura la solution.

    D'avance merci
    Phoe

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 029
    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 029
    Points : 24 584
    Points
    24 584
    Par défaut
    Bonjour,

    Avant d'aller plus loin, quelle est l'utilité d'un tel montage ?

    Cordialement,

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    tout d'abord, merci d'être passé par là.

    En fait le problème est essentiellement dû à mon incompétence en terme de requête SQL. Je me suis initié à acces il y a peu parce que les bases de données sont trop volumineuses pour excel. Je n'y connais donc pas grand chose.

    En ce qui nous concerne, je pars ici d'une table contenant le détail des ventes historisé d'un magasin.
    avec un champ ARTICLE, un champ QTE, un champ TYPE et un champ DATEVENTE

    La première étape est de multipler la valeur valeur des champs QTE de chaque enregistrement par "-1" si la valeur du champ TYPE est "A" (pour "Avoir"). Actuellement, je le fais pendant le chargement de la table en variable puisque c'est une boucle for / next, car je suis bien incapable de le faire par requête.

    Je me retrouve donc avec l'équivalent d'une table à 3 champs :
    un champ ARTICLE
    un champ QTE
    un champ DATEVENTE

    A partir de là, l'objectif est d'obtenir à partir de cette table, une nouvelle table, contenant uniquement :

    1 - la dernière date de vente pour chaque article

    2a - si la date de vente se situe dans "le mois donné" et "l'année donnée"
    > la somme des ventes de ce mois

    2b - si la date de vente est en dehors de cette période
    > ignorer les ventes
    Ce qui me coince dans les requêtes, c'est comment demander que pour un champ donné, si la valeur d'une autre champ du même enregistrement est "telle" alors éxecuter telle action ou telle action.

    Pour le peu que j'ai compris, c'est impossible et, il faudrait plutôt que je fasse d'abord une requête visant à séparer les deux catégories d'articles (ceux dont je dois faire la somme des ventes, et les autres), puis une requête disctincte pour chaque table obtenue avec la première.
    Sachant que je ne serai ensuite pas capable de fusionner ensuite les deux tables en une seule...

    C'est pourquoi je suis obligé de charger la table en variable afin d'exécuter une boucle directement dans le code de mon appli VB.NET.

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 388
    Points : 19 811
    Points
    19 811
    Billets dans le blog
    66
    Par défaut
    Salut,

    Il faut donc te familiariser avec les requêtes sous Access, donc voici de la lecture:

    Créer des requêtes simples
    .

    Utiliser des opérateurs dans des requêtes simples
    .

    Et au niveau du langage sql:
    Le Langage SQL appliqué à Access

    Bonne lecture

    Denis

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 029
    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 029
    Points : 24 584
    Points
    24 584
    Par défaut
    En effet mets toi à SQL rapidement.
    Ton appli doit ramer et ça ne vas pas aller en s'arrangeant. J'espère que ce n'est pas une appli professionnelle.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut
    Bonjour à vous deux,

    Merci pour la lecture ! surtout le SQL appliqué à Access, le reste, je connaissais en majorité. Plus ça va plus je me dis qu'en fait, je ne sais pas composer avec les instructions en SQL pour arriver à mon résultat voulu...

    Si vous le voulez bien, j'aimerais être guidé pour mes premiers pas, car manifestement, c'est la logique SQL que je n'ai pa saisi.

    Question concrète : je pars de ma fameuse table, que j'ai déjà triée par date (plus récent au plus ancien) et par article (de manière à regrouper tous les enregistrements d'un même article) dans une requête précédente.

    Ma première requête consisterait à extraire seulement le premier enregistrement de chaque article, au delà d'une certaine date. Je l'ai rédigée de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Prépa_DetFact.NART, Prépa_DetFact.QTE, Prépa_DetFact.TYPFACT, Prépa_DetFact.DATFACT INTO DetFactOld
    FROM Prépa_DetFact
    WHERE ((Prépa_DetFact.DATFACT) < (#01/03/2012#));
    Je pense que la solution tourne autour de l'instruction "TOP" mais je n'arrive pas à mes fins pour l'instant.

    Je continue de creuser.

    Ah LouFab, navré de te décevoir mais si, c'est une appli professionnelle, ou plutôt un outils de travail prefessionnel. J'y encode les divers traitements que je dois réaliser régulièrement dans le cadre de mon travail.

    @+
    Phoe

  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 029
    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 029
    Points : 24 584
    Points
    24 584
    Par défaut
    Le générateur de requetes ACCESS (QBE) est très bien pour te mettre le pied à l'étrier.

    Il s'agit de la clause TOP :

    Tu peux la régler simplement dans le QBE via les propriétés (Première valeur = 1). Tu peux les afficher en mode création en faisant un Clic-droit sur la partie contenant le schéma des tables, bien sur ne pas le faire sur un des liens ou l'une des tables.

    Tant que tu le seul à l'utiliser tu ne risques pas de faire tirer dessus par un utilisateur pressé...

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    j'ai potassé un peu et voici ce que j'ai trouvé pour "obtenir le dernière date de vente pour chaque article au delà d'un certaine date":

    Etape 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Prépa_DetFact.NART INTO [Distinct NART]
    FROM Prépa_DetFact;
    j'index donc ensuite cette table sans doublon puis

    Etape 2 : trouver la dernière date de vente de chaque article passé une certaine date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Distinct NART].NART, Max(Prépa_DetFact.DATFACT) AS DERNVTE INTO OldDetFact
    FROM [Distinct NART] INNER JOIN Prépa_DetFact ON [Distinct NART].NART = Prépa_DetFact.NART
    GROUP BY [Distinct NART].NART
    HAVING (((Max(Prépa_DetFact.DATFACT))<#03/01/2012#));
    Ces deux requêtes sont nettement plus rapide que ma piroute en Variable Array, comme je m'y attendais. Ca prend à peine 20 secondes...

    Pas trop de fautes de sintaxe ? les requêtes fonctionnent mais c'st peut être possible d'alléger... je ne sais pas

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 388
    Points : 19 811
    Points
    19 811
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Je n'ai pas trop saisi l'utilité de la 1ère requête, a priori le group by de la seconde requête devrait suffire ...

    A+

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    je savais bien que je devais faire des pirouettes de débutant... en effet, la seconde requête suffit, et cela m'arrange grandement.

    bon, il ne me reste plus qu'à rédiger le requête qui va regrouper les ventes de chaque article passé une certaine date... ça encore ça va, le problème c'est que j'ai un champ TYPE en fonction duquel je dois multiplier ma quantité par -1...

    je vais potasser un peu et si je bloque je reviens.

    "Le Langage SQL appliqué à Access" (posté plus haut) est une vraie mine d'or !!

    Encore merci

    @+
    Phoe

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 74
    Points : 94
    Points
    94
    Par défaut
    Re bonjour,

    eh bien je suis arrivé à mes fins, merci à tous pour votre aide.

    Je vais attendre de finaliser le programme avant de toper en résolu, au cas où.

    @+
    Phoe

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

Discussions similaires

  1. Charger une table dans un tableau (ArrayList)
    Par Mailgifson dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 31/10/2013, 11h46
  2. Charger une table de caractere
    Par blackshadow153 dans le forum C
    Réponses: 3
    Dernier message: 14/02/2007, 09h34
  3. [WCE] Charger une table depuis un dataset
    Par dacid dans le forum Windows Mobile
    Réponses: 15
    Dernier message: 30/11/2006, 11h29
  4. Charger une table avec PK, puis ajouter identity sur la PK
    Par heloise31 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/01/2006, 16h23
  5. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56

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