Great points, Dima. But I think any discussions make sense - this is how people communicate and exchange ideas, as you did in your post as well. We could request ObjectScriptQuality to add a profile that will enforce the rule and also, there is a linter in VSCOde ObjectScript - maybe it is possible to request the change in it too.

The idea of an open-source parser for ObjectScript - a good one, do we have it published on the ideas portal?

I see that coding guidlines for ObjectScript linter should be a document (json? yaml?) you include in your code  repository or reference any file in a github/gitlab and VSCode linter follows it on-the-go.

Or as some ObjectScript.Quality like ruleset, is it possible @Daniel Tamajon ?

Or as a codetidy feature by @Timothy Leavitt, but it's not easy to use.

Great app, @Raj Singh ! thanks for the contribution!

Adding two more "cents" for different LOAD DATA usage options:

1. csvgen app, which allows you to create a table and import data automatically as simply as:

do ##class(community.csvgen).Generate("/home/irisowner/dev/data.csv",",","package.class")

It will guess datatypes and use LOAD DATA under the hood.

2. And csvgen-ui - a web UI for csvgen by @Guillaume Rongier 

Also, if you are into embedded Python, take a look at csvgenpy, which uses not LOAD DATA, but sqlalchemy.

$zel, $zlp - two new ObjectScript functions in one day after more than 10 years in InterSystems... Love this community! )

In anyways, there are folks on the community that can help even with these already undocummented stuff )

I guess DC AI bot takes only the post body into the consideration thinking the title is a summary of the post. I this case title is one question and post body is another one.

Hi @Sam Duncan !

I think DC AI Bot answered right: if you try also add:

zpm "enable -community"

this will allow to install packages from a community registry

BTW, faced the same situation today to have an option of getting full sqlname for a class, and generated a classmethod in VSCode with AI (no my personal touch):

ClassMethod GetSQLTableName(pclass As%String) As%String
{
// returns the SQL table name for a classset tablename = ##class(%DeepSee.Utils).%GetSQLTableName(pclass)
if tablename="" {
set tablename=$TR($P(pclass,".",1,*-1),".","_")_"."_$p(pclass,".",*)
}
return tablename
}

And its working. Not bad for a bot.

Hi @Dmitrij Vladimirov ! This is pure ObjectScript AFAIK in an expression mode (think of it if you create a classmethod in ObjectScript in Expression mode), with options of %source to reference base class properties and %cube to reference Cube class methods.

Oh my god! What a drama!

Guys, you are maybe late for the Venice Film Festival 2025, but the Oscar 2026 nomination is yours!

And moreover, Dave Davidson is healthy and sound because of Interoperability and InterSystems! Thanks @Vishal Pallerla  and team! 

Thanks @David Hockenbroch !

An almost ideal pattern to run an SQL query in ObjectScript. 

If you could also share with error handling around?

My typical pattern looks like this one below. Includes try-catch in case when I need to rollback something:

try {

set tStatement = ##class(%SQL.Statement).%New()

set query = "ALTER Table "_table_" ADD PRIMARY KEY ("_column_")"$$$TOE(st,tStatement.%Prepare(query))

set rset=tStatement.%Execute()

if rset.%SQLCODE < 0 {

write"Error adding primary key: "_rset.%SQLCODE_" "_rset.%Messageset ex=##class(%Exception.SQL).CreateFromSQLCODE(rset.%SQLCODE,rset.%Message)

$$$ThrowStatus(ex.AsStatus())

}

}

catch ex {

set st=ex.AsStatus()

}

I agree, makes total sense. Documentation also have a feedback button on every page IIRC