go to post Robert Cemper · Nov 24, 2017 For %BuildIndices you may provide a list or use default. it doesn't affect sequenceexample from Sample.Person.1.Int %BuildIndices(pIndexList="",pAutoPurge=1,pLockFlag=0,pJournalFlag=1,pStartID="",pEndID="",pIgnoreIndexList="") public {if ($listlength(pIndexList)=1)&&($listget(pIndexList,1)="") { return 1 }Set class=$classname(),tBuildFlags=1,tBuildFlags(class)=$c(0,0,0,0,0,0)Set tPtr=0,tStatus=1,pJournalFlag=''pJournalFlagWhile $listnext(pIndexList,tPtr,tIndex) {continue:tIndex=""If '$d(^oddCOM(class,"i",tIndex)) {Set tStatus=$select(+tStatus:$$Error^%apiOBJ(5066,class_"::"_tIndex),1:$$AppendStatus^%occSystem(tStatus,$$Error^%apiOBJ(5066,class_"::"_tIndex)))}}If ('tStatus) RETURN tStatusif $listfind(pIndexList,"$Person") { set $Extract(tBuildFlags(class),1)=$c(1) }if ((pIndexList="")||($listfind(pIndexList,"FCOL"))),'$listfind(pIgnoreIndexList,"FCOL") { set $Extract(tBuildFlags(class),2)=$c(1) }if ((pIndexList="")||($listfind(pIndexList,"NameIDX"))),'$listfind(pIgnoreIndexList,"NameIDX") { set $Extract(tBuildFlags(class),3)=$c(1) }if ((pIndexList="")||($listfind(pIndexList,"SSNKey"))),'$listfind(pIgnoreIndexList,"SSNKey") { set $Extract(tBuildFlags(class),4)=$c(1) }if ((pIndexList="")||($listfind(pIndexList,"ZipCode"))),'$listfind(pIgnoreIndexList,"ZipCode") { set $Extract(tBuildFlags(class),5)=$c(1) }if ((pIndexList="")||($listfind(pIndexList,"dobx"))),'$listfind(pIgnoreIndexList,"dobx") { set $Extract(tBuildFlags(class),6)=$c(1) }If ((pIndexList="")||($Ascii(tBuildFlags(class),5))) && '$listfind(pIgnoreIndexList,"$Person") { set $extract(tBuildFlags(class),1)=$c($select((pStartID'="")||(pEndID'=""):1,1:2)) }Quit ..%BuildIndexInternal(.pLockFlag,.pAutoPurge,.pStartID,.pEndID,.pIndexList,.tBuildFlags,"^Sample.PersonD",1,.pJournalFlag,0) } %Save does it straight by ASSCII sorting of index names (lower after Upper case)See %SaveData(id) in the generated .int
go to post Robert Cemper · Nov 23, 2017 as documented inhttp://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...DATEPART delivers a %Integer value.Differently to %Date which has different display, logical and ODBC presentation %Integer does not follow any specific presentation but is just Integer and nothing else.And your input to DATEPART function is in any example the same: the logical value of TimeCreated.To cover your expectations you would need to adapt your input yourself. eg by %ODBCOUT() function.or the related LogicalToDisplay function.Your expectation that a data type %Integer does a revers research how it was calculated is just un-realistic.
go to post Robert Cemper · Nov 19, 2017 A Total different idea.if Transaction.Account is defined as Account object (could also be calculated) [ Property Account as Account ; ]then you may use implicit join for your query. it looks like this:select Account.Name, Account.State, Transaction.Amt, Transaction.Date, Transaction.Servicefrom Transaction left join Account on Account.Id = Transaction.Account where Transaction.Account in ( Select Account.Id from Account where Transaction.Account ->Type is not null and Transaction.Account->Id>123456789 and Transaction.Account->Id <=323456789 ) and Transaction.Date >= ?and Transaction.Date <= ?
go to post Robert Cemper · Nov 19, 2017 OK, that looks better now go to Mgmt Portal /SQL and verify for both tables that you see values in column Selectivity (marked)IF THERE IS NO SELECTIVITY ANY QUERY PLAN IS JUST GUESSWORK.if this is empty Query Generator just can guess and do a lot of unnecessary extra work.so got Tune Table click itand this you get there information that the Query Generator allows to make useful optimizations (marked)Next enter your specific query and click to "Show Plan"that marked information tells you what is happening and Relative Cost qualifies the expected performance. This query plan tells you what is really happening.
go to post Robert Cemper · Nov 19, 2017 At first sight I'd say the Query Generator is right as your Sub Select Just adds some more WHERE conditions.Your range on Transction.Date with related index might be much more limiting than your range on Account.Id.A index on Account.Type might also speed up your query. where Account.Id in ( Select Account.Name from Account?? Is Account.Name the same as Account.Id ??? IN ( ) expects EXACT VALUES !Suggestion if no done yet: Run tune Table for both tablesNext: publish the generated Query plan.
go to post Robert Cemper · Nov 15, 2017 A dirty hack:- make a new class extending %SerialObject with VALIDIFNULL set.- export your serial classes (to XML)- replace %SerialObject by your MySerialObject- reload the changed classes.Not so nice but I had the same issue with some 100 Serial Objects.The more sophisticated way would be do it programatically over %Dictionary.DefinedProperty ..... Very interesting and very time consuming
go to post Robert Cemper · Nov 15, 2017 You have to set $ZTRAP again at the begin:Or start with do infile^myroutine ....at the 1. run it is set i line 3you my also pass the filename as parameter
go to post Robert Cemper · Nov 15, 2017 Welcome back!infile ; simple file read set filename="C\mydir\myfile.txt" set $ZTRAP="end" open filename:("R"):0 else Write "file error" for line=1:1 use filename read text use 0 write text,! end close filename set $ZTRAP="" use 0 write "Done", quitit's not so sophisticated and I used the end-of-file error to exitThis is also available in class %Library.File with lot more comfort http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?P...HTH
go to post Robert Cemper · Nov 15, 2017 Taskmanager is a part of Caché System Management and you should read the Docs.JOB is a COS command also used in Taskmanager but not only. Any routine may use it.So your Request / Question is just not clear
go to post Robert Cemper · Nov 13, 2017 Suggested solution:#1 create a ROLE with resources DOCBOOK (Readonly) + the required Nmaspaces#2 remove required resources %Development from web application /csp/documatic #3 next create a user with the new defined role (here: "docread")I decided not to give %Development as it could allow access to terminal prompt.
go to post Robert Cemper · Nov 10, 2017 something similar: start ; open infile:"R":0 else write "input file not found",! quit open outfile:"WNS":0 else write "error creating output file",! quit set $Zt="end" for line=1:1:5 { use infile read sql use 0 if $e(sql,1,6)'="SELECT" continue set rs=##class(%ResultSet).%New() set sc=rs.Prepare(sql) set:sc sc=rs.Execute() if 'sc write "bad SQL statement",! quit set cols=rs.GetColumnCount() use outfile;; fill in headers if required while rs.Next() { for cols=1:1:cols write rs.GetData(cols),$c(9) write ! } write !,"###",! use 0 } end set $ZT="" close infile,outfile quit !! NOT TESTED !!
go to post Robert Cemper · Nov 7, 2017 correct.OVER(PARTITION BYis an unknown keyword in documentation You may need to reformulate your query to achieve a similar result
go to post Robert Cemper · Nov 5, 2017 Found it:Exceptions to READ COMMITTED 1 of some moreIf you query contains an aggregate function, the aggregate result returns the current state of the data,regardless of the specified ISOLATION LEVEL. Therefore, inserts and updates are in progress (and may subsequently be rolled back) are included in aggregate results. Deletes that are in progress (and may subsequently be rolled back) are not included in aggregate results. This is because an aggregate operation requires access to data from many rows of a table.see:http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...
go to post Robert Cemper · Oct 27, 2017 Hi Eduard !Being a little bit lazy I simplified the query (for less typing)My example: SELECT * FROM %Dictionary.StorageDataValueDefinitionwhere id [ 'Sample.Person'And it works fine for persistent and serial classes.My hidden assumption: there is only 1 Storage Strategy.The nice point about:you get also storage locations of deleted (!!) properties that eventually might be invisible in class definition.
go to post Robert Cemper · Oct 25, 2017 Assumimg you have both DB on the same instance but different namespaces "FROM" and "TO" You may run a loop like this set id="" for cnt=1:1 { set id=$ORDER(^|"FROM"|Data(""),1,value) quit:id="" set ^|"TO"|Data(id+10000000)=value) if cnt#100000 write cnt,?10,id,! } For the connections of the host you may use ECP For a more structured global you might need to use $QUERY() The write is just to see progress
go to post Robert Cemper · Oct 22, 2017 You may define properties by writing to ##class(%Dictionary.PropertyDefinition)as part of a ##class(%Dictionary.ClassDefinition) http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?P...Parameters is then defined as array of %CacheString; And you set it just as any other array. [SetAt() ..... ]and then compile the class to use that property inside the class This is nothing you may do on the fly.
go to post Robert Cemper · Oct 22, 2017 YES it is !Class %DeepSee.ResultSet has a method %CancelQuery that does the trick.http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?P...http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?P...Chapter Using the Result Set API tells you some more details.http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...especially:If you used %ExecuteAsynch(), periodically check to see whether the query has completed. If the query uses any plug-ins, make sure that any pending results are also complete; pending results are the results from the plug-ins, which are executed separately from the query.To determine the status of the query, call the %GetStatus() method of your instance. Or call the %GetQueryStatus() class method of %DeepSee.ResultSet. These methods return the status of the query and also (separately) the status of any pending results; see the class documentation for details.Optionally, to cancel a query that has not yet completed, call the %CancelQuery() class method.A practical example is seen in ##class( %DeepSee.UI.Analyzer). onunloadHandler()
go to post Robert Cemper · Oct 19, 2017 Hi Scott,analyzing ##class( EnsLib.SQL.Common).ExecuteProcedureParmArray(.....)I think you should be able to provide a prepared Snapshot to set the required parameters.At least $$$sysTRACE("Using initialized SnapShot "_(tNumRS+1)) points in this directionSo your code might look like this:Set SelectPER355MC=##class(%ListOfObjects).%New() Set preset=##class(EnsLib.SQL.Snapshot).%New()Set preset.MaxRowsToGet=12000do SelectPER355MC.SetAt(preset,1)set tSC = ..Adapter.ExecuteProcedureParmArray(.SelectPER355MC,.output,SPQuery,"oi",.parm)I have no environment to check the approach.So it's up to you to verify it.
go to post Robert Cemper · Oct 16, 2017 ERROR 5540 - User "UnknownUser" is not privileged for the operation.This tells me that you don't login with a managed user with enough privileges.So you could have a dedicated user just for this purpose.ORgive "Unknown User" enough rightsORmake use of a Privileged Application to assign temporary required Resources (my guess "%Developer") more on this and pp.http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.PortalHelpPag...
go to post Robert Cemper · Oct 10, 2017 I used this rule of thumb:selectivity > 8 % candidate for bitmap indexselectivity < 2 % normal indexin between it's a mater of investigation and other side conditions beyond selectivity