go to post Kyle Baxter · Aug 4, 2022 Hey Juan,So at a guess - Intersystems is doing the thing where they just take whatever error you return, and tack on their own error on top of it. In some cases they return all errors, and in others they just pick off the first one of them and return that (GetOneError or something similar). This is a bug (in my opinion) - you should open a WRC ticket and have them fix it. They might also be able to give you a workaround.Good luck!
go to post Kyle Baxter · Oct 13, 2021 WHO DARES SUMMON ME!Oh, hi Evgeny! Great to see you, hope you're well!For everyone else, Evgeny is right, of course (because he's quoting me ) but note that in newer versions (IRIS, for instance), you can make use of the %JSON.Adaptor to do something like: Class Test.DoesItJSON Extends (%RegisteredObject, %JSON.Adaptor){Property aString As %String;Property anInteger As %Integer;}The do something like:s obj=##class(Test.DoesItJSON).%New()s obj.aString="Hello"s obj.anInteger=123d obj.%JSONExportToString(.jsonstring)zw jsonstring jsonstring="{""aString"":""Hello"",""anInteger"":123}"This is better for creating new classes (again in later versions than you're on, you need to use the jsonProvider or the altJsonProvider) that you think you're going to want to serialize into JSON.
go to post Kyle Baxter · Sep 17, 2019 @Vitaliy.Serdtsev - you were right to summon me here!SQL optimization is a HUGE topic (as has been mentioned) but InterSystems products are VERY good at JOIN-ing large tables. Here's the issue, you're NOT doing a JOIN, you're doing a Cartesian Product. Your query:select o.col1, o.col2, op.partnum, op.amountfrom orders o join orderpositions opwhere o.orderDate > $H-1000Is saying to JOIN EVERY order with EVERY order position over the last 3 years (give or take). As you are not restricting how you're JOIN-ing the two tables together, there's not much we can do to optimize this. That said, when bringing up these issues (and you should! either we help you write better code or we fix problems in our code!) you should provide your table definition and a query plan. I think if you look at the query plan (which you can get from the management portal) you'll see that the problem is you're missing your JOIN condition (something like ON op.Order = o.ID, if I were to take a guess). If that's not the case and this is the query you want to be running, please send over your class definitions by doing:d $SYSTEM.OBJ.Export("User.orders.cls,User.orderpositions.cls","C:\Temp\KyleWantsThis.xml")and I'll be happy to look at this further. Of course, you are also very welcome to open up an issue with InterSystems Support - best support in the industry, and I'll bet a kidney on that statement.
go to post Kyle Baxter · Mar 13, 2019 To my knowledge you cannot do this on the client side, however it is easy enough to write a stored procedure to take in whatever input you want (say, a JSON object, or a list-of-lists, or some other data type) and use that to parse-and-INSERT on the server side.
go to post Kyle Baxter · Mar 6, 2019 I'm a bit confused here - granting the user SELECT privileges on those tables didn't allow your customer's ODBC client to work? It sounds like %ALL is working as designed (if you have %ALL you own the system and can therefore see everything). What does the client tool look like when you grant just SELECT access to certain tables or schemas? Can you try a different ODBC client to see how that behaves (I like WinSQL)?
go to post Kyle Baxter · Feb 27, 2019 Please open a case with the WRC ( wrc.intersystems.com or email: support@intersystems.com ) who can help get this fixed in the product if it is still not working.
go to post Kyle Baxter · Feb 22, 2019 OK you seem to have 3 questions here: 1) IRIS or Caché: If you're working with new the answer is IRIS. IRIS is our "latest and best" and you'll be best off going there.2) Which IDE: Doesn't matter. Atelier is an Eclipse based IDE, which is nice if you're used to Eclipse. I haven't touched VSCode so I can't speak for that. Studio is our home-grown IDE. Choose one, I'm not sure it matters at all, as long as you're comfortable using it. 3) How to deploy: In IRIS we have containers for deployment, so if you want to go that direction, great. However, you might be more comfortable working on your own machine, which you can also do and bring in containerization later (if it makes sense). Remember, using containers is a tool, and it's not ALWAYS the right tool for the job.Good luck! And if you have questions about building your application be sure to let us know!
go to post Kyle Baxter · Feb 22, 2019 This typically happens when you have some corruption of the Extent information for your namespace. You'll want to delete the nodes for digi.packet in ^oddEXT and ^rINDEXEXT (in the "G" and "U" nodes, I believe). You can try running ##class(%ExtentMgr.Util).DeleteExtentDefinition("digi.packet") but I'm not sure if that will get it all the way done.The easiest thing to do might be to export all your classes and import them into a fresh namespace (as you noted this works in many other places). If you want more step-by-step guidance or any root cause analysis, I recommend contacting InterSystems Support (support@intersystems.com)
go to post Kyle Baxter · Feb 13, 2019 Class Def--------------Class User.JSONify Extends %Persistent{Property JSONData as list of %String; ClassMethod MakeJSONArray(list) as %DynamicArray [sqlname="MakeJSONArray", sqlproc]{ q:(('$listvalid(list))|| (list="")) "" set jsonarray=[] for i=1:1:$LL(list) { d jsonarray.%Push($ListGet(list,i)) } q jsonarray}}--------------Data Population---------------USER>s obj=##class(User.JSONify).%New() USER>s json="{""Name"":""Kyle""}" USER>w obj.JSONData.Insert(json)1USER>s json="{""Name"":""Evgeny""}" USER>w obj.JSONData.Insert(json) 1USER>w obj.%Save()1-----------------Query-----------------3. select JSONData,MakeJSONArray(JSONData) from JSONify JSONData Expression_2$lb("{""Name"":""Kyle""}","{""Name"":""Evgeny""}") 17@%Library.DynamicArray 1 Rows(s) Affectedstatement prepare time(s)/globals/lines/disk: 0.0507s/37476/174342/0ms execute time(s)/globals/lines/disk: 0.0003s/2/598/0ms-----------------Extra Proof-----------------USER>s sql="select JSONData,MakeJSONArray(JSONData) from JSONify" USER>s rs=##class(%SQL.Statement).%ExecDirect(,sql) USER>w rs.%Next()1USER>s json=rs.%GetData(2) USER>w json16@%Library.DynamicArrayUSER>w json.%Get(0){"Name":"Kyle"}USER>w json.%Get(1){"Name":"Evgeny"}Not 100% on this design, but getting it to work isn’t bad. You’ll need extra error checking crap in any REAL code, obviously (for instance, I do ZERO checking to see if what is in the list is valid JSON).Cheers,KyleEdit: Adding parens around list="" as is proper when writing ObjectScript code. Due to ObjectScript's left-to-right evaluation, it is important to always wrap your conditions in parens or risk getting some unexpected results!!!
go to post Kyle Baxter · Jan 11, 2019 AVG exists in 2015.1. If you want the median you might have to calculate that yourself within a function. Do you need an SQL-only solution?
go to post Kyle Baxter · Jan 2, 2019 Did you enable HTTPS on your webserver? If so, that typically means a new port (default: 443), which you would need to add to your connection. If not, do you know how to enable HTTPS on your webserver?
go to post Kyle Baxter · Dec 12, 2018 If ever you are looking for generalized information, you can always look at learning.intersystems.com as well as the documentation (docs.intersystems.com). There's a lot of good videos there that you can use to help get going. If you have any specific questions there are plenty of us who would be happy to answer them.
go to post Kyle Baxter · Oct 10, 2018 Hey Laura!OK so if Frozen Query Plans was your problem (and it's a good hypothesis), then unfreezing them all gets you back to the old behavior (you'll need to recompile and purge cached queries). There were some problems with the 'old' dynamic SQL classes, but I think those were solved, so you shouldn't have any problems going forward. So let's talk about this a bit.What are Frozen Query Plans?If you've ever upgraded Caché and had a critical query degrade in performance, you'll agree this technology is pretty cool. What it does, is to lock down your query execution plan during upgrades (or it can be user [you're the user] initiated). Benefits: No bad surprises during upgradesDrawback: No benefits from core improvements to SQL engineIs it a problem to Unfreeze all plans?No! Of course not. You will absorb some risk, but if you usually don't have problems then you will continue to not usually have problems. If you unfreeze all plans you'll need to compile your application and/or purge cached queries. To do this you can execute the following in your application namespace:w $SYSTEM.SQL.FreezePlans(0,1,,.err)d $SYSETM.SQL.Purge()You can obviously look this up in the docs for more information. If you have embedded SQL queries those would need to be recompiled.Dynamic SQL ImplementationWe (InterSystems) recommend using %SQL.Statement in lieu of %ResultSet for dynamic SQL. When you ask if you should change, the answer is 'yes'. However, this only fixes your problem because when you use %SQL.Statement it ends up being a slightly different query according to our Frozen Query Plan implementation. It fixes your problem, but not the root of the problem. %SQL.Statement is also fine to use for 'older' code. Of course, if you don't want to change your code ("if it ain't broke"), that's understandable.SELECT * queriesRunning a SELECT * query is a bit of an edge case. It is frequently better to list out your fields so your are only showing your users the data they are interested in. Indeed, you can only run into this problem if it is a SELECT * query. In general, list out your fields. So that's that. If you have any further questions, feel free to let me know :-)
go to post Kyle Baxter · Sep 12, 2018 I recommend you open an issue with the WRC. We'd be happy to help you out here.
go to post Kyle Baxter · Feb 14, 2018 I'd bet my breakfast that your first line of code connects to a remote database, and that is failing. Therefore, when you go to prepare your query, it is failing due to no connection. Check the status code from your Connect() call and let us know what that says.
go to post Kyle Baxter · Jan 26, 2018 For an ACTUAL solution to your question - go to the SMP and to System Administration->Configuration->(CSP/Web) Gateway Management. From there go to 'Default Parameters'. The timeout you want to change is the Server Response Timeout. If you are using the private apache you can also edit the CSP.ini file in <Install>/csp/bin/. Of course, if this is a Production Systems DO NOT DO THIS OR I WILL FIND YOU AND SAY VERY MEAN THINGS!
go to post Kyle Baxter · Jan 10, 2018 Your IIS configuration maps /csp to the CSP Gateway, but your application is /myapp - so when IIS looks at /myapp, it doesn't know what to do so it tries to serve files off of your filesystem which, of course, it can't!So your question now, no doubt, is why does it work through the private Apache server (57773)? Well because the private Apache server is set up to ALWAYS send ALL requests to the CSP Gateway, and the CSP Gateway knows how to handle it.There's another trick, too. When you create your /myapp virtual application, make sure you create a new module mapping for *. REST requests do not have extensions so you need to be sending all requests to the CSP Gateway regardless of extension (or things won't work)!If you are having any more trouble getting this set up, please feel free to contact the WRC and we'll be happy to help you get set up.
go to post Kyle Baxter · Nov 16, 2017 The correct way to do this is with TO_DATE:select TO_DATE('19850720','YYYYMMDD')That will convert the text in the first argument (a string) using the format in the second parameter into a date, which will be displayed using the current selectmode. Try this in the Management Portal.
go to post Kyle Baxter · Nov 3, 2017 You can use ##class(Ens.DataType.UTC).timeUTCtoLocal() like so: ENSDEMO>s utc=$ZDATETIME($ZTIMESTAMP,3) ENSDEMO>w utc2017-11-03 14:44:15ENSDEMO>w ##class(Ens.DataType.UTC).timeUTCtoLocal(utc)2017-11-03 10:44:15.000
go to post Kyle Baxter · Oct 26, 2017 This works for me. I used this class definition: Class Test.JDBCStream extends %Persistent { Property Content as %Stream.GlobalCharacter; } And the following query form SQuirreL SQL on Mac worked fine: INSERT INTO Test.JDBCStream (Content) VALUES ('A long String') So I'm not sure exactly what you're doing. Do you have code? Examples? As Len stated yesterday, you should open a WRC Issue. Edit: Sorry this post looks bad, the text editor on this site is awful. Moderator: fixed Post Moderator Edit: Still looks bad, lost the syntax highlighting, and being able to edit people's posts kind of ruins the point of an open forum.