go to post Robert Cemper · Jul 8, 2018 what product/component are you interested in?IRISENSEMBLEHEALTHSHARECACHÉTRAKiKNOWDEEPSEE.....and others is as wide as the whole software industryplease be more specific
go to post Robert Cemper · Jul 7, 2018 in addition, it would be worth to see what your SQ.CBPhoneResult_View does.By the ending VIEW I assume it is a View and not a Table:So the complexity of the executed query is hidden and could be the real performance problem.
go to post Robert Cemper · Jul 7, 2018 referring to CSP.... you let me assume you are working from Mgmt Portalnext you say: I am using the Intersystem ODBC driverThis is a contradiction as CSP doesn't use ODBC driverSo what are you really assuming to do ??Anyhow in both cases a SQL String delimiter (') entered in a %String property aka VARCHAR is always presented as it was entered.I verified it over an external ODBC viewer + Intersystem ODBC driver as well as over JDBC: no issue.For ODBC on Windows just use 64bit Version on 64bit platforms.in addition, you may verify your query also from the terminal prompt without any eventual timeout:USER>do $system.SQL.Shell()SQL Command Line Shell---------------------------------------------------- The command prefix is currently set to: <<nothing>>.Enter q to quit, ? for help.USER>> << entering multiline statement mode >> 1>>SELECT 2>>CallbackComment 3>>FROM SQ.CBPhoneResult_View Where PhoneDateODBC = '2018-04-09' 4>>go
go to post Robert Cemper · Jul 7, 2018 if you define a method mymethod() as somethingYou are expected to terminate ist either by QUIT anyvalue or RETURN ayvaluein your example you announce a %Status. so Quit $$$OK would be fine like thisClassMethod getFile() as %Status{ set filename = "/home/test.json" set newArray={}.%FromJSON(filename) write "New entity:"_newArray.%ToJSON() quit $$$OK }if you ommit as %Status you can allso forget the ending QUIT
go to post Robert Cemper · Jul 6, 2018 You are wrong: getFile+8 is set i2 = resultSet.rowSet.%GetIterator()so either resultSet. or resultSet.rowSet is not what you expect it to be.first you do set sc = stream.LinkToFile(filename) but you don't check the success codeAnd with "path/to/file.json" the file name looks more than suspicious to be correct.next you do set obj=... but this obj isn't used at all.next set jsonObj = [].%FromJSON(filename)and there is the fundamental mistake as your variable filename is set filename = "path/to/file.json"which is anything else than the expected JSON array you may have lost some important lines during cut/paste from your example Deserializing from JSON to a dynamic object may have important information for you
go to post Robert Cemper · Jul 5, 2018 It means in row 8 of method getFile you try to use some object reference that doesn't exist yet or is not initialized yet.posting some of your code could enable more precise diagnostic
go to post Robert Cemper · Jul 2, 2018 Hi Scott,It's indeed surprising.But digging into docs tells me>>>> it's not an ERROR code but a RESULT code and 0 = Success. (like SQL)more LDAP Result Codes Err2String is defintely a misleading naming.
go to post Robert Cemper · Jun 30, 2018 It could be sufficient to set ID=""at the beginning of your code to avoid the <UNDEFINED> later down.
go to post Robert Cemper · Jun 29, 2018 I try a simple explanation and you should try to find some docs on HTTP:So I leave out several steps in between to illustrate the basic actions.your browser sends a request GET /index.html HTTP/1.1 Host: www.example.com and if it is successful the server replies HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close <html> <head> <title>An Example Page</title> </head> <body> Hello World, this is a very simple HTML document. </body> </html> The highlighted part between HTTP and your first <html> is prepared or modified if not default in OnPreHTTP().It has to be ready BEFORE sending the reply. The delimiter between HTTP part and the content transmitted is just an empty line.The closing is 2 empty lines. For the items you can influence see class %CSP.Response
go to post Robert Cemper · Jun 29, 2018 Analysing your code I found @ line 24 i $$$ISWINDOWS,$$$UseSecureConnection{ending @ line 42 that contains s LD=##Class(%SYS.LDAP).Init($$$LDAPServer)but i didn't see an ELSE if the first IF fails.Then LD is undefined. I'm a little bit surprised how it could go up to line 104
go to post Robert Cemper · Jun 29, 2018 you do .ReadLineIntoStream() doc says: https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.clsThis reads from the stream until it find the LineTerminator and returns this as a stream. If the stream does not contain the line terminator this can potentially be the entire stream. and your error message: Premature end of data 12 Line 1 Offset 1 indicates that you have hit some character interpreted as line terminator after 12 characters. (rather short for JSON)My guess: your JSON input is a multiline input with enough line terminators insideAs a consequence your JSON input is incomplete.Suggested workaroundget length of your stream method SizeGet()read full stream ignoring line terminators using method Read(ByRef len As %Integer, ByRef sc As %Status) as %CacheStringeventually, it might be necessary to remove the line terminators before %FromJSON
go to post Robert Cemper · Jun 28, 2018 with large numbers exceeding 64bit integers the logic with integer division \ and modulo #was causing wrong results. So I changed it to pure string interpretation.Recommendation:pass all numbers as strings to escape from numeric normalizationNOT write $$^zahl(102100900002103201200301.6123100)einhundertzwei Trilliarden einhundert Trillionen neunhundert Billiarden zwei Billionen einhundertdrei Milliarden zweihundertein Millionen zweihundert TausendBUT write $$^zahl("102100900002103201200301.6123100")einhundertzwei Trilliarden einhundert Trillionen neunhundert Billiarden zwei Billionen einhundertdrei Milliarden zweihundertein Millionen zweihundert Tausend dreihunderteins Komma sechs eins zwei drei eins null nullIf you feel think this is exaggerated think about banking calculations for countries within low rated currencies.
go to post Robert Cemper · Jun 28, 2018 You are right. Though due to the internal limits, next time I would avoid \ and # operations in favor of $E() for the next versionAs there are some strange effects in handling numerics due to normalizationwrite $$^zahl(1.3400) >>>> eins Komma drei vier write $$^zahl("1.3400") >> eins Komma drei vier null null
go to post Robert Cemper · Jun 28, 2018 Hola Francisco,You motivated me to do something similar for German.It's is straightforward .int routine and you are welcome to add the code to your project.GermanNumberToText I did it up to 10e21, negatives and unlimited decimals. (except what is cut down due to internal limits)I tried to catch all the irregular structures of the language like singular/plural, varying genders, upper/lower caseand tried to keep the output readable: w $$^zahl(-190000103201101.3903)Minus einhundertneunzig Billionen einhundertdrei Millionen zweihundertein Tausend einhunderteins Komma drei neun null drei For quick copy:Updated to avoid failover from integer to floating format for large numbers (2018-06-28 16:34 UTC) zahl(num="",gen="") Public { ;;; convert number as German text ;;; w $$^zahl(-1123.505) >>>> Minus ein Tausend einhundertdreiundzwanzig Komma fünf null fünf set dec=$p(num,".",2),dec=$s(dec?1.N:$$dec(dec),1:"") if num=0 quit "null"_dec set neg=$S(num<0:"Minus ",1:"") if $l(neg) set num=$tr(num,"-") if num=1 set gen=$zcvt(gen,"U") quit neg_"ein"_$case(gen,"W":"e","S":"es","M":"",:"s") if num<10e23 quit neg_$$trd($p(num,"."))_dec quit "*** Zahl zu groß ***"} ;dec(num) { set dec=" Komma" for p=1:1:$l(num) set dec=dec_" "_$$zig($e(num,p)) quit dec}zig(num) { if num<10 quit $li($lb("null","eins","zwei","drei","vier","fünf","sechs","sieben","acht","neun"),num+1) if num<20 quit $li($lb("zehn","elf","zwölf","dreizehn","vierzehn","fünfzehn","sechzehn","siebzehn","achtzehn","neunzehn"),num-9) set zig=$e(num,*-1),zn=$e(num,*) set res=$s(zig=3:"dreißig" ,1:$li($lb(,"zwan",,"vier","fünf","sech","sieb","acht","neun"),zig)_"zig") if zn set res=$s(zn=1:"ein",1:$$zig(zn))_"und"_res quit res }hun(num) { set hun=$e(num,*-2),zig=$e(num,*-1,*),res="",m="hundert" set res=$s(hun=1:"ein"_m ,hun>1:$$zig(hun)_m ,1:"" ) quit $replace(res_$$zig(zig),"null","")}ein(res) { if $e(res,*-3,*)="eins" set res=$e(res,1,*-1) quit $replace(res,"null","")} tsd(num) { ;1,000 10e3 set tsd=$e(num,*-5,*-3),hun=$e(num,*-2,*),res="" if tsd set res=$$ein($$hun(tsd))_" Tausend " quit res_$$hun(hun)}mio(num) { ;1,000,000 10e6 set mio=$e(num,*-8,*-6),tsd=$e(num,*-5,*),m=" Million" set res=$s(mio=1:"eine"_m_" " ,mio>1:$$ein($$hun(mio))_m_"en " ,1:"") quit res_$$tsd(tsd)}mrd(num) { ;1,000,000,000 10e9 set mrd=$e(num,*-11,*-9),mio=$e(num,*-8,*),m=" Milliarde" set res=$s(mrd=1:"eine"_m_" " ,mrd>1:$$ein($$hun(mrd))_m_"n " ,1:"" ) quit res_$$mio(mio)}bio(num) { ;1,000,000,000,000 10e12 set bio=$e(num,*-14,*-12),mrd=$e(num,*-11,*),m=" Billion" set res=$s(bio=1:"eine"_m_" " ,bio>1:$$ein($$hun(bio))_m_"en " ,1:"" ) quit res_$$mrd(mrd)}brd(num) { ;1,000,000,000,000,000 10e15 set brd=$e(num,*-17,*-15),bio=$e(num,*-14,*),res="",m=" Billiarde" set res=$s(brd=1:"eine"_m_" " ,brd>1:$$ein($$hun(brd))_m_"n"_" " ,1:"" ) quit res_$$bio(bio)}tri(num) {;1,000,000,000,000,000,000 10e18 set tri=$e(num,*-20,*-18),brd=$e(num,*-17,*),m=" Trillion" set res=$s(tri=1:"eine"_m_" " ,tri>1:$$ein($$hun(tri))_m_"en"_" " ,1:"" ) quit res_$$brd(brd)} trd(num) { ;1,000,000,000,000,000,000,000 10e21 set trd=$e(num,*-23,*-21),tri=$e(num,*-20,*),m=" Trilliarde" set res=$s(trd=1:"eine"_m_" " ,trd>1:$$ein($$hun(trd))_m_"n"_" " ,1:"" ) quit res_$$tri(tri)}
go to post Robert Cemper · Jun 28, 2018 Before dealing with adapters you should check if your UDP reaches your server at all.You always get it if your server is on the same LAN segment as the sender.But you depend on the setup of the router in the case that it is not in your LAN "neighborhood".2nd your firewall should be willing to let pass this UDP.Then you may check the traffic with some external tool to make it visible.Or you check it directly from terminal following the instructions in IO device guidechapter UDP Client/Server CommunicationUDP is supported through the %Net.UDP class. This class provides methodsto Send() a packet to a specified destination and port,to Recv() a packet from the socket,and to Reply() to the transmitter of the last received packet.
go to post Robert Cemper · Jun 27, 2018 you have the option to read by character usingREAD *varThen you read exactly 1 byte in its decimal representation set file="C:\ZZ\myfile.bin"open file:"RS":0 else write "file not open", ! quitfor use file read *byte use 0 write byte,?5,"x\"_$ZHEX(byte),?12,"char:",$C(byte),!Docs on READYou may also use %File Class and use a Read method with length 1
go to post Robert Cemper · Jun 26, 2018 Use $ZCVT() function for decoding,set y="<html><body><h1>Greater = > lower 0= < Ampersand = & OK</h1></body></html>"write $zcvt(y,"I","HTML")<html><body><h1>greater = > lower 0= < Ampersand = & OK</h1></body></html>Attention all &..; have to be in lower case See doc $ZCONVERT()
go to post Robert Cemper · Jun 25, 2018 2 possible solutions: TEST3(STATUS=1) [STATUS,MSG] PUBLIC { X "S MSG=$S(STATUS:""HELLO"", 1:""GOODBYE"")" W !,MSG}TEST4(%STATUS=1) PUBLIC { X "S %MSG=$S(%STATUS:""HELLO"", 1:""GOODBYE"")" W !,%MSG }see also my article Summary on Local Variable Scoping
go to post Robert Cemper · Jun 23, 2018 Full doc is here :https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=%25SYS&CLASSNAME=%25Library.FileMethod CopyFile:https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Library.File#METHOD_CopyFile