Attention : Ce code nécessite des droits administrateur.
Cette macro, `mp_lockfilecheck`, prend en entrée une référence de jeu de données (`libds`). Elle commence par enregistrer les variables de macro de l'appel courant en consultant `sashelp.vmacro`. Ensuite, elle utilise la macro `%mp_abort` pour effectuer plusieurs vérifications préliminaires : s'assurer qu'un code système supérieur à zéro n'est pas présent et que le paramètre `libds` a bien été fourni. Elle gère spécifiquement les catalogues de format en identifiant leur suffixe '-FC' et en évitant le verrouillage. La macro vérifie également que l'option `OBS=0` n'est pas définie, car cela empêcherait le traitement. Elle récupère ensuite le moteur (`ENGINE`) et le type de membre (`MTYPE`) du jeu de données cible. Le verrouillage n'est tenté que si le moteur est V9 ou BASE et le type de membre est DATA. Une commande `lock &libds;` est exécutée. Si cette commande échoue (vérifié par `&syscc` ou `&SYSLCKRC`), un message d'erreur est affiché et un drapeau d'avortement est positionné. La macro tente ensuite de libérer le verrou avec `lock &libds clear;`. Finalement, si le drapeau d'avortement est activé, la macro est interrompue via `%mp_abort`. La macro se termine par `%mend`.
Analyse des données
Type : SASHELP
Utilise la librairie SASHELP pour les métadonnées des macros système (`sashelp.vmacro`). L'entrée principale est une référence à un jeu de données (`libds`) dont le statut de verrouillage est vérifié. Les données elles-mêmes ne sont pas lues ou créées dans ce bloc de code.
1 Bloc de code
DATA STEP
Explication : Enregistre les variables de macro utilisées lors de l'appel de la macro actuelle, en interrogeant `sashelp.vmacro`.
Copié !
data _null_;
if _n_=1 then putlog "&sysmacroname entry vars:";
set sashelp.vmacro;
where scope="&sysmacroname";
put name '=' value;
run;
1
DATA _null_;
2
IF _n_=1THEN putlog "&sysmacroname entry vars:";
3
SET sashelp.vmacro;
4
where scope="&sysmacroname";
5
put name '=' value;
6
RUN;
2 Bloc de code
MACRO
Explication : Appelle la macro `%mp_abort` pour vérifier le code système (`&syscc`). Si le code est supérieur à 0, le script est interrompu avec un message d'erreur.
Copié !
%mp_abort(iftrue= (&syscc>0)
,mac=checklock.sas
,msg=Aborting with syscc=&syscc on entry.
)
1
%mp_abort(iftrue= (&syscc>0)
2
,mac=checklock.sas
3
,msg=Aborting with syscc=&syscc on entry.
4
)
3 Bloc de code
MACRO
Explication : Appelle `%mp_abort` pour vérifier si le paramètre `libds` a été fourni. Si `libds` est vide (évalué à '0' après substitution), le script est interrompu.
Copié !
%mp_abort(iftrue= ("&libds"="0")
,mac=&sysmacroname
,msg=%str(libds not provided)
)
1
%mp_abort(iftrue= ("&libds"="0")
2
,mac=&sysmacroname
3
,msg=%str(libds not provided)
4
)
4 Bloc de code
MACRO
Explication : Déclare des variables locales et extrait le nom de la librairie (`lib`) et du jeu de données (`ds`) à partir du paramètre `libds`.
Explication : Vérifie si `libds` est un catalogue de format (suffixe '-FC'). Si c'est le cas, affiche une note et termine la macro, car les catalogues de format ne sont pas verrouillés.
Copié !
/* in DC, format catalogs are passed with a -FC suffix. No saslock here! */
%if %scan(&libds,2,-)=FC %then %do;
%put &sysmacroname: Format Catalog detected, no lockfile applied to &libds;
%return;
%end;
1
/* in DC, format catalogs are passed with a -FC suffix. No saslock here! */
2
%IF %scan(&libds,2,-)=FC %THEN %DO;
3
%put &sysmacroname: FORMAT Catalog detected, no lockfile applied to &libds;
4
%return;
5
%END;
6 Bloc de code
MACRO
Explication : Vérifie si l'option `OBS=0` est définie. Si c'est le cas, cela signifie qu'aucune observation ne sera traitée, et la macro est interrompue par `%mp_abort`.
Copié !
/* do not proceed if no observations can be processed */
%let msg=options obs = 0. syserrortext=%superq(syserrortext);
%mp_abort(iftrue= (%sysfunc(getoption(OBS))=0)
,mac=checklock.sas
,msg=%superq(msg)
)
1
/* do not proceed if no observations can be processed */
Explication : Affiche un message de journalisation indiquant la vérification du moteur et du type de membre, puis récupère ces informations pour le `libds` donné en utilisant la macro `%mf_getattrc`.
Copié !
data _null_;
putlog "Engine & member type";
run;
%local engine memtype;
%let memtype=%mf_getattrc(&libds,MTYPE);
%let engine=%mf_getattrc(&libds,ENGINE);
1
DATA _null_;
2
putlog "Engine & member type";
3
RUN;
4
%local engine memtype;
5
%let memtype=%mf_getattrc(&libds,MTYPE);
6
%let engine=%mf_getattrc(&libds,ENGINE);
8 Bloc de code
MACRO
Explication : Vérifie si le moteur utilisé n'est ni V9 ni BASE, ou si le type de membre n'est pas DATA (par exemple, une VIEW). Dans ces cas, un message est affiché et la macro se termine sans tenter de verrouiller le fichier.
Copié !
%if &engine ne V9 and &engine ne BASE %then %do;
data _null_;
putlog "Lib &lib is not assigned using BASE engine - uses &engine instead";
putlog "SAS lock check will not be performed";
run;
%return;
%end;
%else %if &memtype ne DATA %then %do;
%put NOTE: Cannot lock a VIEW!! Memtype=&memtype;
%return;
%end;
1
%IF &engine ne V9 and &engine ne BASE %THEN %DO;
2
DATA _null_;
3
putlog "Lib &lib is not assigned using BASE engine - uses &engine instead";
4
putlog "SAS lock check will not be performed";
5
RUN;
6
%return;
7
%END;
8
%ELSE %IF &memtype ne DATA %THEN %DO;
9
%put NOTE: Cannot lock a VIEW!! Memtype=&memtype;
10
%return;
11
%END;
9 Bloc de code
DATA STEP
Explication : Affiche des messages de journalisation indiquant la tentative d'application du verrou. Ensuite, la commande `lock` est exécutée sur le jeu de données spécifié par `&libds`.
Explication : Initialise une variable locale `abortme` à 0. Vérifie si `&syscc` (code système) ou `&SYSLCKRC` (code de verrouillage) indiquent une erreur. Si une erreur est détectée, un message d'erreur est affiché et `abortme` est mis à 1.
Copié !
%local abortme;
%let abortme=0;
%if &syscc>0 or &SYSLCKRC ne 0 %then %do;
%let msg=Unable to apply lock on &libds (SYSLCKRC=&SYSLCKRC syscc=&syscc);
%put %str(ERR)OR: &sysmacroname: &msg;
%let abortme=1;
%end;
1
%local abortme;
2
%let abortme=0;
3
%IF &syscc>0 or &SYSLCKRC ne 0 %THEN %DO;
4
%let msg=Unable to apply lock on &libds (SYSLCKRC=&SYSLCKRC syscc=&syscc);
5
%put %str(ERR)OR: &sysmacroname: &msg;
6
%let abortme=1;
7
%END;
11 Bloc de code
LOCK STATEMENT
Explication : Tente de libérer le verrou du jeu de données spécifié par `&libds`.
Copié !
lock &libds clear;
1
lock &libds clear;
12 Bloc de code
MACRO
Explication : Appelle `%mp_abort` une dernière fois. Si `abortme` est égal à 1 (indiquant un problème de verrouillage précédent), la macro est interrompue. La macro se termine ensuite avec `%mend`.
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
« Intégrez systématiquement cette macro au début de vos programmes ETL ou de vos applications web SAS. C'est le meilleur moyen de prévenir les erreurs de type "File is in use" qui sont souvent difficiles à gérer proprement une fois que le traitement principal a commencé. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.