Article Robert Cemper · Apr 27, 2020 4m read Multidimensional Property Persistence - Part 1 (Classic) As you know in Caché / IRIS you have the possibility to define a property as Multidimensional as documented here: https://docs.intersystems.com/iris20201/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_proplit#GOBJ_proplit_multidimand the explanation of how to use ithttps://docs.intersystems.com/iris20201/csp/docbook/Doc.View.cls?KEY=GOBJ_proplit#GOBJ_proplit_multidim_valuesThough the access is quite comfortable (in traditional COS sense) there are 2 main restrictions that hurt:#1) It is not saved to disk unless your application includes code to save it specifically.#2) It cannot be stored in or exposed through SQL tables there are some moreI'll show how to overcome these limits #Other 14 1 2 538
Article Robert Cemper · Apr 26, 2020 5m read Materialized Views A VIEW in SQL is basically a prepared SQL statement.It has to be executed and assembled like any other SQL query.MATERIALIZED VIEW means that the content is collected before hands and can be retrieved rather fast.I saw the concept first with my favorite competitor named O* and they made a lot of noise about it. { favorite: because I could win every benchmark against them } #Other 12 3 1 719
Article Robert Cemper · Apr 25, 2020 2m read Semi-Persistent Classes and Tables If you define a Persistent Class / Table the class compiler generates for you an appropriate Storage definition.A different option is to define a SQL mapping for an already existing Global storage. This has been excellentlyexplained already in a different series of articles. The Art of Mapping Globals to Classes 1 of 3 #ObjectScript #Other 10 7 1 499
Article Robert Cemper · Apr 25, 2020 2m read Static WHERE Conditions The typical WHERE condition in SQL relates mostly to some content of the rows you work on.So it needs to be calculated and checked for each row you access.Differently (and that's why I named it STATIC) is a WHERE condition that is independent of the rows you access. #Other 14 2 1 490
Article Robert Cemper · Apr 4, 2020 3m read Websocket Client IRIS internal IRIS 2010.1 brought us a new feature: %Net.WebSocket.Client As a continuation of my series of WS Clients I just couldn't resist to try it.Well, this is the result and it was rather simple in the end. After I succeeded in my personal fight against Windows Firewall ;-) You basically need to prepare 3 classes: #ObjectScript #InterSystems IRIS Open Exchange app 12 0 0 607
Article Robert Cemper · Apr 4, 2020 1m read Websocket Echo server IRIS In Caché you had an example of a WebSocket Server in namespace SAMPLESWith IRIS the samples are gone and require additional installation effort. So I refurbished the code with some useful additions: independent of namespace timeout control from client readable communication log This contains 2 classes: #Interoperability #Testing #InterSystems IRIS 12 0 0 608
Article Robert Cemper · Apr 3, 2020 1m read ...ToLogical / LogicalTo... Visualization A recent discussion made me aware that the documentation on DataType classes is excellent.http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...I just miss the visualization of the methods for Data Format Conversions. #Other 14 0 0 573
Article Robert Cemper · Dec 9, 2019 1m read SUDOKU demo A demo in traditional style COS This was written based on a previous trial in .XLSIt is far from being perfect. Rather a challenge forimprovement in all directions (code, interface, ...)So anyone feel invited to make it better. #Other 13 0 0 549
Article Robert Cemper · Jun 10, 2019 1m read more usefull Object Dump During testing your code you are often confronted with the need to examinethe actual content of an object. Either using ZWRITE or $system.OBJ.Dump()you get a picture of simple properties as "--- attribute values ---"while "--- swizzled references ---" are more confusing than informativeand with "--- calculated references ---" you are just left in the lurch. This small helper class allows you to dump an object to terminal ore.g in background to some stream for later review.By default, you see just properties with content, #ObjectScript #Tools #InterSystems IRIS 16 0 1 914
Article Robert Cemper · Jun 5, 2019 1m read Using Interjob Communication (IJC) Earlier I've written about command pipes.This is the internal variant of a PIPE. To make this more tangible and visible for you I prepared a small example The scenario is to run a monitoring process that receivesinput from an unknown number of sensors. (Could be Lab equipment or similar.) #Other 12 0 0 404
Article Robert Cemper · May 30, 2019 2m read BackgroundJobs over ECP Running a Background Job using the JOB command is a well-known feature.Using ECP to distribute databases to several servers is also well-known.But using the combination of both to run a process on a different serverseems to be a rare case. Sure there are enough other ways to start a remote job, but the specialcombination with ECP where the application server starts a process on adata server without additional networking is worth to be remembered. #ECP #Other 13 0 1 587
Article Robert Cemper · May 29, 2019 1m read Simple Remote Server Control This example is extracted from a long-running installation.The purpose is to have simple monitoring of several servers at a rather primitive level.Just slightly more intelligent than a raw PING. But still easy to integrate.It avoids the overkill of information you are often confronted with while you are justinterested in the number of active processes or similar basic figures.The example shows a basic skeleton that might be easily filled by your real needs. It consists of 3 sections: #Other 13 0 2 543
Article Robert Cemper · Mar 26, 2019 2m read Synchronize data with DSTIME Other Sync-Tools just work from Caché/IRIS to Caché/IRIS.Synchronizing your data to some external DB requires some other solution. The solution is available in Caché/IRIS since quite some time and works excellent.^OBJ.DSTIME does the magic.https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=D2IMP_ch_current#D2IMP_C23869 #InterSystems IRIS Open Exchange app 13 0 2 838
Article Robert Cemper · Feb 8, 2019 2m read Client Websockets based CSP The Caché / Ensemble standard distribution contains in namespace SAMPLESa nice example of a CSP page consuming WebService as a Client.I have modified it not only to display the replies but to feed them back into a Global.I used the classic Hyperevent to achieve this. The replies end up as a log in global^WSREPLY.When there is no input anymore the page closes and goes away. There are 2 versions with visible and hidden display during operation.dc.WSCSP.reverseVerbose.cls and dc.WSCSP.reverseHidden.cls #CSP #ObjectScript #Caché #InterSystems IRIS 11 0 0 475
Article Robert Cemper · Feb 8, 2019 2m read Client Websockets based on Node.js It will demonstrate the wide range that is openend by making useof the power embedded in Node.js and its adapter to Caché, Ensemble, Health,..*Node / JavaScript have wide reputation to work as a WebSocket client.By using the Caché adapter it becomes easy to control it and to consume the results as aClient for WebSocket Servers and to collect the replies in Caché, Ensemble, .. I used node-v6.16.0-x64.msi and cache610.node as cache.node You provide a Global for input: #Node.js #Caché 14 0 1 787
Article Robert Cemper · Oct 9, 2018 3m read Execute Server Commands from Caché / Ensemble / IRIS *** archived *** The question has come up several times and I saw mixed answers and no quick example My personal preference is using CPIPE device as you get back exactly the output you will get at the command line interface of your OS .The tricky thing is to stop reading in time.The example just displays what you normally see in your console.it becomes useful if you look for things that you can't get from any $system.whatever() #DevOps #ObjectScript #Tips & Tricks #Tools #Tutorial #Caché #InterSystems IRIS 15 5 4 2.1K
Article Robert Cemper · Feb 27, 2018 2m read Dataset Lightweight M:N This data set demonstrates a basic M:N relationship between 2 tablesThe dataset is targeted to show a slim implementation of M:NIt's no question that other implementations exist. But at significantly more storage consumption. #Other 6 0 0 273
Article Robert Cemper · Feb 26, 2018 2m read M:N Relationship If you have worked with Caché Objects,You know already all about Relationships (one:many , parent:child) ...But you will not find a word on many:many relationships in the docs. But I met the question quite often from new adopters of Caché objects:"Is it possible to implement many:many relationships ?" YES - of course ! #Other 12 7 0 1.1K
Article Robert Cemper · Feb 16, 2018 2m read Adopted Bitmap The base class Bmap.Person defines persons within an organization distributedby various countries. All records are indexed by (Country, PersonalId).this structure doesn't allow use of bitmaps. So a wrapper class Bmap.PersonQ around the data eliminates the top level ofthe index (Country) and isolates the PersonalId (%Integer, MINVAL=1).We are ready to use a Bitmap index. A few performance figures on 300010 generated records.You see that Relative Cost are sometimes quite misleading. base #ObjectScript #InterSystems IRIS 14 0 1 830
Article Robert Cemper · Nov 11, 2017 3m read Summary on Local Variable Scoping This should be an overview over a subject that pops up over several places in online documentation mostly as remarks and never as dedicated chapter. Once upon a time ... No it's not a fairy tale.In the beginning of Caché (and before) you had your partition to run your code. Part of that partition was a space with all your local variables nicely sorted by %,A,..Z,a,...z #Beginner #Caché #InterSystems IRIS 14 3 1 945