Danny, 
 

Thanks, It's amazing, to see such articles. 

But how about coding style. If to be honest, your code looks like a mess of old-school code and modern.

As this articles mostly for beginners, it would be much better to have also modern style. Instead of OPEN/USE/READ use %Stream classes. I see this way as much readable.

And about how you use standalone ELSE command without brackets, not sure that beginners, can quickly get the trick here.

Open file:"R":1 Else  Use 0 Write "Could not open file ",file Quit

You can remove saved password from windows registry

  • run regedit.
  • open path HKEY_CURRENT_USER\Software\InterSystems\Cache\Servers\
  • choose server
  • remove Server Password

I would recommend instead of mark such object as deleted, with such flag like this. Just "move" it to another table some kind of Trash, when you can store this object as a serialized string for example. In this case object will really disappear from his table and will not be availble with via SQL or any other accesses. But in this Trash, you can have information about deletion data, who deleted and information to restore it.

Dmitry Maslennikov · Oct 27, 2017 go to post

To have a possibility to edit files, you have to create a project, and copy existed classes to this project.

You can look at this youtube playlist, to get more information about working with Atelier.

Dmitry Maslennikov · Oct 18, 2017 go to post

Why you have two different ways to create objects?

If you have class, you should use object or SQL way to create or change objects.

If you add it manually through direct access to global, you should also create all indexes, this way.

Instead of %BuildIndices, you can try to use method %FileIndices, with Object's id as a first argument.

Dmitry Maslennikov · Oct 16, 2017 go to post

It depends on, how long this string should be, and what do you expect to see there.

The simplest way is just generating it with $random.

set string=""
set length=100
for i=1:1:length set string=string_$char($random(26)+97)
Dmitry Maslennikov · Oct 15, 2017 go to post

Unfortunately, downloading distributions from WRC is not so easy. For example, you can look at my article Containerization Caché, where I gave an example how to download and install Caché automatically.

Before, we need some variables

product=cache
version=2017.2.0.744.0
arch=lnxrhx64

Download distribution

# WRC Authorization
WRC_USERNAME="user@somecompany.com"
WRC_PASSWORD="password"

wget -qO /dev/null --keep-session-cookies --save-cookies /dev/stdout --post-data="UserName=$WRC_USERNAME&Password=$WRC_PASSWORD" 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp' \
 | wget -O - --load-cookies /dev/stdin "https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/$product-$version-$arch.tar.gz" \
 | tar xvfzC - .

before an upgrade, you should define at least one variable as defined in documentation by your link.

ISC_PACKAGE_INSTANCENAME=$product

for install new instance, you should define more variables

ISC_PACKAGE_INSTALLDIR="/usr/cachesys/"
ISC_PACKAGE_UNICODE="Y"

so, finally, the script will be

#!/bin/bash

product=cache
version=2017.2.0.744.0
arch=lnxrhx64

# WRC Authorization
WRC_USERNAME="user@somecompany.com"
WRC_PASSWORD="password"

wget -qO /dev/null --keep-session-cookies --save-cookies /dev/stdout --post-data="UserName=$WRC_USERNAME&Password=$WRC_PASSWORD" 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp' \
 | wget -O - --load-cookies /dev/stdin "https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/$product-$version-$arch.tar.gz" \
 | tar xvfzC - .


ISC_PACKAGE_INSTANCENAME=$product

/tmp/dsitrib/$product-$version-$arch/cinstall_silent

But it is just a simple example and not covers everything. But can be easily extended by your needs.

Dmitry Maslennikov · Oct 15, 2017 go to post

Almost the same as you do on Windows, or as clean install. Just call

./cinstall

And installer will offer to choose instance name, and if you put the same will offer to upgrade it.

Dmitry Maslennikov · Sep 28, 2017 go to post

{value1,value2, value3} - is incorrect in JSON

In JSON we have objects and arrays, every element in an object has name and value, while an array is a just list of values.

So, object in this format.

{
  "name": "value",
  "name2": "value2"
}

And array 

[ "value1", "value2" ]

And anyway not sure what you want to do.

Look at this article in the documentation about working with JSON in Caché.

set arr = ["value1", "value2", "value3"]
set iter = arr.%GetIterator()
write !,"<switch> my value"
while iter.%GetNext(.key, .value) {
  w !,"<case>",value,"</case>"
}
w !,"</switch>"
Dmitry Maslennikov · Sep 27, 2017 go to post

Abstract class can have Storage definition, which will be the same for properties defined in abstract class for all children.

Class marked with NoExtent flag does not have own storage definition and all children should have complete storage definition. And data in all those children will be stored separately.

Dmitry Maslennikov · Sep 26, 2017 go to post

Could you add you pwershell script?

And if you have some custom script on Caché side, it would be better to look at it as well?

Dmitry Maslennikov · Sep 25, 2017 go to post

Looks like, pictures are available. But they have multiple pictures for different devices. And choosing this correct picture not working properly.

Dmitry Maslennikov · Sep 22, 2017 go to post

Yeah, it is very interesting. I tried to login with my another account. And I can see the same as show you. But with this account, I see only one editor. So, sure, it should be changed.

Dmitry Maslennikov · Sep 22, 2017 go to post

When I open question, I see answer edition form. When I open simple post, I see editing comment form.

So, 3 and 5 looks like we already have.

Dmitry Maslennikov · Sep 21, 2017 go to post

Have you looked at CacheQuality, and demo available online?

Currently, it is mostly working with classes, parsing for routines added in the latest release. But I'm looking to add better support for routines as well.

Dmitry Maslennikov · Sep 18, 2017 go to post

You can retrieve list of certificates in a way like this

ClassMethod SSLConfigs() As %String
{
  new $namespace
  set $namespace = "%SYS"
  
  set rs=##class(Security.SSLConfigs).ListNamesFunc()
  set result = ""
  while rs.%Next() {
    set result = result_$lb(rs.Name)
  }
  quit result
}

And result will be in $lb

USER>w $lts(##class(User.Test).SSLConfigs())
Amazon,Google,ISC.FeatureTracker.SSL.Config
Dmitry Maslennikov · Sep 18, 2017 go to post

This error may be thrown by some different reasons while you call %Save for an object.

In my case at this place "%Save+5" I have a call to method %BuildObjectGraph, which is internal in %RegisteredObject class. Described as "Build the list of reachable objects and their dependencies".  This method calls recursively, so, maybe some troubles with dependencies.

Dmitry Maslennikov · Sep 13, 2017 go to post

Not, we don't have $listprevious. And I can say why.

$listbuild format quite simple where each element of $listbuild is solid. It has header and data, where in the header we have the length of data. So, to get next element, we just have to read header and ptr used to set position where header begins. 

But when you want to read the previous element, you can't know how long this previous value, and you can't find this right place, you still have to read from the beginning.

So, only one way to do it:

for i=$listlength(myList):-1:1 
Dmitry Maslennikov · Sep 13, 2017 go to post

Could you try to test it with latest version 2017.1 or FieldTest 2017.2?

I would also recommend trying to replace OpenSSL with the latest version in the bin folder. Not sure in this way, but may be it can help.

I don't know how FHIR endpoint looks like in HealthShare, but looks like it this is wrong

/csp/healthshare/fhiraccess/fhiraccess/

I gues it should be

/csp/healthshare/fhiraccess/

JSON, end else seems OK.

Sure, not.

When you read particular patient, your URL is something like (where 1234 is ID of this patient):

/fhir/Patient/1234

But to create new patient, you should use

/fhir/Patient

and method POST 

Full URL, with ID, need when you want to update particular patient, and use method PUT.

This is how it should be by standard FHIR.  But I have not worked with FHIR in HealtShare, and maybe there is some differences.