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

SAS Base Discussion :

Ajouter des lignes vides à une table : ALTER TABLE [SQL]


Sujet :

SAS Base

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut Ajouter des lignes vides à une table : ALTER TABLE
    Bonjour,

    J'ai une question qui doit sans doute être un véritable jeu d'enfant (et encore) pour vous.

    Je souhaiterai tout simplement savoir si ma syntaxe SQL est juste. Je suis étonné car d'habitude je n'utilise jamais de ';' dans une PROC SQL pour séparer mes instructions, mais ça ne fonctionnait pas sans Aussi je souhaiterai tout simplement que vous me disiez si je risque de rencontrer des bugs avec ma PROC (qui n'affiche ni erreur ni warning).

    Le but est de créer une ligne vide dans une table SAS sans avoir à faire d'INSERT VALUES et sans avoir à choisir une variable spécifique déjà présente dans ma table (je fais un macro-programme qui doit s'adapter à n'importe quelle table que j'ai) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data test;
    set sashelp.class;
    run;
    
    proc sql;
    alter table test add ABCD char format=$1.;
    insert into test
    set ABCD = "";
    quit;
    Pourquoi d'habitude il ne faut pas mettre de ';' et là si ?

    Et à tout hasard, si vous avez une astuce pour ajouter une ligne vide encore plus facilement que ça, je suis preneur (INSERT VALUES on doit remplir chaque colonne et INSERT VALUES + SET nécessite de connaître le nom d'une variable de la table, et c'est lourd de devoir entrer ça en macro variable).

    Merci

    alers

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Alers.
    Je ne suis pas un grand spécialiste des ALTER TABLE donc je préfère zapper cette partie de ta question. Pour rajouter une ligne vide, l'étape DATA me semble plus simple. Tu écris systématiquement les lignes d'origine (OUTPUT) et en fin de table (par exemple, mais la condition pourrait aussi être IF _N_=1 et tu insèrerais en 2e une ligne vide), tu vides toutes les variables (instruction CALL MISSING) et tu écris cette nouvelle ligne. Ça s'adaptera plus facilement dans ta macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DATA work.test ;
      SET sashelp.class END=fin ;
      OUTPUT ;
      IF fin THEN DO ;
        CALL MISSING(OF _ALL_) ;
        OUTPUT ;
      END ;
    RUN ;
    Bon courage.
    Olivier

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour et merci pour ta réponse. \o/

    Cette méthode ne fonctionne pas chez moi car je souhaite ajouter une ligne à des data sets vides.

  4. #4
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Bonjour,

    le programme d'olivier permet de répondre je pense.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data dsvide ;
    	set test ;
    	delete ;
    run ; 
     
    data lvide ;
    	set test(obs=1) end=eof ; /* une seule ligne */
    	if eof then CALL MISSING(OF _ALL_) ; /* mise à missing */
    run ;
     
    proc append base=dsvide data=lvide ;
    run ;

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Malheureusement non ou alors je fais n'importe quoi (ce qui est possible). Le problème, c'est que mon data set est vide à la base, donc rien qu'au '(obs=1)' ça coince, je ne récupère pas de ligne donc pas de CALL MISSING.

  6. #6
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bon, alors on va tenter de tourner la chose autrement, en jouant sur la manière de fonctionner de l'étape DATA. L'idée est d'inclure le SET dans une boucle, histoire de pouvoir faire des choses avant et après. Ce qui m'intéresse c'est surtout avant, pour glisser une ligne vide (un simple OUTPUT suffit cette fois, puisque tant qu'on n'a pas fait de SET, il n'y a pas de données dans le vecteur de travail). Ensuite, on boucle sur la table pour écrire les observations existantes ; s'il n'y en a pas (table avec 0 observations), la boucle est zappée et c'est fini.
    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
    /* avec une table pas vide */
    DATA work.en_plus ;
      OUTPUT ;
      DO UNTIL(fin) ;
          SET sashelp.class END=fin ;
          OUTPUT ;
      END ;
      STOP ;
    RUN ;
    /* avec une table vide */
    DATA work.vide ;
      SET sashelp.class ;
      DELETE ;
    RUN ;
    DATA work.en_plus ;
      OUTPUT ;
      DO UNTIL(fin) ;
          SET work.vide END=fin ;
          OUTPUT ;
      END ;
      STOP ;
    RUN ;
    Les deux tests ci-dessous ont fonctionné, sur des tables vides ou non.
    Bon courage.
    Olivier

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Bonjour,

    Cette solution fonctionne effectivement et a le mérite d'être plus rapide que ce que je fais actuellement.

    C'est vraiment bien tout ce qu'on peut apprendre sur ce forum grâce aux utilisateurs !

    Merci encore

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

Discussions similaires

  1. ajouter des lignes a une QRRichText
    Par kroma23 dans le forum Débuter
    Réponses: 2
    Dernier message: 13/02/2013, 10h45
  2. ajout des lignes a une jtable
    Par totomimi dans le forum Composants
    Réponses: 1
    Dernier message: 24/06/2009, 16h26
  3. Richtextbox qui ajoute des lignes vides
    Par Seto dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2006, 14h10
  4. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

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