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 :

Conserver un type MEMO en résultat d'une requête ?


Sujet :

Requêtes et SQL.

  1. #1
    Membre éclairé
    Avatar de kikidrome
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 861
    Points : 685
    Points
    685
    Par défaut Conserver un type MEMO en résultat d'une requête ?
    Bonjour

    J'ai écrit une requête pour transposer une table afin de pouvoir l'exploiter plus facilement avec un outil de reporting :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  VOLONTE_SECURITE AS LIB,VOLONTE_SECURITE_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT  IMPL_HIER AS LIB,IMPL_HIER_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT SERV_SEC AS LIB,SERV_SEC_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT  EXIST_INDIC AS LIB,EXIST_INDIC_Memo  AS MEMO
    FROM Array2z,  Array2_COL;
    Le problème : j'ai en entrée des champs de type "MEMO" et en résultat, je récupère des type TXT tronqués

    Y a t-il une astuce pour conserver le type MEMO ?


    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de kikidrome
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 861
    Points : 685
    Points
    685
    Par défaut
    une piste : c'est l'union qui fout le bazar...
    que faire !


    j'ai essayé de décomposer ma requête en requête élémentaires :
    INFO1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT VOLONTE_SECURITE AS LIB, VOLONTE_SECURITE_Memo AS [MEMO]
    FROM Array2z, Array2_COL;
    INFO2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IMPL_HIER AS LIB, IMPL_HIER_Memo AS [MEMO]
    FROM Array2z, Array2_COL;
    et ensuite de faire l'union :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM INFO1
    UNION SELECT *
    FROM INFO2;

    c'est toujours tronqué


  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Utiliser une table temporaire... ?
    Bonjour,

    Si on considère le contexte d'une requête UNION avec un bon de nombre de sous-requêtes impliquées, je ne vois pas de solution simple.

    Le plus facile serait sans doute de créer une table temporaire où tu pourrais déverser tous les jeux de données.
    Sans compter que cela améliorera les temps de réponses ensuite, surtout qu'à ce stade là tu peux fixer des index sur ta table temporaire et "booster" les traitements suivants.

    Le bémol:
    Avec plein de mémos recopiés vers la table temporaire, les temps de copie pourraient être longs et la mémoire du PC un peu chargée.
    En plus la base de données va grossir ; des compactages fréquents seront nécessaires.

    Bon courage
    _

  4. #4
    Membre éclairé
    Avatar de kikidrome
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 861
    Points : 685
    Points
    685
    Par défaut
    Merci, çà me rassure mais je ne comprends pas comment faire en passant par une table temporaire, peux tu me donner qq précisions ?

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par kikidrome Voir le message
    je ne comprends pas comment faire en passant par une table temporaire, peux tu me donner qq précisions ?
    Avec Access il n'y a pas de gestion automatique de table temporaire, et il faut tout faire soi-même.
    (entre nous, ce n'est pas plus mal ! )

    Donc tu dois créer une nouvelle "table de travail" dont la seule raison d'être est de recevoir les données, dans le cadre d'une opération plus globale.
    Une fois cette "opération globale" terminée, alors la table de travail n'a plus de raison d'être et on peut la supprimer, ou simplement vider son contenu.
    C'est pour ça que je parle de table temporaire.

    La structure des champs de la table de travail doit permettre de respecter le type/dimensionnement des données qui y seront déversées.
    Dans l'idéal, tu définis les index qui pourraient être utiles par la suite (pour ma part, je n'hésiterai pas à ajouter un champ de type NuméroAuto et à en faire une clé primaire, juste au cas où...).

    Dans ton cas, la table de travail (ici je vais l'appeler TEMP_UNION) a au moins 2 champs: LIB et MEMO (d'ailleurs j'éviterai de le nommer [MEMO] de crainte que ce ne soit un mot clé du SQL d'Access).

    Ensuite, au lieu d'exécuter ta super requête UNION, tu suis la procédure:

    * vider la table de travail (table temporaire)

    * pour chaque source de données, exécuter une requête INSERT INTO vers la table de travail. Par exemple:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TEMP_UNION (LIB, MEMO)
    SELECT VOLONTE_SECURITE AS LIB, VOLONTE_SECURITE_Memo AS [MEMO]
    FROM Array2z, Array2_COL;
    * Enfin tu peux utiliser ta table de travail temporaire dans le cadre de << l'opération globale >>.

    * Finalement, il vaut mieux vider la table de travail, en prévision du prochain compactage de la BD.

    Au passage, je suis étonné que tu fasses un produit cartésien entre les tables de la clause FROM (FROM Array2z, Array2_COL). Tu n'as pas besoin de faire une jointure ?
    _

  6. #6
    Membre éclairé
    Avatar de kikidrome
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 861
    Points : 685
    Points
    685
    Par défaut
    Merci pour toutes ces infos. Je viens d'essayer mais il me manque des morceaux de la chaine. Je ne suis pas du tout experte en requête sql , je developpe des rapport avec crystal report : j'ai en entrée une base access avec un bon nombre tables. Parfois, j'ai besoin de créer des tables pour pouvoir afficher mes données correctement. C'est mon cas aujourd'hui.
    En entrée, j'ai une table qui a cette structure :



    et une autre table avec cette structure :



    dans ces 2 tables, il y a un seul enregistrement.

    ce que je dois obtenir :
    - une table avec 2 colonnes : LIB et VALEUR ( à la place de MEMO).
    le premier enregistrement étant
    LIB = DANGER (de la deuxième table) VAL = DANGER_MEMO (de la première table)

    le deuxième enregistrement étant
    LIB = RISQUE (de la deuxième table) VAL = RISQUE_MEMO (de la première table)

    etc...

    pour voir en final :



    j'ai essayé ce que tu proposes avec insert mais la requête ne s'exécute que quand j'essaie de voir le contenue de la table et ... comme je n'ai pas créé la table, çà ne marche pas de toute façon....

    Pas de solution + simple ?


  7. #7
    Membre éclairé
    Avatar de kikidrome
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 861
    Points : 685
    Points
    685
    Par défaut
    Je laisse tomber, j'ai vu que l'union tronquait... super
    Je demande à la personne qui me fournit la table en entrée de changer de structure...

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Conserver un type MEMO en résultat d'une requête ?
    Citation Envoyé par kikidrome Voir le message
    Bonjour

    J'ai écrit une requête pour transposer une table afin de pouvoir l'exploiter plus facilement avec un outil de reporting :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  VOLONTE_SECURITE AS LIB,VOLONTE_SECURITE_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT  IMPL_HIER AS LIB,IMPL_HIER_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT SERV_SEC AS LIB,SERV_SEC_Memo  AS MEMO
    FROM Array2z,  Array2_COL
    UNION SELECT  EXIST_INDIC AS LIB,EXIST_INDIC_Memo  AS MEMO
    FROM Array2z,  Array2_COL;
    Le problème : j'ai en entrée des champs de type "MEMO" et en résultat, je récupère des type TXT tronqués

    Y a t-il une astuce pour conserver le type MEMO ?


    Merci d'avance
    Il faut convertir le type de donnée en sortie du genre SELECT VOLONTE_SECURITE AS LIB,cast(VOLONTE_SECURITE_Memo as text) AS MEMO
    FROM Array2z, Array2_COL
    sur chaque reqête;

    Un autre astuce est d'enregistrer cette requete avec union comme vue et de faire un dernière requete avec la conversion en question sur laquelle va s'appuyer l'état

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

Discussions similaires

  1. [Débutant] récupérer résultat d'une requête select de type int
    Par hamzawhy dans le forum C#
    Réponses: 6
    Dernier message: 12/06/2014, 17h44
  2. Réponses: 10
    Dernier message: 13/09/2011, 17h24
  3. Réponses: 3
    Dernier message: 27/10/2010, 16h47
  4. Les types string/int en résultats d'une requête
    Par labluegirl dans le forum Langage
    Réponses: 8
    Dernier message: 18/10/2009, 15h18
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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