docs.datacontroller.io/dynamic-cell-dropdown/index.html
2023-05-17 10:41:48 +00:00

1492 lines
39 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Configure SAS programs to determine exactly which values can appear within which cells in your Data Controller table!">
<link rel="canonical" href="https://docs.datacontroller.io/dynamic-cell-dropdown/">
<link rel="shortcut icon" href="../img/favicon.ico">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-6.1.0">
<title>Dynamic Cell Dropdown - Data Controller for SAS® Documentation</title>
<link rel="stylesheet" href="../assets/stylesheets/main.bc7e593a.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab28b872.min.css">
<meta name="theme-color" content="#ffffff">
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,400i,700%7CUbuntu+Mono&display=fallback">
<style>body,input{font-family:"Open Sans",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Ubuntu Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
<link rel="manifest" href="../manifest.webmanifest" crossorigin="use-credentials">
<link rel="stylesheet" href="../font-awesome.css">
<meta name="author" content="Allan Bowe">
<meta property="og:type" content="website" />
<meta property="og:title" content="Data Controller Documentation">
<meta property="og:url" content="https://docs.datacontroller.io/dynamic-cell-dropdown/" />
<meta property='og:image' content="https://docs.datacontroller.io/img/cell_validation1.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:description" content="Configure SAS programs to determine exactly which values can appear within which cells in your Data Controller table!" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = "https://analytics.4gl.io/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '4']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="white" data-md-color-accent="amber">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#dynamic-cell-dropdown" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid" aria-label="Header">
<a href="https://docs.datacontroller.io" title="Data Controller for SAS® Documentation" class="md-header-nav__button md-logo" aria-label="Data Controller for SAS® Documentation">
<img src="../img/favicon.ico" alt="logo">
</a>
<label class="md-header-nav__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header-nav__title" data-md-component="header-title">
<div class="md-header-nav__ellipsis">
<span class="md-header-nav__topic md-ellipsis">
Data Controller for SAS® Documentation
</span>
<span class="md-header-nav__topic md-ellipsis">
Dynamic Cell Dropdown
</span>
</div>
</div>
<label class="md-header-nav__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header-nav__source">
<a href="https://github.com/datacontroller/dcdocs.github.io/" title="Go to repository" class="md-source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
</div>
<div class="md-source__repository">
datacontroller/dcdocs.github.io
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://docs.datacontroller.io" title="Data Controller for SAS® Documentation" class="md-nav__button md-logo" aria-label="Data Controller for SAS® Documentation">
<img src="../img/favicon.ico" alt="logo">
</a>
Data Controller for SAS® Documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/datacontroller/dcdocs.github.io/" title="Go to repository" class="md-source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
</div>
<div class="md-source__repository">
datacontroller/dcdocs.github.io
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
User Guide
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="User Guide" data-md-level="1">
<label class="md-nav__title" for="nav-2">
<span class="md-nav__icon md-icon"></span>
User Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dc-overview/" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../dc-userguide/" class="md-nav__link">
DC User Guide
</a>
</li>
<li class="md-nav__item">
<a href="../dcu-datacatalog/" class="md-nav__link">
Data Catalog
</a>
</li>
<li class="md-nav__item">
<a href="../dcu-lineage/" class="md-nav__link">
Data Lineage
</a>
</li>
<li class="md-nav__item">
<a href="../dcu-fileupload/" class="md-nav__link">
File Uploads
</a>
</li>
<li class="md-nav__item">
<a href="../filter/" class="md-nav__link">
Filter Mechanism
</a>
</li>
<li class="md-nav__item">
<a href="../locking-mechanism/" class="md-nav__link">
Locking Mechanism
</a>
</li>
<li class="md-nav__item">
<a href="../dcu-tableviewer/" class="md-nav__link">
Table Viewer
</a>
</li>
<li class="md-nav__item">
<a href="../viewboxes/" class="md-nav__link">
ViewBoxes
</a>
</li>
<li class="md-nav__item">
<a href="../admin-services/" class="md-nav__link">
Admin Services
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Table Guide
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Table Guide" data-md-level="1">
<label class="md-nav__title" for="nav-3">
<span class="md-nav__icon md-icon"></span>
Table Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../tables/mpe_audit/" class="md-nav__link">
MPE_AUDIT
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_column_level_security/" class="md-nav__link">
MPE_COLUMN_LEVEL_SECURITY
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_config/" class="md-nav__link">
MPE_CONFIG
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_datacatalog_libs/" class="md-nav__link">
MPE_DATACATALOG_LIBS
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_datacatalog_tabs/" class="md-nav__link">
MPE_DATACATALOG_TABS
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_datacatalog_vars/" class="md-nav__link">
MPE_DATACATALOG_VARS
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_datastatus_libs/" class="md-nav__link">
MPE_DATASTATUS_LIBS
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_datastatus_tabs/" class="md-nav__link">
MPE_DATASTATUS_TABS
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_lockanytable/" class="md-nav__link">
MPE_LOCKANYTABLE
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_review/" class="md-nav__link">
MPE_REVIEW
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_submit/" class="md-nav__link">
MPE_SUBMIT
</a>
</li>
<li class="md-nav__item">
<a href="../tables/mpe_tables/" class="md-nav__link">
MPE_TABLES
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4" checked>
<label class="md-nav__link" for="nav-4">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration" data-md-level="1">
<label class="md-nav__title" for="nav-4">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../column-level-security/" class="md-nav__link">
Column Level Security
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-dates/" class="md-nav__link">
Dates / Datetimes
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Dynamic Cell Dropdown
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Dynamic Cell Dropdown
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#frontend-configuration" class="md-nav__link">
Frontend Configuration
</a>
</li>
<li class="md-nav__item">
<a href="#backend-configuration" class="md-nav__link">
Backend Configuration
</a>
<nav class="md-nav" aria-label="Backend Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#workdynamic_values" class="md-nav__link">
WORK.DYNAMIC_VALUES
</a>
</li>
<li class="md-nav__item">
<a href="#workdynamic_extended_values" class="md-nav__link">
WORK.DYNAMIC_EXTENDED_VALUES
</a>
</li>
<li class="md-nav__item">
<a href="#code-examples" class="md-nav__link">
Code Examples
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#technical-notes" class="md-nav__link">
Technical Notes
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../emails/" class="md-nav__link">
Emails
</a>
</li>
<li class="md-nav__item">
<a href="../excel/" class="md-nav__link">
Excel Formulas
</a>
</li>
<li class="md-nav__item">
<a href="../formats/" class="md-nav__link">
Formats
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-groups/" class="md-nav__link">
Groups
</a>
</li>
<li class="md-nav__item">
<a href="../libraries/" class="md-nav__link">
Libraries
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-options/" class="md-nav__link">
Options
</a>
</li>
<li class="md-nav__item">
<a href="../row-level-security/" class="md-nav__link">
Row Level Security
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-security/" class="md-nav__link">
Security
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-selectbox/" class="md-nav__link">
Selectboxes
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-tables/" class="md-nav__link">
Tables
</a>
</li>
<li class="md-nav__item">
<a href="../dcc-validations/" class="md-nav__link">
Validations
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../macros/" class="md-nav__link">
Macros
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="1">
<label class="md-nav__title" for="nav-6">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dci-requirements/" class="md-nav__link">
System Requirements
</a>
</li>
<li class="md-nav__item">
<a href="../dci-deploysasviya/" class="md-nav__link">
SAS Viya Deploy
</a>
</li>
<li class="md-nav__item">
<a href="../dci-deploysas9/" class="md-nav__link">
SAS 9 Deploy
</a>
</li>
<li class="md-nav__item">
<a href="../dci-stpinstance/" class="md-nav__link">
SAS 9 Dedicated STP
</a>
</li>
<li class="md-nav__item">
<a href="../dci-troubleshooting/" class="md-nav__link">
Troubleshooting
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
<label class="md-nav__link" for="nav-7">
Legal
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Legal" data-md-level="1">
<label class="md-nav__title" for="nav-7">
<span class="md-nav__icon md-icon"></span>
Legal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../privacy/" class="md-nav__link">
Privacy Policy
</a>
</li>
<li class="md-nav__item">
<a href="../evaluation-agreement/" class="md-nav__link">
Evaluation Licence
</a>
</li>
<li class="md-nav__item">
<a href="../licences/" class="md-nav__link">
Other Licences
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../videos/" class="md-nav__link">
Videos
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
<label class="md-nav__link" for="nav-9">
Roadmap
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Roadmap" data-md-level="1">
<label class="md-nav__title" for="nav-9">
<span class="md-nav__icon md-icon"></span>
Roadmap
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../roadmap/" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../api/" class="md-nav__link">
DC API
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#frontend-configuration" class="md-nav__link">
Frontend Configuration
</a>
</li>
<li class="md-nav__item">
<a href="#backend-configuration" class="md-nav__link">
Backend Configuration
</a>
<nav class="md-nav" aria-label="Backend Configuration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#workdynamic_values" class="md-nav__link">
WORK.DYNAMIC_VALUES
</a>
</li>
<li class="md-nav__item">
<a href="#workdynamic_extended_values" class="md-nav__link">
WORK.DYNAMIC_EXTENDED_VALUES
</a>
</li>
<li class="md-nav__item">
<a href="#code-examples" class="md-nav__link">
Code Examples
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#technical-notes" class="md-nav__link">
Technical Notes
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/datacontroller/dcdocs.github.io/edit/master/docs/dynamic-cell-dropdown.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
</a>
<h1 id="dynamic-cell-dropdown">Dynamic Cell Dropdown<a class="headerlink" href="#dynamic-cell-dropdown" title="Permanent link">&para;</a></h1>
<p>This is a simple, but incredibly powerful feature! Configure a SAS process to run when clicking a particular cell. Data Controller will send the <em>row</em> to SAS, and your SAS program can use the values in the row determine a <em>column</em> of values to send back - which will be used in the frontend selectbox.</p>
<p>So if you'd like the user to only see products for a particular category, or ISIN's for a particular asset group, you can perform that easily.</p>
<p>This feature is used extensively in Data Controller to fetch tables specific to a library, or columns specific to a table:</p>
<p><img alt="" src="../img/cell_validation1.png" /></p>
<p>You can also use the response to populate <em>other</em> dropdowns (also in the same row) in the same request - these are called 'extended validations'.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/rmES77aIr90" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h2 id="frontend-configuration">Frontend Configuration<a class="headerlink" href="#frontend-configuration" title="Permanent link">&para;</a></h2>
<p>Open the MPE_VALIDATIONS table and configure the library, table and column that should contain the selectbox. In the RULE_TYPE column, enter either:</p>
<ul>
<li>HARDSELECT_HOOK - The user entry MUST match the returned values</li>
<li>SOFTSELECT_HOOK - The user can view the list but type something else if they wish</li>
</ul>
<p>The RULE_VALUE column should contain the full path to the SAS Program, Viya Job or SAS 9 Stored process that you would like to execute. If the value ends in ".sas" then it is assumed to be a SAS program on a directory, otherwise a SAS web service (STP or Viya Job).</p>
<h2 id="backend-configuration">Backend Configuration<a class="headerlink" href="#backend-configuration" title="Permanent link">&para;</a></h2>
<p>If creating a Stored Process, be sure to deselect the 'automatic SAS macros' - the presence of %stpbegin or %stpend autocall macros will cause problems with the Data Controller backend.</p>
<p>You can write any SAS code you wish. For examples of hook scripts you can look at the Data Controller internal validation programs (listed in the MPE_VALIDATIONS table). You will receive the following as inputs:</p>
<ul>
<li><code>work.source_row</code> -&gt; A dataset containing the <strong>current row</strong> being modified in Data Controller. This will have already been created in the current SAS session. All variables are available. Use this to filter the initial values in <code>work.dynamic_values</code>.</li>
<li><code>&amp;DC_LIBREF</code> -&gt; The DC control library</li>
<li><code>&amp;LIBDS</code> - The library.dataset being filtered</li>
<li><code>&amp;VARIABLE_NM</code> - The column for which to supply the validation</li>
</ul>
<p>The following tables should be created in the WORK library as outputs:</p>
<ul>
<li><code>work.dynamic_values</code></li>
<li><code>work.dynamic_extended_values</code> (optional)</li>
</ul>
<h3 id="workdynamic_values"><code>WORK.DYNAMIC_VALUES</code><a class="headerlink" href="#workdynamic_values" title="Permanent link">&para;</a></h3>
<p>This output table can contain up to three columns:</p>
<ul>
<li><code>display_index</code> (optional, mandatory if using <code>dynamic_extended_values</code>). Is a numeric key used to join the two tables.</li>
<li><code>display_value</code> - always character</li>
<li><code>raw_value</code> - unformatted character or numeric according to source data type</li>
</ul>
<p>Example values:</p>
<table>
<thead>
<tr>
<th>DISPLAY_INDEX:best.</th>
<th>DISPLAY_VALUE:$</th>
<th>RAW_VALUE</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>$77.43</td>
<td>77.43</td>
</tr>
<tr>
<td>2</td>
<td>$88.43</td>
<td>88.43</td>
</tr>
</tbody>
</table>
<h3 id="workdynamic_extended_values"><code>WORK.DYNAMIC_EXTENDED_VALUES</code><a class="headerlink" href="#workdynamic_extended_values" title="Permanent link">&para;</a></h3>
<p>This output table is optional. If provided, it will map the DISPLAY_INDEX from the DYNAMIC_VALUES table to additional column/value pairs, that will be used to populate dropdowns for <em>other</em> cells in the <em>same</em> row.</p>
<p>The following columns should be provided:</p>
<ul>
<li><code>display_index</code> - a numeric key joining each value to the <code>dynamic_values</code> table</li>
<li><code>extra_col_name</code> - the name of the additional variable(s) to contain the extra dropdown(s)</li>
<li><code>display_value</code> - the value to display in the dropdown. Always character.</li>
<li><code>display_type</code> - Either C or N depending on the raw value type</li>
<li><code>raw_value_num</code> - The unformatted value if numeric</li>
<li><code>raw_value_char</code> - The unformatted value if character</li>
<li><code>forced_value</code> - set to 1 to force this value to be automatically selected when the source value is changed. If anything else but 1, the dropdown will still appear, but the user must manually make the selection.</li>
</ul>
<p>Example Values:</p>
<table>
<thead>
<tr>
<th>DISPLAY_INDEX:best.</th>
<th>EXTRA_COL_NAME:$32</th>
<th>DISPLAY_VALUE:$</th>
<th>DISPLAY_TYPE:$1.</th>
<th>RAW_VALUE_NUM</th>
<th>RAW_VALUE_CHAR:$5000</th>
<th>FORCED_VALUE</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>DISCOUNT_RT</td>
<td>"50%"</td>
<td>N</td>
<td>0.5</td>
<td></td>
<td>.</td>
</tr>
<tr>
<td>1</td>
<td>DISCOUNT_RT</td>
<td>"40%"</td>
<td>N</td>
<td>0.4</td>
<td></td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>DISCOUNT_RT</td>
<td>"30%"</td>
<td>N</td>
<td>0.3</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>CURRENCY_SYMBOL</td>
<td>"GBP"</td>
<td>C</td>
<td></td>
<td>"GBP"</td>
<td>.</td>
</tr>
<tr>
<td>1</td>
<td>CURRENCY_SYMBOL</td>
<td>"RSD"</td>
<td>C</td>
<td></td>
<td>"RSD"</td>
<td>.</td>
</tr>
<tr>
<td>2</td>
<td>DISCOUNT_RT</td>
<td>"50%"</td>
<td>N</td>
<td>0.5</td>
<td></td>
<td>.</td>
</tr>
<tr>
<td>2</td>
<td>DISCOUNT_RT</td>
<td>"40%"</td>
<td>N</td>
<td>0.4</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>CURRENCY_SYMBOL</td>
<td>"EUR"</td>
<td>C</td>
<td></td>
<td>"EUR"</td>
<td>.</td>
</tr>
<tr>
<td>2</td>
<td>CURRENCY_SYMBOL</td>
<td>"HKD"</td>
<td>C</td>
<td></td>
<td>"HKD"</td>
<td>1</td>
</tr>
</tbody>
</table>
<h3 id="code-examples">Code Examples<a class="headerlink" href="#code-examples" title="Permanent link">&para;</a></h3>
<p>Simple dropdown</p>
<div class="highlight"><pre><span></span><code><span class="cm">/**</span>
<span class="cm"> @file</span>
<span class="cm"> @brief Simple dynamic cell dropdown for product code</span>
<span class="cm"> @details The input table is simply one row from the</span>
<span class="cm"> target table called &quot;work.source_row&quot;.</span>
<span class="cm"> Available macro variables:</span>
<span class="cm"> @li DC_LIBREF - The DC control library</span>
<span class="cm"> @li LIBDS - The library.dataset being filtered</span>
<span class="cm"> @li VARIABLE_NM - The column being filtered</span>
<span class="cm"> &lt;h4&gt; Service Outputs &lt;/h4&gt;</span>
<span class="cm"> Output should be a single table called</span>
<span class="cm"> &quot;work.dynamic_values&quot; in the format below.</span>
<span class="cm"> |DISPLAY_VALUE:$|RAW_VALUE:??|</span>
<span class="cm"> |---|---|</span>
<span class="cm"> |$44.00|44|</span>
<span class="cm">**/</span>
<span class="nf">%dc_assignlib</span>(READ,mylibref)
<span class="kr">proc sql;</span>
<span class="k">create</span> <span class="k">table</span> work<span class="m">.</span>DYNAMIC_VALUES <span class="k">as</span>
<span class="k">select</span> <span class="k">distinct</span> some_product <span class="k">as</span> raw_value
<span class="k">from</span> mylibref<span class="m">.</span>my_other_table
<span class="k">where</span> area <span class="k">in</span> (<span class="k">select</span> area <span class="k">from</span> work<span class="m">.</span>source_row)
<span class="k">order</span> <span class="k">by</span> <span class="m">1</span>;
</code></pre></div>
<p>Extended dropdown</p>
<div class="highlight"><pre><span></span><code><span class="kr">proc sql;</span>
<span class="k">create</span> <span class="k">table</span> work<span class="m">.</span>source <span class="k">as</span>
<span class="k">select</span> libref,dsn
<span class="k">from</span> <span class="nv">&amp;DC_LIBREF.</span>.MPE_TABLES
<span class="k">where</span> tx_to &gt; <span class="s">&quot;%sysfunc(datetime(),E8601DT26.6)&quot;</span>dt
<span class="k">order</span> <span class="k">by</span> <span class="m">1</span>,<span class="m">2</span><span class="kr">;</span>
<span class="kr">data </span>work<span class="m">.</span>DYNAMIC_VALUES (<span class="k">keep</span>=display_index raw_value display_value);
<span class="k">set</span> work<span class="m">.</span>source <span class="k">end</span>=last;
<span class="k">by</span> libref;
<span class="k">if</span> last<span class="m">.</span>libref <span class="k">then</span> <span class="k">do</span>;
display_index<span class="m">+1</span>;
raw_value=libref;
display_value=libref;
<span class="k">output</span>;
<span class="k">end</span>;
<span class="k">if</span> last <span class="k">then</span> <span class="k">do</span>;
display_index<span class="m">+1</span>;
raw_value=<span class="s">&#39;*ALL*&#39;</span>;
display_value=<span class="s">&#39;*ALL*&#39;</span>;
<span class="k">output</span>;
<span class="k">end</span><span class="kr">;</span>
<span class="kr">run;</span>
<span class="kr">data </span>work<span class="m">.</span>dynamic_extended_values(<span class="k">keep</span>=display_index extra_col_name display_type
display_value RAW_VALUE_CHAR raw_value_num forced_value);
<span class="k">set</span> work<span class="m">.</span>source <span class="k">end</span>=last;
<span class="k">by</span> libref dsn;
<span class="k">retain</span> extra_col_name <span class="s">&#39;ALERT_DS&#39;</span>;
<span class="k">retain</span> display_type <span class="s">&#39;C&#39;</span>;
<span class="k">retain</span> raw_value_num .;
raw_value_char=dsn;
display_value=dsn;
forced_value=<span class="m">0</span>;
<span class="k">if</span> first<span class="m">.</span>libref <span class="k">then</span> display_index<span class="m">+1</span>;
<span class="k">if</span> last<span class="m">.</span>libref <span class="k">then</span> <span class="k">do</span>;
display_value=<span class="s">&#39;*ALL*&#39;</span>;
raw_value_char=<span class="s">&#39;*ALL*&#39;</span>;
forced_value=<span class="m">1</span>;
<span class="k">output</span>;
<span class="k">end</span>;
<span class="k">else</span> <span class="k">output</span>;
<span class="k">if</span> last <span class="k">then</span> <span class="k">do</span>;
display_value=<span class="s">&#39;*ALL*&#39;</span>;
raw_value_char=<span class="s">&#39;*ALL*&#39;</span>;
forced_value=<span class="m">1</span>;
<span class="k">output</span>;
<span class="k">end</span><span class="kr">;</span>
<span class="kr">run;</span>
</code></pre></div>
<h2 id="technical-notes">Technical Notes<a class="headerlink" href="#technical-notes" title="Permanent link">&para;</a></h2>
<p>When first clicking on a 'dynamic dropdown' cell, the frontend will first hash the entire row, and store the subsequent response from SAS against this hash in an internal lookup table. In this way, the lookup table can be subsequently referenced to vastly improve performance (by avoiding unnecessary server requests).</p>
<p>The lookup event will occur immediately upon clicking on the (dynamic dropdown) cell. If the row has not changed since the previous click, the response will be instant. If any value in the row HAS changed, and that particular combination of values has not previously been requested (in the same browser session), then a request to SAS will need to take place before the dropdown values are shown.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid" aria-label="Footer">
<a href="../dcc-dates/" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-footer-nav__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</div>
<div class="md-footer-nav__title">
<div class="md-ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Dates / Datetimes
</div>
</div>
</a>
<a href="../emails/" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-footer-nav__title">
<div class="md-ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Emails
</div>
</div>
<div class="md-footer-nav__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
All rights reserved &copy;2022 Bowe IO Ltd.
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<script src="../assets/javascripts/vendor.6a3d08fc.min.js"></script>
<script src="../assets/javascripts/bundle.71201edf.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing"}</script>
<script>
app = initialize({
base: "..",
features: [],
search: Object.assign({
worker: "../assets/javascripts/worker/search.4ac00218.min.js"
}, typeof search !== "undefined" && search)
})
</script>
</body>
</html>