Author SHA1 Message Date
allan 8b6e3e60bc Merge pull request 'feed: add the carousel assets (PDF + slides) to the poem post folder' (#17) from feat/if-ode-carousel into main
publish / Build-and-publish (push) Successful in 4m3s
Reviewed-on: #17
Reviewed-by: Allan <allan@4gl.io>
2026-09-20 19:25:17 +00:00
blog-dev 686a745f0b feed: break the carousel stanza slides between the two quatrains 2026-09-20 19:09:38 +00:00
blog-dev 510947d173 feed: add the LinkedIn carousel (PDF + slides) to the post folder 2026-09-20 18:55:18 +00:00
allan 589a745c5b Merge pull request 'Update content/feed/if-an-ode-to-data-control/index.md' (#16) from allan-patch-1 into main
publish / Build-and-publish (push) Successful in 3m53s
Reviewed-on: #16
2026-09-20 17:39:19 +00:00
allan d04c55c731 Update content/feed/if-an-ode-to-data-control/index.md 2026-09-20 17:39:07 +00:00
allan a6a6abf009 Merge pull request 'feat(feed): If - An Ode to Data Control' (#15) from feat/if-ode-to-data-control into main
publish / Build-and-publish (push) Successful in 4m0s
Reviewed-on: #15
Reviewed-by: Allan <allan@4gl.io>
2026-09-20 17:31:40 +00:00
blog-dev 88368fa31d feed: trim the boast and the repeated first-line echo from the intro 2026-09-20 17:21:19 +00:00
blog-dev fdb1db216d feed: rework the poem cover into a title-page design; note the 2022 publication year 2026-09-20 16:37:23 +00:00
blog-dev 6d833f9654 feat(feed): If - An Ode to Data Control 2026-09-20 15:54:56 +00:00
allan 6bcd0adf81 Merge pull request 'feed: correct the case sensitivity example in the full table search post' (#14) from fix/full-table-search-case-sensitivity into main
publish / Build-and-publish (push) Successful in 3m58s
Reviewed-on: #14
Reviewed-by: Allan <allan@4gl.io>
2026-09-17 07:47:31 +00:00
blog-dev 93348ad604 feed: tighten the case sensitivity note to a single sentence 2026-09-17 07:44:53 +00:00
dc 7561bb0c39 feed: correct the case sensitivity example in the full table search post
The post claimed `smith` finds `Smithson`, which only holds for a case
insensitive match. The comparison is case sensitive, so the search term has
to match the case as stored: `Smith` finds `Smithson`, and `smith` finds
`Goldsmith`, but `smith` will not find `Smithson`.
2026-09-16 23:42:45 +00:00
allan 959a9ffab4 Merge pull request 'Feed post: Full Table Search' (#13) from feat/full-table-search into main
publish / Build-and-publish (push) Successful in 4m34s
Reviewed-on: #13
Reviewed-by: Allan <allan@4gl.io>
2026-09-16 23:22:22 +00:00
blog-dev 2348575737 feed: full table search - new demo video, copy matches the recording
- embed the re-recorded 16:9 demo video (search walkthrough, 39s)
- drop the one million row CAS claim from the description, the body and the
  social copy: the recording demonstrates a table in the Viewer, so the
  text now says only what the video shows
2026-09-16 23:17:43 +00:00
blog-dev b2aac21b90 feed: full table search - any value, any column, no query 2026-09-15 17:19:07 +00:00
allan 438b1e93d7 Merge pull request 'Move Cyber Essentials badge to who-is section + about page' (#12) from fix/cert-badge-placement into main
publish / Build-and-publish (push) Successful in 3m56s
Reviewed-on: #12
2026-09-11 20:27:09 +00:00
blog-dev 674737f840 fix: move Cyber Essentials badge to who-is section + about page, drop hero/footer placements 2026-09-11 20:22:29 +00:00
hermes 150be89246 Merge pull request 'Surface Cyber Essentials certification on homepage hero and footer' (#11) from feat/cyber-essentials-badge into main
publish / Build-and-publish (push) Successful in 3m57s
2026-09-11 19:45:26 +00:00
17 changed files with 171 additions and 36 deletions

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

+63
View File
@@ -0,0 +1,63 @@
---
title: 'Full Table Search: Find Any Value in Any Table'
description: Type a value into the search box and Data Controller scans every column for it - no query, no WHERE clause.
date: '2026-09-15 17:00:00'
author: 'Data Controller'
authorLink: https://www.linkedin.com/showcase/data-controller-for-sas
tags:
- Announcements
previewImg: './full-table-search.jpeg'
---
# Full Table Search: Find Any Value in Any Table
Finding a value in a large table usually means writing a query first: guess which column it lives in, write a WHERE clause, run it, and try again when you guess wrong. Data Controller's **full table search** removes that step. Choose a library and table in the Viewer, type a value into the search box and press Enter - every column in the table is scanned for it, and the matching rows come straight back into the grid.
## How it works
The search box sits in the Viewer toolbar, next to a **Numeric** checkbox:
- **Text search** matches part of a value using the case sensitive SAS® `CONTAINS` operator, so `smith` finds `Goldsmith` but not `Smithson`.
- **Numeric search** (tick the box) matches the number exactly against every numeric column in the table.
Whichever you use, the results are ordinary rows in the Viewer, with the rest of the screen behaving exactly as it does for a normal view.
## Any database, not just SAS datasets
The scan runs inside SAS, against whichever libname engine the table is assigned to - so it is not limited to SAS datasets.
## Built on open source
This feature, like most of Data Controller, is built on the [SASjs Macro Core](https://github.com/sasjs/core) library, using the [`%mp_searchdata()`](https://core.sasjs.io/mp__searchdata_8sas.html) macro. The macro assembles a single DATA step with one `OR` clause per column - a `CONTAINS` test for character columns, an equality test for numeric ones - and writes out only the matching records. It is MIT licensed, so you can read, test and audit the code that is running against your data.
A few things worth knowing:
- The search respects your current filter, Row Level Security and Column Level Security - it scans the view you are entitled to see, not the raw table.
- Full table search is available in ViewBoxes as well, so the related tables lined up beside your main grid can be searched the same way.
- Nothing is shipped to an external index or search service: the scan happens on your own SAS platform.
See it in action:
<iframe title="Full Table Search" width="560" height="315" src="https://vid.4gl.io/videos/embed/qdEv4PP2oiPr5VXwLbN58B" style="border: 0px;" allow="fullscreen" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
More detail in the [Viewer documentation](https://docs.datacontroller.io/dcu-tableviewer/).
<!--
Source LinkedIn post:
Data Controller for SAS® has a plethora of features to make Data Discovery easier
Here we demonstrate "full table search". No need to formulate a query - just type a value and hit enter!
It works on all databases
This feature, like most others, is built on our open-source #SASjs library - using the `mp_searchdata()` macro (https://lnkd.in/gxZZq76j).
#sas #sasapps #sasviya
video: https://vid.4gl.io/w/qdEv4PP2oiPr5VXwLbN58B
-->
<!-- Image prompt:
Flat vector illustration on a dark slate (#314351) background with a faint dot grid: a stylised data table across the lower half (rounded header bar plus eight rows of rounded cells), with the fourth row highlighted in brand green (#90c445). A large magnifying glass with a thick green rim and diagonal handle overlaps the table on the right, and inside its dark lens the highlighted row appears magnified with two white value blocks. Headline "FULL TABLE SEARCH" in bold white uppercase, subheading "any value, every column - no query required" in brand green. 1200x627 landscape, no other text. Composed programmatically with PIL in the Data Controller brand palette rather than generated by an image model.
-->
Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

@@ -0,0 +1,69 @@
---
title: 'If: An Ode to Data Control'
description: Rudyard Kipling's 'If', reworked for the data governance era - the full text of a poem first published in 2022.
date: '2026-09-20 15:00:00'
author: 'Allan Bowe'
authorLink: https://www.linkedin.com/in/allanbowe/
tags:
- Announcements
previewImg: './if-an-ode-to-data-control.jpeg'
---
# If: An Ode to Data Control
Rudyard Kipling wrote "If" in 1895 and published it in his 1910 collection Rewards and Fairies. This ode to data control was first published in 2022. Here is the full text.
```
If you can keep your data when all about you
Are losing theirs and blaming it on you;
If you can trust your metrics when analysts doubt you,
But make allowance for their doubting too:
If you can query and not be tired by waiting,
Or building models, adjust for outliers,
Define ETL modules that are self-validating,
And require contracts from data suppliers;
If you can report - and not make KPIs your master;
If you can forecast - and not make compliance your aim,
If you can make the overnight batch faster
And ensure the end results are just the same:
If you can't bear two versions of truth spoken
Produced by silos to make a trap for fools,
Or watch systems you gave your life to, broken,
And stoop and build 'em up with off-the-shelf tools;
If you would make one lake with all your data
And risk it on one vendor's big bang plan,
And lose, and start again at invitation-to-tender
And salvage from the project, what you can:
If you can force your flat files and mainframe
To serve datamarts when key DBAs retire,
And so hold on when stakeholders proclaim
Why (oh why) is our Data Quality so dire?
If you can talk with architects & keep your virtue,
Or walk with CEOs - nor lose the accounting touch,
If neither UTF-8 nor PII can hurt you,
If all teams count with you, but none too much:
If you can keep Data Owners beholden
To uploads that are timely and accurate and whole,
Yours is the Earth and clean records (golden),
And - which is more - you'll have Data Control!
```
---
*If you can't keep your data when all about you are losing theirs - [Data Controller for SAS](https://datacontroller.io) can help. Capture, review and approval for every change, with a full audit trail, on SAS Viya, SAS 9 EBI and SASjs Server.*
<!--
Source LinkedIn post:
If you can keep your data when all about you
are losing theirs, and blaming it on you...
#datagovernance #dataquality #masterdatamanagement
-->
<!-- Image prompt:
Classic book title-page cover on a dark slate (#314351) background with a faint vignette and dot grid. A centred cream paper card with a drop shadow, double rule and green spine hint holds the title page: "FIRST PUBLISHED 2022" in small caps, green ornament rules, "IF" in large bold serif, "An Ode to Data Control" in serif, "after Rudyard Kipling" in italic, and the closing couplet "And - which is more - you'll have Data Control!" above a green rule. 1200x627 landscape, composed programmatically with PIL in the Data Controller brand palette rather than generated by an image model.
-->
-5
View File
@@ -21,11 +21,6 @@ const Footer = () => (
on <StyledAnchor href="https://sasapps.io">SAS Web Apps</StyledAnchor>
.
</StyledDesc>
<StyledDesc>
<StyledAnchor href="https://sasapps.io/cyber-essentials-certified/">
Cyber Essentials Certified
</StyledAnchor>
</StyledDesc>
</div>
<div className="col-md-3">
<StyledHeading>Source Code</StyledHeading>
+4 -14
View File
@@ -1,8 +1,7 @@
import React from 'react'
import { Link } from 'gatsby'
import { FaShieldAlt } from 'react-icons/fa'
import { Hero, HeroHeading, HeroDesc, HeroBadge } from './style'
import { Hero, HeroHeading, HeroDesc } from './style'
import { BottomSectionArrow, OutlineButton } from '../shared/styledComponents'
import { Container } from '../shared'
@@ -20,18 +19,9 @@ const HeroSection: React.FC<HeroSectionProps> = ({
<HeroHeading>{heading}</HeroHeading>
<HeroDesc>{desc}</HeroDesc>
{location.pathname === pathPrefix + '/' && (
<>
<HeroBadge
href="https://sasapps.io/cyber-essentials-certified/"
target="_blank"
rel="noopener"
>
<FaShieldAlt /> Cyber Essentials Certified
</HeroBadge>
<Link to="/contact/">
<OutlineButton>Try Data Controller</OutlineButton>
</Link>
</>
<Link to="/contact/">
<OutlineButton>Try Data Controller</OutlineButton>
</Link>
)}
</Container>
<BottomSectionArrow />
-17
View File
@@ -17,20 +17,3 @@ export const HeroHeading = styled.h1`
export const HeroDesc = styled.p`
opacity: 0.8;
`
export const HeroBadge = styled.a`
display: block;
width: fit-content;
margin: 0.75rem 0 0;
padding: 0.375rem 1rem;
font-size: 0.75rem;
border: 2px solid rgba(255, 255, 255, 0.5);
border-radius: 0.25rem;
color: white;
text-decoration: none;
&:hover {
color: white;
border-color: white;
opacity: 0.9;
}
`
+31
View File
@@ -0,0 +1,31 @@
import React from 'react'
import { FaShieldAlt } from 'react-icons/fa'
import styled from 'styled-components'
const StyledCertBadge = styled.a`
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.375rem 1rem;
font-size: 0.75rem;
border: 2px solid #314351;
border-radius: 0.25rem;
color: #314351;
text-decoration: none;
&:hover {
color: white;
background-color: #314351;
}
`
const CertBadge = () => (
<StyledCertBadge
href="https://sasapps.io/cyber-essentials-certified/"
target="_blank"
rel="noopener"
>
<FaShieldAlt /> Cyber Essentials Certified
</StyledCertBadge>
)
export default CertBadge
+2
View File
@@ -5,6 +5,7 @@ import Layout from '../components/layout'
import Seo from '../components/seo'
import { Section } from '../components/shared'
import CertBadge from '../components/shared/certBadge'
import {
SectionHeading,
SectionDesc
@@ -37,6 +38,7 @@ const About: React.FC<PageProps<unknown>> = ({ location }) => {
</a>
.
</SectionDesc>
<CertBadge />
</div>
</div>
</Section>
+2
View File
@@ -7,6 +7,7 @@ import Layout from '../components/layout'
import Seo from '../components/seo'
import { Section, ScheduleDemo } from '../components/shared'
import CertBadge from '../components/shared/certBadge'
import {
SectionHeading,
SectionDesc
@@ -98,6 +99,7 @@ const Home: React.FC<PageProps<IndexPageData>> = ({ data, location }) => {
perform manual data uploads into their preferred database, in
real-time, with full validation, approval, security, and control.
</SectionDesc>
<CertBadge />
</div>
<div className="col-md-3">
<Art src={rightArt} info="Clinical Research Data" />