go to post Robert Cemper · Jun 20, 2019 Yeah!you can lock out developers from SMP.But you can't prevent them from writing code with similar functionality. And run it.And then you have the same SYSTEM privileges as your Caché installation has. It might be hard to block it.For stronger security block all developers on production systems.
go to post Robert Cemper · Jun 14, 2019 #3 in details:- mount the copy of the DB as an additional DB to your Test Environment READ ONLY.e.g directory C:\InterSystems\Cache\myCopyDB\- Using Extended Global References you copy whatever global your need.e.g. merge ^my.Global = ^|"^^C:\InterSystems\Cache\myCopyDB\"|my.Global
go to post Robert Cemper · Jun 13, 2019 did you try instead of Array Of Objects to use List of Objects ?(it's different storage structure behind)
go to post Robert Cemper · Jun 13, 2019 see this article Execute Server Commands from Caché / Ensemble / IRISand the related example in OpenExchange
go to post Robert Cemper · Jun 12, 2019 not at all. It's just a readable formatted picture of the executed code.
go to post Robert Cemper · Jun 7, 2019 Ah, got it.I understand and agree on 7, 8, 9for 1. I still wait for the "modern" editor. None of the existing ones could really convince me. But all are easier to handle than vi or X ^%
go to post Robert Cemper · Jun 6, 2019 normally there is no need for such "wrapper"typically %Save() returns a %Status object and then it's up to you to analyze it in case there is an error.In the situation described here, all you can do is just a retry. - it could be a Lock collision - or the LockTable is full. Instead of fiddling in system parameters requiring a restart, you just wait and retry. if you are curious how often this happens you may add a loop counter. for further decisions
go to post Robert Cemper · Jun 6, 2019 Yes.it prevents an error message if there is a collision.if nobody else is around it just falls through without loop.
go to post Robert Cemper · Jun 6, 2019 for an insert you may need and exclusive lock for your table do { set gotit=##class(my.class).%LockExtent() if 'gotit hang .3 } while 'gotit ;; now do your INSERT and don't forget do ##class(my.class).%UnLockExtent(0,1) after your insert.
go to post Robert Cemper · Jun 6, 2019 other: XMLSPy for XML/XSD/DTD editingof course I also use Caché Studiostraight NotepadNotpad++ especially for JS also some XML if XMLSpy is to heavy
go to post Robert Cemper · Jun 4, 2019 Docs of $G say variable A local variable, global variable, or process-private global variable, subscripted or unsubscripted. The variable may be undefined. variable may be specified as a multidimensional object property with the syntax obj.property. similar Docs of $D say variable The variable whose status is to be checked. A local or global variable, subscripted or unsubscripted. The variable may be undefined. You cannot specify a simple object property reference as variable; you can specify a multidimensional property reference as variable with the syntax obj.property. but Title in your case is $li(^CinemaooFilmD(3),1). So neither $G() nor $D() is approriate.
go to post Robert Cemper · Jun 4, 2019 misunderstanding:I suggested to just use that EXAMPLE method to write a HTML structured table.Variation is in the SQL statement that you pass to it ClassMethod any(sqlStatement as %string) As %Status { set query = ##class(%ResultSet).%New() , sc = query.Prepare(sqlStatement) ...... }
go to post Robert Cemper · Jun 3, 2019 In docs you find Persistent Objects and Caché SQLespecially storage definitionsFor more information on the globals used for persistent classes, see “Globals.”
go to post Robert Cemper · Jun 3, 2019 some dirty trick to copy across namespace boundaries:have a target class config but change the global references in STORAGE section from^Package.ClassD and ^Package.ClassI to ^|"namespace"|Package.ClassD and ^|"namespace"|Package.ClassIMight be a different way to work across namespaces
go to post Robert Cemper · Jun 3, 2019 Assuming you get the call string as the variable parameter then for par="SERVER","PORT","NAMESPACE" set @par=$P($P(parameter,par_"=",2),":") zw @par SERVER="127.0.0.1" PORT=1972 NAMESPACE="SAMPLES"
go to post Robert Cemper · Jun 3, 2019 Sorry you didn't publish the definition of color .so assuming it is a $LB( ) structure $LISTTOSTRING(color,',') may cover your needs. It's an SQLFUNCTION too!just LIST(color) is wrong as it produces a comma-separated list of MULTIPLE records.
go to post Robert Cemper · Jun 2, 2019 you can delete the class in Studio or from SMPortal.so you delete the class DEFINITION and the related table DEFINITION. but no data.BUT.DROP TABLE in SQL also deletes the data AND the definition because this is part of SQL Standard. (Se also MySQL)I'd suggest you take some time to really read the documentation or consume some online training.
go to post Robert Cemper · Jun 1, 2019 " In MySQL, a "view" is just a saved SQL query - dropping a view does not drop data. I never imagined dropping the class (which I thought was just a view) would empty the global. The global was still there, but all the data was gone. "Caché is different from MySQL but has also VIEWS and dropping a View doesn't touch any DataBut identical as in MySQL DROP TABLE deletes the data.from http://www.mysqltutorial.org/mysql-drop-tableThe DROP TABLE statement removes a table and its data permanently from the database. and this was your question:So how else do I drop the table?and later: I did one by DDL
go to post Robert Cemper · Jun 1, 2019 if you use DROP without option %NODELDATA your data are gone. https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_droptableShort Caché Basics:all data are stored in globals, nowhere elseclasses describe the structure how data are stored and can be accessed as Objects or Tables. classes never change, generate or delete data, but provide methods to do so.so having 3 'tables' on the same global is just having 3 views of the same house.Recommend readings: Long Caché Basics and Introduction to Caché SQL