go to post Eduard Lebedyuk · Jun 26, 2017 Are these (Caché and Ensemble) systems in production or development?Emsemble is Caché + Some classes. So the easiest solution would be to move Caché application into Ensemble instance.Example of calling Ensemble from Caché is available in Demo.ZenService.Zen.WeatherReportForm class, GetWeatherReport method in ENSDEMO namespace.
go to post Eduard Lebedyuk · Jun 25, 2017 Install latest version (we're currently on v4) from here. Installation instructions are there too (just download and import, that's all).
go to post Eduard Lebedyuk · Jun 24, 2017 Here's Ensemble Event Log Viewer with multi-namespace support. In uses custom query to pull data from different namespaces.
go to post Eduard Lebedyuk · Jun 21, 2017 I think the most important part of source control file structure is mirroring package structure in Studio, since that is the view we spend the most time with. That said it looks something like this: root/ Package1/ Class.cls Class2.cls Routine.mac Include.inc Package2/ Class.cls Class2.cls Routine.mac Include.inc Additionally: Web app should be stored in a separate repository.If there's docs/dictionaries/etc, then all sources should be in a /src folder instead of repository root.All libs/modules/etc should be moved into their separate repositories each and plugged in as a submodules.Builds, if any should not be stored in a repo but rather meta-managed (releases).Commit messages and granular commit history is one of the most helpful things when analysing project history, enforce commit message style (title is the most important i.e. PART/SUBPART - thing done in a commit).
go to post Eduard Lebedyuk · Jun 21, 2017 Can you execute in SMP: SELECT cast('0x1F' AS varbinary(1549)) Not sure why 0x1F8B08000000... is unescaped though.
go to post Eduard Lebedyuk · Jun 19, 2017 That was fast.I'm assuming you don't want spoilers here beyond that?Yes, for now.
go to post Eduard Lebedyuk · Jun 19, 2017 I would like to, on every file change export the whole project to XMLWhat do you want to achieve with that?
go to post Eduard Lebedyuk · Jun 18, 2017 Then stored sql procedures/custom queries or result sets are the way to go.You'll need to write a method that returns what you need and expose it to SQL via one of the abovementioned methods.
go to post Eduard Lebedyuk · Jun 17, 2017 You can project collection property as a child table. Property MyList as list of Object(STORAGEDEFAULT="array"); Note that it changes class storage, so existing data should be moved to the correct new place. Several months ago I wrote a small utility class to accomplish exactly that. Or if you don't have a lot of different classes and data dependencies, you can just export to XML, add STORAGEDEFAULT and import XML.
go to post Eduard Lebedyuk · Jun 15, 2017 Is it possible to change underlying data model so that 1 row = 1 main object? Class UserPrefs { Property Username; /// Color/Number are keys, and this can be indexed Property Preferences As Array Of %String(SQLPROJECTION = "table/column"); Parameter ROWLEVELSECURITY = 1; ///Updated for each row when the property 'Preferences' changes Property %READERLIST As %String [ SqlComputeCode = {set {*} = ##class(Users).%SecurityPolicy()}, SqlComputed, SqlComputeOnChange = Preferences ]; } You can use SQL to insert into child table. Not sure if it would actually trigger a %READERLIST recalculation (maybe try %%INSERT) but worth a try.
go to post Eduard Lebedyuk · Jun 15, 2017 16.2 has %ZEN.Auxiliary.altJSONProvider, which has same method signatures but may be preferable (faster).
go to post Eduard Lebedyuk · Jun 13, 2017 Traced stuff to %SOAP.WebBase and for example in WriteSOAPHeaders there are these lines: $$$XMLSetBuffer(" </"_..#SOAPPREFIX_":Header>") $$$XMLWriteLine I guess there's really no way to remove new lines without a very heavy customization.
go to post Eduard Lebedyuk · Jun 13, 2017 Using SQLComputeCode and SQLComputeOnChange %READERLIST property is stored but gets recalculated on every SQL and Object INSERT/UPDATE/%Save: Class Utils.RLS Extends %Persistent { Parameter ROWLEVELSECURITY = 1; Property %READERLIST As %String [ SqlComputeCode = {set {*} = ##class(Utils.RLS).GetAccess({%%ID})}, SqlComputed, SqlComputeOnChange = (%%INSERT, %%UPDATE) ]; Property data As %String; ClassMethod GetAccess(Id) As %String { return:Id>3 "_SYSTEM" return "%All" } /// do ##class(Utils.RLS).Fill() ClassMethod Fill(N = 5) { do ..%KillExtent() for i=1:1:N { &sql(insert into Utils.RLS(data) values(:i)) } zw ^demo.testD,^demo.testI do ##class(%SQL.Statement).%ExecDirect(,"select * from "_$classname()).%Display() }
go to post Eduard Lebedyuk · Jun 13, 2017 Target system is very fastidious about XML. I aim to eliminate all possible variables that may affect XML processing.