go to post Robert Cemper · May 26, 2020 Typically all strings are UTF encoded.The average text often consist of single-byte characters (a subset of UTF-8) As soon as a multibyte character joins the string the whole string just uses WIDE characters example: USER>set txt="cher ami j'ai besoin de 100 eur"USER>zw txttxt="cher ami j'ai besoin de 100 eur" USER>zzdump txt0000: 63 68 65 72 20 61 6D 69 20 6A 27 61 69 20 62 65 cher ami j'ai be0010: 73 6F 69 6E 20 64 65 20 31 30 30 20 65 75 72 soin de 100 eurUSER>set txt="cher ami j'ai besoin de 100 €"USER>zw txttxt="cher ami j'ai besoin de 100 €" USER>zzdump txt0000: 0063 0068 0065 0072 0020 0061 006D 0069 cher ami0008: 0020 006A 0027 0061 0069 0020 0062 0065 j'ai be0010: 0073 006F 0069 006E 0020 0064 0065 0020 soin de0018: 0031 0030 0030 0020 20AC 100 € The conversion happens totally internal.depending on your needs you can select the national language table.different languages sort differently. e.g German äöü vs. aou
go to post Robert Cemper · May 26, 2020 with set gStatus=$DATA(pGlobalName) you check the existence of your call parameter but set gStatus=$DATA(@pGlobalName) check the existence of your Globalto go for the Global you require indirection therefore set gmin=$ORDER(@pGlobalName@(""))will meet your expectations
go to post Robert Cemper · May 25, 2020 using "œ" makes you internal string wide character.you might fix it with DO $ZF(-1,$ZCVT("echo œ","O","UTF8")) if the encoding of your AIX is UTF-8. The first example just shows that AIX understands its own console/terminal. Bonne chance !
go to post Robert Cemper · May 24, 2020 @Eduard Lebedyuk , @Dmitry Maslennikov I tried it and it works: - v $(pwd):/mnt/share/ I set it for both containers and they read/write to it as any other user would do. My consequence: the "Install container" fills all required data the "production container" consumes it. It's similar as data transfer from 1 process to the other over IRISTEMP and I have no need for a merge as in my initial case.
go to post Robert Cemper · May 21, 2020 Your organization seems to run the traditional centralized approach where a few developers workedin a rather close contact with each other being informed of any change immediately.Experiencing all cross-over dependencies on code and data directly. In a distributed / larger organization this information is poor or missing.So with more people stirring the same pot of code from remote is a risky exercise.You are well-advised to have local and separated installations for your developers. The extra effort is to maintain a common code base and data set for them.The advantage is that their changes don't interfere with each other.The next challenge is to keep test data for them consistent.This may even be harder to achieve than code consistency and requires precise maintenance and management.
go to post Robert Cemper · May 20, 2020 As there is no default RANDOM() in Caché/IRIS SQL you have to write it yourself.Create this class: Class User.Henry{ ClassMethod Random(maxval As %Integer = 2) As %Integer [ SqlName = RANDOM, SqlProc ]{ quit $random(maxval)} } Assuming your table has defautl ID (%Integer, MINVAL=1) SELECT TOP 1 column FROM tableHAVING ID >= RANDOM(MAX(ID)) >= ensures that you just get an existing ID and don't drop on a deleted one Of course, if you know in advance the highest existing ID (e.g. maxid) then RANDOM(maxid) will do it.
go to post Robert Cemper · May 20, 2020 Extending the reply of @Vitaliy.Serdtsev Basically whatever your variable holds could be a %String (also including binary values)COS has a few check functions to interpret the content $ISOBJECT $ISVALIDDOUBLE $ISVALIDNUM $INUMBER $LISTVALID the whole block of $ZD,$ZDH,$ZDT,$ZDTH,$ZT,$ZTH $MATCH Further on the Pattern Match operator ? let you sort out pure text and binary, ..... All you have is just content. It is left up to you to decide what type it is.You can find out by those functions what is NOT. Only the data type classes decide to some limit what type it should be.
go to post Robert Cemper · May 20, 2020 NO it is not possible:In IRIS for Windows (x86-64) 2020.1 (Build 215U) it is compiled.But at run time you get an SQLCODE=1 and an error message for a bad SQL statement. Better compose an SQL string "SELECT name FROM "_table and process it with some ResultSet class, The embedded code in the class we know from Cache is gone.It all generates into a %scqlc.* class
go to post Robert Cemper · May 17, 2020 In principle I'd share te suggestion of @Stephen Canzano; with 2 minor additions: SELECT Count(ID) from <youtable> will you always lead to theexplicit or implicit Extent Index. (bitmap or standard) set cls=##class(%Dictionary.CompiledClass).%OpenId("classname")set table=clsSqlTableName This is important as there are a bunch of classes that have explicit defined table names. In addition, it works also for table linked over SQL gateway
go to post Robert Cemper · May 15, 2020 *.1.int shows us that this is generated from a class%Stream.Object.... is a class from SYSLIB.System Classes are typically only available in compiled format (.obj) You can't debug them.Either skip them by <F10> or leave them by <SHIFT F11>
go to post Robert Cemper · May 11, 2020 I'd suggest to UNSWIZZLE ( ~~ remove from memory) all children once you a done with an object. it's described here: https://docs.intersystems.com/iris20192/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_relationships
go to post Robert Cemper · May 10, 2020 An example as you see in namespace SAMPLES SOAP.Demo.cls .First, of anything else, it is an XML document. <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://tempuri.org" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tempuri.org"> <types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org"> <s:import namespace="http://tempuri.org/ByNameDataSet" schemaLocation="http://localhost:57772/csp/samples/SOAP.ByNameDataSet.cls?XSD"/> <s:import namespace="http://tempuri.org/QueryByName_DataSet" schemaLocation="http://localhost:57772/csp/samples/SOAP.Demo.QueryByName.DS.cls?XSD"/> <s:element name="AddInteger"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="Arg1" type="s:long"/> <s:element minOccurs="0" name="Arg2" type="s:long"/> </s:sequence> </s:complexType> </s:element> <s:element name="AddIntegerResponse"> <s:complexType> <s:sequence> <s:element name="AddIntegerResult" type="s:long"/> </s:sequence> </s:complexType> </s:element> <s:element name="DivideInteger"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="Arg1" type="s:long"/> <s:element minOccurs="0" name="Arg2" type="s:long"/> </s:sequence> </s:complexType> </s:element> <s:element name="DivideIntegerResponse"> <s:complexType> <s:sequence> <s:element name="DivideIntegerResult" type="s:long"/> </s:sequence> </s:complexType> </s:element> <s:element name="FindPerson"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="id" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="FindPersonResponse"> <s:complexType> <s:sequence> <s:element name="FindPersonResult" type="s0:Person"/> </s:sequence> </s:complexType> </s:element> <s:complexType name="Employee"> <s:complexContent> <s:extension base="s0:Person"> <s:sequence> <s:element minOccurs="0" name="Title"> <s:simpleType> <s:restriction base="s:string"> <s:maxLength value="50"/> </s:restriction> </s:simpleType> </s:element> <s:element minOccurs="0" name="Salary"> <s:simpleType> <s:restriction base="s:long"> <s:maxInclusive value="100000"/> <s:minInclusive value="0"/> </s:restriction> </s:simpleType> </s:element> <s:element minOccurs="0" name="Notes" type="s:string"/> <s:element minOccurs="0" name="Picture" type="s:base64Binary"/> </s:sequence> </s:extension> </s:complexContent> </s:complexType> <s:complexType name="Person"> <s:sequence> <s:element name="Name" type="s:string"/> <s:element name="SSN" type="s:string"/> <s:element minOccurs="0" name="DOB" type="s:date"/> <s:element minOccurs="0" name="Home" type="s0:Address"/> <s:element minOccurs="0" name="Office" type="s0:Address"/> <s:element minOccurs="0" name="Spouse" type="s0:Person"/> <s:element minOccurs="0" name="FavoriteColors" type="s0:ArrayOfFavoriteColorsItemString"/> <s:element minOccurs="0" name="Age" type="s:long"/> </s:sequence> </s:complexType> <s:complexType name="Address"> <s:sequence> <s:element minOccurs="0" name="Street"> <s:simpleType> <s:restriction base="s:string"> <s:maxLength value="80"/> </s:restriction> </s:simpleType> </s:element> <s:element minOccurs="0" name="City"> <s:simpleType> <s:restriction base="s:string"> <s:maxLength value="80"/> </s:restriction> </s:simpleType> </s:element> <s:element minOccurs="0" name="State"> <s:simpleType> <s:restriction base="s:string"> <s:maxLength value="2"/> </s:restriction> </s:simpleType> </s:element> <s:element minOccurs="0" name="Zip"> <s:simpleType> <s:restriction base="s:string"> <s:maxLength value="5"/> </s:restriction> </s:simpleType> </s:element> </s:sequence> </s:complexType> <s:complexType name="ArrayOfFavoriteColorsItemString"> <s:sequence> <s:element maxOccurs="unbounded" minOccurs="0" name="FavoriteColorsItem" nillable="true" type="s:string"/> </s:sequence> </s:complexType> <s:element name="GetByName"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="name" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="GetByNameResponse"> <s:complexType> <s:sequence> <s:element name="GetByNameResult" type="s0:DataSet"/> </s:sequence> </s:complexType> </s:element> <s:complexType name="DataSet"> <s:sequence> <s:element ref="s:schema"/> <s:any/> </s:sequence> </s:complexType> <s:element name="GetDataSetByName"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="name" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="GetDataSetByNameResponse"> <s:complexType> <s:sequence> <s:element name="GetDataSetByNameResult" type="s0:ByNameDataSet"/> </s:sequence> </s:complexType> </s:element> <s:complexType name="ByNameDataSet"> <s:sequence> <s:any namespace="http://tempuri.org/ByNameDataSet"/> </s:sequence> </s:complexType> <s:element name="GetListByName"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="name" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="GetListByNameResponse"> <s:complexType> <s:sequence> <s:element name="GetListByNameResult" type="s0:ArrayOfPersonIdentification"/> </s:sequence> </s:complexType> </s:element> <s:complexType name="ArrayOfPersonIdentification"> <s:sequence> <s:element maxOccurs="unbounded" minOccurs="0" name="PersonIdentification" nillable="true" type="s0:PersonIdentification"/> </s:sequence> </s:complexType> <s:complexType name="PersonIdentification"> <s:sequence> <s:element minOccurs="0" name="ID" type="s:string"/> <s:element name="Name" type="s:string"/> <s:element name="SSN" type="s:string"/> <s:element minOccurs="0" name="DOB" type="s:date"/> </s:sequence> </s:complexType> <s:element name="LookupCity"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="zip" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="LookupCityResponse"> <s:complexType> <s:sequence> <s:element name="LookupCityResult" type="s0:Address"/> </s:sequence> </s:complexType> </s:element> <s:element name="Mission"> <s:complexType> <s:sequence/> </s:complexType> </s:element> <s:element name="MissionResponse"> <s:complexType> <s:sequence> <s:element name="MissionResult" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="QueryByName"> <s:complexType> <s:sequence> <s:element minOccurs="0" name="name" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="QueryByNameResponse"> <s:complexType> <s:sequence> <s:element name="QueryByNameResult" type="s0:QueryByName_DataSet"/> </s:sequence> </s:complexType> </s:element> <s:complexType name="QueryByName_DataSet"> <s:sequence> <s:any namespace="http://tempuri.org/QueryByName_DataSet"/> </s:sequence> </s:complexType> </s:schema> </types> <message name="AddIntegerSoapIn"> <part name="parameters" element="s0:AddInteger"/> </message> <message name="AddIntegerSoapOut"> <part name="parameters" element="s0:AddIntegerResponse"/> </message> <message name="DivideIntegerSoapIn"> <part name="parameters" element="s0:DivideInteger"/> </message> <message name="DivideIntegerSoapOut"> <part name="parameters" element="s0:DivideIntegerResponse"/> </message> <message name="FindPersonSoapIn"> <part name="parameters" element="s0:FindPerson"/> </message> <message name="FindPersonSoapOut"> <part name="parameters" element="s0:FindPersonResponse"/> </message> <message name="GetByNameSoapIn"> <part name="parameters" element="s0:GetByName"/> </message> <message name="GetByNameSoapOut"> <part name="parameters" element="s0:GetByNameResponse"/> </message> <message name="GetDataSetByNameSoapIn"> <part name="parameters" element="s0:GetDataSetByName"/> </message> <message name="GetDataSetByNameSoapOut"> <part name="parameters" element="s0:GetDataSetByNameResponse"/> </message> <message name="GetListByNameSoapIn"> <part name="parameters" element="s0:GetListByName"/> </message> <message name="GetListByNameSoapOut"> <part name="parameters" element="s0:GetListByNameResponse"/> </message> <message name="LookupCitySoapIn"> <part name="parameters" element="s0:LookupCity"/> </message> <message name="LookupCitySoapOut"> <part name="parameters" element="s0:LookupCityResponse"/> </message> <message name="MissionSoapIn"> <part name="parameters" element="s0:Mission"/> </message> <message name="MissionSoapOut"> <part name="parameters" element="s0:MissionResponse"/> </message> <message name="QueryByNameSoapIn"> <part name="parameters" element="s0:QueryByName"/> </message> <message name="QueryByNameSoapOut"> <part name="parameters" element="s0:QueryByNameResponse"/> </message> <portType name="SOAPDemoSoap"> <operation name="AddInteger"> <input message="s0:AddIntegerSoapIn"/> <output message="s0:AddIntegerSoapOut"/> </operation> <operation name="DivideInteger"> <input message="s0:DivideIntegerSoapIn"/> <output message="s0:DivideIntegerSoapOut"/> </operation> <operation name="FindPerson"> <input message="s0:FindPersonSoapIn"/> <output message="s0:FindPersonSoapOut"/> </operation> <operation name="GetByName"> <input message="s0:GetByNameSoapIn"/> <output message="s0:GetByNameSoapOut"/> </operation> <operation name="GetDataSetByName"> <input message="s0:GetDataSetByNameSoapIn"/> <output message="s0:GetDataSetByNameSoapOut"/> </operation> <operation name="GetListByName"> <input message="s0:GetListByNameSoapIn"/> <output message="s0:GetListByNameSoapOut"/> </operation> <operation name="LookupCity"> <input message="s0:LookupCitySoapIn"/> <output message="s0:LookupCitySoapOut"/> </operation> <operation name="Mission"> <input message="s0:MissionSoapIn"/> <output message="s0:MissionSoapOut"/> </operation> <operation name="QueryByName"> <input message="s0:QueryByNameSoapIn"/> <output message="s0:QueryByNameSoapOut"/> </operation> </portType> <binding name="SOAPDemoSoap" type="s0:SOAPDemoSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="AddInteger"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.AddInteger" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="DivideInteger"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.DivideInteger" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="FindPerson"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.FindPerson" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="GetByName"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.GetByName" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="GetDataSetByName"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.GetDataSetByName" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="GetListByName"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.GetListByName" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="LookupCity"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.LookupCity" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="Mission"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.Mission" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="QueryByName"> <soap:operation soapAction="http://tempuri.org/SOAP.Demo.QueryByName" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="SOAPDemo"> <port name="SOAPDemoSoap" binding="s0:SOAPDemoSoap"> <soap:address location="http://localhost:57772/csp/samples/SOAP.Demo.cls"/> </port> </service> </definitions>
go to post Robert Cemper · May 8, 2020 Just to complete this issue.My final solution is a VM with Ubuntu 18.04 + Docker (as suggested by @Rich Taylor ) .After some troubles, I moved to a Docker VOLUME as advised by @J. Hemdal . Docker Volumes are typically buried in a multilevel hard to remember directory tree. An easy to remember symlink solved that.And it works fine in all variations. Full durability and lightweight.Thanks for your contributions.
go to post Robert Cemper · May 4, 2020 First, check if the Caché SERVICE (in win sense) gets started as account With enough privileges Next, check that the installation directory and all sub dir are accessible with all right from this account Eventually, consider a reinstall / Update with enough ADMINISTRATOR rights
go to post Robert Cemper · Apr 23, 2020 CLASSPARAMETERS are static and apply to class compile time. You refer to it by ..#paramname in your class codehttps://cedocs.intersystems.com/latest/csp/docbook/Doc.View.cls?KEY=RCOS_fparametersee section References to Other Class Members or by COS function $PARAMETER(class,parameter)
go to post Robert Cemper · Apr 22, 2020 For Multiline SQL you may do it his way: set myquery = "SELECT TOP 5 "_ "Name, "_ "DOB AS bdate, "_ "FavoriteColors "_ "FROM Sample.Person" no solution for coloring inside a String
go to post Robert Cemper · Apr 20, 2020 on "html to pdf converter freeware" google gave me 3 270 000 hits.Why reinventing the wheel. Place your HTML into a local file and let someone else do the dirty job.There are enough solutions for a call-out to trigger the conversion.
go to post Robert Cemper · Apr 17, 2020 #1) I'd suggest to increase the size of your LockTab as suggested by @Vic Sun #2) There is a class in %SYS . ^SYS.Lock that could be useful for multiple Lock deletes.and as I just learned to adjust LockTab size (SetMaxLockTableSize) https://cedocs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=SYS.Lock#3) ^LOCKTAB from terminal command line in %SYS also shows the Locktab
go to post Robert Cemper · Apr 17, 2020 So a possible workaround could be to have a VIEW on Oracle including ROWNUM as a columnlike SELECT ROWNUM as row, * from whatever_tableand then map the View instead of the original table just for this purpose.
go to post Robert Cemper · Apr 16, 2020 see this example to reproduce and explain that there is an unnecessary conversion on the way as you showed in your example "text": "Condição de pagamento sujeito a análise de crédito: "