The LinkedIn opener did not parse - "A SAS numeric missing is not a lone wolf.
It is 28." - and reading the rest of the post and its LinkedIn version together
turned up a further set of style defects:
- the article opener made the missing value the wolf, and padded the count
- "All numeric values means numeric; all strings means character" was clumsy
- procedure and function names were lowercase in places (proc means, cats,
options MISSING), and "and friends" was too casual for a list of procedures
- "gotcha" and "harmless" undersold the points they introduced
- "One thing worth knowing" opened two separate paragraphs
- "a value ... and as a value with its own place" repeated itself, in both the
article and the LinkedIn version
- the adapter bullet list mixed trailing periods with none
- the LinkedIn list was split in two by a stray blank line, and "a physical
constraint" did not say which constraint
- "the most common of them" echoed the "28 of them" in the line above
No claims changed - the range-rule behaviour, the period, the primary key and
the strict dropdown all read as they did.
Embeds the "Special Missings in Data Controller" recording from vid.4gl.io as a
responsive PeerTube iframe, in place of the older YouTube embed, and drops the
stray `video: [...]` line that was sitting in the body as literal text.
Copy corrections, each verified against the running app rather than the source:
- the range rules compare in SAS's order, so MINVAL .A with MAXVAL .C takes .B
and refuses .D, a missing fails a numeric MINVAL and passes a numeric MAXVAL,
and a number sits above every missing. The old wording said the range rules
step aside for a missing value
- a lone "." is another way of typing the regular missing; the previous claim
that a literal "." is refused in favour of null is not what happens
- a strict dropdown does accept a special missing when its list holds one (the
list shows it as a bare letter), and still rejects a value that is not listed
- NOTNULL rejects a special missing, and a primary key column is NOT NULL
whether or not a rule is configured for it
The LinkedIn version of the post is kept in sync, and carries the new video URL.
A range rule keys both sides into the order SAS uses for a numeric variable, so a
range written in special missings means what SAS would mean by it: MINVAL .A with
MAXVAL .C accepts .B and rejects .D, a blank fails a floor of .A, and a number
sits above every missing - passing a floor of .A and failing a ceiling of .C.
Against a numeric bound the same order gives the obvious answer: a missing fails
MINVAL 1 and passes MAXVAL 100.
Replaces the "the range rules step aside for a missing value" wording.
Three corrections to the special missings post:
- a special missing is typed with or without its leading period - `.a` and `a`
are the same missing
- MINVAL and MAXVAL both accept a special missing, and both still reject a real
number that is out of range. A minimum constrains a number, and a missing is
not a number; NOTNULL is the rule for a column that must be populated
- the formula rules are the one case where a special missing genuinely does not
work, so the range rules are no longer grouped with them
The validator fix lands in dc/dc (PR #323), so the post describes the fixed
behaviour rather than the mismatch: a special missing fails NOTNULL, matching
a physical SAS NOT NULL / primary key constraint.
Also records what ROUND and SOFTSELECT/HARDSELECT do with one, and groups
MINVAL/MAXVAL/HARDFORMULA/SOFTFORMULA under 'not supported'.
Verified on a real SAS estate:
- a physical NOT NULL (or primary key) constraint rejects a special missing,
and getdata merges that constraint into a frontend NOTNULL rule - which
passes a special missing, so the editor is more lenient than the constraint
- a special missing as a MINVAL rule value fails every cell; as a MAXVAL rule
value it fails every real number
- a HARDFORMULA/SOFTFORMULA reading a special-missing cell returns #VALUE!
- PRX and the JS engine agree on the value; SAS pads the numeric-to-character
conversion, so an anchored pattern re-used in SAS needs strip()
- heading + intro now say these are Data Controller's MPE_VALIDATIONS rules,
applied in the browser
- new paragraph on options MISSING: a regular missing prints as . unless the
option changes it (eg to blank); special missings are never affected
- CASE split out of the rule list: it is a character rule, and a special
missing always reaches the browser as an uppercase letter
- HARDREGEX and SOFTREGEX separated (SOFTREGEX warns rather than blocks, and
is ignored when the column also has a HARDREGEX)
- LinkedIn copy kept in sync
Behaviour confirmed against the deployed services on a real Viya estate.
Cover art for "28 Ways to Be Missing in SAS": a pack of wolves on a snow plain
at dusk with one animal standing apart, carrying the post's opening line - a
numeric missing is not a lone wolf, there are 28 of them.
Source image was 4:3, so it is cropped to 1.91:1 (1200x627) to match the other
feed covers and double as the LinkedIn share card. The crop was chosen to keep
both the lone wolf on the left and the full pack on the right in frame, losing
only sky above the clouds and foreground snow.
Sets previewImg in the front matter; the template renders it, so it is not
embedded in the body as well. Verified through gatsby build - the image
pipeline emits 300/600/1200-wide variants.
Replaces the placeholder one-liner with the prompt actually intended for the
cover: the pack of wolves on a snow plain at dusk with one animal standing
apart, plus the negative constraints, the output spec (./cover.jpeg at
1200x627, previewImg in front matter) and a fallback single-subject variant.
Two deliberate choices are recorded so they are not lost on a regenerate:
- No text, letters or numbers anywhere in the image. The subject is letters
standing in for numbers, so a stray glyph undercuts the cover.
- No exact head count of 28. Generators cannot count, and a crowded pack reads
worse than a dozen clear animals; the number belongs in the headline.
Links to the full prompt and variants on paste.4gl.io.
The special missings video was labelled "Retain Formulas when Loading Excel
to SAS", which is a different video. Restores the one-line correction that
was in the earlier revision of this branch, kept separate from the feed post.
The special missings material that was added to the v4.0 blog post belongs in
its own post: that article is a release announcement for v4.0, not a teaching
piece. This reverts the blog change and publishes the content under /feed/.
The new post covers what SAS special missings are, how the SASjs Adapter
carries them between the browser and SAS, and how Data Controller's validation
rules treat them - NOTNULL passes, MINVAL fails, MAXVAL passes, and the regex
rules apply as they would to any other value.
The LinkedIn version of the copy, and the image prompt for the cover, are
recorded in a comment at the foot of the file.
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`.