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

Macro Discussion :

Savoir si une table est vide


Sujet :

Macro

  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 Savoir si une table est vide
    Bonjour à toutes et à tous,

    Ma question est simple : est-il possible de savoir si une table donnée est vide ? Si oui, comment ?

    J'ai essayé de faire un call symputx et de créer une macro-variable indiquant le nombre de ligne de ma table, mais elle n'est visiblement pas crée et ne prend pas la valeur 0.

    Merci pour vos conseils,

    alers

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour, il y a de multiples façon de le savoir,

    par exemple avec sashelp

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    6698  data g; j=1;run;
     
    NOTE: Compression was disabled for data set WORK.G because compression overhead would increase the
          size of the data set.
    NOTE: The data set WORK.G has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
     
     
    6699
    6700  data _null_;
    6701  set sashelp.vtable;
    6702  if libname="WORK" and memname="G" then call symputx('nobs',nobs);
    6703  run;
     
    NOTE: There were 577 observations read from the data set SASHELP.VTABLE.
    NOTE: DATA statement used (Total process time):
          real time           1.21 seconds
          cpu time            0.51 seconds
     
     
    6704
    6705  %PUT nombre observation &nobs;
    nombre observation 1
    6706
    6707  data g; set g; delete;run;
     
    NOTE: Compression was disabled for data set WORK.G because compression overhead would increase the
          size of the data set.
    NOTE: There were 1 observations read from the data set WORK.G.
    NOTE: The data set WORK.G has 0 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
     
     
    6708
    6709  data _null_;
    6710  set sashelp.vtable;
    6711  if libname="WORK" and memname="G" then call symputx('nobs',nobs);
    6712  run;
     
    NOTE: There were 577 observations read from the data set SASHELP.VTABLE.
    NOTE: DATA statement used (Total process time):
          real time           0.48 seconds
          cpu time            0.51 seconds
     
     
    6713
    6714  %PUT nombre observation &nobs;
    nombre observation 0

  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
    Salut et merci pour ta réponse,

    Je n'ai pas réussis à reproduire ce que tu fais sur ma table. J'ai des erreurs avec le LIBNAME et le MEMTYPE (non initialisés) et la macro-variable ne se crée pas.

    Toutefois je me souviens maintenant que la macro-variable SQLOBS permet également de connaitre le nombre de lignes. Toutefois ça nécessite de faire une PROC SQL sans NOPRINT (ce qui est assez lourd à la longue).

    Je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    proc sql;
    select * 
    from nom_table;
    quit;
    et ça fonctionne à merveille. Si vous avez une astuce pour ne faire avec un NOPRINT je suis preneur.

    Merci encore

  4. #4
    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 : 46
    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.
    Tu peux créer une macro-variable via une étape DATA, en lisant ta table (instruction SET) en récupérant dans une variable temporaire le nombre d'observations (option NOBS=nomVariableTemporaire). Si ce nombre est <= 0, la table est vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA _NULL_ ;
      SET nom_table NOBS=n ;
      CALL SYMPUTX("vide", n<=0) ;
      STOP ;
    RUN ;
    %PUT est-ce vide ? &vide ;
    L'instruction STOP est là pour éviter de lire toutes les observations d'une table non vide : on est renseigné dès la 1e, donc on peut arrêter la lecture du SET et finir l'étape DATA.
    Bon courage.
    Olivier

    PS : étrange cette histoire de variables MEMNAME et LIBNAME non initialisées. Normalement la vue SASHELP.VTABLE qu'utilise Jérôme est toujours peuplée des mêmes variables. Elle s'appuie sur la vue SQL appelée DICTIONARY.TABLES...
    Bon courage.
    Olivier

  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
    En fait, j'ai eu ce problème de MEMNAME et LIBNAME en essayant le code sur ma propre table, pas la sashelp.vtable.

    J'ai tout fait en PROC SQL là, je verrai demain avec l'étape DATA.

    Merci encore !

  6. #6
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    Février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    je vous propose 2 méthodes, qui ont l'avantages de ne pas lire la table en entier pour avoir l'information.

    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
    /* avec la proc contents */
    proc contents data=sashelp.cars  out=contents noprint ;
    run ;
    data _null_ ;
      set contents (obs=1) ;
      call symput ("NombreObs", put (nobs-delobs, 8.) ) ;
    run ;
    %put &NombreObs ;
     
    /* en lisant les vues de la sashelp*/
    proc sql noprint ; 
              select nobs into: NombreObs 
             from DICTIONARY.TABLES
             where libname = 'SASHELP' and memname = 'CARS' ; 
    quit ; 
    %put &NombreObs ;
    Cordialement,

    --
    Géraldine CADE-DESCHAMPS
    Consultante ▪ Support Clients SAS
    Tel: +33 1 60 62 12 12 ▪ support@sas.com
    www.sas.com/france
    SAS® … THE POWER TO KNOW®

  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
    Mon problème de memname c'est peut-être car j'ai utilisé une table et pas une vue ?

    Citation Envoyé par Géraldine_Cade_SAS Voir le message
    Bonjour,

    je vous propose 2 méthodes, qui ont l'avantages de ne pas lire la table en entier pour avoir l'information.

    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
    /* avec la proc contents */
    proc contents data=sashelp.cars  out=contents noprint ;
    run ;
    data _null_ ;
      set contents (obs=1) ;
      call symput ("NombreObs", put (nobs-delobs, 8.) ) ;
    run ;
    %put &NombreObs ;
     
    /* en lisant les vues de la sashelp*/
    proc sql noprint ; 
              select nobs into: NombreObs 
             from DICTIONARY.TABLES
             where libname = 'SASHELP' and memname = 'CARS' ; 
    quit ; 
    %put &NombreObs ;
    Merci pour vos conseils.
    J'ai réussis avec la proc contents et avec la vue. Le problème des vues c'est qu'il faut deux macros variables pour la librairie et la table alors qu'avec la proc contents on peut n'en avoir qu'une.

    En tout cas c'est plus agréable qu'avec un SQLOBS intempestif qui s'affiche dans l'output.

    Merci à tous !

    alers

  8. #8
    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
    J'ai toutefois une question sur le programme faisant appel à une PROC CONTENTS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA _null_ ;
      SET contents (obs=1) ;
      call symput ("NombreObs", put (nobs-delobs, 8.) ) ;
    run ;
    Pourquoi faire la soustraction "nobs-delobs" ? Placer nobs en macro-variable n'est pas suffisant pour avoir l'information ?

    Merci encore,

    alers

  9. #9
    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,

    grâce à un ods et la proc contents tu récupères dans une table le nombre de lignes de ta table. Ensuite tu récupères en macro var le nb de lignes en filtrant sur la bonne information.

    Le code est :

    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
    data vide ;
    set sashelp.prdsale;
    delete ;
    run ; 
     
    /* teste si il existe des observations ds les tables */
     
    		ODS OUTPUT Attributes = listattrib ;
    			PROC CONTENTS DATA = vide VARNUM;
    		RUN ;
     
    		/* on initialise à 0 où à ce que tu voudras  */
    		%let nobs = 0 ;
    		PROC SQL noprint;
    			SELECT cValue2 INTO : nobs 
    				FROM Listattrib
    				WHERE Label2 ="Observations" ;
    		QUIT ;
    %put &nobs. ;
     
    		%IF &nobs gt 0 %THEN %DO ;
    Mohamed.

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

Discussions similaires

  1. Comment savoir si le champ d'une table est vide?
    Par CleeM dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/07/2007, 11h35
  2. Savoir si une table est verouillé ?
    Par borislotte dans le forum Access
    Réponses: 4
    Dernier message: 26/09/2006, 13h49
  3. savoir si une table est masquée ou pas
    Par scully2501 dans le forum Access
    Réponses: 13
    Dernier message: 22/09/2005, 12h19
  4. Tester si une table est vide
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 01/07/2004, 16h25
  5. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 09h17

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