go to post Alexander Koblov · Sep 18, 2019 Unpack IAM-0.34-1-1.tar.gz first. Docker image is inside this archive
go to post Alexander Koblov · Sep 17, 2019 To add on what Dmitry said. We need to see the query, its plan and corresponding classes with selectivity information. For example, do you really want to run query without join condition? select o.col1, o.col2, op.partnum, op.amount from orders o join orderpositions op where o.orderDate > $H-1000
go to post Alexander Koblov · Sep 17, 2019 Hi Kris. What version of Caché do you have? SetHttpHeader is correct method to add headers. ISCSOAP began logging headers starting from 2016.1. In order to log headers you need to add "h" to the ^ISCSOAP("Log"). https://cedocs.intersystems.com/ens20161/csp/docbook/DocBook.UI.Page.cls...
go to post Alexander Koblov · Sep 11, 2019 Following this useful table (https://stackoverflow.com/a/33206814/82675) you can have blinking text as follows: USER>write $C(27)_"[5m"_"Hello"_$C(27)_"[0m"
go to post Alexander Koblov · Sep 10, 2019 Contact InterSystems Support: https://www.intersystems.com/support-learning/support/immediate-help/
go to post Alexander Koblov · Sep 9, 2019 You need to return Status from this method. Everything that you write inside this method is placed inside element Method override( proxy As %SOAP.ProxyDescriptor, tag As %String) As %Status { Write "<request>hi</request>",! Quit 1 }
go to post Alexander Koblov · Sep 9, 2019 I'm not sure for how much this is efficient, but you can use XSLT to do the transformation. Class CMT.XmlToCsv [ Abstract ] { ClassMethod transform( infile As %String, outfile As %String) As %Status { Set tXSL=##class(%Dictionary.CompiledXData).%OpenId(..%ClassName(1)_"||XmlToCsv").Data Set tSC=##class(%XML.XSLT.CompiledStyleSheet).CreateFromStream(tXSL,.tCompiledStyleSheet) If $$$ISERR(tSC) Quit tSC quit ##class(%XML.XSLT.Transformer).TransformFileWithCompiledXSL(infile,tCompiledStyleSheet,outfile) } XData XmlToCsv { <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:variable name="separator" select="','" /> <xsl:variable name="newline" select="' '" /> <xsl:template match="/"> <xsl:text>Col1,Col2,Col3</xsl:text> <xsl:value-of select="$newline" /> <xsl:for-each select="//Details"> <xsl:value-of select="Col1" /> <xsl:value-of select="$separator" /> <xsl:value-of select="Col2" /> <xsl:value-of select="$separator" /> <xsl:value-of select="Col3" /> <xsl:value-of select="$newline" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> } } And then call it from terminal: set p=##class(CMT.XmlToCsv).transform("c:\temp\input.xml","c:\temp\output.txt") zw p I took XSLT from https://stackoverflow.com/a/46176699/82675
go to post Alexander Koblov · Sep 6, 2019 Return statement is do %sqlcontext.AddResultSet(rs) When you call this stored procedure it returns resultset For example: call CMT.ExternalUsersSearch('%in%',,,'Title') If you call this stored procedure via ODBC / JDBC you need to add ReturnResultsets to the method definition: https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?K...
go to post Alexander Koblov · Sep 6, 2019 CASE statement expects expression after THEN. DESC or ASC are not expressions. That's why you are getting syntax error. So you need to supply some expression, ordering by which would mean reverse ordering by FirstName. I don't know how to do this. I would do sorting on the client or use dynamic SQL to create the query. As below for example. Important! Nowhere I concatenate parameters of the stored procedure with the query to avoid SQL injections. Only SortingField is concatenated after checking that it has approved value. ClassMethod Search( Name As %String = "", SSN As %String = "", Title As %String = "", SortingField As %String = "", StartIndex As %String = "") As %Integer [ SqlName = ExternalUsersSearch, SqlProc ] { set query = "select Name, Title, SSN from Sample.Employee WHERE 1=1 " kill args if Name'="" { set args($I(args)) = Name set query = query _ "AND Name like ? " } if SSN'="" { set args($I(args)) = SSN set query = query _ "AND SSN like ? " } if Title'="" { set args($I(args)) = Title set query = query _ "AND Title like ? " } set AllowedFieldsToOrderBy = $LB("Name", "SSN", "Title") if $ListFind(AllowedFieldsToOrderBy, SortingField) { set query = query _ " ORDER BY " _ SortingField if StartIndex = 1 { set query = query _ " DESC" } else { set query = query _ " ASC" } } set rs = ##class(%SQL.Statement).%ExecDirect(,query,args...) #dim %sqlcontext As %SQLProcContext if rs.%SQLCODE >=0 { do %sqlcontext.AddResultSet(rs) } else { // pass errors to the caller set %sqlcontext.%SQLCODE = rs.%SQLCODE set %sqlcontext.%Message = rs.%Message } quit 1 }
go to post Alexander Koblov · Sep 6, 2019 Not possible to do this in Query. You need to use dynamic SQL. Symbol ":" is used to indicate host variables. Host variables are treated as expressions, not as identifiers. During query compilation host variables are replaced with placeholders. Consider query: SELECT FirstName, MiddleName, LastName, Email, UserType FROM DB.ExternalUsers WHERE FirstName like :objSearch.FirstName ORDER BY :objSearch.SortingField This query is compiled as: SELECT FirstName, MiddleName, LastName, Email, UserType FROM DB.ExternalUsers WHERE FirstName like ? ORDER BY ? Then during runtime you supply values as follows: objSearch.FirstName = 'A%' objSearch.SortingField = 'FirstName' And query is executed as follows: SELECT FirstName, MiddleName, LastName, Email, UserType FROM DB.ExternalUsers WHERE FirstName like 'A%' ORDER BY 'FirstName' Notice 'FirstName' is in quotes in ORDER BY. So you sort by literal string. That is doing nothing. What you can do is to use expression like: Order by CASE :objSearch.SortingField WHEN 'FirstName' THEN FirstName WHEN 'MiddleName' THEN MiddleName ... END Although such generic queries makes SQL Query Analyzer unable to reason what plan is better to use for this query.
go to post Alexander Koblov · Sep 2, 2019 I like usage of parameter, as it is computed once -- at compile time. And after you only fetch value in cycle. You can also use $listfromstring via the same technique.
go to post Alexander Koblov · Sep 2, 2019 If you have index.csp and it is specified as login page and you are seeing 404 error, try following: a) Enable Audit b) Enable Protect event in Audit c) Reproduce the problem. e) Check Audit records if any Protect errors were logged
go to post Alexander Koblov · Aug 30, 2019 Name the file login.csp And inside it check for Error:ErrorCode request parameter: <html><head><title>Login</title></head> <body> My login page:</br> <form method='post'> Name: <input name="CacheUserName"/><br/> Password: <input type='password' name="CachePassword"/><br/> <input type='submit'/> </form> <server> Set tMsg = $Get(%request.Data("Error:ErrorCode",1)) If ((tMsg'="")&&($SYSTEM.Status.GetErrorCodes(tMsg)'[$$$ERRORCODE($$$RequireAuthentication))) { &html<<center>> write "Auth failed!" &html<</center>> } </server> </body> </html>
go to post Alexander Koblov · Aug 30, 2019 You can use $system.OBJ.Export to export LUT document to file: ENSDEMO>w $system.OBJ.Export("AlertTable.LUT","c:\temp\qq.lut") Exporting to XML started on 08/30/2019 12:03:14 Exporting type : AlertTable.LUT Export finished successfully. 1 ENSDEMO>w $system.OBJ.Load("c:\temp\qq.lut") Load started on 08/30/2019 12:03:26 Loading file c:\temp\qq.lut as xml Imported document: AlertTable.LUT Load finished successfully. 1
go to post Alexander Koblov · Aug 30, 2019 Hi Salma. Check for files with extension LUT. They represent Lookup Tables. You can add these files to Studio Export. Hope this helps, Alexander.
go to post Alexander Koblov · Aug 29, 2019 Hi Matthias. Try adding [Identity] to the attributes of property id in generated class. Something like follows: Property id As %Integer(EXTERNALSQLNAME = "id", EXTERNALSQLTYPE = 4) [ Identity, SqlColumnNumber = 2, SqlFieldName = ID ]; Hope this helps, Alexander.
go to post Alexander Koblov · Aug 27, 2019 I understand that get data method only needs to return the Y-Axis values Yes! Do you think it is good to try and store values for x and y-Axes in the same data array? No, keeping values in getChartData and labels for X axis in getAxisTime is fine.