ATTENTION : Ce contenu est DÉSACTIVÉ. Il est invisible pour les visiteurs.
Niveau de difficulté
Débutant
Publié le :
Le script effectue une série de tests pour valider le fonctionnement de la macro `%mp_retainedkey`, qui est conçue pour gérer des clés primaires persistantes (clés retenues) lors de l'ajout de données. Le script commence par définir la structure de deux tables de contrôle (`maxkeytable` pour suivre la valeur maximale de la clé, `locktable` pour gérer les verrous) via `PROC SQL`. Ensuite, il crée des tables de données source (`targetds`) et à ajouter (`appendtable`) en se basant sur `sashelp.class`. Un premier test est lancé pour un cas de base, et ses résultats sont vérifiés en comparant les clés générées. Un second test est effectué avec des paramètres plus avancés, activant la vérification de l'unicité des clés métier et l'enregistrement des métadonnées dans les tables de contrôle. Les résultats de ce second test sont également validés via des assertions sur le code retour et le nombre d'observations créées.
Analyse des données
Type : MIXTE
Le script utilise la table standard `sashelp.class` comme source pour générer ses propres tables de données de test (`work.targetds`, `work.appendtable`, etc.). Les tables de contrôle (`work.maxkeytable`, `work.locktable`) sont créées avec une structure vide, sans données initiales.
1 Bloc de code
PROC SQL Data
Explication : Ce bloc `PROC SQL` crée la table `work.maxkeytable`. Cette table est destinée à stocker la valeur maximale de la clé retenue pour une table de base donnée, permettant ainsi de garantir l'incrémentation unique des clés.
Copié !
proc sql;
create table work.maxkeytable(
keytable varchar(41) label='Base table in libref.dataset format',
keycolumn char(32) format=$32.
label='The Retained key field containing the key values.',
max_key num label=
'Integer representing current max RK or SK value in the KEYTABLE',
processed_dttm num format=E8601DT26.6
label='Datetime this value was last updated',
constraint pk_mpe_maxkeyvalues
primary key(keytable));
1
PROC SQL;
2
create TABLE work.maxkeytable(
3
keytable varchar(41) label='Base table in libref.dataset format',
4
keycolumn char(32) FORMAT=$32.
5
label='The Retained key field containing the key values.',
6
max_key num label=
7
'Integer representing current max RK or SK value in the KEYTABLE',
8
processed_dttm num FORMAT=E8601DT26.6
9
label='Datetime this value was last updated',
10
constraint pk_mpe_maxkeyvalues
11
primary key(keytable));
2 Bloc de code
PROC SQL Data
Explication : Ce bloc `PROC SQL` crée la table `work.locktable`. Elle est conçue pour enregistrer et suivre les informations de verrouillage sur les tables de données pendant leur manipulation, afin d'éviter les conflits d'accès.
Copié !
create table work.locktable(
lock_lib char(8),
lock_ds char(32),
lock_status_cd char(10) not null,
lock_user_nm char(100) not null ,
lock_ref char(200),
lock_pid char(10),
lock_start_dttm num format=E8601DT26.6,
lock_end_dttm num format=E8601DT26.6,
constraint pk_mp_lockanytable primary key(lock_lib,lock_ds));
Explication : Crée la table de destination `work.targetds` en copiant les données de `sashelp.class`. Une colonne `rk_col` est ajoutée pour servir de clé retenue, initialisée avec le numéro d'observation.
Copié !
data work.targetds;
rk_col=_n_;
set sashelp.class;
run;
1
DATA work.targetds;
2
rk_col=_n_;
3
SET sashelp.class;
4
RUN;
4 Bloc de code
DATA STEP Data
Explication : Crée la table `work.appendtable` avec les données à ajouter. Elle se base sur `sashelp.class`, mais modifie certaines valeurs de la variable `name` pour simuler à la fois des enregistrements existants et nouveaux. Seules les 6 premières lignes sont conservées.
Copié !
data work.appendtable;
set sashelp.class;
if mod(_n_,2)=0 then name=cats('New',_n_);
if _n_<7;
run;
1
DATA work.appendtable;
2
SET sashelp.class;
3
IF mod(_n_,2)=0 THEN name=cats('New',_n_);
4
IF _n_<7;
5
RUN;
5 Bloc de code
LIBNAME
Explication : Assigne la bibliothèque `x` à la bibliothèque `work`. Cela permet de référencer les tables de `work` via le préfixe `x`.
Copié !
libname x (work);
1
LIBNAME x (work);
6 Bloc de code
MACRO CALL Data
Explication : Premier appel à la macro `%mp_retainedkey`. Ce test de base fusionne les données de `appendtable` dans `targetds`. Il identifie les nouvelles lignes basées sur la clé métier `name` et leur assigne une nouvelle valeur de clé retenue `rk_col`. La sortie est stockée dans `work.APPEND`. Les tables de logging (`maxkeytable`, `locktable`) ne sont pas utilisées dans ce cas.
Copié !
/** Test 1 - base case **/
%mp_retainedkey(
base_lib=X
,base_dsn=targetds
,append_lib=X
,append_dsn=APPENDTABLE
,retained_key=rk_col
,business_key= name
,check_uniqueness=NO
,maxkeytable=0
,locktable=0
,outds=work.APPEND
,filter_str=
)
1
/** Test 1 - base case **/
2
%mp_retainedkey(
3
base_lib=X
4
,base_dsn=targetds
5
,append_lib=X
6
,append_dsn=APPENDTABLE
7
,retained_key=rk_col
8
,business_key= name
9
,check_uniqueness=NO
10
,maxkeytable=0
11
,locktable=0
12
,outds=work.APPEND
13
,filter_str=
14
)
7 Bloc de code
MACRO CALL Data
Explication : Appel à la macro `%mp_assert` pour vérifier que l'exécution précédente de `%mp_retainedkey` s'est terminée sans erreur (variable système `syscc` égale à 0). Le résultat du test est enregistré dans `work.test_results`.
Copié !
%mp_assert(
iftrue=(&syscc=0),
desc=Checking errors in test 1,
outds=work.test_results
)
1
%mp_assert(
2
iftrue=(&syscc=0),
3
desc=Checking errors in test 1,
4
outds=work.test_results
5
)
8 Bloc de code
DATA STEP Data
Explication : Crée une table de vérification `work.check` contenant les valeurs attendues pour la clé retenue `rk_col` après l'exécution du premier test. Ces valeurs correspondent aux clés existantes et aux nouvelles clés qui auraient dû être générées.
Copié !
data work.check;
do val=1,3,5,20,21,22;
output;
end;
run;
1
DATA work.check;
2
DO val=1,3,5,20,21,22;
3
OUTPUT;
4
END;
5
RUN;
9 Bloc de code
MACRO CALL
Explication : Appel à la macro `%mp_assertcolvals` pour comparer les valeurs de la colonne `rk_col` dans la table de sortie `work.append` avec les valeurs attendues de la table `work.check`. Cela valide que la logique d'assignation de clé a fonctionné comme prévu.
Copié !
%mp_assertcolvals(work.append.rk_col,
checkvals=work.check.val,
desc=All values have a match,
test=ALLVALS
)
1
%mp_assertcolvals(work.append.rk_col,
2
checkvals=work.check.val,
3
desc=All values have a match,
4
test=ALLVALS
5
)
10 Bloc de code
DATA STEP Data
Explication : Préparation pour le deuxième test. Crée une nouvelle table de destination `targetds2` et une nouvelle table `appendtable2` contenant 21 enregistrements garantis d'être uniques et nouveaux.
Copié !
/** Test 2 - all new records, with metadata logging and unique check **/
data work.targetds2;
rk_col=_n_;
set sashelp.class;
run;
data work.appendtable2;
set sashelp.class;
do x=1 to 21;
name=cats('New',x);
output;
end;
stop;
run;
1
/** Test 2 - all new records, with metadata logging and unique check **/
2
DATA work.targetds2;
3
rk_col=_n_;
4
SET sashelp.class;
5
RUN;
6
7
DATA work.appendtable2;
8
SET sashelp.class;
9
DO x=1 to 21;
10
name=cats('New',x);
11
OUTPUT;
12
END;
13
stop;
14
RUN;
11 Bloc de code
MACRO CALL Data
Explication : Second appel à `%mp_retainedkey`. Ce test utilise des paramètres plus avancés : `check_uniqueness=YES` pour valider l'unicité des clés métier, et spécifie `maxkeytable` et `locktable` pour activer le logging des métadonnées et le mécanisme de verrouillage.
Explication : Deux appels à la macro `%mp_assert` pour valider le second test. Le premier vérifie que la macro s'est exécutée sans erreur. Le second vérifie que la table de sortie `work.append2` contient bien les 21 nouveaux enregistrements attendus, en utilisant une macro (supposée) `%mf_nobs` pour compter les observations.
Copié !
%mp_assert(
iftrue=(&syscc=0),
desc=Checking errors in test 2,
outds=work.test_results
)
%mp_assert(
iftrue=(%mf_nobs(work.append2)=21),
desc=Checking append records created,
outds=work.test_results
)
1
%mp_assert(
2
iftrue=(&syscc=0),
3
desc=Checking errors in test 2,
4
outds=work.test_results
5
)
6
%mp_assert(
7
iftrue=(%mf_nobs(work.append2)=21),
8
desc=Checking append records created,
9
outds=work.test_results
10
)
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.
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.