go to post Robert Cemper · Nov 30, 2017 Nopehttps://learning.intersystems.com/pluginfile.php/15097/mod_resource/cont...Next: Download PDF downloads a html page but with .PDF termination.
go to post Robert Cemper · Nov 29, 2017 I'm not an expert on callout but deep back in history I believe to remember that what ever youtransfer is in wider sense a single item. If string structured by $p() or $lb().You my take a closer look to %XML.SAX.* classes.The highest structure is $LB(). Which is a string under cover.And take care of the 32k limit
go to post Robert Cemper · Nov 28, 2017 Nicole,thanks for your input. I had my experience with CTRL+O by accident just a few minutes before your answer .It would be great if normal OUTLINE could do this as well.
go to post Robert Cemper · Nov 27, 2017 Nicole,thanks for your input. I had my experience with CTRL+O just a few minutes ago by accident.It would be great if normal OUTLINE could do this as well.
go to post Robert Cemper · Nov 27, 2017 so $lb($$$FIXSTR,text) since $L(text) is included there anyhowand $$$FIXSTR tells you that it's < 32
go to post Robert Cemper · Nov 27, 2017 I'd suggest to use $LB() if you are not hit by the LongString limit.why: all packaging, selection,.... is already done and "hard wired" in C++ with $C() you may re-invent $LB() or $Piece() or similar. And you have to do it in COS.Same applies to local array where you may iterate over the structure in COS again.Nothing against COS but C++ (in COS Functions) IS faster
go to post Robert Cemper · Nov 27, 2017 Thank you, Dan!I was pretty sure to miss some cases.SOID is probably the one nobody else would be aware of that it exists.
go to post Robert Cemper · Nov 27, 2017 similar in practice if you run bookkeeping as a service.master has full access and has the responsibility for the content. Using Work classclients have just read access to most fields. Using Client class.I didn't say tax control doesn't see everything. Using Government class
go to post Robert Cemper · Nov 26, 2017 A few recommendations:#2) save you original Global as you do otherwise. [Just to be Save]#1) In Studio Copy class has a checkbox to copy Storage Definition (=Globals) . Set it. In the new class add ClassParameter MANAGEDEXTENT=0 ; /// The <var>MANAGEDEXTENT</var> parameter can be set to 0 (zero) to cause the Extent Manager/// to ignore this class. If set to 1 then the Extent Manager will register globals used by/// the class and detect collisions. Unmanaged extents (MANAGEDEXTENT = 0) are not checked./// Currently, only classes using default storage (%Library.CacheStorage) can be managed.Parameter MANAGEDEXTENT As INTEGER [ Constraint = "0,1", Flags = ENUM ] = 1; So the old and the new class use the same Globals.Now go on with #3 to #6If you miss something in refactoring the damage should be limited as you just change names not the Storage in Globals.Assuming the change of ClassName is all you do.
go to post Robert Cemper · Nov 24, 2017 I see. It's hard generatedIndexNext distracted meBut you may call it individually. With your sequence then.
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 24, 2017 ok.You followed the direction: that you mark the "unavailable" value by a UNIQUE value.So for SQL it's NOT NULL.I agree with you that NullString (COS) => String of length 0 and NULL(SQL) is confusing [since invention of SQL in the late 60ties]
go to post Robert Cemper · Nov 24, 2017 Take a closer look to %Library.Date, %Library.TimeStamp, %Library.Integerand you will see the various methods for LogicalTo.....The switch you select applies to the final presentation only. Not to internal calculations.
go to post Robert Cemper · Nov 23, 2017 I think there is a basic misunderstanding of what NULL means in SQL.NULL in SQL means unknown / undefined value / any valueWhich is to my understanding a clear contradiction to uniqueness.If you assign yourself something indicating NO VALUE ( e.g '') then it works but it isn't NULL anymore in the sense of SQL.
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 17, 2017 much faster and straight forward string conversion then $ZD* stuff doing unnecessary conversions .