Robert Cemper · Apr 27, 2018 go to post

Thanks for the clarification.
It's sometimes hard to guess the picture if you miss some pixels.

I'd still recommend moving the CLOSE after each inner loop to have OPEN / CLOSE strictly paired

The implicit CLOSE happens only if you exit the partition. There's no class to act undercover. 
Curly braces just structure the code with no operational side effect.

Robert Cemper · Apr 27, 2018 go to post

It seems you have manually changed the class definition.

A normal RegisterdObject has no storage definition.
from <Type>%Library.CacheStorage</Type> i see it was a %Rersitent before.

Storage Default
{
<Data name="EOBListDefaultData">
<Subscript>"EOBList"</Subscript>
<Value name="1">
<Value>EOBList</Value>
</Value>
</Data>
<DefaultData>EOBListDefaultData</DefaultData>
<Type>%Library.CacheStorage</Type>
}

remove Storage and recompile.

Robert Cemper · Apr 26, 2018 go to post

I finally succeeded in reproducing your error

ERROR #5803: Failed to acquire exclusive lock on instance of '%Studio.ProjectItem'

The conditions are somewhat strange and you should take an exact check what applies in your case.
The story:

  • ENSEMBLE uses %Studio.Project to manage the export.
  • every item to be exported gets locked. The global  name to look for is ^oddPROJECT
  • if the number of items exceeds a threshold the whole Project storage will be locked
  • this is NOT possible if someone else has any other project in this namespace locked for him
    then the export will fail and you get the ERROR message. 

So try to find out in Terminal

  • USER>zn "%SYS"
    %SYS>write $system.SQL.GetLockThreshold()      ; most likely default => 1000

    xxxxxx
  • %SYS>d ^LOCKTAB
                       LOCK table entries at
                    16767728 bytes usable, 16774528 bytes available.
    Entry Process     X#   S#
    Flg   W# Item Locked
       1) 1016         1               ^["^^c:\intersystems\17e20\mgr\"]%SYS("CSP","Daemon")
       2) 6444         1               ^["^^c:\intersystems\17e20\mgr\"]ISC.LMFMON("License Monitor")
       3) 6752         1               ^["^^c:\intersystems\17e20\mgr\"]ISC.Monitor.System
       4) 12180        1               ^["^^c:\intersystems\17e20\mgr\"]TASKMGR
       5) 8568         1               ^["^^c:\intersystems\17e20\mgr\user\"]
    oddPROJECT("Ali")
     
    Command=>

Look if you see oddPROJECT

Next try to estimate the number of items your production will export.
If you get close to the dimension of  xxxxxx then you run most likely into your error.
Be aware that some components can create more than 1 entry. So your limit might be lower (70% ??)

You can increase the threshold in
MgmtPortal > System Admin > Configuration > SQL and Object Settings > General SQL Settings

ATTENTION:  If you set this value to high you risk an overrun of the LOCKTABLE.
        This blocks the whole instance.   Increasing the size of LOCKTABLE + Restart is then required. Or you set the limit t back.

Robert Cemper · Apr 26, 2018 go to post

I miss 3 things in this example:

  • There is a condition: I found no IF nor anything
  • at the end of the inner loop there is no CLOSE file1 7 /  CLOSE file2  for file1 or file2
  • OPEN file:("WNS": ......)   
    • W - Write is ok
    • S - Stream mode is OK
    • N - i s questionable. if you are not on VMS you override the file at each outer loop
      http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GIOD_rmsseqfiles#GIOD_rmsseqfiles_use
      New file. If the specified file does not exist, the system creates the file. If the specified file already exists, the system creates a new one with the same name. The status of the old file depends on which operating system you are using. On UNIX® and Windows, Caché deletes the old file. (Note that file locking should be used to prevent two concurrent processes using this parameter from overwriting the same file.)

      So to get all output you may append arrayIndex to filename to have unique file names

Robert Cemper · Apr 26, 2018 go to post

as you noted SEEMS not to work.

method OnInit() as %Status

This user callback method is called via initConfig() from %OnNew() or in the case of SOAP Services from OnPreSOAP()

 $$$LOGINFO("INIT") translates to
   Do ##class(Ens.Util.Log).LogInfo($$$CurrentClass,$$$CurrentMethod,"INIT")

I'd suggest to replace it by set ^Antonio($i(^Antonio))=$lb($ZDT($h,3),"INIT")

so so find out if your Init gets called or not or multiple times, .. 
Especially during init phase high independence from the rest could be useful

Robert Cemper · Apr 26, 2018 go to post

My final idea:
- restart the whole ENSEMBLE instance to get rid of anything that might be hidden/hanging around in memory.
     It's not my preferred solution, but with the actual information, nothing else seems to work.
     If someone starts screaming you may have identified you opponent that blocks you. 
- if the problem persists further then contact WRC 

Robert Cemper · Apr 25, 2018 go to post

I did more research on %Studio.ProjectItem:

In the actual version there is no chance to such a lock situation.
Export is using a lot of  %Studio classes. So either a Studio instance or some other editing blocks something.

BTW: what version of ENSEMBLE do you use ?
 

Robert Cemper · Apr 25, 2018 go to post

From your screenshot, I see that you have a running production.

#1) ENSEMBLE has an internal locking not seen in LOCKTABLE.
#2) If you try to export the actual running production this might be you might get in conflict with this internal protection.

I found no note that you can't export a running production.
Though I've never heard of such attempt as a production consists many dynamic moving parts.

Suggestion: STOP the production you want to export and then try the export again.

Robert Cemper · Apr 25, 2018 go to post

Salva, that's Great!

without having to change the class definition

I like this.  yesyes

Robert

Robert Cemper · Apr 25, 2018 go to post

The the description is somewhat vague:

Exclusive LOCK happens on process basis not by user !
It's not clear where you run "export from the production". Portal,Terminal, Studio, ...

if you are in Studio and run "export from the production" in MgmtPortal or Terminal then you have 2 processes.
1 has the lock the other can't get it.
 

take a look in MgmtPortal >  System Operation > Locks  > View Locks

Now you should see who is owning your lock 

Robert Cemper · Apr 24, 2018 go to post

BTW. Class %ZEN.Component.querySource  still does it as iit did in past.

For more tricky manipulation you have

/// (optional) Name of Server-side callback method to call to create
/// a <class>%ResultSet</class> object.<br>
/// This must be the name of a server-only method in the page
/// class that contains this component.
Property OnCreateResultSet As %ZEN.Datatype.delegator(FORMALSPEC = "*tSC:%Status,pInfo:%ZEN.Auxiliary.QueryInfo", RETURNTYPE = "%ResultSet");
/// (optional) Name of Server-side callback method to call to execute the
/// <class>%ResultSet</class> object.<br>
/// This must be the name of a server-only method in the page
/// class that contains this table pane.
Property OnExecuteResultSet As %ZEN.Datatype.delegator(FORMALSPEC = "pRS:%Library.ResultSet,*tSC:%Status,pInfo:%ZEN.Auxiliary.QueryInfo", RETURNTYPE = "%Boolean");

 

Robert Cemper · Apr 24, 2018 go to post

yeah, table navigators chop the original resultset.

but with the absolute rowID (%vid) and the pageSize (pS)  you should get pageNum= %vid\pS+1
and relative rowID= %vid#pS

Or directly in SQL  with pageSize = 12

SELECT *, %vid AbsRowID,
                    CEILING(%vid/12) PageNum,
                   {fn MOD(%vid,
12)} RelRowId from (
      
SELECT name,home_city TOWN FROM Sample.Person
) WHERE TOWN %STARTSWITH 'DENVER'

you will keep the * away as you don't need the content

It's all based on the fact that the 'base'query always generates the same sequence of rows 
Just dynamic filters may break this. 
For paging also tablePane has to use the same mechanics. 
 

Robert Cemper · Apr 24, 2018 go to post

Hi Chip,

If I understand it correct you have a value and look for the related rowID in your tablePane.

tablePanes get typically feeded by a well know SQL SELECT and it numbers its rows sequentially.

For ease of explanation,  I use  SELECT name,home_city TOWN FROM Sample.Person  to fill your tablePane

Let's look for TOWN = 'Denver'

SELECT *, %vid rowID from ( 
      SELECT name,home_city TOWN FROM Sample.Person
) WHERE TOWN %STARTSWITH 'DENVER'

Of course, there is still arithmetic required if you have several sections to calculate.
This just gives you the 'absolute' rowID, not the relative.
HTH, Robert

Robert Cemper · Apr 24, 2018 go to post

the DSN is used when you set up your SQLgateway connection.

MgmtPortal > System > Configuration > SQL Gateway Connections

 There all information  on the DSN is stored.

Next if you Link the external table this gateway entry is used and stored for access.

MgmtPortal > System Explorer > SQL > Wizards > LinkTable

Now you bind a Class in a Namespace to a Gateway to a DSN


  

So you are fixed for THIS namespace. This is static.
If you change the Gateway entry or the DSN in some essential way
it could happen that you have to do this again.

Similar for a different target table you have to do the Link again.

A different issue could be that you might just have read access to the foreign table.
Then I'd expect some kind of error message.
At least it is something the partner side has to manage.

Robert Cemper · Apr 24, 2018 go to post

so either you or someone else just has it opened in a different Studio / Session.

Robert Cemper · Apr 24, 2018 go to post

doc for ORA-01861
describes the TO_Date issue very detailed

https://www.techonthenet.com/oracle/errors/ora01861.php

Your problem seems to be strictly related that the value you use and its description in TO_DATE don't match.

So TO_DATE(?,'YYYYMMDD') in Prepare
should work with 
    s result=obj.%Execute(20180425,par2,par3,par4)

It's a little bit less transformations

Robert Cemper · Apr 24, 2018 go to post

Through terminal couldn't make it work no mater what i tried, not when it is %Date and using $h without to_date nor when it is %String and translating the date to yyyy-mm-dd with or without to_date (at prepare or at execute).

Did you also try SQL shell from terminal ?  (it should act like SMP)
SAMPLES>Do $system.SQL.Shell()
SAMPLES>>INSERT INTO .......

Also: have you ever checked status  ?   to see if  %Prepare was OK ?

after:

s status=obj.%Prepare(statement)

do $system.OBJ.DisplayError(status)
It's hidden in your example

Robert Cemper · Apr 23, 2018 go to post

ok

did you try '2018-04-23' instead of $h ?

SELECT top 3 EFFECTIVE_START_DATE PACKAGE.SOME_TABLE_NAME

may show the expected default.

Robert Cemper · Apr 23, 2018 go to post

The change from %Date to %String influences image of your target table

and may affect implicit ODBC Data transmission that converts eg. +$h to YYY-MM-DD format !
once your data is a %Date again this should do it:

...... VALUES (?,?,?,?)

%Execute($zdh(somedateYYYYMMDD,8),par2,par3,par4)
If you test in SMP you have to check if you are in ODBC, Logical or Display mode.

with TO_DATE() you just overrule this as string are the same in any mode.
For ODBC the date is always 2018-04-25

For Display it's 04/23/2018 or 23.04.2018 depending on your local setting

For Logial it is always 64761 (+$h)

Robert Cemper · Apr 23, 2018 go to post

OK.
you got a reply of 149 characters!

And what was the result of ZZDUMP tText?

It should look similar to  this:

ZZDUMP tText
  
0000: 3F C1 0A C2 30 20 0A 3F 5F 65 E4 2C 63 D2 0A 9D         ?Á.Â0 .?_eä,cÒ..
0010: 27 3D 0A 2A 5E 3C 59 D9 46 A1 ED 24 ED BC C8 DE         '=.*^<YÙF¡í$í¼ÈÞ
0020: DD 74 20 0A 6F C9 F7 FD 24 3F 7C 0A A4 31 A1 7B         Ýt .oÉ÷ý$?|.¤1¡{
0030: 44 E2 68 E0 B0 DD 3F D6 F9 29 32 F3 73 3F 3F 52         Dâhà°Ý?Öù)2ós??R
0040: 3F B8 BC 3F BA 64 3F 24 2C F1 44 2B BB 3F 3F 0A         ?¸¼?ºd?$,ñD+»??.
0050: 3F 20 0A D4 BA 51 5A E9 FD 4E D5 20 56 7B 43 3F         ? .ÔºQZéýNÕ V{C?
0060: F3 F2 3F 62 A2 3F E9 CD 20 29 24 20 0A B2 35 C5         óò?b¢?éÍ )$ .²5Å
0070: 3F 77 45 EB 3F 20 3F 3F A9 74 D6 E3 31 7A D7 32         ?wEë? ??©tÖã1z×2
0080: 46 EB CA 6E F4 65 CB 20 E6 3F 3F 5D 5A DF 71 20         FëÊnôeË æ??]Zßq
0090: DC BA 3F E1 0A                                          Üº?á.

I filled in the marked characters to get to your received size. The real value could help as there is a bunch of controls that could trigger a newline.

The thing looks somehow encoded / encrypted or just binary.
Do you have information on source system ?   (the url is definitely faked)

  

Robert Cemper · Apr 22, 2018 go to post

Classes and Methods forever!

#1) for documentation
#2) for all the possibilities and structural controls of  OO development.
 

#3)
.mac & .int is a left over from a previous millennium,
a (failing) attempt to mimic OO with the mindset of procedural methodology.

I'm personally disappointed that Atelier still supports mac.

It was a historical requirement. Accepted. For last millennium. Eventually still for some internals.
Definitely not for public use.

Robert Cemper · Apr 20, 2018 go to post

you didn't get me. The browsers make something unreadable and useless out of it.
That's just rubbish

 
Â0 
?_eä,cÒ
'=
*^<YÙF¡í$í¼ÈÞÝt 
oÉ÷ý$?|
¤1¡{Dâhà°Ý?Öù)2ós??R?¸¼?ºd?$,ñD+»??

ÔºQZéýNÕ V{C?óò?b¢?éÍ )$ 
²5Å?wEë? ??©tÖã1z×2FëÊnôeË æ??]Zßq ܺ?á

pls do:

SET tText tHttpResponse.Data.Read()
ZZDUMP tText
WRITE tHttpResponse.Data.Size

So we see the real HEX_content , eventual control characters, ...  and the received number of characters
Similar to your request the response is encrypted. Eventually,  it can be decoded. 

Robert Cemper · Apr 20, 2018 go to post

where does Answer in Ensemble: come from ??

pls add:
write tHttpResponse.Data.Size,!

ZZDUMP tText