intl-spectrum.com INTERNATIONAL

SPECTRUM® SPECTRUMTHE MULTIVALUE TECHNOLOGY MAGAZINE I January/February 2020

MV Speaks JSON

Also in this Issue: y Building MV Staff Part III y Finding MV outside of MV INTERNATIONAL SPECTRSPECTR UMUM MultiValue Conference and Partner Exchange

CHANGE. ADAPT. EVOLVE.

39TH Annual Conference APRIL 20 – 23, 2020 | SADDLEBROOK RESORT, TAMPA, FL

REGISTER NOW

www.intl-spectrum.com/conference I NTERNA TIONAL SPECTRU M THE MULTIVALUE TECHNOLOGY MAGAZINE

January/February 2020

COVER Parsing JSON Data with jBASE, QM, and U2 6 Modernizing applications often require working with JSON data. While parsing JSON data isn’t hard, several MultiValue flaovrs provide features that make it even easier. Here’s some excellent starting examples on how to parse JSON data with jBASE Dynamic

Objects, QM Data Collections, and U2 Dynamic Objects BY

NATHAN RECTOR

FEATURES

Business Tech: Building MV Staff: Part III Programming needs 11 to be preceded by analysis. We have to know what we are supposed to teach the system to do. Every programmer should have at least a little bit of analyst in them. Ideally, they should have a lot. How do we teach our staff to be analytic in their approach to problems? Have

a seat on the analyst’s couch and let’s explore that. BY CHARLES BAROUCH

Finding MV outside of MV Black and white, day and night, MultiValue 17 and SQL… We are used to thinking of them as opposites. Common needs drive people to common solutions. Are the still worlds-apart or are they being driven to the middle? Is there an mvSQL love-child out there? Some MultiValue databases store in SQL tables. Most MultiValue databases have a way to accept SQL queries. This is a look at something different than both of those

things. BY KEVIN KING

CONTENTS DEPARTMENTS

International Spectrum and MultiValue are registered trademarks of International Spectrum, From the Inside page 4 Inc. All other registered trademarks are the property of the respective trademark holders. From the Press Room page 14

INTL-SPECTRUM.COM u January/February 2020 u 3 I NTERNA TIONAL SPECTRU M From January/February 2020 the

NATHAN RECTOR Inside President

CHARLES BAROUCH t looks like 2020 will become the law’s wording implies that Editor the year of implementing images on those recordings are TRACEY RECTOR I government regulations in part of the consumer’s privacy Layout businesses. There are several new rights. If the consumer states federal and state laws going into they don’t want to be recorded effect this year, and it is catching for privacy reasons, then you are a lot of business by surprise. not allowed to record them even California Privacy Laws in public areas. That’s how broad this law is. California was the first state New York Privacy Laws to pass privacy laws roughly Learn more about the MultiValue Symbol and see modeled after the European Like California, New York is what MulitValue Technologies and MultiValue Communities exist to help you support and manage privacy laws, but it didn’t take proposing a bill that would allow your business and systems. To find out more visit effect until 2020. Since the people to find out what data http://www.intl-spectrum.com wording of the laws wasn’t as companies are collecting on clear as they originally wanted them, see who they’re sharing it, there has been some back and that data with, request that it be forth working through it. While corrected or deleted, and avoid MISSION STATEMENT International Spectrum magazine’s editorial mission is it seems to be more focused having their data shared with or to be the premier independent source of on regulating the larger Social sold to third parties altogether. useful information for users, developers, Media and Tech company, it will The difference is that New York’s and resellers of MultiValue affect smaller companies as well. bill would allow their residents management systems, open systems There are two major takeaways to sue companies directly over business database solutions, and related that everyone should be aware privacy violations. While the hardware, software, and peripherals. Published bimonthly, International of. The law is not limited to California law is focused on Spectrum provides comprehensive California companies. It affects companies doing more than $25 coverage of the products, companies, on any company that does million, New York’s would apply and trends that shape the MultiValue business in California if they to company of any size. marketplace as well as the computer collect consumer data. So, even if New York’s SHIELD Act will industry at large — helping its readers get your business is based in another the most out of their business computer directly affect how data is stored systems. state, if you do business with by business software regardless anyone in California, then you if they are based in New York or can’t collect or receive consumer not. Just like California’s law, it data without complying. International Spectrum is published six (6) times per is designed to act as a right for year at the subscription price of $40.00 U.S. in the That’s pretty much everybody. the person who resides in their U.S.A.; $45.00 U.S. in Canada and Mexico; $50.00 Even if you think you aren’t state regardless of the infringer’s U.S. for other countries. Single copy rates are $7.00 U.S. in the U.S.A. and Canada, and $9.00 U.S. in all affected, consider this: If you location. other countries. International Spectrum is published are working with a marketing by International Specturm, Inc., 3691 E. 102nd Ct., Federal W4 and Payroll Thornton, CO 80229; Tel: 720/259-1356; Fax: 603/250- or data collection company, like 0664 E-Mail: [email protected]. Copyright the ones that provide loyalty The Federal Government has 2020 International Spectrum, Inc. All rights reserved. redone their payroll systems. Reproduction in whole or in part, without written per- programs, or any company that mission, is prohibited. provides data analytics for you, There are new tax rules and new you need to consider your legal tax tables. Not to mention, new PRINTED IN USA W2 and Tax forms to be filled NEWS RELEASES/UNSOLICITED ARTICLES position. International Spectrum is eager to print your submissions of out. up-to- the-minute news and feature stories complementary to There are still some gray areas the MultiValue marketplace. Black and white or color photo- While this doesn’t affect existing graphs and diagrams are welcome. Although there is no guar- that are being worked out. For antee a submitted article will be published, every article will be employees of a company, any considered. Please send your press releases, articles, and queries example, if you are using cloud to: [email protected]. International Spectrum retains all storage for security cameras, new employees that have been reprint rights. International Spectrum is a registered trademark and MultiValue twitter.com/intlspectrum intl-spectrum.com/facebook is a trademark of International Spectrum, Inc. All other registered trademarks and trademarks are the property of the respective trademark holders. INTL-SPECTRUM.COM u January/February 2020 u 4 hired in 2020 are required to use the new forms and tables. Many Celebrating 20 Years companies have outsourced their HR and Payroll systems, but if you as a leader in the are doing payroll internally still, this may come a bit of a surprise. MultiValue Industry Freelancer Laws New York and California are also crafting freelancer laws, designed D3 UniVerse UniData PICK jBase mvBase Caché to stop companies like Uber and Lyft from abusing the drivers. The reach is far longer, affecting IT Solutions. Proven Results. anyone who freelances, including One Project. One Decision. One Keystroke at a time. writers and possibly consultants. These topics are going to be Custom developed solutions based on your needs covered at the International Senior level developers and business analysts to guide you Spectrum 2020 Conference in Tampa, Florida on April 20th. Developing long term partnerships Watch for more information in the coming months!

NATHAN RECTOR www.pickprogram.com President [email protected] International Spectrum [email protected] (614) 921-9840

mv QuickBooks API for the MultiValue Database QB

• Read/Write Directly to Quickbooks Databases Customer, Vendor, Invoices, Purchase Orders, Chart of Accounts • mvQB API is Designed for the MultiValue Program to Use All routines are simple BASIC calls designed for the developer. No special user interfaces required. • No Need to Learn the Internals of QuickBooks • QuickBooks Pro/Premier/Enterprise Natec Systems Phone: 303.465.9616 E-mail: [email protected] Providing Solutions to your MultiValue Questions Website: www.natecsystems.com

INTL-SPECTRUM.COM u January/February 2020 u 5 Parsing JSON Data with jBASE, QM, and U2

BY NATHAN RECTOR

jBase Parsing JSON into Memory There are many different ways to parse JSON, but if you are The first thing that needs to be done is load the JSON string working with jBASE 5 or above, then there are tools built into memory. This will create an in-memory structure that directly into the BASIC language. make accessing JSON easier. In order to enable Dynamic Objects “$OPTION jabba” must be included at the top of jDO your program. jBASE BASIC allows developers to use the Dynamic Ob- ject (jDO) feature to parse JSON into in-memory objects. JSON.DOCUMENT = JSON.STRING->$fromjson() While the Dynamic Objects has many uses beyond simple $fromjson() converts the JSON string into a dynamic ob- JSON name/value pairs, it simplifies parse and interacting ject. Dynamic Objects are part of jBASE’s Object Oriented with JSON strings. Programing features for BASIC.

Figure 1 shows the example JSON that we will be parsing. Retrieving a Name/Value Pair For those who don’t read JSON, the equivalent in XML can Once you have your data collection variable, you will need be found in Figure 2. to access the JSON data in it. Let’s say you need to access

1234 { “orderID”: 12345, “shopper”: { John Smith “Name”: “John Smith”, John Smith “Email”: [email protected] }, “contents”: [ { 34 “productID”: 34, SuperWidget “productName”: “SuperWidget”, 1 “quantity”: 1 }, { 56 “productID”: 56, WonderWidget “productName”: “WonderWidget”, 3 “quantity”: 3 } ], true “orderCompleted”: true} Figure 1 JSON Example Figure 2 XML Example INTL-SPECTRUM.COM u January/February 2020 u 6 the “orderID” information. To do this, you would do the provided in a compressed format. That is, no spaces and line following: feed, which make debugging JSON issues harder.

CRT JSON.DOCUMENT->orderID JSON.DOCUMENT = JSON.STRING->$fromjson() CRT JSON.DOCUMENT->$tojson(1) In jDO notation, the “->” indicates that orderID is a prop- erty of the JSON.DOCUMENT variable. Additional Information You can find out more about the jBASE Dynamic objects NOTE: Just a reminder to people new to JSON… JSON is in the jBASE manual under “Introduction to Dynamic Ob- case-sensitive. In this case, “OrderID”, “orderID”, and “or- jects”. derid” are all different property values according to the rules of JSON. QM Retrieving a nested Name/Value Pair If you are working with QM 3.3 or above, then there are tools built directly into the BASIC language. The JSON data you are working with will rarely be a simple Name/Value Pair. Generally, it will be nested data. Shopper QM BASIC allows developers to use the Data Collection Name is an example. If you needed to access the Shopper feature to parse JSON into in memory objects. While the Name, you would use the following JSON Dot notation Data Collection feature has many uses beyond simple JSON (not supported in MV) to reference it: name/value pairs, it simplifies parse and interacting with JSON strings. echo shopper.Name; \\ output: “John Smith” We will be using the same example that we used for jBase as Using a Dynamic Object, the code is very similar to the seen in Figure 1 and 2. JSON Dot Notation: Parsing JSON into Memory SHOPPER.NAME = JSON.DOCUMENT->shopper->Name CRT SHOPPER.NAME The first thing that needs to be done is load the JSON string into memory. This will create an in-memory structure that Retrieve Data from Arrays make accessing JSON easier. Some JSON strings will have data found in arrays instead of just nested JSON objects. In the example, this would the JSON.DOCUMENT = JPARSE(JSON.DATA) ‘contents’ data. If you were accessing this information using JPARSE() converts the JSON string into a Data Collec- JSON Dot Notation, then you would do something like the tion variable. Data Collection variables in QM can be pass following: around inside subroutines and COMMON blocks the same way that File handler and dynamic arrays can. echo contents[0].productID; \\ output: “34” echo contents[1].productID; \\ output: “56” Retrieving a Name/Value Pair Using a Dynamic Object, there we first need to figure out Once you have your data collection variable, you will need the size of the array in order to get the information from to access the JSON data in it. Let’s say you need to access each product: the “orderID” information. To do this, you would do the PRODUCT.NUM = JSON.DOCUMENT→contents→$size() following: -1 FOR PCNT = 0 TO PRODUCT.NUM CRT JSON.DOCUMENT{‘orderID’} PRODUCT.ITEM = JSON.DOCUMENT->contents->@p CRT PRODUCT.ITEM->productID NOTE: Just a reminder to people new to JSON: Everything NEXT PCNT is case-sensitive. In JSON, “OrderID”, “orderID”, and “or- Formatting JSON derid” are all different property values. As a byproduct of the jDO functions, there is a cool feature Retrieving a nested Name/Value Pair that allows a developer to format a JSON string as human The JSON data you are working with will rarely be in a sim- readable indented format. Many time JSON data will be ple Name/Value Pair without the nested data. For example, if you needed to access the Shopper Name, you would use

INTL-SPECTRUM.COM u January/February 2020 u 7 the following JSON Dot notation (not supported in MV) While the above code shows you how to access a specific ar- to reference it: ray position, if you needed to process each item in the array you need to get the array size: echo shopper.Name; \\ output: “John Smith” Using a Data Collection variable, it is very similar to the PRODUCT.NUM = INMAT(JSON.DOCUMENT{‘contents’}) FOR PCNT = 1 TO PRODUCT.NUM JSON Dot Notation: CRT JSON.DOCUMENT{‘contents’,P,’productID’} NEXT PCNT SHOPPER.NAME = JSON.DOCUMENT{‘shopper’,’name’} CRT SHOPPER.NAME Formatting JSON As a byproduct of the UDO function, there is a cool feature Retrieve Data from Arrays that allows a developer to format a JSON string as human Some JSON strings will have data found in arrays instead readable indented format. Many time JSON data will be of just nested JSON objects. In the example, this would the provided in a compress format. That is, no spaces and line contents data. If you were accessing this information using feed, which make debugging JSON issues harder. JSON Dot Notation, then you would do something like the following: JSON.DOCUMENT = JPARSE(JSON.DATA) CRT JBUILD(JSON.DOCUMENT) echo contents[0].productID; \\ output: “34” echo contents[1].productID; \\ output: “56” Additional Information Using a Data Collection variable, it is very similar to the You can find out more about the Data Collections in the JSON Dot Notation: QM manual.

PRODUCT.ID = JSON.DOCUMENT{‘contents’,1,’prod uctID’}

INTL-SPECTRUM.COM u January/February 2020 u 8 U2 (UniData or UniVerse) Retrieving a Name/Value Pair If you are working with U2 (UniData or UniVerse), then Once you have your data in-memory, you will need to access there are several built-in functions that simplify the processes. it. Let’s say you need to access the “orderID” information. To do this, you would use the UDOGetProperty [Figure 4]. Starting in Universe 11.1 and UniData 7.3, the U2 Dynam- ic Objects (UDO) functions were added. The UDO com- UDOGetProperty will return the value of ‘orderID’ in the mands are designed for developers to parse Name/Value pair ORDER.ID variable, as well as, tell you what kind of infor- data from both JSON, and in some cases, XML strings. U2 mation it is in DATA.TYPE. The data type information for dynamic Objects will load the information into memory, so function will return if the data is a String, Boolean, Array, or be aware of how large the data is. another JSON object. This will be important to know when trying to retrieve the Product data. We will be using the example of JSON and XML found in Figure 1 and 2 NOTE: Just a reminder to people new to JSON… JSON is case-sensitive. In this case, “OrderID”, “orderID”, and “or- Parsing JSON into Memory derid” are all different property values according to the rules The first thing that needs to be done is load the JSON string of JSON. into memory. This will create an in-memory structure that Retrieving a nested Name/Value Pair the rest of the UDO function will use to access the data. Very rarely will the JSON data you are working with be clear There is one last thing you will need for the UDO functions Name/Value Pair without the nested data. For example, if to work. You have to include “$INCLUDE UNIVERSE.IN- you needed to access the Shopper Name, you would use the CLUDE UDO.H” into your program [Figure 3]. following JSON Dot notation to reference it: The UDOFree() statement is very important. This will clear echo shopper.Name; \\ output: “John Smith” the JSON document from memory, which is important for security and to avoid Memory Leaks. It is NOT recommend- Using the UDO functions, you will still access the data with ed you store the JSON.DOCUMENT.HANDLE in COM- UDOGetProperty, but you need to use the following steps MON statements for this reason. [Figure 5].

IF NOT (UDORead(JSON.DATA,UDOFORMAT_JSON,JSON.DOCUMENT.HANDLE) = UDO_SUCCES) THEN * JSON is not formatted correctly. END … … UDOFree(JSON.DOCUMENT.HANDLE) Figure 3

IF NOT(UDOGetProperty(JSON.DOCUMEHT.HANDLE,”orderID”,ORDER.ID,DATA.TYPE) = UDO_SUCCES) THEN * Unable to find OrderID UDOFree(JSON.DOCUMENT.HANDLE) RETURN END Figure 4

* Retrieve a handle to the shopper Object IF NOT(UDOGetProperty(JSON.DOCUMEHT.HANDLE,”shopper”,SHOPPER.HANDLE,DATA.TYPE) = UDO_SUCCES) THEN * Unable to find Shipper in the JSON Document RETURN END

* Retrieve the Name value from Shopper Object IF NOT(UDOGetProperty(SHOPPER.HANDLE,”Name”,SHOPPER.NAME,DATA.TYPE) = UDO_SUCCES) THEN * Unable to find then Name property in Shopper RETURN END CRT SHOPPER.NAME Figure 5 INTL-SPECTRUM.COM u January/February 2020 u 9 object. Since it is a JSON object, the the DATA.TYPE variable will return PICK/U2 value returned is a handle which allows the value UDO_ARRAY. It would Resources Available you to access the properties specific to be smart to code your program to test that JSON object. for this before trying to do a UDOAr- rayGetNextItem to help avoid any as- Once you have SHIPPER.HANDLE Execu-Sys, Ltd is an Executive Search sumptions in the JSON data. & Consulting firm that has specialized defined, you use that variable instead in the PICK/MULTIVALUE market since of the JSON.DOCUMENT.HAN- Formatting JSON 1988 and is the Preferred Partner DLE to reference the properties associ- of Rocket Software for PICK/U2 As a byproduct of the UDO function, professional services. ated with the ‘shopper’ data. there is a cool feature that allows a de- Hourly rates for contract programming Retrieve Data from Arrays veloper to format a JSON string as hu- are extremely competitive and there is man readable indented format. Many no minimum time or $ commitment. Some JSON strings will have data time JSON data will be provided in Contact us today to discuss potential found in arrays instead of just nested a compress format. That is, no spaces engagements. JSON objects. In the example, this and line feed, which make debugging would the ‘contents’ data. If you were Matt Hart JSON issues harder [Figure 7]. accessing this information using JSON EXECU-SYS, LTD Dot Notation, then you would do Additional Information 1411 Broadway, Suite 1220 something like the following: New York, NY 10018 You can find out more about the U2 Dynamic Objects in the UniBASIC (800) 423-1964 x302 echo contents[0].productID; \\ output: “34” Extensions manual. IS Email: [email protected] echo contents[1].productID; \\ output: “56” NATHAN RECTOR To retrieve these values using the UDO President function, there are several steps to go International Spectrum through [Figure 6]. [email protected] You will notice that you first access the ‘shipper’ property from the document. When you do a UDOGetProperty on In this case, the value will be a JSON a JSON property that is an array, then

* Retrieve a handle to the contentsarray IF NOT(UDOGetProperty(JSON.DOCUMEHT.HANDLE,”contents”,CONTENTS.HANDLE,DATA.TYPE) = UDO_SUCCES) THEN * Unable to find contents in the JSON Document RETURN END

* Process each item in the array LOOP SUCCESS = UDOArrayGetNextItem(CONTENTS.HANDLE,PRODUCT.HANDLE,DATA.TYPE) WHILE (SUCCESS = UDO_SUCCES) DO * Retrieve the Product ID IF NOT(UDOGetProperty(PRODUCT.HANDLE,”productID”,PRODUCT.ID,DATA.TYPE) = UDO_SUCCES) THEN * Unable to find then Name property in Shopper END CRT PRODUCT.ID REPEAT Figure 6

* Tell UDO to output as formated IF NOT(UDOSetOption(UDOOPTION_OUTPUTMODE, UDO_OUTPUT_FORMATTED) = UDO_SUCCESS) THEN * Unable to set Options END IF UDOWrite(JSON.DOCUMEHT.HANDLE, UDOFORMAT_JSON, JSON.OUT) = UDO_SUCCESS THEN CRT JSON.OUT END Figure 7 INTL-SPECTRUM.COM u January/February 2020 u 10 BUSINESS TECH

BuildingBuilding MultiValueMultiValue ProgrammersProgrammers Part III

BY CHARLES BAROUCH

inding people who have no save the day. Analysis is about doing exposure to programming is We need to ask: What the homework, not about doing the becoming much less com- is the thing being heroics. mon.F That doesn’t mean they are well accomplished? If the goal is slaying the dragon, we grounded in what they do know. As may need to fire up the forge and with databases, I’m going to start very make a better sword. If the goal is for simplistically, not because people are to evoke a feeling. So, I guess Ren the dragon to stop eating the sheep, starting from zero, but because far too Faires are terrible? we might have a vast array of solutions many people are starting from way No. They would be if exacting histori- available that don’t involve violence. down in the negatives. cal precision were the goal. Likewise, Ask Again, I Dare You The school of “but it works” has been before we judge a business situation producing vast herds of terrible cod- where MIS is required to solve the One of the first questions I teach ers in every language. So, I don’t teach problem, we need context. We need people to ask is: What is the urgency? programming initially, I teach analysis. to ask: What is the thing being accom- An answer of “not very” is not a con- When people start from a position of plished? versation ender. Having a backlog of nice-to-do projects is worthwhile. Ad- “my job is for the problem to stop be- I go to Ren Faires to have fun. I go to ditionally, the part that Mary the A/R ing a problem” instead of “my job is soak up a different sort of experience Clerk is asking about might be a lower to personally code our way out of this and be with people who have all agreed priority while still being the tip of a hellscape-nightmare that every prob- to suspend disbelieve to some degree. I bigger iceberg. Her not-a-rush might lem is” we get better employees. don’t fly into a rage when I find out the also be Joe in A/P’s top issue. The per- bathrooms available to us commoners Is It Right? son reporting it may not be the best have indoor plumbing. The fact that Go to a Ren Faire and look around. arbiter of the need. I’m allowed to drive there instead of Colorful costumes, amusing perform- hiking or going by drawn cart… also So, why ask it if we can’t trust the an- ers, sure. But is it accurate? No, not re- not offensive. swer? Several reasons. First off, it con- ally. It isn’t an accurate representation veys respect in their expertise. Second- of a time period. It is a facade designed So my first advocation to a new em- ly, they are often correct. Perhaps more ployee is to understand the problem importantly, it is an equalizing ques- and the context before leaping in to INTL-SPECTRUM.COM u January/February 2020 u 11 cards and realizes that each teacher started with assumptions based on IT audits have you jumping through hoops? how the teacher before them had seen the student… the notes in the file. The PRC can help you meet your compliance requirements and make IT more agile and productive. No extra question became: Am I in an Honors work, nothing to remember, nothing to fall through Program because I impressed my Kin- the cracks. Our software development lifecycle tool automatically prevents or detects change dergarten teacher with the symmetry according to your criteria. You can deploy, of my mud pies? rollback, test and report quickly, automatically and with confidence. Let PRC protect your company’s The brilliant employee sitting before valuable U2 data and software assets. you can give you inaccurate details. SJ+ Systems Associates • [email protected] • http://sjplus.com The put-upon drudge in the back of- fice might have their finger on the pulse of this particular crisis. Don’t tion. If Mary demands I do something, ing emotionally invested in the current judge people on who they were when she needs to take responsibility for it path. It is their idea, their contribu- they were six. bumping other things. If Mary assigns tion. Respect that. it a lesser position on the queue, she Teaching That Remember When You Were Six? cooperates with us in de-drama-ing the Respect and empathy are the real les- problem in question. You’ll notice that I have barely said son. People at ease are more likely to anything technical at all so far. Analy- give you more complete information. I don’t discount someone saying the sis has very little to do with technol- They are more likely to go along with priority is high but I often disbelieve a ogy. Computers, all of tech, is just one your systemic, step-by-step approach. claim of low priority. possible route to a solution. Analysis is And nothing puts people more at ease Is This trip Really Necessary? about people and their expectations. than being treated decently. Are some Being an analyst is a human-to-human The next good question is something people immune? Are some people just skill, not a coding skill. along the lines of: What if we just stop terrible? Yep. But I tend to attract doing the entire thing where the prob- Some people are stuck in a loop. They better people and better nature from lem shows up? have a limited approach and they en- not-better people with this approach. act it over and over, even when it stops I teach decency both because it is mor- I’d rather show them a different report working. Even when it never really ally right and because it is pragmati- which has what they need rather than worked. Our job as analysts is to help cally better. refactor the report they are using to them get at least an inch past their work a little less worse. I’d rather find Negative Review: Zero Stars pattern so that better solutions can be them a better way. People who know me know that I found. don’t think programming should be a I can’t understate how often the prob- Likewise, it is easy for us to get stuck job. Not what you expected to hear in lem I’m asked to solve is a symptom in other people’s opinions. If every- a business article in a tech publication, of a solution someone else thought up. one says Joe is a whiner, dismissing but there it is. I believe that coding — If you can get to the root issue, often Joe’s complaints becomes easy. Now, coding brilliantly — should be part of you can do less work and create more Joe might be. Or, based on how he is the analysts job. Separating problem, success. treated, he whines but would respond and interpersonal analysis, from cod- To be clear: This is a problem caused differently to a smidgen of respect. ing is a bad path. by people trying to do the right thing. If we don’t want people to endlessly re- is a bad path. Banging on keys to cre- They didn’t just dump their problem enact their past behavior, we need to ate more lines to maintain is not the on us, they tried to work out a solu- see them as more than that behavior. best plan. I won’t debate if it was ever tion. Most of these stage-two issues There was a sitcom where one of the a good idea in the past, but today, no. come from the homebrew solution kids is going back through their report Just, no. We have low-code solutions. failing, combined with the person be- INTL-SPECTRUM.COM u January/February 2020 u 12 We have no-code solutions. We have We need to acknowledge that and act non-tech solutions. Can technology, on it. coding specifically, be the right an- I certainly haven’t presented you with swer? Frequently. Should it be done by a masterclass on analysis here. I’ve people who didn’t go to the meeting touched on a few things that should and are isolated from the people who be part of any new programmer train- will have to live with their solutions? ing. Next issue, we’ll start the coding I’ll give that a firm no. part. Please don’t skip over this article And yes, programming is a muscle. in your rush to get them to the next We should generate metric tons of one. There are already enough bad code early in our career to develop that programmers in the world. is muscle. We should periodically do it throughout our career to maintain and CHARLES BAROUCH build that muscle. That doesn’t mean is the CTO of HDWP, that code should all end up in produc- Inc. and the Publisher tion. at HDWPbooks. You Nathan has raised this flag periodical- can read his writing in ly: If you only code at work and to-task International Spectrum, Theme-Thology, you aren’t really improving yourself. Novo Pulp, Pax Solaria, PerehelionSF, and Musicians don’t only play at the con- cert. They do the work at home. They the Interrogative series, which begins with try things out alone or with their team. Tiago and the Masterless.

INTERNATIONAL SPECTR UM MultiValue Conference and Partner Exchange

CHANGE. ADAPT. EVOLVE.

39TH Annual Conference APRIL 20 – 23, 2020 | SADDLEBROOK RESORT, TAMPA, FL

INTL-SPECTRUM.COM u January/February 2020 u 13 From the Press Room

mance. Kourier is now up to twice as fast when extract- ing data from UniData/Uni- Verse files. This release also improves the overall perfor- mance, execution and trans- Carnation parency of Kourier generated New MultiValue New DateTime Software Release SSIS packages with the new Mobile App For Functions MacWise Version Package Execution Manager and SSIS Package Queue Food Trucks Coming Soon to 20 dashboard. Alcomtec ERIL, a MultiValue UniVerse 11.3.2 MacWise version 20 has These and other improve- Partner in Peru, released been released with new ver- ments support Kourier’s con- Datetime is a very important Fudtraker, an app for general data type for business appli- sion number for 2020. Minor tinuing mission of being the public use that can be down- upgrades to version 20 will fastest and most complete cations including law enforce- loaded from Google Play, ment, fire and EMS agencies. be released throughout dur- ETL and EAI solution for Mul- helps customers: ing the year. tiValue and Microsoft SQL For example, when an urgent Server-based systems. • Locate their favorite food event happens across dif- MacWise version 20 is a 64- trucks ferent time zones, the vital bit app and is compatible with Key Enhancements • Get directions to the food and high-quality information Catalina, Mojave, High Sierra Data Export Performance: truck via Google Maps Computer-Aided Dispatch and Sierra. Kourier’s export engine has • View the menu software requires includes been optimized to extract Datetime and time zone sup- MacWise version 19 was the • Call the food truck first version that was a 64-bit delimited data from UniData/ port, making it possible to • Follow their favorite food app, released in 2019. UniVerse files up to twice as store consistent information fast as previous versions. The trucks on social media about the time of events and MacWise version 18 is a 32- actual performance increase including Instagram and transactions. bit app and is compatible with will vary depending on the Facebook Mojave, High Sierra, Sierra, El It’s for these reasons that one installed versions of the da- • Place orders online Capitan, Yosemite, Mavericks, of our partners requested tabase and operating system. (coming soon!) Mountain Lion, Lion, Snow some new features to make it Fudtraker was built using the Leopard and Leopard.  Package Execution Manager: more convenient to use Date- Rocket UniData, U2 RESTful Provides a stable and fault tol- time in UniVerse application services, Angular and Flutter. erant environment in which to development on Linux and The Fudtrak app, hosted in run SSIS Packages. Ensures Solaris. that all packages are run in Amazon Lightsail, starts with Internally, datetime objects a timely manner while mini- the minimum configuration are stored as a single 64-bit mizing overloading of system available and will scale from integer representing the num- resources within the available there as the app evolves and ber of milliseconds since the Kourier constraints of the server. grows. Unix epoch: midnight UTC of To read more about it: Integrator SSIS Package Queue: Dash- January 1, 1970. All the da- Release 4.7 Now board to view the operational https://blog.rocketsoftware. tetime before the Unix epoch status of packages by server com/multivalue/2020/01/ are represented as negative Available and account. A drill-down into new-multivalue-mobile-app- numbers. each status category displays for-food-trucks/  Kore Technologies is pleased In Universe, we’ve done three individual package perfor- to announce Kourier Integra- things to support the UTC da- mance metrics and the ability tor Release 4.7. tetime. to view the SSIS package out- The primary focus for this put results to diagnose pack- 1. New variable @TZ (time zone release is increased perfor- age run-time errors.  support).

INTL-SPECTRUM.COM u January/February 2020 u 14 From the Press Room

2. A set of new BASIC functions the company’s community- verse array of requirements. member of the Zumasys de- in relation to datetime. related efforts with MV Basic He also has experience with velopment team, Mike Wright 3. New conversion code for and www.pickmultivalue.com. Zumasys’ databases jBASE has been promoted into a Datetime(ICONV/OCONV). Prior to joining Zumasys, Mike and OpenQM. Now the Man- new role as Director of Tech- Found out more at: Wright was the VP of Informa- ager of Technical Support at nology. Mike’s ability to help tion Technology for Equiant Zumasys, Robert will play a customers migrate to new https://blog.rocketsoftware. Financial Services, a D3 end critical role in developing and databases like OpenQM and com/multivalue/2019/11/ user in Arizona. supporting the unified sup- jBASE and implement web- new-datetime-variable-coming- port program for the com- based interfaces while main- soon-to-universe-11-3-2/  Introducing Robert Burke, Manager of pany’s growing portfolio of taining their valuable busi- Technical Support offerings which include Ac- ness logic has been essential Robert began his career at cuTerm, jBASE, MVConnect, to Zumasys’ success and re- Pick Systems (subsequently MVDashboard, and OpenQM. cent growth. TigerLogic), where he was first Having gone through mul- In his new role, Mike will be recruited to work with some tiple mergers and acquisi- responsible for technology of the company’s largest cus- tions during his career, Burke design and product vision tomers. After making his way is adept at integrating diverse and will serve as a key escala- Zumasys Hires into QA, he quickly became teams and processes. Burke tion resource for all technical Robert Burke Director of Technical Support explains, “Each acquisition departments. As Director of at TigerLogic overseeing the comes with new developers, Technology, Mike will contin- and Promotes D3 database. When the PICK QA teams, and support pro- ue to lead technical teams to Mike Wright segment of TigerLogic’s busi- grams—all things that need to drive innovation for Zumasys ness was acquired by Rocket be standardized across the while developing and sup- to Director of Software, Robert was made support organization. As Zu- porting the company’s evolv- Technology Worldwide Director of Techni- masys continues to grow, I’m ing portfolio of solutions.  cal Support and QA over all looking forward to building a Zumasys announced that MultiValue databases includ- world-class support program Robert Burke, former World- ing D3, mvBase, Universe that can scale with the busi- wide Director of Technical and Unidata. ness.” Support for Rocket Software, has joined the company as Having led support teams for Announcing Mike Manager of Technical Sup- over 20 years, Robert has a Wright, Director of port. Robert brings more than depth of experience provid- Technology 20 years of MultiValue ex- ing timely, professional sup- Less than one year after perience in support, Quality port for customers with a di- coming on board as a senior Assurance (QA), migrations, and professional services. He will be based in Zumasys’ San Clemente offices. Zumasys also announced the e-xtra Newsletter promotion of Mike Wright to Stay on top of Industry News Director of Technology. Since early 2019, Mike has been instrumental in his role as Se- Š Tech Tips nior Software Developer with Š Job Postings Zumasys, collaborating with Š New Products clients on modernizing their systems and leading some of Š Corporate Updates

www.intl-spectrum.com/newsletter

INTL-SPECTRUM.COM u January/February 2020 u 15 M a r k e t p l a c e

ACCOUNTING LETTERS TO THE EDITOR Natec Systems www.natecsystems.com | [email protected] Have an opinion on an article: Agree, disagree, COMPLIANCE or enhancement to an article from a previous issue? International Spectrum and our authors are SJ+ Systems Associates www.sjplus.com | [email protected] interested in hearing from you! E-mail: [email protected] CONSULTING WANT TO SEE A SPECIFIC TOPIC? Drexel Management Service www.drexelmgt.com | [email protected] International Spectrum is looking for writers, Execu-Sys, LTD feedback, and topic ideas. We all have specific www.eslny.com | [email protected] topicsONLINE and BANNERissues that ADS: we need answers to find solutions for. Send us an E-mail with topics you HDWP VERTICAL BANNER (120X240) www.HDWP.com | [email protected] would like to have covered in the magazine or on Modern MultiValue, LLC the $2,880.00website. per year or $300.00 per month www.ModernMultiValue.com | [email protected] E-mail:RECTANGLE [email protected] (180X150) PICK Programmers Shop www.pickprogram.com | [email protected] $2,592.00 per year or $270.00 per month Precision Solutions WANT TO WRITE? www.precisonline.com | [email protected] ExpandSQUARE your BUTTON professional (125X125) credentials, and provide us with an article. DATABASE $1,680.00 per year or $175.00 per month Give us a rough and ugly outline, and we will help Zumasys www.zumasys.com/products/accuterm/ youE-MAIL refine NEWSLETTER it, proof it, and BANNER:make it press ready. Or you can give us something polished, proofed, and FILE MANAGEMENT pressHALF ready BANNER to publish. (300X90) Paradigm Systems, Inc. $4,200.00 per year or $175.00 per issue www.paradigm-systems.us | [email protected] Share your thoughts and expertise with over 10,000ONLINE fellow MARKETPLACE MultiValue developers LIST: and users. REPORTING E-mail: [email protected] BASIC LISTING – FREE Brian Leach Consulting, LTD www.brianleach.co.uk | [email protected] Q Company PageNEED A MENTOR? MentorsQ Product give Page developers – Limit 1 the ability to ask industry TERMINAL EMULATOR expertsQ ADs willfor be displayeddirection, on yourcode page examples, and/or Zumasys just ask them to see if something makes sense. www.zumasys.com/products/accuterm/ Sometimes,PROFESSIONAL all you need LISTING is a resource or example to start $350.00 or complete per year/ $35.00 a project. per month CheckQ Company with us Page to see who is available for mentoring, andQ Producthow you Pages can - Unlimited take advantage of it to save your businessQ No ADs or displayed company on your money. page E-mail:Q Download [email protected] Links

WANT TO BE A MENTOR? We have many retired or semi-retired professionals out there that would love to share their knowledge of MultiValue development. If you are one of them, please contact us to see what mentoring is all about. WEB DEVELOPMENT AND TOOLS E-mail: [email protected] Aptron Corporation www.aptron.com | [email protected]

For more information contact Nathan at: [email protected]

INTL-SPECTRUM.COM u January/February 2020 u 16 BY KEVIN KING Finding MV Outside of MV

n the wide, wonderful, and some- there besides us now. Common sense times wacky world of MultiValue ... is there anything in would dictate looking that way first. (MV), we tend to see things as the wild now that has the Certainly, the of the world Ieither MV or not MV. However, our benefits of MultiValue... would not do the kinds of things that perception does not dictate reality. The we’re doing for, because hey, they’re wheels of database technology contin- not MultiValue… right? Considering ue to turn and things change in unex- encode the full Unicode character the various products that have built a pected ways. set if needed, it’s easy to work with, MultiValue system running on SQL As a result, I propose a question that lightweight to transport, and well sup- databases, maybe there is an SQL op- some might view as ridiculous at best, ported throughout the entire world tion that fits some or all of our wishlist. heresy at worst. Ready for the ques- of technology. And hey, it already can support MultiValue-type data. Stuck in the Codd Model or Low tion? Buckle up — here goes: Might ACID your next MultiValue database be … Unrelated to the merits or demerits When you compare most SQL imple- SQL? of that idea, this became a flashpoint mentations to MV, the differences are Before you answer that — or send a for others to share their ideas with me. stark. Most SQL solutions, for all their hitman — let’s establish some context. What followed was a series of online billions of dollars of development, still and offline discussions about the po- insist that data is remarkably flat. Dr. SQL is Flat, MV has three tential benefits of adding more schema dimensions Codd still rules the roost with these support to MV, collection nesting, platforms as they remain steadfastly Since being named the winner of the storage and retrieval optimization, and committed to first — and second and Zumasys idea contest, I’ve come un- a whole host of other great and crazy third — normal form table structures. der a bit of fire for proposing that MV ideas. The idea of what MultiValue needs to be modified to extend beyond On the other end of the spectrum, could be was evolving beyond adding three dimensions. I had suggested that many NoSQL products also vary sig- dimensions. there could be significant benefits to nificantly from MultiValue. For exam- embracing encodings like JSON which This then started me thinking… is ple, MongoDB and CassandraDB are supports multidimensional structures there anything in the wild now that both great for scalability, redundancy, to a practically unlimited depth. In has the benefits of MultiValue plus and distributed data, but they veer far- addition to the dimensional support, some of these other things, like strong ther away from the ACID compliance, JSON supports internationalization schema support or nested collections? structure and query-ability that both using UTF-8 out of the box and can There’s several NoSQL options out SQL and MultiValue provide.

INTL-SPECTRUM.COM u January/February 2020 u 17 of SQL, could house complex multi- is kept together according to the data Is Your Membership dimensional and unstructured data, type as you’ve defined it. plus a healthy dose of open connectiv- Profile Up to Date? Say, for instance, that you want to store ity. Both structured and unstructured, the two lines of an address, plus the living in perfect harmony. Now THAT International Spectrum city, state, and zip together. This could would be a trick. is currently working on be done by creating a new data type for updating membership Yet, that is exactly what PostgreSQL the address. Let’s call it “t_address”: information for all our intends to do. PostgreSQL is a SQL readers. We always like database with some MV-like leanings. CREATE TYPE t_address AS ( to have the most current addr1 text, information so that we It’s not exactly SQL and it’s not exactly addr2 text, MultiValue, but it’s an interesting hy- city text, can keep you informed state text, of current news in the brid that does a lot of things we admire zip text MultiValue Market. in both camps, and most of it is done ); very well. Now, there are readers that Once this has been created, it can then will wince just a little bit every time be used when creating a table. By add- they read the word SQL, so for our ing one column of this type to the Please go online and update purposes today, let’s just call it Postgres. table, you’re really adding 5 different your membership profile subfields into that one column. You today! Old and Reliable can then address each of the subfields One of the strong arguments for Mul- directly when inserting or retrieving intl-spectrum.com/membership tiValue is that it has been around the data from the record. block and proven itself over and over The second, and (I think) more inter- again. Postgres isn’t a newcomer either. Having said that, both SQL and esting feature of Postgres as it pertains NoSQL options have MultiValue beat Postgres is an +30-year veteran of open to MV developers is the array data hands-down when it comes to out-of- source development that can be in- modifier. In short, any field anywhere the-box connectivity. There are drivers stalled easily using the package manag- can be stored as an array — i.e. multi- available to connect just about every- er of your favorite Linux distribution. ple values — all in the same field. This thing to just about any database that It can be downloaded from . is where Postgres thumbs its nose at isn’t MultiValue. org and installed on Windows desktops Dr. Codd’s rules of normal form, em- and servers as well. It has a command bracing the wide world of MultiValue. In my opinion, that right there is a huge line, like most SQL and MV databases, Using our t_address example earlier, problem for MV. SQL databases also and in the spirit of SQL, all updates one could create a table with a simple have very complex and tunable query and queries are done using SQL data address like this: planners to allow database design- manipulation language (DML). ers the flexibility to optimize retrieval There are two intriguing features of CREATE TABLE customer ( strategies. While we have options in name text, MV for improving queries, sometimes Postgres that may be of interest to the address t_address ); a solution calls for more than just an- MV world. First up is the ability to cre- other index. There are plenty of ways ate compound data types using exist- To convert this into a multi-valued list to deal with this, but they involve roll- ing data types. This allows you to cre- of addresses, one simply needs to add ing up our sleeves more often than not. ate new data types to represent a row “[]” to the end of the t_address data that might be stored in MV as a multi- type, like this: Post Fix? valued or sub-valued field. However, instead of being separated over multi- CREATE TABLE customer ( If only there existed a database that al- name text, lowed both the flexibility of NoSQL ple attributes, all the data for that row address t_address[] with the structure and index support );

INTL-SPECTRUM.COM u January/February 2020 u 18 Independently, these two features are larly interesting features to those of us one way to bridge the gap. JBASE and quite powerful. Used together, how- with long careers in any flavor or fla- MVON# cross-compile mvBASIC to ever, they vault Postgres into the realm vors of MultiValue. other languages. Someone could make of being a database for everybody — a cross-compiler to convert mvBASIC I am by no means a Postgres cheer- whether flat or dimensional. to python or another supported lan- leader. I want you to see the good and guage, allowing us to port mvBASIC All this is fine for data that require the bad. With that in mind, let’s take programs with little or no changes. structure, but what if you need some a peek at the dark underbelly of Post- additional thing that is more free- gres, at least in terms our MultiValue To be clear, SQL procedural languages form? In that case, Postgres has two perspective. aren’t like mvBASIC in that you don’t data types that allow JSON storage, write the entire application in SQL First, because Postgres is fundamental- right in the row as a first-class column. languages. The business logic typi- ly SQL-based, it uses data manipula- The “json” data type stores raw JSON cally exists in some separate repository, tion language constructs like INSERT that must be parsed to be used, where- whether that be written in C#, PHP, and UPDATE to do updates. This may as the “jsonb” data type stores a binary, Go, Dart, JavaScript, or any number be great for flat tables but it is really pre-parsed representation of the struc- of other languages in the wild. But in pretty awful for doing multi-valued ture that can not only be queried like recent years, more work is being done nested inserts and updates from the regular fields, values deep inside of the outside of the MV environment as command line. JSON can be indexed and leveraged in more of the front end moves to the web query planning and execution. Removing a specific value from a and apps. And since python is on both multi-valued array is not a standard lists, procedural and application... There is much more to Postgres than feature of the DML, but it can be ac- just this, but I find these to be particu- The important takeaway from all this complished with a PLSQL procedure. is simply to acknowledge that Multi- Interestingly, you can rewrite an entire Value isn’t as far outside of the main- “attribute” with nested structures in- stream as we might otherwise think. tact, not unlike what we might do with Feedback Both NoSQL and PostgreSQL support a WRITEV on a MV record. Howev- features that are important to us, while What came first, er, updating specific data elements in not sacrificing the fundamentals that the letters or the nested structures requires some pretty have made them successful. When it letters-to-the-editor tricky SQL chicanery. department? comes to multi-valued data, the main- Speaking of PLSQL, Postgres has its stream has now come to us. International Spectrum own procedural language. Or to be More importantly, the more MultiVal- Magazine has a Feedback more exact, there are four supported Department, sometimes ue people that get involved with prod- procedural languages (including Py- known as Letters to the ucts like this, the more likely it is that thon) plus an entire framework for Editor. we can take the awesomeness that we adding in additional languages for We want to hear your know as MV and use it to influence the writing stored procedures. Of course, comments, your reactions, world. . is your agreement or none of these are mvBASIC, but it would be an interesting study to see disagreement with what you KEVIN KING is the see. Also, do not hesitate if the procedure language framework President and Chief to let us know about things could be used to bridge that gap. An- happening in the MultiValue other time, perhaps? Technologist with Community we may not Precision Solutions, have heard about yet. Spectrum has already published code [http://www.intl-spectrum.com/ Inc., a leader in tech- Please send your comments by e-mail to: article/r992/] to bring parts of the nology solutions, sup- [email protected] OCONV to python. That would be port, and training.

INTL-SPECTRUM.COM u January/February 2020 u 19