go to post Eduard Lebedyuk · Aug 2, 2017 Ensemble event log? It is stored in Ens.Util.Log class, so you can easily export it to csv/html/xml/pdf/txt from SQL. Here's a sample export to CSV: set rs = ##class(%SQL.Statement).%ExecDirect(,"SELECT * FROM Ens_Util.Log") set file = "C:\InterSystems\Ensemble\mgr\Temp\Ens.Log" do rs.%DisplayFormatted(100, file) // 100 for CSV format Docs for %DisplayFormatted.
go to post Eduard Lebedyuk · Aug 1, 2017 There are several ways to do that.Add from/to arguments to your existing REST servise, so your client asks for a data within a specified time slice.Specifying no arguments yields all dataSpecifying only from yields data starting at from and till nowSpecifying both from and to yields only data acquired between from and toUse websockets.
go to post Eduard Lebedyuk · Jul 31, 2017 If it's a part of Ensemble Production, you need to create Business Operation. Here's a sample BO that does POST request: /// This operation does a POST request to a REST API and receives Auth token Class Production.Operation.NLPAuthOperation Extends Ens.BusinessOperation { Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter"; Property Adapter As EnsLib.HTTP.OutboundAdapter; Parameter INVOCATION = "Queue"; /// Get Auth token Method GetAuth(request As Ens.Request, Output response As Ens.StringResponse) As %Status { #dim sc As %Statis = $$$OK // Form request body (using Credentials) set input = {"user": ( ..Adapter.%CredentialsObj.Username), "pass": (..Adapter.%CredentialsObj.Password)} // Send post request set sc = ..Adapter.Post(.httpResponse,,input.%ToJSON()) quit:$$$ISERR(sc) sc // Get token from response set token = {}.%FromJSON(httpResponse.Data).token // set response = ##class(Ens.StringResponse).%New(token) quit sc } XData MessageMap { <MapItems> <MapItem MessageType="Ens.Request"> <Method>GetAuth</Method> </MapItem> </MapItems> } } If you're outside of Ensemble, you need to use %Net.HttpRequest class. Here's an example.
go to post Eduard Lebedyuk · Jul 27, 2017 Let's say you have called this url: http://localhost:57772/rest/users/1?fields=list And you have this route: <Route Url="/users/:id" Method="GET" Call="Test"/> Then in your Test method call: write %request.Get("fields") it would output list.
go to post Eduard Lebedyuk · Jul 26, 2017 Turns out, I forgot to setup DispatchClass for /passthrough application. After setting it to EnsLib.SOAP.GenericService, the following URL works: http://localhost:57773/passthrough/PassthroughService/CurrencyConvertor.asmx
go to post Eduard Lebedyuk · Jul 25, 2017 That's $$$defClassDefined(class). It shows that class definition exists (or doesn't), but it doesn't show if a class is compiled.
go to post Eduard Lebedyuk · Jul 24, 2017 %ExistsId does not open an object for %Dictionary package. Just checks the globals (see %Dictionary.CompiledClass for example). The fastest way to check if a class exists would be: write $$$comClassDefined(class)
go to post Eduard Lebedyuk · Jul 24, 2017 For your specific usecase REST seems like a way to go. Check Caché FileServer and ClassExplorer projects - they both do file serving.
go to post Eduard Lebedyuk · Jul 19, 2017 The name is not important. This method is an method generator, so it runs during compilation. But as it produces no code, the method does not get generated.
go to post Eduard Lebedyuk · Jul 19, 2017 If you have access to Caché database you can create custom query that accepts date as an argument and based on that returns specific table. It can be used via ODBC like this: SELECT * FROM Package.Class.MyQuery(DATE) or Call Package.Class.MyQuery(DATE) Here's a sample query that returns Ids from a table or a class and has an argument - class name (or table name): Class Utils.CustomQuery2 { /// Return ids from a table or a class Query GetTable(Table) As %Query(CONTAINID = 1, ROWSPEC = "Id:%String") [ SqlProc ] { } ClassMethod GetTableExecute(ByRef qHandle As %Binary, Table) As %Status { #Dim Status As %Status = $$$OK If ##class(%Dictionary.ClassDefinition).%ExistsId(Table) { // Got a class, we need to calculate a table name and quote it #define ClassSQLTable(%c) ($$$comClassKeyGet(%c,$$$cCLASSsqlschemaname)_"."_$$$comClassKeyGet(%c,$$$cCLASSsqltablename)) Set Table = ##class(%CSP.UI.Portal.SQL.Home).Quoter2($$$ClassSQLTable(Table)) } Set qHandle = ##class(%SQL.Statement).%ExecDirect(,"SELECT ID FROM " _ Table) If qHandle.%SQLCODE'=0 { Set Status = $$$ERROR($$$SQLError, qHandle.%SQLCODE, qHandle.%Message) } Quit Status } ClassMethod GetTableFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status { If qHandle.%Next() { // Same as in ROWSPEC Set Row = $Lb(qHandle.ID) } Else { /// No more data Set AtEnd = 1 Set Row = "" } Quit $$$OK } ClassMethod GetTableClose(ByRef qHandle As %Binary) As %Status { Kill qHandle Quit $$$OK } } Call samples from ODBC: SELECT * FROM Utils.CustomQuery2_GetTable('Cube.Cube.Fact') Call Utils.CustomQuery2_GetTable('Cube_Cube.Fact') Code on GitHub.
go to post Eduard Lebedyuk · Jul 18, 2017 You can use %Dictionary package to do that. Here's a method that sets selectivity of a specified class/property (assuming Default storage) to an arbitrary value: /// w $system.Status.DisplayError(##class(User.Selectivity).ModifySelectuvity()) ClassMethod ModifySelectuvity(class As %Dictionary.CacheClassname = {$classname()}, property As %String = "field1", selectivity As %Integer(MINVAL=0,MAXVAL=100) = {$random(101)}) As %Status { #dim sc As %Status = $$$OK set id = $lts($lb(class, "Default", property), "||") set strategy = ##class(%Dictionary.StoragePropertyDefinition).%OpenId(id) set strategy.Selectivity = selectivity _ ".0000%" set sc = strategy.%Save() quit:$$$ISERR(sc) sc set sc = $system.OBJ.Compile(class) quit sc }
go to post Eduard Lebedyuk · Jul 18, 2017 Here's a code snippet: // Really %sqlcq.<NAMESPACE>.cls<NUMBER> #dim rs As %SQL.ISelectResult set rs = ##class(%SQL.Statement).%ExecDirect(, "SELECT * FROM Sample.Person") //set rs = ##class(Sample.Person).ExtentFunc() //do rs.%Display() while rs.%Next() { write rs.ID,! }
go to post Eduard Lebedyuk · Jul 18, 2017 Why do you want to change selectivity?You can run TuneTable to recalculate selectivity.