We are not WRC, it is developer community.

As Tom already mentioned, in Caché class is not just as routine, it is like a bunch of objects defined in %Dictionary package, methods code can be found with %Dictionary.MethodDefinition or %Dictionary.CompiledMethodDefinition, depends on the situation.

But it is possible to get a text of class like you can in Studio

%Compiler.UDL.TextServices with methods GetTextAsStream, GetTextAsFile and etc., and convert back from text to class

In versions since 2016.2 you can use export to file in UDL format with $system.OBJ.ExportUDL()

Dmitry Maslennikov · Apr 27, 2018 go to post

If you think you know exact column which fails this query, you can try to CAST it to another type which Cache will understand.

Dmitry Maslennikov · Apr 25, 2018 go to post
USER>zload dc.test.1
 
USER>do sub1()
sub1_1
USER>do sub2()
sub2_2
USER>do sub2(10)
sub2_10
USER>do procPrivate(10)
 
DO procPrivate(10)
^
<NOLINE>^dc.test.1
USER>do procPublic(10)
procPublic_10
USER>do sub1
sub1_1
Dmitry Maslennikov · Apr 25, 2018 go to post

Pilar, could you please extend your post with a bit details about DNI, looks like it is used only in Spain.
And it would be better, to translate comments to English.

Dmitry Maslennikov · Apr 16, 2018 go to post

I would recommend to use more suitable class for it. %Stream.FileCharacter when you can set TranslateTable property

Set stream=##class(%Stream.FileCharacter).%New()
Set sc=stream.LinkToFile("c:\myfile.txt")
Set stream.TranslateTable = "UTF8"
While 'stream.AtEnd {
	Set line=stream.Read()
	; Process the chunk here
}

And you don't need any conversions after that

Dmitry Maslennikov · Apr 16, 2018 go to post

It looks like you are going the wrong way. If it fails if even classes have not changed and have not recompiled.

Could you show exact error, which fails to run your reports?

I think, the issue may be in SQL cache, so, you can try to purge it

Do $SYSTEM.SQL.Purge()

Both of those formats do not have support out of the box. And better to use some external tools for it. And it is possible to implement it at least for docx files.

Collation 20 is Portuguese2. Looks like windows was localized in Portuguese or regional settings when Ensemble was installed. But later changed locale definition to something else. You should return back because the database was created with this collation, and if you want to use new collation you should create a new one and move all data to the new database.

I think your original locale was ptbw, so, you should choose it and press install, and in confirmation press install again.

set groupSeparator=##class(%SYS.NLS.Format).SetFormatItem("NumericGroupSeparator"," ")
write $fnumber(12345.678, ",", 2)
12 345.68

By default in english locale group separator is comma

Dmitry Maslennikov · Mar 29, 2018 go to post

Atelier is Eclipse plugin, and I think you can find eclipse plugin for Clear Case as well, so, you will not need SourceControl class anymore.

Dmitry Maslennikov · Mar 26, 2018 go to post

Looks like you want to get more than just hide CSPCHD. It is still possible. You can achieve with URL rewrite in IIS or Apache.

Let's say if you configure your DNS for lcda.omnidata.com.au or any other as you want, or just *.omnidata.com.au for all subdomains, to the same server. You can configure URL Rewrite's for the particular domain to another path.

Rewrite is different from Redirect, when Redirect will show new URL, when Rewrite works hidden and even can redirect to some internal server not available from outside.

Dmitry Maslennikov · Mar 26, 2018 go to post

May I ask, why do you need so?

With eclipse settings stored in workspaces, so, if you will install multiple eclipse's open the same workspace, you will get the same server's in Atelier.

But you can work with multiple servers in one workspace. So, I don't really see any reasons to have multiple installations.

Dmitry Maslennikov · Mar 26, 2018 go to post

I would suggest using JSON in another way.

If you caught some errors, please provide more details, sometimes it is quite difficult to predict whats going on, and it helps to find the solution faster.

If you doing SOAP, it should be XML. If you need JSON response it could not be SOAP, it can be REST.

Why did you use altJSONProvider  instead of jsonProvider

Dmitry Maslennikov · Mar 21, 2018 go to post

I think it is possible to do, with little coding.

  • Set Inactive limit in system security settings.
  • While Inactive limit is a system-wide setting, you have to check  Account Never Expires  for those users who should not be expired.
  • InterSystems Cache has special task SecurityScan which executes every day, and disable expired users.
  • Create new system task, and schedule it to start after SecurityScan. This task should find disabled users in table Security.Users, and enable them and set flag ChangePassword, which will say to change a password on next login.
Dmitry Maslennikov · Mar 21, 2018 go to post

In CSP-Application you should choose Use Cookie for Session: Always

Or you can control it programmatically in %session with Property UseSessionCookie 

property UseSessionCookie as %Integer [ InitialExpression = 1 ];

Indicates whether sessions should be maintained using cookies or not. There are three possible values:

  • 0 - Never use cookies. This will pass the CSPCHD parameter around in all the url links and as hidden fields in the <FORM> elements.
  • 1 - Auto detect cookie support. This will start by trying to insert a cookie into the browser, if this fails it will switch to mode 0 and never use cookies for this session. The initial page will send both cookies to the browser and it will include the CSPCHD parameter in all links and forms.
  • 2 - Always use cookies. This will only use cookies so if the browser does not accept the cookie then the session state will not be maintained.

In Caché we have %UnitTest, you can find more information about it in the documentation. It is also possible to automate testing with various of Continuous Integration tools.

Dmitry Maslennikov · Feb 26, 2018 go to post

ZAUTHENTICATE used to authenticate users with their login and password, so, if you already have user's password you can connect to LDAP/AD server with this credentials.

Dmitry Maslennikov · Feb 26, 2018 go to post

Cheapest is only own PC/servers. If you want to play with ICM, as I found, it can work with bare metal and OpenStack as well.

I would also suggest trying to play with local Kubernetes cluster.

Dmitry Maslennikov · Feb 23, 2018 go to post

I reproduced this error, and when I managed to catch it, I tried to work with Auditing, but with no luck.

But Func way does not check any privilege and just works.

Dmitry Maslennikov · Feb 22, 2018 go to post

try this call

  set rs=##class(%File).FileSetFunc("c:\")
  if rs.%SQLCODE {
    write rs.%SQLCODE," - ",rs.%Message
  } else {
    do rs.%Display()
  }

Dmitry Maslennikov · Feb 22, 2018 go to post

You can just pass any value to the called by #server(..myMethod(arg1,arg2))# or #call(..myMethod(arg1,arg2))# method.

Look at my simple example.

Class User.Page Extends %CSP.Page
{

ClassMethod OnPage() As %Status
{
  &html<<html>
<head>>
  write ..HyperEventHead()
  &html<
</head>
<body>
<label><input id="chbox" type="checkbox" onchange="checkboxChanged(this);">
Choose me
</label><br>
<select id="combo">>
  write ..comboboxOptions()
  &html<</select>>

  &html<
<script language="javascript">

function checkboxChanged(chbox) {
  var options #server(..comboboxOptions(chbox.checked))#;
  document.getElementById("combo").innerHTML options;
}

</script> 
</body>
</html>>
  Quit $$$OK
}

ClassMethod comboboxOptions(chbox = 0)
{
  set options = ""
  if chbox {
    set options = options _ "<option value=""11"">test1</option>"
    set options = options _ "<option value=""12"">test2</option>"
    set options = options _ "<option value=""13"">test3</option>"
    set options = options _ "<option value=""14"">test4</option>"
else {
    set options = options _ "<option value=""11"">value1</option>"
    set options = options _ "<option value=""12"">value2</option>"
    set options = options _ "<option value=""13"">value3</option>"
    set options = options _ "<option value=""14"">value4</option>"
  }
  return options
}

}