#Caché

30 Followers · 4.6K Posts

  

InterSystems Caché is a multi-model DBMS and application server. See more details here.

Documentation.

Question Gunwant Kapade · Mar 5, 2019

After compilation of routine .int file is not generated and toggle breakpoint is also not visible for that routine. It is showing error #5001 Editing of INT file is not allowed. How can I resolve this ?

2
0 414
Question Neerav Verma · Mar 5, 2019

Just wondering an Insight in the difference between these two indexes

IdKey / PrimaryKey
================= 

Property Identifier As %Integer

Index Index1 on Identifier [Idkey]

Index Index2 on Identifier [PrimaryKey]

What's the difference?

1. If I don't have Index1 and only have Index2,  then cache does still make its own id.
So how and why  do I ever use the PrimaryKey.  In Joins ??

Table1.Identifier = Table2.Identifier instead of Table1.Id = Table2.id ??
But I can still use Table1.Id = Table2.Id as cache still made one ID field

So where is PrimaryKey useful in cache?

4
0 1292
Question Neerav Verma · Mar 2, 2019

Hi

Just curious to know about the pros and cons of Parent/Child Vs One/Many.

We do use a bit of both. 
One big reason we use Parent child is we feel if we delete one global, it gets rid of all child data too and all parent child data is stored in one global. Much easier to manage.

4
0 982
Article Stuart Byrne · Mar 2, 2019 6m read

I know it's late, but I really love the advent of code theme each year to find some project ideas to go out and code something and push myself.

I had the intentions of completing the AOC 2018 before the new year, but I've got 2 young kids (1yo and 4yo), so most nights I just want to sleep.

I've been looking at this on my half hourly commute each day before and after work.

So whilst doing this, I found not many people had posted what they had done and in previous years.

2
0 298
Question Eduard Lebedyuk · Mar 2, 2019

I have one abstract class and several subclasses. All share one data/id global.

How can I get concrete class name from id (without opening the object)?

What I have so far:

write $p($lg(^DATAGLOBAL(<id>),1),"~",*-1)

It does the job, but is there a more official way?

3
0 353
Question Eduard Lebedyuk · Feb 28, 2019

Here's a simple indirection snippet. It fails with <UNDEFINED> error and I'm not sure why.

ClassMethod ind()
{
  kill info

  set active = 1
  set reactive = 2

  for i="active","reactive" {
    set info(i)= @i
  }

  zw info

  break
}

I'm getting this exception: <UNDEFINED>zind+5^test.Client.1 *active

6
0 634
Article Eduard Lebedyuk · Mar 7, 2018 7m read

In this series of articles, I'd like to present and discuss several possible approaches toward software development with InterSystems technologies and GitLab. I will cover such topics as:

  • Git 101
  • Git flow (development process)
  • GitLab installation
  • GitLab Workflow
  • Continuous Delivery
  • GitLab installation and configuration
  • GitLab CI/CD

In the previous article, we covered Git basics, why a high-level understanding of Git concepts is important for modern software development, and how Git can be used to develop software. Still, our focus was on the implementation part of software development, but this part presents:

  • GitLab Workflow - a complete software life cycle process - from idea to user feedback
  • Continuous Delivery - software engineering approach in which teams produce software in short cycles, ensuring that the software can be reliably released at any time. It aims at building, testing, and releasing software faster and more frequently.
1
4 3538
Question Eduard Lebedyuk · Feb 28, 2019

I'm connecting to a remote device using TCP. It has a binary protocol.

set host = ""
set port = ""
set io = $io
set device = "|TCP|7000"

set timeout = 2
open device:(host:port:"M")
use device:(/IOT="RAW")
read string:timeout

use io
zzdump string

The problem is when reading from it, I get a 0A (also known as 10 or \n or linefeed) byte, which terminates the read.

Expected output:

0000: 42 00 7B 0A 11

But I get this output:

0000: 42 00 7B

How can I fix that?

Some additional info:

  • read completes in 0.1 seconds despite 2 seconds timeout.
  • $zb contains the value of 0D
1
0 339
Question William Beetge · Feb 28, 2019

I have an existing table, and I've added an array property to it that I need to populate.
The issue is that I can only use SQL to insert into the table due to access reasons.

For example:

Class Package.Tables.Person Extends %Persistent
{
Property Name As %String(MAXLEN = "");

Property Address As Array of Package.Datatypes.Address;
}

Class Package.Datatypes.Address Extends %SerialObject
{
    Property AddressType As %Integer;
    Property StreetAddress As %String(MAXLKEN = "");
}
                
So the projected tables are:

Package_Tables.Person
Package_Tables.

1
0 576
Question Daniel Lee · Feb 21, 2019

I am taking over a production system that had some HSLIB and other database routine and class files modified. However, I do not know what was modified .

I developed a routine that allows me to load each database in our production instance and compare it against a default instance using the SIZE attribute. This allowed me to generate a list of files where the .INT file size in production does not match the file size in the default instance. However, doing a spot check of the .cls or .mac files indicates that in some cases these files are identical, just the intermediate files are different.

9
0 1418
Question Javier Llobet · Feb 26, 2019

I try to create a column with computeonchange. 

Its works with CREATE TABLE sql command, but if i use ALTER TABLE ADD COLUMN sql command this computeonchange doesn't works.

any reason why?

example:

CREATE TABLE MyStudents (   Name VARCHAR(16) NOT NULL,   surname VARCHAR(16))

alter table MyStudents add column fullname Varchar(50) COMPUTECODE { SET {fullname}={Name}_ "?" _{surname}} COMPUTEONCHANGE (Name,surname)  

insert into SQLUser.MyStudents (Name, surname) values ('name1',null)

update MyStudents set name = 'name' where name = 'name1'

this not updates fullname column value.

1
0 291
Question Nael Nasereldeen · Jan 1, 2019

Hi,

When Creating a custom security role, what privileges do I need to add to it, in order for the users that I grant him the role, to be able to use 

dynamic SQL to perform read only queries on all tables in a namespace?

I have a security role, that contains the %Service_SQL privilege,

And yet when I connect to a terminal and try to run an SQL query using dynamic SQL , I get a "user is not privileged for the operation" error.

7
0 1714
Question Stella Ticker · Feb 21, 2019

I am reviewing some code where the % sign has been used liberally to name arrays that are worked on by different methods within the same class. Apparently it is not good practice to name variables with a "%" sign as the first character because this could overwrite other similarly named variables from other developers, including ISC!  Is there another way to make a variable public ? 

8
0 788
Question Arto Alatalo · Feb 21, 2019

I'm getting this compilation error:

Kompilieren der Klasse digi.packet
FEHLER #5002: Caché-Fehler: <FUNCTION>zLockUse+5^%ExtentMgr.GlobalRegistry.1
  > FEHLER #5030: Während der Kompilierung von Klasse 'digi.packet' ist ein Fehler aufgetreten

when importing one of my classes on the production server into one particular namespace:

  • the class compiles just fine on dev pc.
  • the class compiles just fine also in any other namespace of the same cache instance. So, looks as a problem of this particular namespace.
8
0 884
Question Daniel Lee · Feb 22, 2019

In my routine when I call set filestream.FileName = filename, I get an error

"cn_iptcp://localhost:56773/USER/%Stream.FileBinary.1.INT" does not exist on the Server

I successfully instantiate the %Stream.FileCharacter object. 'filestream' value is '1@%Stream.FileCharacter'. But when I debug the code, the step where I try to set the file name fails. 

The port number for local host looks good for my current instance. I have tried a few variations, such as using the method FileNameSet(). But this did not work either. 

My routine exists in the USER namespace, as indicated in the error.

10
0 788
Question Fred Gustafsson · Feb 3, 2017

Is it just me or is the sync mechanism way too slow and too trigger happy to be used for large projects? It keeps "Caching for server connection" which takes a good five minutes!  

Has it been tested with a large number of classes and CPSs? I have about 2000 of each.

2
0 598
Question Token Ibragimov · Feb 22, 2019

Hello,

I'm trying to convert JSON response to object in cache 2010.

My Code is bellow:

set sc = ##class(%ZEN.Auxiliary.jsonProvider).%ParseJSON(resptext,,.pObject,1)

my JSON response

{"access_token":"DSAFFDSGFDGTRHTRHTRH","in":"2522","refresh":"","scope":"send","token_type":"Bearer"}

the result :  "9@%ZEN.proxyObject" 

6
0 776
Question Eduard Lebedyuk · Feb 21, 2019

I have a date in this format: "YYYY-MM-DD HH:MM:SS+HHMM" how can I convert it to UTC?

write $zdth("2018-02-01 00:00:00+0600",3,5)
>64680,0
write $zdt("64680,0",3,5)
>2018-02-01T00:00:00+03:00

As you see, timezone is lost. Docs for $zdth in timeopt (5) state: Specify time in the form "hh:mm:ss+/-hh:mm" (24-hour clock). The time is specified as local time. The following optional suffix may be supplied, but is ignored: a plus (+) or minus (–) suffix followed by the offset of local time from Coordinated Universal Time (UTC)

2
0 2171
Question Eduard Lebedyuk · Feb 21, 2019

SetIdentityInsert call controls the ability of the user to specify a value for the IDENTITY property when saving a new object, a value for the IDENTITY column or an explicit ROWID value in an SQL INSERT. If IDENTITY_INSERT is false and the user specifies an explicit IDENTITY or ROWID value when saving a new object or inserting a new ROW then an error condition is reported.

Setting takes effect immediately and lasts for the duration of the process or until SetIdentityInsert is called again.

My question is how can I change this setting system-wide?

2
0 442
Article Gevorg Arutiunian · Feb 22, 2019 2m read

(Originally posted by @Sascha Kisser on March 11, 2014) The following 2 classes are a component for a webcam, and a ZEN page that incorporates it. The webcam can take a snapshot and save it to Caché:


Class skisser.webcamPage extends %ZEN.Component.page
{
Parameter APPLICATION;
Parameter PAGENAME;
 
Parameter DOMAIN;
 
XData Style
{
&lt;style type="text/css"&gt;
&lt;/style&gt;
}
 
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
&lt;page xmlns="http://www.intersystems.com/zen" title=""&gt;
&lt;button caption="startCam" onclick="zenPage.startCam()"/&gt;
&lt;button caption="Snapshot" onclick="zenPage.snapshot()"/&gt;
&lt;camComponent width="600px" height="800px" id="mycam"/&gt;
&lt;image id="image_source" src="" hidden="true"/&gt;
 
&lt;/page&gt;
}
 
ClientMethod snapshot() [ Language = javascript ]
{
    var snap = zenPage.getComponentById('image_source')
    zen('mycam').snapshot(snap);
    zen('mycam').SaveImageToDB(snap);
    snap.refreshContents();
}
 
ClientMethod startCam() [ Language = javascript ]
{
    zen('mycam').startWebcam();
}
0
1 308
Question Daniel Lee · Feb 18, 2019

I am new to Intersystems Cache, so please bear with me. We are using HealthShare 2013.1. 

I have a routine to compare databases from separate instances where I want to ignore values that begin with %sqlcq. I thought this would be easy with pattern matching operator '?' but it is proving difficult and it seems to be because of the percent character. 

For example:

set x = "%sqlcq.something.value.foo"

#;does not evaluate as true. 
if x?1P1"sqlcq" {write "valid"}

set y="sqlcq.something.value.bar"

if y?1"sqlcq".E {write "valid"}
valid
if x?1"sqlcq".E {write "valid"}

  
4
0 594
Question Christopher Schaefer · Feb 18, 2019

I am currently working with someone who is in the process of moving an application written in Cache Object Script over to a Windows server. It was previously running on a Linux server so all of the paths are unix style paths. Is anyone aware of a way to have cache remap paths to different paths so this user won't have to go through all of the scripts and change them?

In older versions of Cache 2007 for example you could setup a device where the name was "/somefolder/" and the physical path was "C:\somefolder\" and that worked.

2
0 2503
Question Adrian Bourner · Feb 14, 2019

Hi Community,

I have a need to access the Lock Table to find the Process ID of the process that has a particular global node Locked. The process holding the lock could be on any one of four application servers.

Having identified the Process ID, I then need to interrogate the local variables for that process, to find an application User ID.

I can then inform the current user which of their colleagues has a particular record locked, preventing them from continuing with their work...

Are these things I can do under Caché?

6
0 783
Question Thembelani Mlalazi · Dec 3, 2018

I have an application which is distributed across maybe 5 servers since it has over a thousand users at a time we had an upgrade to the application last week and I had an integration build that uses the REST service (  ##class(%Net.HttpResponse) but since the upgrade the integration has not be able to communicate with the application tried testing my URL through Postman and all seems ok but if I test direct  I get a 500 error anything that I need to check on please or any advice on how to check what's going on. I have used SoapUI with 200 result so as postman and swagger

2
0 641
Discussion Evgeny Shvarov · Feb 11, 2019

Hi guys!

Suppose you developed a tool, framework, library on InterSystems ObjectScript for InterSystems Data Platform, share it via Open Exchange and want people to install it. 

What is the best strategy if it is a library and supposed to be called from different namespaces?

Here are the following thoughts:

1. Tool's developer should be able to use globals to read/store data the tool needs.

2. Tool's consumer should be confident, that the thing he/she installs will not harm the application's data.

3. A tool should be callable from any application's namespace.

4. Tool's installation(in general) should not request manual security changes (e.g. grant the write access to IRISLIB) and %YourClass is not an option.

5. It's easy to uninstall the tool - just delete the namespace/database (maybe delete some web-apps too).

10
0 602