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

1657 lines
46 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="The Data Controller roadmap is aligned with the needs of our customers - we continue to build and prioritise on Features requested by, and funded by, new and existing customers.">
<link rel="canonical" href="https://docs.datacontroller.io/roadmap/">
<link rel="shortcut icon" href="../img/favicon.ico">
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-6.1.0">
<title>Roadmap - 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/roadmap/" />
<meta property='og:image' content="https://i.imgur.com/xFGhgg0.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:description" content="The Data Controller roadmap is aligned with the needs of our customers - we continue to build and prioritise on Features requested by, and funded by, new and existing customers." />
<!-- 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="#roadmap" 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">
Roadmap
</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--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<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">
<a href="../dynamic-cell-dropdown/" class="md-nav__link">
Dynamic Cell Dropdown
</a>
</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--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9" checked>
<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 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">
Overview
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Overview
</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="#overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="#requested-features" class="md-nav__link">
Requested Features
</a>
<nav class="md-nav" aria-label="Requested Features">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#set-approvals-to-zero" class="md-nav__link">
Set Approvals to Zero
</a>
</li>
<li class="md-nav__item">
<a href="#complex-excel-uploads" class="md-nav__link">
Complex Excel Uploads
</a>
<nav class="md-nav" aria-label="Complex Excel Uploads">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#estimates" class="md-nav__link">
Estimates
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-submissions" class="md-nav__link">
API Submissions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#delivered-features" class="md-nav__link">
Delivered Features
</a>
<nav class="md-nav" aria-label="Delivered Features">
<ul class="md-nav__list">
<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="#support-for-special-sas-missing-numerics" class="md-nav__link">
Support for Special SAS Missing Numerics
</a>
</li>
<li class="md-nav__item">
<a href="#ability-to-view-edit-formats" class="md-nav__link">
Ability to View &amp; Edit Formats
</a>
</li>
<li class="md-nav__item">
<a href="#change-tracking-information-in-a-single-transaction-table" class="md-nav__link">
Change Tracking Information in a Single Transaction Table
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-filtering" class="md-nav__link">
Dynamic Filtering
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-cell-validation" class="md-nav__link">
Dynamic Cell Validation
</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="#formula-preservation" class="md-nav__link">
Formula Preservation
</a>
</li>
<li class="md-nav__item">
<a href="#configurable-locale" class="md-nav__link">
Configurable Locale
</a>
</li>
<li class="md-nav__item">
<a href="#restricted-viewer" class="md-nav__link">
Restricted Viewer
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</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="#overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="#requested-features" class="md-nav__link">
Requested Features
</a>
<nav class="md-nav" aria-label="Requested Features">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#set-approvals-to-zero" class="md-nav__link">
Set Approvals to Zero
</a>
</li>
<li class="md-nav__item">
<a href="#complex-excel-uploads" class="md-nav__link">
Complex Excel Uploads
</a>
<nav class="md-nav" aria-label="Complex Excel Uploads">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#estimates" class="md-nav__link">
Estimates
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-submissions" class="md-nav__link">
API Submissions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#delivered-features" class="md-nav__link">
Delivered Features
</a>
<nav class="md-nav" aria-label="Delivered Features">
<ul class="md-nav__list">
<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="#support-for-special-sas-missing-numerics" class="md-nav__link">
Support for Special SAS Missing Numerics
</a>
</li>
<li class="md-nav__item">
<a href="#ability-to-view-edit-formats" class="md-nav__link">
Ability to View &amp; Edit Formats
</a>
</li>
<li class="md-nav__item">
<a href="#change-tracking-information-in-a-single-transaction-table" class="md-nav__link">
Change Tracking Information in a Single Transaction Table
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-filtering" class="md-nav__link">
Dynamic Filtering
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-cell-validation" class="md-nav__link">
Dynamic Cell Validation
</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="#formula-preservation" class="md-nav__link">
Formula Preservation
</a>
</li>
<li class="md-nav__item">
<a href="#configurable-locale" class="md-nav__link">
Configurable Locale
</a>
</li>
<li class="md-nav__item">
<a href="#restricted-viewer" class="md-nav__link">
Restricted Viewer
</a>
</li>
</ul>
</nav>
</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/roadmap.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="roadmap">Roadmap<a class="headerlink" href="#roadmap" title="Permanent link">&para;</a></h1>
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h2>
<p>On this page you can find details of the Features that have currently been requested, that we agree would add value to the product, and are therefore in our development roadmap.</p>
<p>Where customers are paying for the new Features (eg with our discounted Developer Days offer), then those Features will always take priority. Where funding is not available, new Features will be addressed during the Bench Time of our developers, and will always be performed after Bug Fixes.</p>
<p>If you would like to see a new Feature added to Data Controller, then let's have a chat!</p>
<h2 id="requested-features">Requested Features<a class="headerlink" href="#requested-features" title="Permanent link">&para;</a></h2>
<p>Where features are requested, whether there is budget or not, we will describe the work below and provide estimates.</p>
<p>The following features are currently requested, and awaiting budget:</p>
<ul>
<li>Ability to set 'number of approvals' to zero, enabling instant updates (4 days)</li>
<li>Ability to restore previous versions</li>
<li>Ability to import complex excel data using Excel Maps (10.5 days)</li>
<li>Ability to make automated submissions using an API</li>
</ul>
<h3 id="set-approvals-to-zero">Set Approvals to Zero<a class="headerlink" href="#set-approvals-to-zero" title="Permanent link">&para;</a></h3>
<p>The following changes are necessary to implement this feature:</p>
<ul>
<li>Adjust restriction on MPE_TABLES allowing 0 in NUM_APPROVALS_REQD</li>
<li>Refactor <code>editors/postdata</code> enabling execution from <code>editors/stagedata</code></li>
<li>Additions to the test suite</li>
<li>Pre-flight checks to ensure the SUBMITTER has APPROVAL rights prior to submit</li>
<li>Log handling</li>
<li>Updates to documentation </li>
<li>Release Notes</li>
</ul>
<h3 id="complex-excel-uploads">Complex Excel Uploads<a class="headerlink" href="#complex-excel-uploads" title="Permanent link">&para;</a></h3>
<p>When Excel data arrives in multiple ranges, or individual cells, and the cells vary in terms of their column or row identifier, made more "interesting" with the use of merged cells - a rules engine becomes necessary!</p>
<p>This feature enables the use of "EXCEL MAPS". It will enable multiple tables to be loaded in a single import, and that data can be scattered across multiple sheets / cells / ranges, accessed via the rules described further below.</p>
<p>The backend SAS tables must still exist, but the column names do not need to appear in the excel file.</p>
<p>To drive the behaviour, a new configuration table must be added to the control library - MPE_EXCEL_MAP. The columns are defined as follows:</p>
<ul>
<li><strong>XLMAP_ID</strong> - a unique reference for the excel map</li>
<li><strong>XLMAP_LIB</strong> - the library of the target table for the data item or range</li>
<li><strong>XLMAP_DS</strong> - the target table for the data item or range</li>
<li><strong>XLMAP_COL</strong> - the target column for the data item or range</li>
<li><strong>XLMAP_SHEET</strong> - the sheet name in which to capture the data. Rules start with a forward slash (/). Example values:<ul>
<li><code>Sheet2</code> - an absolute reference</li>
<li><code>/FIRST</code> - the first tab in the workbook</li>
</ul>
</li>
<li><strong>XLMAP_START</strong> - the rule used to find the top left of the range. Use "R1C1" notation to move the target. Example values:<ul>
<li><code>ABSOLUTE F4</code> - an absolute reference</li>
<li><code>MATCH P R[0]C[2] |My Test</code> - search column P for the string "My Test" then move 2 columns right</li>
<li><code>MATCH 7 R[-2]C[-1] |Top Banana</code> - search row 7 for the string "Top Banana" then move 2 rows up and 1 column left</li>
</ul>
</li>
<li><strong>XLMAP_FINISH</strong> - The rule used to find the end of the range. Leave blank for individual cells. Example values:<ul>
<li><code>BLANKROW</code> - search down until a blank row is found, then choose the row above it</li>
<li><code>LASTDOWN</code> - The last non blank cell below the start cell</li>
<li><code>RIGHT 3</code> - select 3 more cells to the right (4 selected in total)</li>
</ul>
</li>
</ul>
<p>To illustrate with an example - consider the following excel. The yellow cells need to be imported.</p>
<p><img alt="Complex Excel for SAS Import" src="/img/excel_map.png" /></p>
<p>The data will be imported into two SAS tables - the cells on the left will go into a table with multiple rows, and the cells on the right will be entered as a single row. The XLMAP_ID will also be added to both tables, and the tables will need to have had their keys and quality rules defined in Data Controller in the usual way.</p>
<p>The MPE_EXCEL_MAP configuration entries would be as follows:</p>
<table>
<thead>
<tr>
<th>XLMAP_ID</th>
<th>XLMAP_LIB</th>
<th>XLMAP_DS</th>
<th>XLMAP_COL</th>
<th>XLMAP_SHEET</th>
<th>XLMAP_START</th>
<th>XLMAP_FINISH</th>
</tr>
</thead>
<tbody>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS1</td>
<td>MI_ITEM</td>
<td>Current Month</td>
<td><code>MATCH B R[1]C[0] |ITEM</code></td>
<td><code>LASTDOWN</code></td>
</tr>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS1</td>
<td>MI_AMT</td>
<td>Current Month</td>
<td><code>MATCH C R[1]C[0] |AMOUNT</code></td>
<td><code>LASTDOWN</code></td>
</tr>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS2</td>
<td>TMI</td>
<td>Current Month</td>
<td><code>ABSOLUTE F6</code></td>
<td></td>
</tr>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS2</td>
<td>CB</td>
<td>Current Month</td>
<td><code>MATCH F R[2]C[0] |CASH BALANCE</code></td>
<td></td>
</tr>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS2</td>
<td>RENT</td>
<td>Current Month</td>
<td><code>MATCH E R[0]C[2] |Rent/mortgage</code></td>
<td></td>
</tr>
<tr>
<td>MAP01</td>
<td>MYLIB</td>
<td>DS2</td>
<td>CELL</td>
<td>Current Month</td>
<td><code>MATCH E R[0]C[2] |Cell phone</code></td>
<td></td>
</tr>
</tbody>
</table>
<p>To import the excel, the end user simply needs to navigate to the UPLOAD tab, select the appropriate map (eg MAP01), and upload. This will stage two tables (MYLIB.DS1 and MYLIB.DS2) which will go through the usual approval process and quality checks. A copy of the source excel file will be attached to each upload.</p>
<h4 id="estimates">Estimates<a class="headerlink" href="#estimates" title="Permanent link">&para;</a></h4>
<table>
<thead>
<tr>
<th>Component</th>
<th>Estimate (days)</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Frontend</td>
<td>1</td>
<td>Build ExcelMap page with dropdown (and fetching rules), plus drag &amp; drop modal for excel capture</td>
</tr>
<tr>
<td>Frontend</td>
<td>1</td>
<td>Create staged (unsubmitted) page with support for multiple tables</td>
</tr>
<tr>
<td>Frontend</td>
<td>2</td>
<td>Create standalone framework utility for rules engine (utils folder), /FIRST sheet rule and Absolute rule</td>
</tr>
<tr>
<td>Frontend</td>
<td>2</td>
<td>Implement MATCH rule (with BLANKROW, LASTDOWN and {DIRECTION + INTEGER} finish rules)</td>
</tr>
<tr>
<td>Frontend</td>
<td>0.5</td>
<td>Developer documentation</td>
</tr>
<tr>
<td>Frontend</td>
<td>2</td>
<td>Cypress tests</td>
</tr>
<tr>
<td>Backend</td>
<td>0.5</td>
<td>Prep MPE_EXCEL_MAP table, including validations, integrate with DCLIB and add to CI build</td>
</tr>
<tr>
<td>Backend</td>
<td>1</td>
<td>Create services to fetch Excel Maps and rules (only those the user has permissions for), corresponding SASjs tests, and update developer docs</td>
</tr>
<tr>
<td>Backend</td>
<td>0.5</td>
<td>Publish online documentation for the overall Excel Maps feature</td>
</tr>
</tbody>
</table>
<p>Total: <strong>10.5 days</strong></p>
<h3 id="api-submissions">API Submissions<a class="headerlink" href="#api-submissions" title="Permanent link">&para;</a></h3>
<p>Described <a href="https://docs.datacontroller.io/api/">here</a>.</p>
<h2 id="delivered-features">Delivered Features<a class="headerlink" href="#delivered-features" title="Permanent link">&para;</a></h2>
<p>Below are some examples of Features that have been requested (and delivered) into Data Controller.</p>
<h3 id="column-level-security">Column Level Security<a class="headerlink" href="#column-level-security" title="Permanent link">&para;</a></h3>
<p>The columns that can be VIEWed or EDITed are now configurable. See <a href="/column-level-security">docs</a></p>
<h3 id="support-for-special-sas-missing-numerics">Support for Special SAS Missing Numerics<a class="headerlink" href="#support-for-special-sas-missing-numerics" title="Permanent link">&para;</a></h3>
<p>It is now possible to VIEW and EDIT special SAS missings, eg <code>.a</code> through to <code>.z</code> and <code>._</code></p>
<h3 id="ability-to-view-edit-formats">Ability to View &amp; Edit Formats<a class="headerlink" href="#ability-to-view-edit-formats" title="Permanent link">&para;</a></h3>
<p>Format Catalogs can now be viewed, filtered, exported and edited. See <a href="/formats">docs</a></p>
<h3 id="change-tracking-information-in-a-single-transaction-table">Change Tracking Information in a Single Transaction Table<a class="headerlink" href="#change-tracking-information-in-a-single-transaction-table" title="Permanent link">&para;</a></h3>
<p>Now available in <a href="/mpe_audit.md">mpe_audit</a></p>
<h3 id="dynamic-filtering">Dynamic Filtering<a class="headerlink" href="#dynamic-filtering" title="Permanent link">&para;</a></h3>
<p>Previously, if a user filtered on, say, "region", and then filtered on "store", they would see stores for ALL regions (not just the region/regions already selected in the filter).</p>
<p><img alt="" src="https://i.imgur.com/KDEVvDi.png" /></p>
<p><strong>Solution</strong></p>
<p>We added a checkbox to the top left of the filter dialog (default ON) for "Dynamic Where Clause". Whilst enabled, whenever a list of values is requested, it is filtered using every filter clause EXCEPT the one currently being modified.</p>
<p>See <a href="/filter/">documentation</a>. Available from <a href="https://datacontroller.io/3-12-four-new-data-management-features/">v.3.12.</a></p>
<h3 id="dynamic-cell-validation">Dynamic Cell Validation<a class="headerlink" href="#dynamic-cell-validation" title="Permanent link">&para;</a></h3>
<p>When editing a value in a grid, the values presented to the user should be filtered according to additional rules, based on the values of other cells in the same row.</p>
<p><img alt="" src="https://i.imgur.com/J1q4lqo.png" /></p>
<p><strong>Solution</strong></p>
<p>We provided two new config item in the MPE_VALIDATIONS table - to links an editable column to a HOOK script via a web service.</p>
<p>The configuration would like like so:</p>
<p><img alt="" src="https://i.imgur.com/8Hx05GP.png" /></p>
<p>In this way, the entire record can be sent to SAS, for processing by the hook script, before returning the desired list of values.</p>
<p>The HOOK_SCRIPT can be either a SAS program on a filesystem (identified by a ".sas" extension) or the path to a registered SAS Service (STP or JES). The latter is identified by the absence of an extension.</p>
<p>This approach provides maximum flexibility for delivering bespoke values in the edit grid dropdown.</p>
<p>See <a href="/dynamic-cell-dropdown/">documentation</a>. Available from <a href="https://datacontroller.io/3-12-four-new-data-management-features/">v.3.12.</a></p>
<hr />
<h3 id="row-level-security">Row Level Security<a class="headerlink" href="#row-level-security" title="Permanent link">&para;</a></h3>
<p>Row level security is provided by various products in both SAS 9 and Viya, based on the logged in user identity.</p>
<p>This is problematic for the EDIT page, which - by necessity - operates under system account credentials.</p>
<p>It is also the case that some customers need row level security but the data access engine does not support that.</p>
<p>Therefore, there was a need to configure such a feature within the Data Controller product.</p>
<p><strong>Solution</strong></p>
<p>A new table (MPE_ROW_LEVEL_SECURITY) was added to the data controller library to allow complex rules to be applied based on the SAS group and the target table. Documentation is <a href="/row-level-security/">here</a></p>
<p>Available from <a href="https://datacontroller.io/3-12-four-new-data-management-features/">v.3.12.</a></p>
<h3 id="formula-preservation">Formula Preservation<a class="headerlink" href="#formula-preservation" title="Permanent link">&para;</a></h3>
<p>Data Controller uses an OEM licence with the excellent <a href="https://sheetjs.com/">sheetJS</a> library. This enables us to read pretty much any version of Excel at breakneck speeds.</p>
<p>By default, Data Controller will use the data model of the target table when extracting data, eg to determine whether a column should be character, numeric, date, datetime or time.</p>
<p>Formats used to be ignored and only the cell <em>values</em> would be extracted when formulas are being used.</p>
<p>Now, it is possible to extract and retain the actual formula itself, so it can be re-used when downloading the data again later.</p>
<p><strong>Solution</strong></p>
<p>A new table (MPE_EXCEL_CONFIG) was be added to the data controller library to allow the column with the formula to be specified. See <a href="/excel/">documentation</a></p>
<p>Available from <a href="https://datacontroller.io/3-12-four-new-data-management-features/">v.3.12.</a></p>
<h3 id="configurable-locale">Configurable Locale<a class="headerlink" href="#configurable-locale" title="Permanent link">&para;</a></h3>
<p>When importing spreadsheets with ambiguous dates (eg 01/02 or 02/01) the ANYDTDTM. informat was using the locale of the browser (en_us) instead of that of the client's actual country, resulting in incorrect dates being loaded. This is due to the <a href="https://rawsas.com/look-out-locale-gotcha/">default behaviour</a> of the SAS Stored Process server.</p>
<p><strong>Solution</strong></p>
<p>We added a <a href="/dcc-options/#dc_locale">new config item</a> so that the locale can be explicitly set for all Data Controller users.</p>
<h3 id="restricted-viewer">Restricted Viewer<a class="headerlink" href="#restricted-viewer" title="Permanent link">&para;</a></h3>
<p>Data Controller relies on metadata permissions (in SAS 9) or authorization rules (in Viya) to determine who can see which table.</p>
<p>We had a customer who was using Data Controller to provide data access to a company wide audience, most of whom did not have access to SAS client tools (such as Enterprise Guide) and so had not been set up in metadata before.</p>
<p>It was necessary to find a way to restrict the tables which certain groups could see, without having to tweak permissions in SAS Management Console.</p>
<p><strong>Solution</strong></p>
<p>We added a <a href="/dcc-security/#view">new access level</a> in the MPE_SECURITY table so that access could be restricted at both TABLE and LIBRARY level.</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="../videos/" 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>
Videos
</div>
</div>
</a>
<a href="../api/" 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>
DC API
</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>