Too often my days have started out with deciding to email someone about something related to a top priority. Next thing you know it is lunch time, almost nothing but email is done and you’re exhausted.
To focus on your highest priorities, you might be interested in trying the Personal Kanban (pronounced kahn-bahn). All you need is a white board, dry erase markers, post it notes, and sharpies.

Use sharpie markers and post it notes to visualize your work on your white board. It helps if you lay your white board out as shown above.
The key to Personal Kanban is reducing your work in progress.
That means you’ll only have one post it note (a single task) in the “Work In Progress” column at a time. Because you’re able to focus all of your energy on that one task, you’re making headway. The energy invested in a single task comes back to you as you complete your work and move that task to the Done column.
PS. I would be falling short in my responsibility to my business and myself, dear reader , if I didn't mention, I have lead HIT projects to incredible, and dramatic increases in productivity. That my friend is what I do. If you'd like to experience a bump in project implementation efficiency in the next 6 months or less, fax a letter to 509-624-3862 and let me know a little about your organization and objectives. One of my assistants will be back with you in a few days to schedule a FREE no obligation 30 minute phone consultation. Talk to you soon!
Where do I change the MEDITECH Magic Spool Group for automatically printed Claims?
Why in the BAR Claim Dictionary, of course!
See Meditech's Magic documentation here titled: Automatically Printing Claims
DOWNLOAD here: Change Spool Group Meditech BAR Claim
There are 2 ways to call 1 MEDITECH macro from another MEDITECH macro.
- Use @Macro(APP.DPM.zcus.report.name.M.macro.name) to call the macro and have it compiled as code into your existing report, the effect is the macro from the other report becomes part of your report.
The downside is that you'll need to re-compile both reports if there are changes to the original macro APP.DPM.zcus.report.name.M.macro.name.
The benefit is: all of your local variables are available to you both in the calling report's macro and APP.DPM.zcus.report.name.M.macro.name.
- If the macro you want to call is developed as a program, then you can call it like this: %APP.DPM.zcus.report.name.M.macro.name(0).
The benefit: you can pass arguments to the macro you're calling and not worry about how your local variables impact that macro.
Unless your back is against the wall (for instance, a production report is crashing after a MEDITECH upgrade), I don't recommend it.
But if you're bent on debugging production reports in LIVE, here's the safest way to debug a production report in MEDITECH LIVE... put this snip of code in just for you, and replace YOUR MEDITECH USER MNEMONIC with whatever your user mnemonic is.
IF{/(.S).USR="YOUR MEDITECH USER MNEMONIC" %Z.debug(0)}
Limiting the debug to just your user, means that if you fix the code, or forget to take it out: MEDITECH users won't be impacted.
You might put this debug call into a LC (line check), macro, ECB, ECE, xx.field (custom field), or even a footnote.
With deadlines looming to get the LSS Visit Summaries automated for mailing to patients, there is no time to lose.
Then it happened... right in the middle of my Summit Scripting & Automation for a MEDITECH LSS Meaningful Use project. There it reared its ugly face... "Certificate authentication failed" are you serious? Adobe? An installation error?

Yes, my Adobe Acrobat Reader Standard installation was in trouble. Could it be related to...
- this install being on a Windows Server?
- the installer not being raised properly, and having never learned to play well with others, ie: this particular Anti-Virus and it didn't get along?
- the whole thing just deciding to get a little wonky?

Problem solved.
Next!
P.S.: Save big time, and get rid of the temps... I'll help you automate LSS Patient Summary Mailing in a week flat OR your money back! Call 508-656-0735 and ask for John.
SSDs what are they, why might you want one, and are they worth the extra money?
An SSD is a Solid State Drive. Unlike a normal hard drive, SSDs have no moving parts.
There probably isn’t a single upgrade you can perform to your computer that will deliver the benefits of an SSD. The benefits are: super fast computer boot up time, applications open
almost instantly, files move and copy faster, local computer searches come back faster, even your anti-virus works quicker behind the scenes.
If you're the kind of person who likes to install and use a lot of applications, you'll be surprised at how many applications you can run at the same time without the machine bogging down.
What’s the catch? The cost... these drives cost about 10 times as much as a normal hard drive of the same size and quality.
If your primary reason for buying a hard drive is space, you store a lot of graphics, music and video and super fast access isn’t necessary, purchasing one of these drives is not for you.
A couple years ago, I noticed that I was holding other people up during conference calls and killing team productivity. If I was working with you and needed to reboot my machine during our call, the round trip reboot time was 15 minutes! That is 15 minutes from the time I shut down until my desktop appeared and my machine could run applications. When I bought an
SSD drive, my round trip boot time dropped to about 2 or 3 minutes. When you’re on the phone with a group of people, nobody minds waiting 3 minutes for you to reboot your machine, on the other hand, nobody I know will wait 15 minutes either.
My primary reason for buying an SSD was boot time and application performance. Since upgrading to the SSD, I’ve never looked back. Miserable to ecstatic with one upgrade, it
doesn’t seem possible. Now I will tell you that I use 2 hard drives, my boot drive (C:\ drive) is the SSD, my default storage drive is a standard hard drive. Since I need quite a bit of storage for photos, software and database development, that’s the tradeoff I can live with.
MEDITECH B/AR for example, formats payments as (100.00), but to load these into another vendor's database, you need that value expressed as: -100.00.
Today, you get a new MEDITECH NPR function (which you'd use in an NPR macro) that makes converting a negative value from Billing, like transaction amount into a value you can load into a SQL database, as easy as 1... 2... 3...
To reformat the numeric value, put the following in your macro:
REPLACE: @txn.amount
WITH: @txn.amount^@NEGATIVE.NUMERIC.CONVERT^/TXN.AMOUNT
Then paste these 2 routines below into the body of your NPR macro.
NEGATIVE.NUMERIC.CONVERT
; Input(s): /NUMERIC
; Output(s): /NUMERIC
; Usage: /NUMERIC^@NEGATIVE.NUMERIC.CONVERT^/NUMERIC
; Author: John Sharpe
/NUMERIC,
; Convert (100.00) to -100.00
IF{/NUMERIC#L(/NUMERIC,"(") {"(","",/NUMERIC}^@STRING.FIND.REPLACE^/NUMERIC,
{")","",/NUMERIC}^@STRING.FIND.REPLACE^/NUMERIC,
0-/NUMERIC^/NUMERIC},
/NUMERIC
STRING.FIND.REPLACE
; Input(s): /PARAMS
; Output(s): /STRING
; Usage: {@QUOTE,"",/TXT}^@STRING.FIND.REPLACE^/TXT
; Author: John Sharpe
/PARAMS,/PARAMS|0^FIND,/PARAMS|1^REPLACE,/PARAMS|2^STRING,
IF{FIND=REPLACE;
DO{STRING#(L(STRING,FIND)^P) (STRING$P)_REPLACE_(STRING%P)^STRING}},
STRING^/STRING

That's it, step 3 is EASY, run & test your report. If this is helpful, comment below and let me know where you see yourself using it.
P.S.: Have an interesting project you're thinking of getting outside help on this fall? Have your director or manager email me, I may still have time in my schedule to help. The fall calendar is filling up fast!
A friend emailed me today requesting recommendations on what to read for professional development in the MEDITECH healthcare IT world we're apart of. Here's a paraphrase what I wrote back.
--------------------------------------------------------------------------
Recently... I went to the library and looked at a resource called SRDS: Standard Rate & Data Service. The SRDS is a resource used in direct mail marketing to reach buyers with marketing messages. The SRDS is a catalog on how to reach who you want to reach. If as a marketer you wanted to reach C-Level, Director Level, & Manager Level people in Healthcare Management, you might want to rent lists of the subscribers to these magazines & journals.
H&HN: http://www.hhnmag.com/
HFMA: http://www.hfma.org/
Modern Healthcare: http://www.modernhealthcare.com/
Being armed with that knowledge, that these audiences read these magazines, that tells me that I ought to be too! If I want to know what they are thinking, what their problems are, what they need help with, this is 1 place to start. What an edge this gives you in the workplace, you're not working downstream, you're working with anticipation, finding meaning in your work, and embracing projects with the biggest impact based on your knowledge of the big picture.
The late Peter Drucker said, once a person has competence in their work, the limiting factor on how a person can go in their career depends on communication skill in the written & spoken word. For that reason, I've joined Toastmasters, which I recommend to anyone looking to improve their speaking skills, this is a link to our club in Spokane: Moonlighters #431. The opportunity to grow in this environment is amazing.
Finally, one other thing I'm looking into is: ACHE, The American College of Healthcare Executives @ http://ache.org/. This is an association where anyone with a 4 year degree can volunteer and mingle with healthcare executives in a forum revolving around professional development in the healthcare arena.
--------------------------------------------------------------------------
If you're looking for that next challenge on your horizon, here's something to think about, who is promotable and what makes them that way? Enough of the right things being equal, the person who is hired or promoted will be: the person who is on the leading edge of healthcare trends; who can translate education, experience & ideas into execution; who comes in looking to lead transformation. And professional development in these areas is the fuel that gets us there.
Professional development... its easy to do. What's the problem, why don't more do it? It's easy not to do.
If you have other recommendations on professional development in the HIT world that I can pass on to my friend, please post them here as comments below.
We both thank you.
Dear Friend,
It's raining here in Spokane, WA today and it is Friday. Rain is coming down and thunder is cracking overhead. Me? I'm sitting in my basement, windows open, listening to the sights and catching a glimpse of lightning if I can. Not a promising day for canoeing with the girls, that's for sure.
Ahem, this isn't about me.
Today... reach out, connect with and thank David for today's insights. Our topic today, implements ROW_NUMBER() to identify records by a sequence id of our choosing (using sort criteria), this gives you that NPR type logic in SQL.
Did I ever tell you? I never cease to be amazed at how stupid I was just 2 weeks ago? That's a good thing, a sign of real progress. If not for our progress together, with you my clients and readers, I'd feel like I was standing still.
Remember... was it Thursday - the day after the 4th of July, yeah that's right, I was all excited about MEDITECH DR Top N Analysis By Multiple Search Criteria. On that day I wrote a web utility to write a bunch of SQL scripts based on your criteria. Met the need at the time, even then, I knew I needed a better solution. And you no doubt spotted that before I did. Thanks for not making old John feel too dumb, you're a real mensch.
Today's tip is a gem if you're interested in 1 of 2 things, automation, efficiency, or productivity (sorry, make that 3).
Say you want to run a query to report 10 Accounts for 33 different Account Types, you don't want to manually type and run 33 queries do you? Shake your head no, our time is too precious to do stuff like that, that's for other people, not us. We need to be making progress on critical projects.
Here goes, follow along with me reading the script and bold comments below.
USE livedb
GO
/*
To begin, you need a couple of temp tables, now that
really isn't how I wrote the script, I wrote it as you
would, step by step, and then I put it all together.
Here we setup our temp tables using the # to denote
that these are temp tables. These temp tables will be
used to store our detail data in. For you NPR gurus,
this is your MV array.
*/
IF Object_id('tempdb..#BarAccountDetail') IS NOT NULL
DROP TABLE #BarAccountDetail
GO
CREATE TABLE #BarAccountDetail (
BillingID VARCHAR(44) ,
AccountNumber VARCHAR(15) ,
AccountType VARCHAR(20)
)
/*
Drop and get Account Type Dictionary entries into a
temp table.
*/
IF Object_id('tempdb..#BarAccountTypes') IS NOT NULL
DROP TABLE #BarAccountTypes
GO
/*
Use ROW_NUMBER() to give each Account Type a Sequence
Number. Remember David? This is the select from the
Account Type Dictionary used to give each AccountType
a number. This number will be used in a while loop to
SELECT TOP 10 records for each Account Type.
*/
SELECT AccountTypeID ,Row_number() OVER
( ORDER BY AccountTypeID ) [RowID]
INTO #BarAccountTypes
FROM DBarAccountTypes
WHERE AccountTypeID LIKE 'LH%'
OR AccountTypeID LIKE 'RK%'
GO
/*
Set your AccountTypeCount to the number of Account
Types you're going to work with. If you're looping in
NPR report writer, you start with nil or 0, this works
the same way.
*/
DECLARE @AccountTypeCount INT =
( SELECT Count(AccountTypeID)
FROM #BarAccountTypes)
/*
Start at zero 0. Loop from zero 0 to the maximum
number of accounts you have, use the AccountTypeCounter
to get the value for your TOP 10 SELECT Criteria.
Right there in the loop INSERT the TOP 10 records for
the current Account Type into our #BarAccountDetail
temp table.
*/
DECLARE @AccountTypeCounter INT = CONVERT(INTEGER, 0)
WHILE @AccountTypeCounter < @AccountTypeCount
BEGIN
SET @AccountTypeCounter = @AccountTypeCounter + 1
INSERT INTO #BarAccountDetail
(
BillingID ,
AccountNumber ,
AccountType
)
SELECT TOP 10
BVFD.BillingID ,
BV.AccountNumber ,
BVFD.AccountType
FROM BarVisitFinancialData AS BVFD
INNER JOIN BarVisits AS BV
ON BVFD.SourceID = BV.SourceID
AND BVFD.BillingID = BV.BillingID
INNER JOIN #BarAccountTypes AS BAT
ON BVFD.AccountType = BAT.AccountTypeID
WHERE BAT.RowID = @AccountTypeCounter
CONTINUE
END
GO
/*
Finally, its like our MV array is already for printing.
Now, report the TOP 10 Accounts for each Account Type
that starts with the AccountType selection criteria:
LH or RK.
*/
SELECT BillingID ,
AccountNumber ,
AccountType
FROM #BarAccountDetail
Okay, try this script we've just blazed through together, then post a comment here. Tell the other readers how this was helpful and how you applied it in your place of work.
As I just stepped out to check the mail, I see the sky is clearing, it never rains for long in Spokane, at least not long enough for me... it may yet turn out to be like that day I remember, that sunny day on the river with the girls.

When you need to find a needle in your MEDITECH haystack, making use of a temp table might be right for you.
In my situation today, I needed to know how many MEDITECH BAR accounts had multiple Calculated APC Data Sets. Let's see there are 6,000,000+ accounts in the database. And I'm looking for less than 1,000 APC sets.
OLD MEDITECH Way: writing an NPR report to do that would take a few minutes, running that NPR report might take anywhere from 2 - 24 hours to get the answer.
vs...
NEW MEDITECH Way: develop & run a SQL script against MEDITECH Data Repository (DR) to return the answer in less than a minute.
IF Object_id('tempdb..#BarApcs') IS NOT NULL
DROP TABLE #BarApcs
GO
SELECT DISTINCT VisitID,
ApcDateTime
INTO #BarApcs
FROM (SELECT VisitID,
ApcDateTime
FROM BarApcs) AS TEMP
GO
SELECT A.AccountNumber,
Count(ApcDateTime)
FROM #BarApcs
INNER JOIN AdmVisits AS A
ON #BarApcs.VisitID = A.VisitID
GROUP BY A.AccountNumber
HAVING Count(ApcDateTime) > 1
GO
Bottom Line: writing an NPR report is your last resort when performing data discovery, that is unless 1 of 3 things are true:
- Your organization doesn't have DR.
- You don't like SQL.
- DR in this rare case doesn't yet have that information loaded yet.