Publié le :
ETL CREATION_INTERNE

Macro de Création et d'Indexation de Table de Différences

Ce code est également disponible en : Deutsch English Español Français
En attente de validation
La macro `%mddl_dc_difftable` est conçue pour établir une table normalisée pour l'audit des modifications de données. Elle utilise `PROC SQL` pour définir une table avec une structure détaillée, incluant des champs pour l'identification du chargement, les horodatages, les références de librairie/dataset, des hachages de clés primaires, le type de modification (ajout, suppression, modification), des indicateurs pour les clés primaires et les changements de valeurs, ainsi que les anciennes et nouvelles valeurs (caractères ou numériques). Après la définition de la structure, un bloc de logique macro extrait le nom de la librairie cible. Enfin, `PROC DATASETS` est utilisé pour créer un index unique nommé `pk_mpe_audit` sur une combinaison de colonnes clés, garantissant l'intégrité et l'efficacité des opérations de recherche sur cette table de différences. La macro est compatible avec SAS© Viya 4.
Analyse des données

Type : CREATION_INTERNE


Le script définit la structure d'une table SAS (`DIFFTABLE`) de manière interne. Il ne lit ni ne consomme de données existantes provenant de SASHELP ou d'autres sources. La table est conçue pour être peuplée ultérieurement par d'autres processus qui généreront les données de différences.

1 Bloc de code
PROC SQL Data
Explication :
Ce bloc définit la macro `%mddl_dc_difftable` et utilise `PROC SQL` pour créer une nouvelle table SAS (nommée via le paramètre `libds`, par défaut `WORK.DIFFTABLE`). La table est structurée pour enregistrer des métadonnées de différences, incluant des identifiants de référence, des horodatages, les noms de bibliothèque et de dataset, un hachage de clé primaire, le type de modification, des indicateurs de statut de clé primaire et de différence, le type de variable cible, et les anciennes/nouvelles valeurs pour les formats numériques et caractères.
Copié !
1%macro mddl_dc_difftable(libds=WORK.DIFFTABLE);
2 
3 PROC SQL;
4 create TABLE &libds(
5 load_ref char(36) label='unique load reference',
6 processed_dttm num FORMAT=E8601DT26.6 label='Processed at timestamp',
7 libref char(8) label='Library Reference (8 chars)',
8 dsn char(32) label='Dataset Name (32 chars)',
9 key_hash char(32) label=
10 'MD5 Hash of primary key values (pipe seperated)',
11 move_type char(1) label='Either (A)ppended, (D)eleted or (M)odified',
12 is_pk num label='Is Primary Key Field? (1/0)',
13 is_diff num label=
14 'Did value change? (1/0/-1). Always -1 for appends and deletes.',
15 tgtvar_type char(1) label='Either (C)haracter or (N)umeric',
16 tgtvar_nm char(32) label='Target variable name (32 chars)',
17 oldval_num num FORMAT=best32. label='Old (numeric) value',
18 newval_num num FORMAT=best32. label='New (numeric) value',
19 oldval_char char(32765) label='Old (character) value',
20 newval_char char(32765) label='New (character) value'
21 );
22 
2 Bloc de code
Logique Macro
Explication :
Ce segment de code macro gère la résolution du nom de la bibliothèque (`libref`). Il convertit le paramètre `&libds` en majuscules. Si `&libds` ne contient pas de point (indiquant un dataset sans spécification de librairie), la librairie par défaut 'WORK' est assignée à la variable macro `lib`. Sinon, la partie précédant le premier point est extraite et utilisée comme nom de la librairie.
Copié !
1 %local lib;
2 %let libds=%upcase(&libds);
3 %IF %index(&libds,.)=0 %THEN %let lib=WORK;
4 %ELSE %let lib=%scan(&libds,1,.);
5 
3 Bloc de code
PROC DATASETS
Explication :
Ce bloc utilise `PROC DATASETS` pour modifier la table nouvellement créée ou existante (dont le nom est extrait de `&libds`) dans la librairie `&lib`. Il ajoute un index unique nommé `pk_mpe_audit` composé des colonnes `load_ref`, `libref`, `dsn`, `key_hash`, et `tgtvar_nm`. Les options `/nomiss unique` garantissent que l'index est créé même si des valeurs sont manquantes et que la combinaison des valeurs de ces colonnes est unique pour chaque enregistrement, améliorant ainsi la performance et l'intégrité des données. Le `%mend` marque la fin de la définition de la macro.
Copié !
1 PROC DATASETS lib=&lib noprint;
2 modify %scan(&libds,-1,.);
3 index create
4 pk_mpe_audit=(load_ref libref dsn key_hash tgtvar_nm)
5 /nomiss unique;
6 QUIT;
7 
8%mend mddl_dc_difftable;
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.