persistent SysMaskedQuery 0 %Persistent ============================================================================================ PROPERTIES ============================================================================================ %Library.String 1 %Library.String 1 %Library.Boolean 0 1 Classname in geval van statische query %Library.String Queryname in geval van statische query %Library.String %Library.String 1 ResultSet for Masked query %Library.ResultSet 1 Hierin komt de SQL query te staan die zichtbaar is voor de gebruiker (met :para1, :para2, ...) %Library.String "SELECT [*] FROM [TABLES]" Hierin komt de SQL query te staan die wordt uitgevoerd (met ?-parameters) %Library.String Init-code (uitgevoerd voor Execute query) %Library.String %Library.Boolean 0 Exit-code (uitgevoerd na Close query) %Library.String %Library.Boolean 0 AfterCacheCode %Library.String %Library.Boolean 0 EMBEDDED objects Sys.MaskedQuery.ColumnDef list Sys.MaskedQuery.ParamDef list Sys.MaskedQuery.TableDef list Sys.MaskedQuery.ConditionalDef array EMBEDDED: General header format (ook in te stellen op afzonderlijk 'column' niveau) Sys.MaskedQuery.ColumnDef.emExcelFmtHeader EMBEDDED: General column format (ook in te stellen op afzonderlijk 'column' niveau) Sys.MaskedQuery.ColumnDef.emExcelFmtGeneral Clause Containers (NB: in bijv. de GroupByClause is "GROUP BY" niet te vinden, dat wordt toegevoegd) %Library.String %Library.String Indexed array (nr) containing all enabled columns %Library.String 1 1 Indexed array (name) containing all enabled columns %Library.String 1 1 Indexed array (nr) containing all visible columns %Library.String 1 1 Indexed array (name) containing all visible columns %Library.String 1 1 Indexering voor parameters %Library.String 1 1 Tijdelijke opslagplaats voor RowCount %Library.Integer 1 Voor het tijdelijk bewaren van de MaskedQuery ColumnCount Afhankelijk van de Show status van de columns %Library.Integer 1 Voor het tijdelijk bewaren van de MaskedQuery ColumnCount Afhankelijk van de Enabled status van de columns %Library.Integer 1 Voor het tijdelijk bewaren van de SQL ColumnCount Afhankelijk van de Fetch status van de columns %Library.Integer 1 Uitvoermodus onthouden (simple,normal,cached) %Library.String "normal" Voor het tijdelijk bewaren van een row %Library.List 1 ModifiedBeforeExec %Library.Boolean 1 De volledige ResultSet wordt mogelijk hierin geschreven om snelle transfert naar de factory mogelijk te maken %GlobalCharacterStream Cache Array Index (uniek nr voor ^Hulp te kunnen gebruiken) Wordt eenmalig ingesteld bij CacheTableEx %Integer -1 1 Cache Array Key (om doorheen ^Hulp te lopen) %Integer -1 1 %ValidateObject method to provide notification that the current object is being validated.

If this method returns an error then %ValidateObject will fail. ============================================================================================ PARAMETERS ============================================================================================ Parameters te gebruiken bij column indices]]> 1 2 3 4 5 6 7 8 9 10 11 12 Logtype parameter EXEC ============================================================================================ INDEX ============================================================================================ 1 1 Groep,SubGroep 1 ============================================================================================ METHODS ============================================================================================ Wanneer FdynRawSQL wordt aangepast dan mag dit de modified status van het object niet wijzigen de property wordt namelijk tijdens uitvoeren van een query vernieuwd maar behoort niet tot de definitie van de query Arg:%String %Status Opvragen van een volgende row zoals bij %ResultSet, echter enkel de fetchcols ophalen %Library.Boolean %Library.Boolean %Library.Boolean eerste sleutel terug) .. Set ..FCAK=$O(^Hulp(..FCAI,..FCAK),-1) . Set SkipRow=0 . Set LastRow=0 . m ..aiEnabledColNr(..#ipTmpValue)=^Hulp(..FCAI,..FCAK) . Set Row="" . For Loop=1:1:..FtmpEnabledColumnCount Do Quit:(SkipRow) .. ;Value uitlezen (leeg voor niet SQL col, anders inhoud uit resultset in vorige loop opgehaald) .. Set Val=..aiEnabledColNr(..#ipTmpValue,Loop) .. If ..aiEnabledColNr(..#ipDoTranslation,Loop) Do ;MQObj meegekregen van DefaultExecute ... If $$imXecute^vhLib(..aiEnabledColNr(..#ipTransCode,Loop))'="" Do .... Set Val="#TRANSLATION ERROR ("_Val_")" .... Set ..aiEnabledColNr(..#ipDoTranslation,Loop)=0 ;Translation tijdelijk afzetten, anders fout telkens opnieuw .. If ..aiEnabledColNr(..#ipDoTypeTranslation,Loop) Do ;MQObj meegekregen van DefaultExecute ... If $$imXecute^vhLib(..aiEnabledColNr(..#ipTypeTransCode,Loop))'="" Do .... Set Val="#TYPE TRANSL. ERROR ("_Val_")" .... Set ..aiEnabledColNr(..#ipDoTypeTranslation,Loop)=0 ;Translation tijdelijk afzetten, anders fout telkens opnieuw .. Set:(..aiEnabledColNr(..#ipShow,Loop)) Row=Row_$LB(Val) .. ;Value terug uitlezen zodat eventueel opvolgende cols ermee kunnen stoeien .. Set ..aiEnabledColNr(..#ipTmpValue,Loop)=Val . Set ..FtmplbRow=Row . If 'SkipRow Do .. Set RowIndex=RowIndex+1 .. Set:(LastRow) ..FCAK=$O(^Hulp(..FCAI,""),-1) ;Plaats cached arrayindex op het einde Set ..FtmpRowIndex=RowIndex Quit 'EOT ]]> %Library.Boolean %Library.Boolean 0) ]]> %Library.Boolean 0) ]]> 1 Controle op opgegeven alias reeds voorkomt in tabellijst Alias:%String,AliasToCheckKey:%String="" %Boolean skip . Quit:(AliasToCheckKey=Key) . Set:(emTable.Alias=Alias) Unique=0 Quit Unique ]]> Table:%String,TableToCheckKey:%String="" %Boolean skip . Quit:(TableToCheckKey=Key) . Set:(emTable.Name=Table) Unique=0 Quit Unique ]]> Param:%String,ParamToCheckKey:%String="" %Boolean skip . Quit:(ParamToCheckKey=Key) . Set:(emParam.Name=Param) Unique=0 Quit Unique ]]> Param:%String Sys.MaskedQuery.ParamDef %Library.Boolean ColumnCount afhankelijk van Show status in Columns %Library.Integer Alle columncounts instellen n:%Library.Integer %Library.String Data kan enkel opgevraagd worden van Cols waarbij Show=1 is Name:%Library.String %Library.String ColNr via een ColName opvragen enkel mogelijk wanneer Col property show=1 is Name:%Library.String %Library.Integer Header kan enkel opgevraagd worden van Cols waarbij Show=1 is n:%Library.Integer %Library.String n:%Library.Integer Sys.MaskedQuery.ColumnDef 1 emColumn:Sys.MaskedQuery.ColumnDef %Library.String %Library.Boolean Msg:%Library.String "ClassName:QueryName"]]> %Library.String "Groep: SubGroep"]]> %Library.String SQL:%Library.String %Library.Boolean SQL:%Library.String %Library.Boolean %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"#" . Else If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"#" . If InConditional Do .. If Char="#" Do ... Set InConditional=0 ... Set CondName=$P(CondStr," ",1) ... Set CondCode=$P(CondStr," ",2,9999) ... Quit:((CondName="") || (CondCode="")) ... Set emConditional=..emConditionals.GetAt(CondName) ... If (emConditional'=$$$NULLOREF) && (emConditional.Enabled) Do .... Set NewSQL=NewSQL_CondCode .. Else Do ... Set CondStr=CondStr_Char . Else Do .. If Char="#" Do ... Set CondStr="" ... Set InConditional=1 .. Else Do ... Set NewSQL=NewSQL_Char If InConditional Do . Do ..SetMsg("Een bepaalde conditie werd niet correct afgesloten met het #-teken.") . Set Error=1 Set SQL=$S(Error:"",1:NewSQL) Quit 'Error ]]> SQL:%Library.String %Library.Boolean Columns (optioneel) ; [TABLES] -> Tables (optioneel) ; [Col] -> Column (Col=ColName/Alias) (niet behorende tot SELECT maar tot WHERE of dergelijke) ; Indien [Col] met Col een ColName of ColAlias in de tabel voorkomen deze ; vervangen door de gepaste code Quit:('..FReplaceBracketKeys(.tmpRawSQL)) 0 ; PARAMs Quit:('..FReplaceBraceParams(.tmpRawSQL)) 0 ; RawSQL updaten in object Set ..FdynRawSQL=tmpRawSQL Set ..FdynRawSQL=$Translate(..FdynRawSQL,"""","'") Quit 1 ]]> check of reeds in array... andere oplossing zoeken! ]]> SQL:%Library.String %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 . Else If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 . If InCondition Do .. If Char="#" Do ... Set InCondition=0 ... Set CondName=$P(CondStr," ",1) ... Set CondCode=$P(CondStr," ",2,9999) ... Quit:((CondName="") || (CondCode="")) ... Set emConditional=##class(Sys.MaskedQuery.ConditionalDef).%New() ... Set emConditional.Name=CondName ... Set emConditional.Enabled=$G(aEnabled(CondName),0) ;Default False ... Set emConditional.Code=CondCode ... Do ..emConditionals.SetAt(emConditional,CondName) .. Else Do ... Set CondStr=CondStr_Char . Else Do .. If Char="#" Do ... Set CondStr="" ... Set InCondition=1 If InCondition Do . Do ..SetMsg("Een bepaalde conditie werd niet correct afgesloten met een #-teken.") . Set Error=1 Do ..emConditionals.%SetModified(WasModified) Quit 'Error ]]> SQL:%Library.String %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 . Else If (Char="#") && (NextChar="#") Do Quit .. Set CharLoop=CharLoop+1 . If InCondition Do .. If Char="#" Do ... Set InCondition=0 ... w CondStr,! .. Else Do ... Set CondStr=CondStr_Char . Else Do .. If Char="#" Do ... Set CondStr="" ... Set InCondition=1 If InCondition Do . Do ..SetMsg("Een bepaalde conditie werd niet correct afgesloten met een #-teken.") . Set Error=1 Quit 'Error ]]> In de tranlation code van een column kan een parameter gebruikt worden, maar deze parameter is mogelijk niet aanwezig in de SQL code. Volgende method geeft alle parameters terug die te vinden zijn in de tranlationcodes van de columns, zodat de InSQL parameter van een parameter toch nog correct kan worden weergegeven (als InSQL=0 dan is de parameter 'niet actief' en wordt de waarde ervan niet opgevraagd). %String %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="{") && (NextChar="{") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"{" . Else If (Char="}") && (NextChar="}") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"}" . If InBraces Do .. If Char="}" Do ... Set InBraces=0 ... If $D(aParam(ParamStr)) Do .... Set NewSQL=NewSQL_aParam(ParamStr) .... Set emParam=aParam(ParamStr,$$$AssocParamObj) .... Set ParamPosCnt=ParamPosCnt+1 .... Set emParam.lbPositions=emParam.lbPositions_$LB(ParamPosCnt) .... Set emParam.InSQL=1 ... Else Do .... Set Error=1 .... Do ..SetMsg("De parameter '{"_ParamStr_"}' kan niet vertaald worden.") .. Else Do ... Set ParamStr=ParamStr_Char . Else Do .. If Char="{" Do ... Set ParamStr="" ... Set InBraces=1 .. Else Do ... Set NewSQL=NewSQL_Char If InBraces Do . Do ..SetMsg("Het aantal '{'-karakters komt niet overeen met het '}'-aantal.") . Set Error=1 Set SQL=$S(Error:"",1:NewSQL) Quit 'Error ]]> %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="[") && (NextChar="[") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"]" . Else If (Char="]") && (NextChar="]") Do Quit .. Set CharLoop=CharLoop+1 .. Set NewSQL=NewSQL_"]" . If InBrackets Do .. If Char="]" Do ... Set InBrackets=0 ... If $D(aCol(ColStr)) Do .... Set NewSQL=NewSQL_aCol(ColStr) ... Else Do .... Set Error=1 .... Do ..SetMsg("De kolom '["_ColStr_"]' kan niet vertaald worden.") .. Else Do ... Set ColStr=ColStr_Char . Else Do .. If Char="[" Do ... Set ColStr="" ... Set InBrackets=1 .. Else Do ... Set NewSQL=NewSQL_Char If InBrackets Do . Do ..SetMsg("Het aantal '['-karakters komt niet overeen met het ']'-aantal.") . Set Error=1 Set SQL=$S(Error:"",1:NewSQL) Quit 'Error ]]> %Library.Boolean SQL:%Library.String %Library.Boolean CodeLen) || Error) Do . Set Char=$E(SQL,CharLoop) . Set NextChar=$E(SQL,CharLoop+1) . If (Char="{") && (NextChar="{") Do Quit .. Set CharLoop=CharLoop+1 . Else If (Char="}") && (NextChar="}") Do Quit .. Set CharLoop=CharLoop+1 . If InBraces Do .. If Char="}" Do ... Set InBraces=0 ... If $D(aParam(ParamStr)) Do .... Set emParam=aParam(ParamStr) .... If emParam.AskForValue Do ..... Set ParamPosCnt=ParamPosCnt+1 ..... Set emParam.lbPositions=emParam.lbPositions_$LB(ParamPosCnt) ..... Set emParam.InSQL=1 ... Else Do .... Set Error=1 .... Do ..SetMsg("De parameter '{"_ParamStr_"}' kan niet vertaald worden.") .. Else Do ... Set ParamStr=ParamStr_Char . Else Do .. If Char="{" Do ... Set ParamStr="" ... Set InBraces=1 If InBraces Do . Do ..SetMsg("Het aantal '{'-karakters komt niet overeen met het '}'-aantal.") . Set Error=1 Quit 'Error ]]> varResultSet:%Library.ResultSet %Library.Boolean Geeft een string terug met daarin alle tables %Library.String Geeft een string terug met daarin alle columns %Library.String %Library.Boolean %Library.Boolean varIsError:%Library.Boolean %Library.String RS:%Library.ResultSet %Library.Boolean %Library.Boolean Lees columns uit via ResultSet object ; [*] -> User Defined Columns, sluit gewoon deze routine af ; .,. -> Columns gedefinieerd in SQL-statement, deze uitlezen ; Indien SELECT [*], dan worden de ColumnDefs door de gebruiker aangemaakt ; Deze versie bestaat enkel bij een dynamische query! Quit:(..SQLDependsOnColumnDefs()) 1 ; SELECT * of SELECT col1,col2,... (uitlezen via ResultSet) New RS Quit:('..FGetResultSet(.RS)) 0 Do ..FGetColumnsViaRS(RS) Quit 1 ]]> UseDefaultValues:%Library.Boolean=0,varParamError:%Library.Boolean="" %Library.String StartH:%Library.String,StartZTS:%Library.String,StopZTS:%Library.String,Msg:%Library.String 1 MaxEntries:%Library.Integer=100 ParamStr:%Library.String %Library.Boolean exit New RS Quit:('..FGetResultSet(.RS)) 0 Set ..FResultSet=$$$NULLOREF ;Tijdelijke RowIndex initialiseren op 1 (het gaat hier om een index, niet om een count, ;de translationcode moet bij het verkrijgen van de eerste col een RowIndex van 1 hebben) Set ..FtmpRowIndex=1 ;Trachten Execute van resultset uit te voeren New ExeCode,XecuteOk,StartH,StartZTS Set StartH=$H Set StartZTS=$ZTS Set ExeCode="Set ExeStatus=RS.Execute("_ParamStr_")" Set XecuteOk=$$iXecute^vhLib(ExeCode) If XecuteOk'="" Do Quit 0 . Do ..SetMsg("Fout tijdens uitvoeren:"_$C(13,10,13,10)_XecuteOk) Else Do . Do ..FAddExecToLog(StartH,StartZTS,$ZTS,"NoMsg") ;ResultSet object bijhouden Set ..FResultSet=RS ;Uitvoeren Init-code New ExitOk Set ExitOk=1 If ..UseInitCode && (..InitCode'="") Do . New InitSuccess . Set InitSuccess=$$imXecute^vhLib(..InitCode) . If InitSuccess'="" Do .. Do ..SetMsg("Fout tijdens uitvoeren init-code:"_$C(13,10,13,10)_InitSuccess) .. Set ExitOk=0 .. Set ..UseInitCode=0 Quit ExitOk ]]> UseDefaultValues:%Library.Boolean=0 %Library.Boolean Groep:%Library.String,SubGroep:%Library.String Sys.MaskedQuery 1 %Library.String Code:%Library.String,varError:%Library.String=0,CheckIfColExists:%Boolean=1 %Library.String CodeLen) || varError) Do . Set Char=$E(Code,CharLoop) . Set NextChar=$E(Code,CharLoop+1) . If (Char="{") && (NextChar="{") Do Quit .. Set CharLoop=CharLoop+1 .. Set ExeCode=ExeCode_"{" . Else If (Char="}") && (NextChar="}") Do Quit .. Set CharLoop=CharLoop+1 .. Set ExeCode=ExeCode_"}" . If InBrackets Do .. If Char="}" Do ... Set InBrackets=0 ... If IsParam Do .... Set ExeCode=ExeCode_$G(..aiParamVal(ColStr)) ... Else If IsGroupDecode Do .... Set ExeCode=ExeCode_##class(Sys.GroupDecode).GetExecCode(ColStr,IsGroupDecodeLong,.GroupDecErr) .... If GroupDecErr'="" Do ..... Set varError=1 ..... Do ..SetMsg("Group Decode Error: "_GroupDecErr) ... Else Do .... Set ColNr=$G(..aiEnabledColName(ColStr),0) .... If (ColNr=0) && CheckIfColExists Do ..... Set varError=1 ..... Do ..SetMsg("De kolom '"_ColStr_"' is niet actief of bestaat niet."_$C(13,10,13,10)_Code) .... Else Do ..... Set ExeCode=ExeCode_ColNr_")" .. Else Do ... Set ColStr=ColStr_Char . Else Do .. If Char="{" Do ... Set ColStr="" ... Set InBrackets=1 ... Set IsParam=$S(NextChar=":":1,1:0) ... Set IsGroupDecode=$S(NextChar="@":1,1:0) ... If IsGroupDecode Do .... Set IsGroupDecodeLong=($E(Code,CharLoop+2)="@") ... Else Do .... Set IsGroupDecodeLong=0 ... If IsParam || IsGroupDecode Do .... Set:(IsGroupDecodeLong) CharLoop=CharLoop+1 .... Set CharLoop=CharLoop+1 ... Else Do .... Set ExeCode=ExeCode_"..aiEnabledColNr("_..#ipTmpValue_"," .. Else Do ... Set ExeCode=ExeCode_Char If InBrackets Do . Do ..SetMsg("Het aantal '{'-karakters komt niet overeen met het '}'-aantal."_$C(13,10,13,10)_Code) . Set varError=1 Quit ExeCode ]]> 1 IP:%Library.String,QueryID:%Library.String 1 IP:%Library.String %Library.String 1 %Library.String 1 ============================================================================================ QUERIES ============================================================================================ %SQLQuery SELECT %ID,Groep,SubGroep,Groep || '.' || SubGroep AS Name,UseDynamicQuery FROM Sys.MaskedQuery ORDER BY UseDynamicQuery,Groep, SubGroep %SQLQuery SELECT Groep FROM Sys.MaskedQuery GROUP BY Groep ORDER BY Groep %SQLQuery paGroup:%Library.String SELECT %Id,SubGroep FROM Sys.MaskedQuery WHERE Groep=:paGroup ORDER BY SubGroep %Library.CacheStorage ^Sys.MaskedQueryD MaskedQueryDefaultData ^Sys.MaskedQueryD ^Sys.MaskedQueryI ^Sys.MaskedQueryS listnode %%CLASSNAME FdynRawSQL UseDynamicQuery dynVisualSQL statClassName statQueryName LastErrorMsg ErrorOccured FlbParam ExitCode InitCode UseExitCode UseInitCode BeforeNextRowCode UseBeforeNextRowCode AfterCacheCode UseAfterCacheCode QueryStream LastExecType ExecType GroupByClause OrderByClause emExcelFmtHeader emExcelFmtColumn emColumns subnode "emColumns" emConditionals subnode "emConditionals" emParams subnode "emParams" emTables subnode "emTables"