go to post Robert Cemper · Jan 14 Though, if you need this functionality over multiple namespacesI'd suggest to use a Language Extension:#1 an .inc for the the code definition in namespace %SYS ROUTINE ZZFIX [Type=INC] /// fix length string + padding + l/r-adjustment ZZFIX(%val, len , pad = "", right = 0) if right quit $e($tr($j("",len)," ",$e(pad_" "))_%val,*+1-len,*) quit $e(%val_$tr($j("",len)," ",$E(pad_" ")),1,len) #2 add this line to %ZLANGF00.mac #include ZZFIX after compiling it you may run a test in any namespace USER>set test="213abc" USER>write $ZZFIX(test,10,"*") 213abc**** USER>write $ZZFIX(test,10,"*",1) ****213abc USER>write $zzfix(test,5,"*",1) 13abc USER>write $zzfix(test,15,"$") 213abc$$$$$$$$$ USER>write $zzfix(test,15,"$",1) $$$$$$$$$213abc USER> If available this could of course also replace theClassMethod in the DataType definition.It's a matter of taste.
go to post Robert Cemper · Jan 14 I just felt the need of the last extension to adjust it to reality. A side effect: because of the implementation as Classmethod ClassMethod Fix(%val, rcc, rccp = "", rccal = 0) As %String You can apply it dynamically to any String/Number that you get in hands.(that's how I tested the core functionality)
go to post Robert Cemper · Jan 13 Thank you @Jeffrey Drumm !Yet another idea:Sometimes you may want a static non-blank padding character.e.g. ****123 or 345~~~~this is included as Parameter PADCHAR as %String =" " ; default= blank /// padding other than " " might be useful in some cases Class rcc.GetFixSqlPad Extends %Library.String { Parameter LENGTH As %String = 10; Parameter ALIGN As %String = "LEFT"; Parameter PADCHAR As %String = ""; Method Get() As %String [ CodeMode = generator, ServerOnly = 1 ] { set code=+%parameter("LENGTH")_","""_$E(%parameter("PADCHAR")_" ",1)_"""" set code=code_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSqlPad).Fix(%val,"_code ) QUIT $$$OK } ClassMethod StorageToLogical(%val As %String) As %String [ CodeMode = generator, ServerOnly = 1 ] { set code=+%parameter("LENGTH")_","""_$E(%parameter("PADCHAR")_" ",1)_"""" set code=code_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSqlPad).Fix(%val,"_code ) QUIT $$$OK } /// PADCHAR=" "; LEFT=0, RIGHT=1 ClassMethod Fix(%val, rcc, rccp = "", rccal = 0) As %String { if rccal{ set %val=$e($tr($j("",rcc)," ",$e(rccp_" "))_%val,*+1-rcc,*) } else { set %val=$e(%val_$tr($j("",rcc)," ",$e(rccp_" ")),1,rcc) } quit %val } }
go to post Robert Cemper · Jan 12 This doesn't work for SQL - Therefore a new version Class rcc.GetFixSql Extends %Library.String { Parameter LENGTH As %String = 10; Parameter ALIGN As %String = "LEFT"; Method Get() As %String [ CodeMode = generator, ServerOnly = 1 ] { set code=+%parameter("LENGTH")_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSql).Fix(%val,"_code ) QUIT $$$OK } ClassMethod LogicalToDisplay(%val As %String) As %String [ CodeMode = generator, ServerOnly = 0 ] { set code=+%parameter("LENGTH")_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSql).Fix(%val,"_code ) QUIT $$$OK } ClassMethod LogicalToOdbc(%val As %String) As %String [ CodeMode = generator, ServerOnly = 1 ] { set code=+%parameter("LENGTH")_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSql).Fix(%val,"_code ) QUIT $$$OK } // only required for SQL Display Logical mode ! ClassMethod StorageToLogical(%val As %String) As %String [ CodeMode = generator, ServerOnly = 1 ] { set code=+%parameter("LENGTH")_","_("RIGHT"=$zcvt(%parameter("ALIGN"),"U"))_")" $$$GENERATE(" quit ##class(rcc.GetFixSql).Fix(%val,"_code ) QUIT $$$OK } /// LEFT=0, RIGHT=1 ClassMethod Fix(%val, rcc, rccal = 0) As %String { if rccal{ set %val=$e($j(%val,rcc),*+1-rcc,*) } else { set %val=$e(%val_$j("",rcc),1,rcc) } quit %val } }
go to post Robert Cemper · Jan 12 A more compact data type with LENGTH and ALIGNFor RIGHT alignment I cut off oversized data by LENGHT counted from the end. Class rcc.GetFixAligned Extends %Library.String { Parameter LENGTH As %String = 10; Parameter ALIGN As %String = "LEFT"; Method Get() As %String [ CodeMode = generator, ServerOnly = 1 ] { set rcc=+%parameter("LENGTH") if "RIGHT"=$zcvt(%parameter("ALIGN"),"U") { set code="$e($j(%val,"_rcc_"),*+1-"_rcc_",*)" } else { set code="$e(%val_$j("""","_rcc_"),1,"_rcc_")" } $$$GENERATE(" Quit "_code) QUIT $$$OK } }
go to post Robert Cemper · Jan 12 Sorry, no idea! It was the first time I met this suspicious parameter.My personal style is quite traditional.
go to post Robert Cemper · Jan 11 by extending %RegisteredObject you lost the basic data typeand all other parameters of %Stringthis should do it: Class rcc.FixStr Extends (%Library.String, rcc.FixStr.Props) { /// Fill value according to LENGTH parameter Method Get() As %String [ CodeMode = generator, ServerOnly = 1 ] { set tCode="$e(%val_"""_$j("",+%parameter("LENGTH")) set tCode=tCode_""",1,"_+%parameter("LENGTH")_")" $$$GENERATE( " Quit "_tCode) QUIT $$$OK } }
go to post Robert Cemper · Jan 8 MySQL doesn't like TOP. Use LIMIT insteadYou have an error in your SQL syntax SELECT column_name(s) FROM table_name WHERE condition LIMIT number; found here: https://www.w3schools.com/sql/sql_top.asp
go to post Robert Cemper · Jan 3 My personal congratulations to the winners to complete the challenge in time👍👏😎
go to post Robert Cemper · Jan 2 different approach: SELECT LI.id from FDRD_Com.List LI JOIN FDRD_Com.Prod PR ON LI.vehicle = PR.Car WHERE PE.ProductLineName='Toyota' AND PR.Car is not null -- might be obsolete
go to post Robert Cemper · Jan 2 IN is expecting a list. Did you ever try select id from FDRD_Com.List where vehicle IN (select LIST(Car) from FDRD_Com.Prod where ProductLineName='Toyota' and Car is not null) on the sub select ?
go to post Robert Cemper · Dec 31, 2024 As an active participant you know the practical case.Though most readers that never touched AOC might be confused.The original intention was to exclude parts not solved in ObjectScript:(e.g Java, C# JS, ....)It turned out this was not possible to implement with acceptable effort.
go to post Robert Cemper · Dec 31, 2024 Big THANK YOU @Jani Hurskainen for sharing your story.I'm impressed by the progress you made on ObjectScriptafter only 1,5 years maybe 30% of working time, AoC examples are definitely different from the target cases ObjectScript was designed for.Its top target is the underlaying database, string manipulation and less math functionality. My best wishes for Health and Success for the New YearRobert
go to post Robert Cemper · Dec 29, 2024 In 2021 I published my article IRIS easy ECP workbenchwith a related a Docker based demo on OEX.All you need is the ECP enabled license for containers or Platform IndependentCommunity version is not ECP enabled
go to post Robert Cemper · Dec 27, 2024 Only 2 completed Packages from GitHub >installed and verified with 2 test sets fulfill requirements.You have to provide your test data set manually. @Abdul Manan : see reply @Yuval Golan : https://github.com/uvg/AdventOfCode2024Uvg The contest is closed.
go to post Robert Cemper · Dec 27, 2024 Thank you @Evgeny Shvarov !I'd like to underline especially the use of Docker.My hundreds reviews in OEX wouldn't be possible without it with my limited test environment.It's not only the option to run various versions in parallel to my personal setup,but much more the possibility to clean out all traces and specific settings just with a click.If you ever tried to remove COMPLETELY an IRIS installation with all tracesfrom Windows you may understand me.And with the available templates it is a really easy exercise to composeyour personal customized package with almost no effort andtest it over and over from scratch.
go to post Robert Cemper · Dec 17, 2024 Suggestion:you crate your own stored procedure to decide during SELECTexample: /// Return NEW for first occurance of item /// otherwise return OLD Class User.ItemStat Extends %RegisteredObject { ClassMethod NewOld(item As %String = "") As %String [ SqlProc ] { if item="" quit "?" if $d(^||list(item)) quit "OLD" if $i(^||list(item)) quit "NEW" } } How to use it: SELECT *, ItemStat_NewOld(item) as Status FROM items order by 2 Result: ID date item Status 1 09/13/1932 A NEW 2 04/06/1933 D NEW 10 06/15/1940 A OLD 4 11/26/1940 A OLD 6 02/19/1956 B NEW 8 04/22/1957 D OLD 7 05/01/1959 D OLD 9 06/29/1961 ? 3 07/04/1992 B OLD 5 12/08/2020 D OLD
go to post Robert Cemper · Dec 16, 2024 %ZSTOP routine may log the last user. But it has no information on an external stopped process. E.g from MGMT portal