1//****************************************************************************
2//
3// $File name : WebBusinessBrocess.pkg
4// $Author : Janne Wassberg
5// $System : VDF Internet Server
6//
7// Confidential Trade Secret.
8// Copyright 1998-1999 Data Access Corporation, Miami FL, USA
9// All Rights reserved
10// DataFlex is a registered trademark of Data Access Corporation.
11//
12//
13// $Rev History
14//
15// JJT 12/1/2000 Combined WA3 NT and Linux Package
16//
17// JJT 10/20/00 Added ddXxxxx and WML support
18// JJT 10/20/00 Changed output to xHtml (lowecase tags, <br />)
19// Import WriteWmlXxx messages and WmlXxxx functions for wml support.
20// Removed old interface support
21// JJT 10/20/00 Changes from JVH to support WebApp Integrator (no other changes!)
22// JJT 8/1/99 changes for WebApp Studio
23// JJT 8/1/99 merged "01" interface into class
24//
25// JW 1998-09-03 Zoom interface for drill down added
26//
27// JJT 1998-08-28 Added Write_PainText (encodes HTML) and WriteHtml
28// All other messages now go through WriteHtml
29//
30// JW 1998-07-08 VDF Internet Server Version 0.8-215
31//
32// JW 1998-06-27 Source Merge for Internet by Janne Wassberg
33//
34// 1998-06-27 Version 0.8-201
35//
36// 98-03-10 Version 110
37//
38// 98-02-18 Version 105
39//
40// 97-10-01 File header created.
41//
42//****************************************************************************
43UseLanguageTextWebApp.pkg 44UsecInternetSessionBusinessProcess.pkg // InternetSessionBusinessProcess
45UseDataDict.pkg 46UseHtmlFormat_mixin.pkg // HTML helper mixin and functions
47UseHtmlWrite_mixin.pkg 48 49UsewmlFormat_mixin.pkg // wml helper mixin and functions
50UsewmlWrite_mixin.pkg 51 52 53DefineMIN_TEXT_SIZEfor4 54DefineMAX_TEXT_SIZEfor40 55DefineDFLT_TEXT_ROWSfor5 56DefineCONTROL_NAME_SEPfor"__" 57 58// Define all values for DDValue
59 60// reserve 0-99 for DD field information values
61DefineDDCRNTVALUEfor0 // Field_Current_value
62DefineDDDESCfor1 // Field_current_Description
63DefineDDLONGLABELfor2 // Field_Label DDLONGLABEL
64DefineDDSHORTLABELfor3 // Field_Label DDSHORTLABEL
65DefineDDTAGLABELfor4 // Field_Label DDTAGLABEL
66DefineDDSTHELPfor5 // Status_Help
67DefineDDOPTfor6 // File_Field_options (w/ foreign support)
68 69DefineDDVALNUMfor7 // number of val-table items
70DefineDDVALDATAfor8 // data value for val-table [pass index]
71DefineDDVALDESCfor9 // desc value for val-table [pass index]
72 73// reserve 100-199 for HTML specfic "helper"
74// return values
75 76DefineDDSELfor103 // returns selected="Selected" if field matches passed value
77DefineDDCHCKfor104 // returns checked="checked" if field matyches passed value
78DefineDDOPTIONfor105 // returns the <option....> value
79DefineDDREADONLYfor106 // returns readonly="readdonly" if RO
80DefineDDRECSfor107 // returns <option...> for all recs (obsolete... use ddrowids)
81DefineDDTITLEfor108 // returns title="status help" or blank if none.
82DefineDDFIELDERRORfor109 // returns error string for field (if error exists, else blank)
83DefineDDSHORTFIELDERRORfor110 // returns shorter error string for field (if error exists, else blank)
84DefineDDROWIDSfor111 // returns <option...> for all rowids
85// reserve 200-299 for HTML control
86DefineDDFORMfor200 // create a single line edit
87DefineDDEDITfor201 // create a multi line edit
88DefineDDRADIOfor202 // create radios for field
89DefineDDCOMBOfor203 // create a single line list (combo) for val-table
90DefineDDPARENTCOMBOfor204 // create a single line list of all records
91DefineDDAUTOfor205 // create the best control type for field
92 93DefineDDWMLINPUTfor250 // create WML Input form
94 95//
96// This class stores the interface for Call messages. It is entirely private.
97//
98 99{ ClassLibrary=WebApp Visibility=Private } 100ClasscDDValueInterfaceisanArray 101 102FunctionddValueCountReturnsinteger 103Function_Return(item_count(self)/4) 104End_Function 105 106ProcedureRegisterDDValueintegeriParam1stringsParam1stringsParam2stringsComment 107integeriCount 108GetItem_CountToiCount 109SetValue(iCount)toiParam1 110SetValue(iCount+1)tosParam1 111SetValue(iCount+2)tosParam2 112SetValue(iCount+3)tosComment 113End_Procedure 114 115FunctionParam1NumberIntegeriItemReturnsInteger 116Function_Return(Value(self,iItem*4)) 117End_Function 118 119FunctionParam1StrIntegeriItemReturnsString 120Function_Return(Value(self,iItem*4+1)) 121End_Function 122 123FunctionParam2StrIntegeriItemReturnsString 124Function_Return(Value(self,iItem*4+2)) 125End_Function 126 127FunctionddValCmntIntegeriItemReturnsString 128Function_Return(Value(self,iItem*4+3)) 129End_Function 130 131End_Class 132 133{ ClassLibrary=WebApp Visibility=Private } 134ClasscWebBusinessProcess_ddValueInterfaceIsAcDDValueInterface 135 136ProcedureRegisterddValues 137SendRegisterDDValueDDCRNTVALUE'''''Current value - this is the default' 138SendRegisterDDValueDDCRNTVALUE'DDCRNTVALUE''''Current value' 139SendRegisterDDValueDDDESC'DDDESC''''Description (validation descriptions)' 140SendRegisterDDValueDDLONGLABEL'DDLONGLABEL''''Long Label' 141SendRegisterDDValueDDLONGLABEL'DDLONGLABEL''iParam''Long Label, 1=Error in Red, 2=Show error message' 142SendRegisterDDValueDDSHORTLABEL'DDSHORTLABEL''''Short Label, 1=Error in Red, 2=Show error message' 143SendRegisterDDValueDDSHORTLABEL'DDSHORTLABEL''iParam''Short Label, 1=Error in Red, 2=Show error message' 144SendRegisterDDValueDDTAGLABEL'DDTAGLABEL''''Tag Label' 145SendRegisterDDValueDDSTHELP'DDSTHELP''''Status_Help' 146SendRegisterDDValueDDSTHELP'DDSTHELP''bShowError''Status_Help 1=show error in text' 147SendRegisterDDValueDDFIELDERROR'DDFIELDERROR''''Returns error string for column (if error exists, else blank)' 148SendRegisterDDValueDDSHORTFIELDERROR'DDSHORTFIELDERROR''''Returns a error short string for column (if error exists, else blank)' 149SendRegisterDDValueDDOPT'DDOPT''''bit-options (w/ foreign support) -bit values' 150SendRegisterDDValueDDVALNUM'DDVALNUM''''Number of validation table items' 151SendRegisterDDValueDDVALDATA'DDVALDATA''iIndex''data value for validation table' 152SendRegisterDDValueDDVALDESC'DDVALDESC''iIndex''description value for validation table' 153SendRegisterDDValueDDSEL'DDSEL''sData''Returns selected="selected" if column matches passed value' 154SendRegisterDDValueDDCHCK'DDCHCK''sData''Returns checked="checked" if column matches passed value' 155SendRegisterDDValueDDOPTION'DDOPTION''''Returns the lines for all validation table items' 156SendRegisterDDValueDDREADONLY'DDREADONLY''''Returns readonly="readonly" if column is Read-only' 157SendRegisterDDValueDDRECS'DDRECS''''Obsolete, use DDROWIDS. Returns lines for all records in table' 158SendRegisterDDValueDDROWIDS'DDROWIDS''''Returns lines for all rowids in table' 159SendRegisterDDValueDDTITLE'DDTITLE''''Returns title="status help" or blank if none.' 160SendRegisterDDValueDDFORM'DDFORM''''Create a single line edit form based on DD information' 161SendRegisterDDValueDDFORM'DDFORM''iWidth''Create a single line edit form of width iWidth based on DD information' 162SendRegisterDDValueDDEDIT'DDEDIT''''Create a multi line edit form based on DD information' 163SendRegisterDDValueDDEDIT'DDEDIT''iWidth''Create a multi line edit form of width iWidth based on DD information' 164SendRegisterDDValueDDEDIT'DDEDIT''"Width,Length"''Create a multi line edit form of passed size based on DD information' 165SendRegisterDDValueDDRADIO'DDRADIO''''Create radio control for column based on DD information' 166SendRegisterDDValueDDCOMBO'DDCOMBO''''Create a single line list (combo) for validation table based on DD Information' 167SendRegisterDDValueDDPARENTCOMBO'DDPARENTCOMBO''''Create a single line list (combo) of a parent table' 168SendRegisterDDValueDDAUTO'DDAUTO''''Create the best control type for this column' 169SendRegisterDDValueDDAUTO'DDAUTO''iWidth''Create the best control type of width iWidth for this column' 170SendRegisterDDValueDDWMLINPUT'DDWMLINPUT''''Create a WML Input form' 171SendRegisterDDValueDDWMLINPUT'DDWMLINPUT''sFormat''Create a formatted WML Input form' 172End_Procedure 173 174Procedureend_construct_object 175sendRegisterddValues 176forwardsendend_construct_object 177End_Procedure 178 179End_Class 180 181// create a single global instance of this...We only need one of 'em
182ObjectoWebBusinessProcess_ddValueInterfaceIsAcWebBusinessProcess_ddValueInterface 183End_Object 184 185 186{ ClassLibrary=WebApp Visibility=Private } 187ClasscDDValTblisanArray 188 189ProcedureConstruct_Object 190forwardsendconstruct_object 191PropertyintegerCrntValTblFile0 192PropertyintegerCrntValTblField0 193End_Procedure 194 195ProcedureWBPO_Fill_ItemintegeriItemstringsValuestringsDescription ;
196integeriFileRowIdriRec 197IfsDescriptioneq''MovesValuetosDescription 198SetValue(iItem*2)tosValue 199SetValue(iItem*2+1)tosDescription 200End_Procedure 201 202ProcedureAdd_Blank_ItemStringBlank_Desc 203SendWBPO_Fill_Item(Item_Count(Self)/2)''Blank_Desc00 204End_Procedure 205 206 // Fills the list by loading the entire defined data-file
207 //
208ProcedureWBPO_Fill_Field_ListintegerhMainintegeriFileintegeriField 209integeriObj 210If(hMainANDiFile)Begin 211GetFile_Field_Table_ObjectofhMainiFileiFieldtoiObj 212SendFile_Field_Fill_ListtohMainiFileiFieldSelfmsg_WBPO_Fill_Item 213If(iObjAND(Allow_Blank_State(iObj))) ;
214SendAdd_Blank_ItemDD_BLANK_CODE_DESCRIPTION 215End 216End_Procedure 217 218 219 // Fill the Val table if required. Check current iFile and iField
220FunctionUpdateValTblintegerhMainintegeriFileintegeriFieldreturnsinteger 221integeriItems 222If(iFile<>CrntValTblFile(self)OriField<>CrntValTblField(self))Begin 223SendDelete_Data // this will clear the entire list
224SetCrntValTblFiletoiFile 225SetCrntValTblFieldtoiField 226SendWBPO_Fill_Field_ListhMainiFileiField 227End 228Function_return(Item_Count(self)/2) 229End_Function 230 231FunctionValTbl_ItemsintegerhMainintegeriFileintegeriFieldreturnsinteger 232integeriItems 233SetCrntValTblFileto0 // this will force an update of the table
234GetUpdateValTblhMainiFileiFieldtoiItems 235Function_returniItems 236End_Function 237 238FunctionValTbl_ItemDataintegerhMainintegeriFileintegeriFieldintegeriItemreturnsstring 239integeriItems 240GetUpdateValTblhMainiFileiFieldtoiItems 241IfiItemsgtiItem ;
242Function_return(Value(self,iItem*2)) 243End_Function 244 245FunctionValTbl_ItemDescintegerhMainintegeriFileintegeriFieldintegeriItemreturnsstring 246integeriItems 247GetUpdateValTblhMainiFileiFieldtoiItems 248IfiItemsgtiItem ;
249Function_return(Value(self,iItem*2+1)) 250End_Function 251 252End_Class 253 254 255{ ClassLibrary=WebApp } 256{ DDOHost=True } 257{ ComponentType=WBOClass } 258{ HelpTopic=cWebBusinessProcess } 259ClasscWebBusinessProcessisacInternetSessionBusinessProcess 260 261ProcedureConstruct_object 262forwardsendconstruct_object 263ObjectoDDValTblIsAcDDValTbl 264End_Object 265 266{ Category=Behavior } 267PropertyStringpsAutoEntryLabelStart'
'
274 275{ Visibility=Private } 276PropertyintegerhDDValueInterface(oWebBusinessProcess_ddValueInterface(self)) 277 278{ Visibility=Private } 279PropertyintegerphAutoWebReport0 280 281{ Visibility=Private } 282PropertyintegerphLastFindDD0 283{ Visibility=Private } 284PropertyintegerpiLastFindIndex0 285End_Procedure 286 287 //*************************************************************************
288 //*** Html-interface
289 //*************************************************************************
290 291Import_Class_ProtocolHtmlFormat_Mixin 292Import_Class_ProtocolHtmlWrite_Mixin 293 294Import_Class_ProtocolWmlFormat_Mixin 295Import_Class_ProtocolWmlWrite_Mixin 296 297 298 //If you use characters that could be understod as a html tag it will be written as a tag.
299ProcedureWriteHtmlstringsHtml 300SendOutputHTMLToghInetSessionsHtml 301End_Procedure 302 303ProcedureWriteDataaddresspData 304SendOutputDataToghInetSessionpData 305End_Procedure 306 307 308 //Will output everything in the string without destroying the HTML page.
309ProcedureWriteHtmlPlainTextstringsTxt 310SendOutputPlainTextToghInetSessionsTxt 311End_Procedure 312 313FunctionValTbl_ItemsintegerhMainintegeriFileintegeriFieldreturnsinteger 314integeriItems 315getValTbl_ItemsofoDDValTblhMainiFileiFieldtoiItems 316Function_returniItems 317End_Function 318 319FunctionValTbl_ItemDataintegerhMainintegeriFileintegeriFieldintegeriItemreturnsstring 320stringsValue 321getValTbl_ItemDataofoDDValTblhMainiFileiFieldiItemtosValue 322function_returnsValue 323End_Function 324 325FunctionValTbl_ItemDescintegerhMainintegeriFileintegeriFieldintegeriItemreturnsstring 326stringsValue 327getValTbl_ItemDescofoDDValTblhMainiFileiFieldiItemtosValue 328function_returnsValue 329End_Function 330 331FunctionDDComboOptionsintegerhMainintegeriFileintegeriFieldreturnsstring 332IntegeriiItems 333stringsValuesDatsDescsItemsCrntValsSelectedsCRLF 334Move(Character(13)+character(10))tosCRLF 335getfile_field_current_valueofhMainiFileiFieldtosCrntVal 336GetValTbl_ItemshMainiFileiFieldtoiItems 337DecrementiItems 338ForiFrom0toiItems 339getValTbl_ItemDatahMainiFileiFielditosDat 340getValTbl_ItemDeschMainiFileiFielditosDesc 341Move(if(sCrntVal=sDat,'selected="selected"',''))tosSelected 342Move('')tosItem 344AppendsValuesItem //sCRLF
345Loop 346Function_ReturnsValue 347End_Function 348 349FunctionDDRecsOptionsintegerhMainintegeriFileintegeriFieldreturnsstring 350IntegeriIndexhDDiCreciRec 351stringsValuesDatsItemsSelectedsCRLF 352Move(Character(13)+character(10))tosCRLF 353GetData_SetofhMainiFiletohDD 354IfhDDGetCurrent_recordofhDDtoiCrec 355getField_Main_IndexofhMainiFileiFieldtoiIndex 356IfiIndexlt0Move1toiIndex 357sendRequest_ReadtohMainFIRST_RECORDiFileiIndex 358While(Found) 359Get_Field_ValueiFile0toiRec // compatibility w/ recnum
360Get_Field_ValueiFileiFieldtosDat 361Move(if(iCRec=iRec,'selected="selected"',''))tosSelected 362Move('')tosItem 363AppendsValuesItem //sCRLF
364sendRequest_ReadtohMainNEXT_RECORDiFileiIndex 365Loop 366Function_ReturnsValue 367End_Function 368 369FunctionDDRowIdsOptionsintegerhMainintegeriFileintegeriFieldreturnsstring 370IntegeriIndexhDD 371rowIdriCrecriRec 372stringsValuesDatsItemsSelectedsCRLF 373Move(Character(13)+character(10))tosCRLF 374GetData_SetofhMainiFiletohDD 375IfhDDGetCurrentRowIdofhDDtoriCrec 376getField_Main_IndexofhMainiFileiFieldtoiIndex 377IfiIndexlt0Move1toiIndex 378sendRequest_ReadtohMainFIRST_RECORDiFileiIndex 379While(Found) 380Move(GetRowId(iFile))toriRec 381Get_Field_ValueiFileiFieldtosDat 382Move(if(IsSameRowId(riCRec,riRec),'selected="selected"',''))tosSelected 383Move('')tosItem 384AppendsValuesItem //sCRLF
385sendRequest_ReadtohMainNEXT_RECORDiFileiIndex 386Loop 387Function_ReturnsValue 388End_Function 389 390 391FunctionHtml_Ctrl_NameintegeriFileintegeriFieldreturnsstring 392stringsNamesField 393Get_AttributeDF_File_Logical_NameofiFiletosName 394Get_AttributeDF_Field_NameofiFileiFieldtosField 395Function_Return(lowercase(sName-CONTROL_NAME_SEP-sField)) 396End_Function 397 398FunctionHtml_Ctrl_RowId_NameintegeriFilereturnsstring 399stringsNamesField 400Get_AttributeDF_File_Logical_NameofiFiletosName 401Function_Return(lowercase(sName-CONTROL_NAME_SEP-"RowId")) 402End_Function 403 404 405FunctionDDReadOnlyHTMLintegerhMainintegeriFileintegeriFieldReturnsString 406stringsRO 407integeriOpts 408Getfile_Field_OptionsofhMainiFileiFieldtoiOpts 409If(iOPTsiANDDD_NOENTER)Move'readonly="readonly" 'tosRO 410Function_ReturnsRO 411End_Function 412 413FunctionDDTitleHTMLintegerhMainintegeriFileintegeriFieldReturnsString 414stringsTitlesErr 415integeriItem 416GetFile_Field_Status_HelpofhMainiFileiFieldtosTitle 417Move(trim(HtmlEncode(sTitle)))tosTitle 418GetFileFieldErrorItemiFileiFieldtoiItem 419If(iItem>=0)Begin 420GetErrorMessageiItemtosErr 421Move(pos(" ",lowercase(sErr)))toiItem 422IfiItemgt0Move(left(sErr,iItem-1))tosErr 423AppendsTitle" **Error** "sErr 424End 425IfsTitlene""Move('title="'-sTitle-'"')tosTitle 426Function_ReturnsTitle 427End_Function 428 429 430FunctionDDFormControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 431stringsValuesDatsReadOnlysTitle 432integeriSizeiType 433 434GetFile_Field_Current_ValueofhMainiFileiFieldtosDat 435GetHtmlEncodesDattosDat 436 437IfsParamsne'' ;
438MovesParamstoiSize 439ElseBegin 440Get_AttributeDF_FIELD_TYPEOfiFileiFieldToiType 441If(iType=DF_DATE) ;
442Move10toiSize // date should be enough for xx/xx/xxxx
443ElseIf(iType=DF_DATETIME) ;
444Move26toiSize // date should be enough for xx/xx/xxxx hh:mm:ss.fff pm
445Else ;
446get_attributeDF_FIELD_LENGTHofiFileiFieldtoiSize 447IfiSizeltMIN_TEXT_SIZEMoveMIN_TEXT_SIZEtoiSize 448ElseifiSizeGTMAX_TEXT_SIZEMoveMAX_TEXT_SIZEtoiSize 449end 450 451GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 452GetDDTitleHTMLhMainiFileiFieldtosTitle 453 454Move('+string(iSize)+'"'* ;
455sReadOnly*sTitle*'name="'+Html_Ctrl_Name(Self,iFile,iField)+ ;
456'" value="'+sDat+'" />')tosValue 457 458Function_ReturnsValue 459 460end_function 461 462FunctionDDEditControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 463stringsValuesDatsReadOnlysTitle 464integeriSizeiRowsiPos 465 466getfile_field_current_valueofhMainiFileiFIeldtosdat 467GetHtmlEncodeNoCrlfsDattosDat 468 469MoveDFLT_TEXT_ROWStoiRows 470MoveMAX_TEXT_SIZEtoiSize 471IfsParamsne''Begin 472Move(Pos(",",sParams))toiPos 473IfiPosBegin 474Move(left(sParams,iPos-1))toiSize 475Move(Mid(sParams,255,iPos+1))toiRows 476End 477Else ;
478MovesParamstoiSize 479End 480 481GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 482GetDDTitleHTMLhMainiFileiFieldtosTitle 483 484Move('string(iRows)+'" cols="'+string(iSize)+'"'* ;
485sReadOnly*sTitle*'name="'+Html_Ctrl_Name(Self,iFile,iField)+'" >'+ ;
486sDat+'')tosValue 487Function_ReturnsValue 488 489end_function 490 491FunctionDDComboControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 492stringsValuesReadOnlysTitle 493GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 494GetDDTitleHTMLhMainiFileiFieldtosTitle 495GetDDComboOptionshMainiFileiFieldtosValue 496Move('')tosValue 498 //showln "....." (length(svalue)) ' ' (right(svalue,50))
499Function_ReturnsValue 500end_function 501 502 // changed to use row ids instead of recnums. Should work the same
503FunctionDDParentComboControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 504stringsValuesReadOnlysTitle 505GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 506GetDDTitleHTMLhMainiFileiFieldtosTitle 507GetDDRowIdsOptionshMainiFileiFieldtosValue 508Move('')tosValue 510Function_ReturnsValue 511end_function 512 513 // in WA/3 we now pass optional decriptions on sParams delmited by "|". e.g. "Yes|No|Maybe".
514 // If passed those are used for the radio item descriptions. If not passed, we use the database values
515 // which is consistent with WA/2.
516FunctionDDRadioControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 517stringsValuesDatSReadOnlysCheckedsItemsCrntValsDescsTitle 518integeriiItemsbCheckediPos 519 520GetFile_Field_Current_ValueofhMainiFileiFieldtosCrntVal 521GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 522GetDDTitleHTMLhMainiFileiFieldtosTitle 523GetValTbl_ItemshMainiFileiFieldtoiItems 524Move(trim(sParams))tosParams 525DecrementiItems 526ForiFrom0toiItems 527getValTbl_ItemDatahMainiFileiFielditosDat 528 // if there are descriptions passed in sParams use them one at a time
529If(sParams<>"")Begin 530Move(pos("|",sParams))toiPos // descriptions are separated by "|"
531IfiPosBegin 532Move(trim(left(sParams,iPos-1)))tosDesc 533Move(trim(mid(sParams,255,iPos+1)))tosParams 534end 535ElseBegin 536MovesParamstosDesc 537Move""tosParams 538end 539end 540else ; // if no sparams use the database description (which works well for Validation tables)
541getValTbl_ItemDeschMainiFileiFielditosDesc 542Move(if(sCrntVal=sDat,'checked="checked"',''))tosChecked 543If(sChecked<>"")Move1tobChecked 544 // if nothing was selected check the list radio (better than nothin')
545If(not(bChecked)andi=iItems)Move'checked="checked"'tosChecked 546Move(' *sChecked*sReadOnly*sTitle* ;
547'name="'+Html_Ctrl_Name(Self,iFile,iField)+ ;
548'" value="'+htmlEncode(sDat)+'" />'+ ;
549HtmlEncode(sDesc))tosItem 550AppendsValue' 'sItem 551Loop 552Function_ReturnsValue 553End_Function 554 555 556FunctionDDAutoControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 557stringsValuesReadOnly 558integeriTypeiVTypehDD 559Get_AttributeDF_Field_TypeofiFileiFieldtoiType 560IfiTypeeqDF_TEXT ;
561GetDDEditControlhMainiFileiFieldsParamstosValue 562elseBegin 563GetData_SetofhMainiFiletohDD 564IfnothDDfunction_return 565GetField_Validation_TypeofhDDiFieldtoiVType 566If(iVType=FA_VALIDATION_TYPE_CHECKBOX) ;
567GetDDRadioControlhMainiFileiFieldsParamstosValue 568elseif(iVType=FA_VALIDATION_TYPE_CHECKoriVType=FA_VALIDATION_TYPE_TABLE) ;
569GetDDComboControlhMainiFileiFieldsParamstosValue 570else ;
571GetDDFormControlhMainiFileiFieldsParamstosValue 572End 573 //showln "....." (length(svalue)) ' ' (right(svalue,50))
574Function_ReturnsValue 575end_function 576 577 // create input for WML
578FunctionDDWMLInputControlintegerhMainintegeriFileintegeriFieldstringsParamsreturnsstring 579stringsValuesDatsReadOnlysFormat 580integeriSize 581GetFile_Field_Current_ValueofhMainiFileiFieldtosDat 582GetHtmlEncodesDattosDat 583 584Get_attributeDF_FIELD_LENGTHofiFileiFieldtoiSize 585 586GetDDReadOnlyHTMLhMainiFileiFieldtosReadOnly 587 588If(sParams<>"") ;
589Move('format="'-sParams-'"')tosFormat 590 591If(sReadOnly="") ;
592Move('+Html_Ctrl_Name(Self,iFile,iField)+ ;
593'" value="'+sDat+ ;
594'" maxlength="'+string(iSize)+ ;
595'"'*sFormat*'/>')tosValue 596Else ;
597MovesDattosValue // if readonly...just return the ddValue
598 599Function_ReturnsValue 600 601end_function 602 603 604FunctionDDFieldErrintegerhMainintegeriFileintegeriFieldintegerbShortreturnsstring 605integeriItem 606stringsErr 607GetFileFieldErrorItemiFileiFieldtoiItem 608If(iItem>=0)Begin 609GetErrorMessageiItemtosErr 610If(sErr='') ;
611Move"Field Error"tosErr 612ElseIfbShortBegin 613Move(pos(" ",lowercase(sErr)))toiItem 614IfiItemgt0Move(left(sErr,iItem-1))tosErr 615End 616Function_returnsErr 617End 618Function_returnsErr 619End_Function 620 621 622 // This replaces the standard ddValue
623 //
624FunctionDDHndValueintegerhMainintegeriFileintegeriFieldintegeriOptionstringsParamsReturnsstring 625stringsValuesErr 626integeriMsgiItemiType 627 628 // Note that we use pbEncodeddValue to determine if data should be html encoded. This is set by
629 // the system and you should not change that here. Some ddvalues params always enccode because they
630 // make no sense in any other context (e.g. ddForm, ddAuto) while other are affected by this property
631 // (e.g. ddCrntValue, ddDesc). If this method is augmented you can use this property to determine if
632 // you need an htmlencode of not.
633 634CaseBegin 635CaseiOptioneqDDCRNTVALUE 636GetDDCurrentValuehMainiFileiFieldtosValue 637caseBreak 638 639CaseiOptioneqDDLONGLABELMoveDD_LABEL_LONGtoiType 640CaseiOptioneqDDSHORTLABELMoveDD_LABEL_SHORTtoiType 641CaseiOptioneqDDTAGLABELMoveDD_LABEL_TAGtoiType 642GetFile_Field_LabelofhMainiFileiFieldiTypetosValue 643If(pbEncodeDDValue(self)) ;
644GetHtmlEncodesValuetosValue 645If(sParams>0)Begin 646GetFileFieldErrorItemiFileiFieldtoiItem 647ifiItemge0begin 648Move(''*sValue)tosValue 649IfsParamseq2begin 650GetErrorMessageiItemtosErr 651Move(pos(" ",lowercase(sErr)))toiItem 652IfiItemgt0Move(left(sErr,iItem-1))tosErr 653AppendsValue' **'sErr'' 654End 655AppendsValue'' 656End 657end 658caseBreak 659 660CaseiOptioneqDDDESCMoveGet_File_Field_Current_DescriptiontoiMsg 661 //Case iOption eq DDSTHELP Move Get_File_Field_Status_Help to iMsg
662CaseiOptioneqDDOPTMoveGet_File_Field_OptionstoiMsg 663 // all of the above will drop to here
664GetiMsgofhMainiFileiFieldtosValue 665If(pbEncodeDDValue(self)) ;
666GetHtmlEncodesValuetosValue 667CaseBreak 668 669CaseiOptioneqDDSTHELP 670GetGet_File_Field_Status_HelpofhMainiFileiFieldtosValue 671If(pbEncodeDDValue(self)) ;
672GetHtmlEncodesValuetosValue 673IfsParamseq"1"Begin 674GetFileFieldErrorItemiFileiFieldtoiItem 675If(iItem>=0)Begin 676GetErrorMessageiItemtosErr 677AppendsValue" Error: "sErr 678End 679End 680CaseBreak 681 682CaseiOptioneqDDVALNUM 683GetValTbl_ItemshMainiFileiFieldtosValue 684CaseBreak 685 686CaseiOptioneqDDVALDATA 687MovesParamstoiItem 688GetValTbl_ItemDatahMainiFileiFieldiItemtosValue 689If(pbEncodeDDValue(self)) ;
690GetHtmlEncodesValuetosValue 691CaseBreak 692 693CaseiOptioneqDDVALDESC 694MovesParamstoiItem 695GetValTbl_ItemDeschMainiFileiFieldiItemtosValue 696If(pbEncodeDDValue(self)) ;
697GetHtmlEncodesValuetosValue 698CaseBreak 699 700 // these are HTML helper messages
701CaseiOptioneqDDCHCK 702Move(If(File_Field_Current_value(hMain,iFile,iField)=sParams,'checked="checked"',""))tosValue 703CaseBreak 704 705CaseiOptioneqDDSEL 706Move(If(File_Field_Current_value(hMain,iFile,iField)=sParams,'selected="selected"',""))tosValue 707CaseBreak 708 709CaseiOptioneqDDOPTION 710GetDDComboOptionshMainiFileiFieldtosValue 711CaseBreak 712 713CaseiOptioneqDDREADONLY 714GetDDReadOnlyHTMLhMainiFileiFieldtosValue 715CaseBreak 716 717CaseiOptioneqDDROWIDS 718GetDDRowIdsOptionshMainiFileiFieldtosValue 719CaseBreak 720CaseiOptioneqDDRECS 721GetDDRecsOptionshMainiFileiFieldtosValue 722CaseBreak 723CaseiOptioneqDDTITLE 724GetDDTitleHtmlhMainiFileiFieldtosValue 725CaseBreak 726CaseiOptioneqDDFIELDERROR 727GetDDFieldErrhMainiFileiField0tosValue 728CaseBreak 729CaseiOptioneqDDSHORTFIELDERROR 730GetDDFieldErrhMainiFileiField1tosValue 731CaseBreak 732 733 734 // these are dynamic form options. They create the entire html control
735CaseiOptioneqDDFORM 736GetDDFormControlhMainiFileiFieldsParamstosValue 737CaseBreak 738CaseiOptioneqDDEDIT 739GetDDEditControlhMainiFileiFieldsParamstosValue 740CaseBreak 741CaseiOptioneqDDCOMBO 742GetDDComboControlhMainiFileiFieldsParamstosValue 743CaseBreak 744CaseiOptioneqDDRADIO 745GetDDRadioControlhMainiFileiFieldsParamstosValue 746CaseBreak 747CaseiOptioneqDDPARENTCOMBO 748GetDDParentComboControlhMainiFileiFieldsParamstosValue 749CaseBreak 750CaseiOptioneqDDAUTO 751GetDDAutoControlhMainiFileiFieldsParamstosValue 752CaseBreak 753 754 // wml input form
755CaseiOptioneqDDWMLINPUT 756GetDDWmlInputControlhMainiFileiFieldsParamstosValue 757CaseBreak 758 759CaseEnd 760Function_returnsValue 761 762End_function 763 764 // This creates an entire HTML output entry form automatically for all fields that
765 // are not binary or overlap
766FunctionAutoEntrystringsFileNamereturnsinteger 767integerhDDiFileiFldsiiType 768stringsValuesLblStartsLblEndsDatStartsDatEnd 769 //
770GetpsAutoEntryLabelStarttosLblStart 771GetpsAutoEntryLabelEndtosLblEnd 772GetpsAutoEntryDataStarttosDatStart 773GetpsAutoEntryDataEndtosDatEnd 774 //
775GetMapFileNametoDDsFileNameFalsetohDD // Must find the file
776IfnothDDFunction_return0 777GetMain_fileofhDDtoiFile 778Get_AttributeDF_FILE_NUMBER_FIELDSofiFiletoiFlds 779 // create hidden rowid field
780Move('+Html_Ctrl_RowId_Name(Self,iFile)+ ;
781'" value="'+SerializeRowId(CurrentRowId(hdd))+'" />')tosValue 782SendWriteHtmlsValue 783 // create changed state field
784Move''tosValue 785SendWriteHtmlsValue 786 787 788 //
789SendWriteHtmlTableBegin'class="EntryTable"' 790Forifrom1toiFlds 791Get_AttributeDF_FIELD_TYPEofiFileitoiType 792If(iType<>DF_OVERLAPandiType<>DF_BINARY)Begin 793SendWriteHtmlRowBegin 794GetddHndValuehDDiFileiDDSHORTLABEL2tosValue 795SendWriteHtml(sLblStart+sValue+sLblEnd) 796GetddHndValuehDDiFileiDDAUTO''tosValue 797SendWriteHtml(sDatStart+sValue+sDatEnd) 798SendWriteHtmlRowEnd 799End 800Loop 801SendWriteHtmlTableEnd 802IfnothDDFunction_return1 803End_function 804 805 // not used. keeps the compiler happy
806{ Visibility=Private } 807FunctionDoAutoReportintegeriIndexstringsHrefintegeriMaxintegeriStartReturnsinteger 808end_function 809 810 // Auto report.
811 // pass: FileName, Index, ASP-href name
812FunctionAutoReportstringsFileNamestringiIndexstringsHRefintegeriMaxintegeriStartreturnsinteger 813integerhDDhWBPObStat 814integeriFileiField 815handlehAutoReport 816GetphAutoWebReporttohAutoReport 817If(hAutoReport=0)function_return0 818 819GetMapFileNametoDDsFileNameFalsetohDD // Must find the file
820IfnothDDFunction_return1 821GetMain_FileofhDDtoiFile 822MoveSelftohWBPO 823 // support passing of index number or field name - if
824 // field name is passed, use main index of field
825// Move (trim(sIndex)) to sIndex
826// If sIndex eq '' ;
827// Move 1 to iIndex
828// else If ("0123456789" contains left(sIndex,1)) ;
829// Move sIndex to iIndex
830// else Begin
831// Field_Map iFile sIndex to iField
832// Get_Attribute DF_FIELD_Index of iFile iField to iIndex
833// End
834IfiIndexlt0Move1toiIndex 835 //
836GetDoAutoReportofhAutoReportiIndexsHRefiMaxiStarttobStat 837function_returnbStat 838End_function 839 840 // Find by recnum. Pass FileName and record ID
841FunctionDoRequestFindbyRecIdstringsfileNameStringsRecreturnsinteger 842IntegerhDD 843integeriFileiRec 844SendClearErrors 845MovesRectoiRec 846GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
847If(hDD=0)function_returnTrue 848GetMain_fileofhDDtoiFile // this is the file#
849SendFind_by_recnumofhDDiFileiRec 850Function_return(not(HasRecord(hDD))) 851End_Function 852 853 // Find by rowed. Pass FileName and serialized row id
854FunctionDoRequestFindbyRowIdstringsfileNameStringsRecreturnsinteger 855IntegerhDD 856integeriFile 857RowidriRec 858SendClearErrors 859Move(DeserializeRowid(sRec))toriRec 860GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
861If(hDD=0)function_returnTrue 862GetMain_fileofhDDtoiFile // this is the file#
863SendFindByRowIdofhDDiFileriRec 864Function_return(not(HasRecord(hDD))) 865End_Function 866 867 868 869 // Create a Combo with all Indexes for passed File and current selected fldname
870 // returns control named FindIndex
871FunctionCreateFindIndexCombostringsComboNamestringsfileNameintegeriDfltIndexreturnsstring 872IntegerhDD 873integeriFileiiNumFldsiTypeiNdx 874stringsFldTagsFldNamesOptionsSelsIndx 875 876GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
877 //Showln "in createfindindexcombo " sfilename ' dflt=' sDefaultField ' hdd=' hdd
878IfhDDeq0function_return1 879 880GetMain_fileofhDDtoiFile // this is the file#
881Get_AttributeDF_FILE_NUMBER_FIELDSofiFiletoiNumFlds 882 883SendWriteHtml('sComboName-'">') 884Move"/"tosIndx 885ForiFrom1toiNumFlds 886Get_AttributeDF_FIELD_TYPEofiFileitoiType 887If(iType<>DF_OVERLAPandiType<>DF_BINARY)Begin 888Get_AttributeDF_FIELD_IndexofiFileitoiNdx 889if(iNdx>0ANDpos("/"+string(iNdx)+"/",sIndx)=0)begin 890Move(sIndx+string(iNdx)+"/")tosIndx 891GetField_LabelofhDDiDD_LABEL_LONGtosFldName 892 //Get_Attribute DF_FIELD_Name of iFile i to sFldTag
893Move(if(iDfltIndex=iNdx,'selected="selected"',""))tosSel 894Move(' ')tosOption 895SendWriteHtmlsOption 896end 897End 898Loop 899SendWriteHtml'' 900 901End_Function 902 903 // create index selector for WML
904FunctionWmlCreateFindIndexSelectstringsComboNamestringsfileNameintegeriDfltIndexreturnsstring 905IntegerhDD 906integeriFileiiNumFldsiTypeiNdx 907stringsFldTagsFldNamesOptionsIndx 908 909GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
910IfhDDeq0function_return1 911 912GetMain_fileofhDDtoiFile // this is the file#
913Get_AttributeDF_FILE_NUMBER_FIELDSofiFiletoiNumFlds 914SendWriteWml('sComboName-'" value="'-string(iDfltIndex)-'">') 915Move"/"tosIndx 916ForiFrom1toiNumFlds 917Get_AttributeDF_FIELD_TYPEofiFileitoiType 918If(iType<>DF_OVERLAPandiType<>DF_BINARY)Begin 919Get_AttributeDF_FIELD_IndexofiFileitoiNdx 920if(iNdx>0ANDpos("/"+string(iNdx)+"/",sIndx)=0)begin 921Move(sIndx+string(iNdx)+"/")tosIndx 922GetField_LabelofhDDiDD_LABEL_LONGtosFldName 923Move(' string(iNdx)-'">'-wmlEncode(sFldName)-'')tosOption 924SendWriteWmlsOption 925end 926End 927Loop 928SendWriteWml'' 929End_Function 930 931 // return field name of first segment in index
932FunctionIndexMainFieldstringsfileNameintegeriIndexreturnsstring 933IntegerhDD 934integeriFileiFld 935stringsFldName 936GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
937IfhDDeq0function_return"" 938GetMain_fileofhDDtoiFile // this is the file#
939Get_AttributeDF_INDEX_SEGMENT_FIELDofiFileiIndex1toiFld 940Get_AttributeDF_FIELD_NAMEofiFileiFldtosFldName 941Function_return(lowercase(sFldName)) 942End_Function 943 944 945 // ddFind
946 // Find Record from primed DD buffer
947 // Note: 2nd param (sFieldName) can be a field (if name passed) or an index (if number passed)
948 //
949FunctionddFindstringsFileNamestringsFieldNameIntegeriFindModereturnsinteger 950IntegerhDDiFileiFieldiIndex 951integerbErrbIsIndex 952 953SetphLastFindDDto0 954 955GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
956Move(hDD=0)tobErr 957GetMain_fileofhDDtoiFile // this is the file#
958ifNotbErrBegin 959Move(trim(sFieldName))tosFieldName 960If(sFieldName='')Begin 961Move1toiIndex 962Move1tobIsIndex 963end 964elseIf("0123456789"containsleft(sFieldName,1))Begin 965MovesFieldNametoiIndex 966Move1tobIsIndex 967end 968ElseBegin 969GetMaptoFieldNumberiFilesFieldNameToiField 970If(iField<0)Move1tobErr 971end 972End 973 974IfNotbErrBegin 975 976IfNotbIsIndex ;
977GetField_Main_IndexofhDDiFileiFieldtoiIndex 978If(iIndex>=0)Begin 979SetphLastFindDDtohDD 980SetpiLastFindIndextoiIndex 981SendFile_Index_FindofhDDiFindModeiFileiIndexTrueFalseFalse // Error will not be reported
982Function_return(found) 983end 984End 985End_Function 986 987 // ddFindFirst
988 // Find First record.
989 // Note: 2nd param can be a field (if name passed) or an index (if number passed)
990 //
991FunctionddFindFirststringsFilestringsFieldReturnsinteger 992IntegerbFound 993GetDDFindsFilesFieldFIRST_RECORDtobFound 994Function_returnbFound 995End_function 996 997 // ddFindLast
998 // Find last record.
999 // Note: 2nd param can be a field (if name passed) or an index (if number passed)
1000 //
1001FunctionddFindLaststringsFilestringsFieldReturnsinteger 1002IntegerbFound 1003GetDDFindsFilesFieldLAST_RECORDtobFound 1004Function_returnbFound 1005End_function 1006 1007 // ddFindNext
1008 // Find next record. Must be primed with a ddFind, ddFindFirst or ddFindLast
1009 // This takes no params, it uses last "primed" find data.
1010 //
1011FunctionddFindNextreturnsinteger 1012IntegerhDDiFileiIndx 1013GetphLastFindDDtohDD 1014GetpiLastFindIndextoiIndx 1015IfhDDBegin 1016GetMain_fileofhDDtoiFile 1017SendRequest_FindofhDDGTiFileiIndx 1018Function_return(Found) 1019End 1020End_Function 1021 1022 // ddFindPrev
1023 // Find previous record. Must be primed with a ddFind, ddFindFirst or ddFindLast
1024 // This takes no params, it uses last "primed" find data.
1025FunctionddFindPrevreturnsinteger 1026IntegerhDDiFileiIndx 1027GetphLastFindDDtohDD 1028GetpiLastFindIndextoiIndx 1029IfhDDBegin 1030GetMain_fileofhDDtoiFile 1031SendRequest_FindofhDDLTiFileiIndx 1032Function_return(Found) 1033End 1034End_function 1035 1036 // ddFindbyrecId
1037 // Find by record Id. Pass FileName and record ID
1038 //
1039FunctionddFindbyRecIdstringsfileNameStringsRecreturnsinteger 1040HandlehDD 1041integeriRec 1042MovesRectoiRec 1043GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
1044IfhDDBegin 1045SendFind_by_RecnumofhDD(main_file(hDD))iRec // this will do a DD find by recnum
1046Function_return(found) 1047End 1048End_Function 1049 1050FunctionddFindbyRowIdstringsfileNamestringsSerializedRowIdreturnsinteger 1051HandlehDD 1052GetMapFileNametoDDsFileNameTruetohDD // this is the find DD
1053IfhDDBegin 1054SendFindByRowIdofhDD(main_file(hDD))(DeserializeRowId(sSerializedRowId)) // this will do a DD find by row id
1055Function_return(found) 1056End 1057End_Function 1058 1059 1060 // ddClear
1061 //
1062FunctionddClearstringsFilereturnsinteger 1063HandlehDD 1064SetphLastFindDDto0 1065GetMapFileNametoDDsFileTruetohDD // this is the find DD
1066IfhDDBegin 1067SendCleartohDD 1068Function_return1 1069end 1070End_function 1071 1072 // ddDelete
1073 // Delete current record in DD
1074 //
1075FunctionddDeletestringsFilereturnsinteger 1076HandlehDD 1077IntegerbErr 1078GetMapFileNametoDDsFileTruetohDD // this is the find DD
1079IfhDDBegin 1080SendRequest_deleteofhDD 1081Move(Err)tobErr 1082Function_return(not(bErr)) 1083end 1084End_Function 1085 1086 // ddSave
1087 // This does a validate and a save.
1088 //
1089FunctionddSavestringsFilereturnsinteger 1090HandlehDD 1091IntegerbErr 1092GetMapFileNametoDDsFileTruetohDD // this is the find DD
1093IfhDDBegin 1094GetRequest_Validate_AllofhDDtobErr // Validate-All Fields (includes FindReq)
1095IfNotbErrBegin 1096SendRequest_SaveofhDD // Ask DD to save the Record
1097Move(Err)tobErr // Err indicator is returned if failure
1098End 1099Function_return(not(bErr)) 1100end 1101End_Function 1102 1103 // ddValidate
1104 // validate all fields (even if error is encountered all fields are validated)
1105 //
1106FunctionddValidatestringsFilereturnsinteger 1107HandlehDD 1108IntegerbErr 1109GetMapFileNametoDDsFileTruetohDD // this is the find DD
1110IfhDDBegin 1111GetRequest_Validate_AllofhDDtobErr // Validate-All Fields (includes FindReq)
1112Function_return(not(bErr)) 1113end 1114End_Function 1115 1116 1117 //*************************************************************************
1118 //*** Interface reporting:
1119 //*************************************************************************
1120 1121 // Ideally these two messages belong in the DD class.
1122 1123 // traverse All DDOs starting at the parent most and working down.
1124{ Visibility=Private } 1125ProcedureEnumerate_DDOsintegerhDDintegerhMsgintegerhObjstringsP1stringsP2 1126SendInitialize_VisitedtohDDTrueFalse // False=don't clear Column marks
1127SendPrivateEnumerate_DDOshDDhMsghObjsP1sP2 1128End_procedure 1129 1130{ Visibility=Private } 1131ProcedurePrivateEnumerate_DDOsintegerhDDintegerhMsgintegerhObjstringsP1stringsP2 1132IntegerhDDNext 1133IntegeriCountiMax 1134 // mark visisted so that it does not get revisited by a server looking down
1135SetVisited_StateofhDDtoTRUE 1136 // First process all server DDs (and all server's clients)
1137GetData_Set_Server_CountofhDDtoiMax 1138DecrementiMax 1139ForiCountfrom0toiMax 1140GetData_Set_ServerofhDDiCounttohDDNext 1141IfNot(Visited_state(hDDNext)) ;
1142SendPrivateEnumerate_DDOshDDNexthMsghObjsP1sP2 1143Loop 1144 // All servers processed, now process self
1145SendhMsgtohObjhDDsP1sP2 1146 // Now process all client DDs (and all client's servers)
1147GetData_Set_Client_CountofhDDtoiMax 1148DecrementiMax 1149ForiCountfrom0toiMax 1150GetData_Set_ClientofhDDiCounttohDDNext 1151IfNot(Visited_state(hDDNext)) ;
1152SendPrivateEnumerate_DDOshDDNexthMsghObjsP1sP2 1153Loop 1154End_Procedure 1155 1156 1157{ Visibility=Private } 1158FunctionYesNointegerbStateReturnsString 1159Function_Return(if(bState,"Yes","No")) 1160End_Function 1161 1162{ Visibility=Private } 1163FunctionTrueFalseintegerbStateReturnsString 1164Function_Return(if(bState,"TRUE","FALSE")) 1165End_Function 1166 1167{ Visibility=Private } 1168ProcedureShowddValueintegerhoObjintegerhmMsg 1169stringsparam1sParam2sCommentsStr1sStr 1170integerhddviParam1iCounti 1171GethDDValueInterfacetohddv 1172IfhddvBegin 1173SendhmMsgtohoObj(" DDValue Interface") 1174GetddValueCountofhddvtoiCount 1175Move' Obj.ddValue("sTable.Column"'tosStr1 1176ForiFrom0to(iCount-1) 1177GetParam1NumberofhddvitoiParam1 1178GetParam1strofhddvitosParam1 1179GetParam2StrofhddvitosParam2 1180GetddValCmntofhddvitosComment 1181MovesStr1tosStr 1182If(sParam1<>'')begin 1183Move(sStr+","*sParam1)tosStr 1184If(sParam2<>'') ;
1185Move(sStr+","*sParam2)tosStr 1186End 1187Move(sStr+") /"+"/"*sComment*if(sParam1<>"","("+sParam1+"="+string(iParam1)+")",""))tosStr 1188SendhmMsgtohoObjsStr 1189Loop 1190SendhmMsgtohoObj"" 1191end 1192End_Procedure 1193 1194 1195{ Visibility=Private } 1196ProcedureShowDDDataintegerhDDintegerhoObjintegerhmMsg 1197stringsTablesColumn 1198integeriTableiColumnsiTypei 1199BooleanbRecnumTable 1200SendhmMsgtohoObj(" "+Object_Label(hDD)*If(hDD=Main_dd(self),"(Main DDO)","")) 1201GetMain_fileofhDDtoiTable 1202Get_AttributeDF_FILE_LOGICAL_NAMEofiTabletosTable 1203Get_AttributeDF_FILE_NUMBER_FIELDSofiTabletoiColumns 1204Get_AttributeDF_FILE_RECNUM_TABLEofiTabletobRecnumTable 1205 // only add recnum of table supports that type
1206If(bRecnumTable)begin 1207SendhmMsgtohoObj(Lowercase(" "+sTable-'.'-"RECNUM")) 1208end 1209ForiFrom1toiColumns 1210Get_AttributeDF_FIELD_TYPEofiTableitoiType 1211If(iType<>DF_OVERLAPANDiType<>DF_BINARY)Begin 1212Get_AttributeDF_FIELD_NAMEofiTableitosColumn 1213SendhmMsgtohoObj(Lowercase(" "+sTable-'.'-sColumn)) 1214End 1215Loop 1216End_Procedure 1217 1218{ Visibility=Private } 1219ProcedureShowWBODataintegerhoObjintegerhmMsgintegeriMode 1220StringsNamesParamssComment 1221integeriCountiItemhMainDD 1222SendhmMsgtohoObj("WBO:"*Object_Label(self)*"-"*psDescription(self)) 1223SendhmMsgtohoObj"" 1224 1225GetMain_ddtohMainDD 1226IfNothMainDD ;
1227SendhmMsgtohoObj"Main DD is not Defined" 1228ElseBegin 1229SendEnumerate_DDOshMainDDmsg_showDDDataselfhoObjhmMsg 1230end 1231SendhmMsgtohoObj"" 1232SendhmMsgtohoObj(" Allow RequestSave (New):"*YesNo(self,pbAllowSaveNew(self))) 1233SendhmMsgtohoObj(" Allow RequestSave (Edit):"*YesNo(self,pbAllowSaveEdit(self))) 1234SendhmMsgtohoObj(" Allow RequestDelete:"*YesNo(self,pbAllowDelete(self))) 1235SendhmMsgtohoObj(" Allow RequestClear:"*YesNo(self,pbAllowClear(self))) 1236SendhmMsgtohoObj(" Allow RequestFind:"*YesNo(self,pbAllowFind(self))) 1237SendhmMsgtohoObj(" Allow RequestDDUpdate:"*YesNo(self,pbAllowDDUpdate(self))) 1238 1239If(pbUseOpenEvalInterface(Self)) ;
1240SendhmMsgtohoObj(' Open "eval" interface is enabled for "Call"') 1241GetInterfaceMessageCounttoiCount 1242If(iCount>0)Begin 1243SendhmMsgtohoObj"" 1244SendhmMsgtohoObj(" Call Interface:"*If(pbUseOpenEvalInterface(Self),'Open "eval" interface enabled','')) 1245ForiItemFrom0to(iCount-1) 1246GetInterfaceMessageNameiItemtosName 1247GetInterfaceMessageParamsiItemtosParams 1248GetInterfaceMessageCommentiItemtosComment 1249SendhmMsgtohoObj(" "+sName*sParams+" /"+"/"*sComment) 1250Loop 1251End 1252SendhmMsgtohoObj"" 1253SendShowDDValuehoObjhmMsg 1254End_Procedure 1255 1256 1257 // FormatXmlObjName
1258 // ----------------
1259 // This is a cheap way to improve the way that object names appear in WebApp.xml
1260 // At least it is better than ALLCAPS.
1261 1262{ Visibility=Private } 1263FunctionFormatXmlObjNameStringsObjectReturnsString 1264StringsTemp 1265 1266Move(Lowercase(sObject))TosObject 1267 1268If(Length(sObject)>1)Begin 1269If(Left(sObject,1)="o")Begin 1270Move(Mid(sObject,1,2))TosTemp 1271Move(Uppercase(sTemp))TosTemp 1272Move(Overstrike(sTemp,sObject,2))TosObject 1273End 1274ElseBegin 1275Move(Mid(sObject,1,1))TosTemp 1276Move(Uppercase(sTemp))TosTemp 1277Move(Overstrike(sTemp,sObject,1))TosObject 1278End 1279End 1280Function_ReturnsObject 1281End_Function // FormatXmlObjName
1282 1283 // GetParamType
1284 // ------------
1285 // determine the parameter type by analysing the parameter name.
1286 // The analysis is case-sensitive, so the name must be case-exact...
1287 1288{ Visibility=Private } 1289FunctionGetParamTypeStringsParamNameReturnsString 1290CaseBegin 1291Case(sParamName="sTable") 1292Function_Return"ptTableName" 1293CaseBreak 1294 1295Case(sParamName="sColumn") 1296Function_Return"ptColumnName" 1297CaseBreak 1298 1299Case(sParamName="sTableColumn") 1300Function_Return"ptTableColumnName" 1301CaseBreak 1302 1303Case(sParamName="iTable") 1304Function_Return"ptTableNumber" 1305CaseBreak 1306 1307Case(sParamName="iColumn") 1308Function_Return"ptColumnNumber" 1309CaseBreak 1310 1311CaseElse 1312Function_Return"ptUnspecified" 1313CaseBreak 1314CaseEnd 1315End_Function // GetParamType
1316 1317 1318 1319 // ShowXMLddValue
1320 // --------------
1321 1322{ Visibility=Private } 1323ProcedureShowXMLddValueintegerhObj 1324stringsparam1sParam2sComment 1325Handlehddv 1326IntegeriParamNumberiCounti 1327 1328GethDDValueInterfacetohddv 1329 1330If(hddv)Begin 1331GetddValueCountofhddvtoiCount 1332 1333ForiFrom0to(iCount-1) 1334GetParam1NumberofhddvitoiParamNumber 1335GetParam1strofhddvitosParam1 1336GetParam2StrofhddvitosParam2 1337GetddValCmntofhddvitosComment 1338SendBegin_XML_TagtohObj'ddValueMessage' // <ddValueMessage>
1339SendAdd_XML_TagtohObj'ddValueName'sParam1('Constant="'+string(iParamNumber)+'"') 1340SendAdd_XML_TagtohObj'ddValueDescription'sComment 1341 1342If(Trim(sParam2)<>"")Begin 1343 // Output the Param Tag........................
1344 // Here we create special logic to output extra
1345 // parameter information about specific types
1346 // of ddValueName..............................
1347CaseBegin 1348Case(sParam1='DDSTHELP') 1349SendBegin_XML_TagtohObj'Param ParamType="ptBoolean"' 1350SendAdd_XML_TagtohObj'ParamName'sParam2 1351SendEnd_XML_TagtohObj'Param' 1352CaseBreak 1353 1354CaseElse 1355 // For all other ddValueNames just do the
1356 // standard parameter name analysis.
1357SendBegin_XML_TagtohObj('Param ParamType="'+GetParamType(Self,sParam2)+'"') 1358SendAdd_XML_TagtohObj'ParamName'sParam2 1359SendEnd_XML_TagtohObj'Param' 1360CaseBreak 1361CaseEnd 1362End // If sParam2 <> ""
1363SendEnd_XML_TagtohObj"ddValueMessage" // </ddValueMessage>
1364Loop 1365end 1366End_Procedure // ShowXMLddValue
1367 1368 // ShowXMLDDdata
1369 // -------------
1370 1371{ Visibility=Private } 1372ProcedureShowXMLDDdataintegerhDDintegerhObj 1373stringsTablesColumn 1374StringsMainDD 1375integeriTableiColumnicColumniType 1376BooleanbRecnumTable 1377 1378If(Main_dd(Self)=hDD)Move"TRUE"TosMainDD 1379ElseMove"FALSE"TosMainDD 1380 1381SendBegin_XML_TagtohObj('DDO IsMainDDO="'+sMainDD+'"') // <DDO>
1382GetMain_fileofhDDtoiTable 1383Get_AttributeDF_FILE_LOGICAL_NAMEofiTabletosTable 1384Get_AttributeDF_FILE_NUMBER_FIELDSofiTabletoicColumn 1385Get_AttributeDF_FILE_RECNUM_TABLEofiTabletobRecnumTable 1386 1387SendAdd_XML_TagtohObj"DDOClass""not implemented" 1388SendAdd_XML_TagtohObj"DDOName"(FormatXmlObjName(Self,Object_Label(hDD))) 1389SendAdd_XML_TagtohObj"TableName"(lowercase(sTable)) 1390SendAdd_XML_TagtohObj"TableNumber"iTable 1391 1392If(icColumn>0)Begin 1393SendBegin_XML_TagtohObj'Columns' // <Columns>
1394 1395 // only add recnum of table supports that type
1396If(bRecnumTable)begin 1397SendBegin_XML_TagtohObj'Column' // <Column>
1398SendAdd_XML_TagtohObj'ColumnName''recnum' 1399SendEnd_XML_TagtohObj'Column' // </Column>
1400end 1401 1402ForiColumnFrom1toicColumn 1403Get_AttributeDF_FIELD_TYPEofiTableiColumntoiType 1404If(iType<>DF_OVERLAPANDiType<>DF_BINARY)Begin 1405Get_AttributeDF_FIELD_NAMEofiTableiColumntosColumn 1406SendBegin_XML_TagtohObj'Column' // <Column>
1407SendAdd_XML_TagtohObj'ColumnName'(lowercase(sColumn)) 1408SendEnd_XML_TagtohObj'Column' // </Column>
1409End 1410Loop 1411SendEnd_XML_TagtohObj'Columns' // </Columns>
1412End // If there are any columns
1413SendEnd_XML_TagtohObj"DDO" // </DDO>
1414End_Procedure // ShowXmlDDdata
1415 1416 1417 // ShowXmlMethodParameters
1418 // -----------------------
1419 // This method parses the sParams and outputs the <Params> collection of WebApp.xml.
1420 // The sParams string is derived from the InterfaceMessageParams property of a given
1421 // interface method.
1422 1423{ Visibility=Private } 1424ProcedureShowXmlMethodParametersIntegerhObjStringsParamsintegerbExtendedParams 1425StringsParamTypesParamNamesUCParamName 1426StringsOriginal 1427IntegeriPos 1428IntegericLoop 1429 1430 // determine if there are any params....................
1431Move(Trim(sParams))TosParams 1432MovesParamsTosOriginal 1433 1434IfbExtendedParamsbegin 1435 // if extended and it is returns, we are done. No <params>
1436Move(Pos(" ",sParams))ToiPos 1437If(iPos=0)Move(Length(sParams))ToiPos 1438Move(lowercase(trim(Left(sParams,iPos))))TosParamName 1439If(sParamName="returns") ; // if returns, make string empty to end it
1440Move""tosParams 1441end 1442 1443If(sParams<>"")Begin 1444Move0ToicLoop 1445 1446SendBegin_XML_TagtohObj"Params" // <Params>
1447While(Trim(sParams)<>"") 1448IfbExtendedParamsbegin 1449 // if extended, strip the datatype. If the DT is returns, we are done.
1450Move(Pos(" ",sParams))ToiPos 1451If(iPos=0)Move(Length(sParams))ToiPos 1452Move(lowercase(trim(Left(sParams,iPos))))TosParamName 1453If(sParamName="returns") ; // if returns, make string empty to end it
1454Move''tosParams 1455else ;
1456Move(Trim(Remove(sParams,1,iPos)))TosParams 1457end 1458If(sParams<>"")begin // could be empty from extended stuff
1459 // extract the next parameter...................
1460Move(Pos(" ",sParams))ToiPos 1461If(iPos=0)Move(Length(sParams))ToiPos 1462Move(trim(Left(sParams,iPos)))TosParamName 1463Move(Remove(sParams,1,iPos))TosParams 1464Move(Trim(sParams))TosParams 1465 1466Move(GetParamType(Self,sParamName))TosParamType 1467 1468 // Output the parameter tag..................... // <Param>
1469SendBegin_XML_TagtohObj('Param ParamType="'-sParamType-'"') 1470SendAdd_XML_TagtohObj'ParamName'sParamName 1471SendEnd_XML_TagtohObj'Param' // </Param>
1472End 1473 1474 // infinite loop control........................
1475IncrementicLoop 1476If(icLoop>1000)Begin // there should definitely not be more that 1000 loops!
1477ErrorDFERR_PROGRAM(SFormat(C_$ParamCountExceeded,sOriginal)) 1478End 1479If(icLoop>1000)Break 1480Loop 1481 1482SendEnd_XML_TagtohObj"Params" // </Params>
1483End 1484End_Procedure // ShowXmlMethodParameters
1485 1486 1487 // ShowXml
1488 // -------
1489 // XML Output. Both of these messages expect that hOBj understands the messages
1490 // Add_xml_tag, begin_xml_tag and end_xml_tag
1491 1492{ Visibility=Private } 1493ProcedureShowXmlintegerhObj 1494StringsMethodNamesParamssComment 1495StringsMethodType 1496integeriCountiItem 1497HandlehMainDD 1498IntegerbExtended 1499 1500SendAdd_XML_TagtohObj"WBOName"(FormatXmlObjName(Self,Object_Label(self))) 1501SendAdd_XML_TagtohObj"WBODescription"(psDescription(self)) 1502 1503 // If there is no Main DDO then we can't enumerate
1504 // the DDOs so we cant output these tags..........
1505GetMain_ddTohMainDD 1506 1507If(hMainDD)Begin 1508SendBegin_XML_TagtohObj"DDOs" // <DDOs> (0 or 1)
1509SendEnumerate_DDOshMainDDmsg_showXMLDDdataselfhObj"" 1510SendEnd_XML_TagtohObj"DDOs" // </DDOs>
1511End // If there is a main_DDO
1512 1513SendBegin_XML_TagtohObj"AllowRequests" // <AllowRequests>
1514SendAdd_XML_TagtohObj"AllowRequestSaveNew"(TrueFalse(self,pbAllowSaveNew(self))) 1515SendAdd_XML_TagtohObj"AllowRequestSaveEdit"(TrueFalse(self,pbAllowSaveEdit(self))) 1516SendAdd_XML_TagtohObj"AllowRequestDelete"(TrueFalse(self,pbAllowDelete(self))) 1517SendAdd_XML_TagtohObj"AllowRequestClear"(TrueFalse(self,pbAllowClear(self))) 1518SendAdd_XML_TagtohObj"AllowRequestFind"(TrueFalse(self,pbAllowFind(self))) 1519SendAdd_XML_TagtohObj"AllowRequestDDUpdate"(TrueFalse(self,pbAllowDDUpdate(self))) 1520 //Send Add_XML_Tag to hObj "AllowDoProcess" (TrueFalse(self,pbAllowDoProcess(self)))
1521 //If (pbAllowDoProcess(self)) begin
1522 // Send Add_XML_Tag to hObj "DoProcessParams" (psDoProcessParams(self))
1523 // Send Add_XML_Tag to hObj "DoProcessComment" (psDoProcessComments(self))
1524 //end
1525SendEnd_XML_TagtohObj"AllowRequests" // </AllowRequests>
1526 1527SendBegin_XML_TagtohObj"Methods" // <Methods>
1528 1529GetInterfaceMessageCounttoiCount 1530 1531ForiItemFrom0to(iCount-1) 1532GetInterfaceMessageNameiItemtosMethodName 1533GetInterfaceMessageParamsiItemtosParams 1534GetInterfaceMessageCommentiItemtosComment 1535GetInterfaceMessageIsExtendediItemtobExtended 1536 // Split the "raw" method name into sMethodType and
1537 // real method name. Raw method name is of the format:
1538 // get_MethodName, set_MethodName or msg_MethodName.
1539Move(Left(sMethodName,3))TosMethodType 1540Move(lowercase(sMethodType))TosMethodType 1541 // if the type is unknown default to message...else XML file will not load
1542 // this should not happen with new studio but it could be done manually
1543If(sMethodType<>"get"ANDsMethodType<>"set"ANDsMethodType<>"msg") ;
1544Move"msg"TosMethodType 1545 1546Move(Remove(sMethodName,1,4))TosMethodName 1547 // <Method>
1548SendBegin_XML_TagtohObj('Method Type="'-sMethodType-'"') 1549SendAdd_XML_TagtohObj"MethodName"sMethodName 1550SendAdd_XML_TagtohObj"MethodDescription"sComment 1551 1552SendShowXmlMethodParametershObjsParamsbExtended 1553SendEnd_XML_TagtohObj'Method' // </Method>
1554Loop 1555SendEnd_XML_TagtohObj'Methods' // </Methods>
1556 1557SendBegin_XML_TagtohObj"ddValueMessages" // <ddValueMessages>
1558SendShowXMLddValuehObj 1559SendEnd_XML_TagtohObj"ddValueMessages" // </ddValueMessages>
1560 1561 //Send Begin_XML_Tag to hObj "Properties" // <Properties>
1562 //Send End_XML_Tag to hObj "Properties" // </Properties>
1563End_Procedure // ShowXml
1564 1565 1566ProcedureRegisterDebugInterface 1567 1568SendRegisterInterfaceset_pbVerboseErrors"set_pbVerboseErrors""boolean bState" ;
1569"report error back with extra detail (for debugging)" 1570 1571SendRegisterInterfaceset_pbAllErrorstoEventLog"set_pbAllErrorstoEventLog""boolean bState" ;
1572"Log all errors to the event log - for debugging" 1573 1574SendRegisterInterfaceset_pbAllErrorstoLocal"set_pbAllErrorstoLocal""boolean bState" ;
1575"report all errors to the console - for debugging" 1576 1577SendRegisterInterfaceset_pbAllErrorstoHtml"set_pbAllErrorstoHtml""boolean bState" ;
1578"report all errors to browser - for debugging" 1579 1580SendRegisterInterfaceset_peHtmlOutput"set_peHtmlOutput""Integer iMode" ;
1581"Redirect Html 1-normal, 2-file, 4-consolse (bits) can be ORed" 1582 1583 1584End_Procedure 1585 1586ProcedureRegisterBasicErrorInterface 1587 1588SendRegisterInterfacemsg_ErrorQueueStart"msg_ErrorQueueStart""" ;
1589"Start Error Queue /Clear current errors" 1590 1591SendRegisterInterfacemsg_ErrorQueueEnd"msg_ErrorQueueEnd""" ;
1592"End Error Queue" 1593 1594SendRegisterInterfacemsg_ClearErrors"msg_ClearErrors""" ;
1595"Clear all errors from error queue" 1596 1597SendRegisterInterfacemsg_ReportAllErrors"msg_ReportAllErrors""string sTitle" ;
1598"report all errors in error queue" 1599 1600End_Procedure 1601 1602 1603ProcedureRegisterFullErrorInterface 1604 1605SendRegisterBasicErrorInterface 1606 1607SendRegisterInterfacemsg_ReportLastError"msg_ReportLastError""boolean bClearError" ;
1608"report last error in queue" 1609 1610SendRegisterInterfaceget_ErrorCount"get_ErrorCount""returns Integer" ;
1611"Return number of items in error queue" 1612 1613SendRegisterInterfacemsg_ReportErrorItem"msg_ReportErrorItem""integer iItem" ;
1614"report error for item" 1615 1616SendRegisterInterfaceget_ErrorMessage"get_ErrorMessage""integer iItem returns string" ;
1617"return error message text for item" 1618 1619SendRegisterInterfacemsg_LogErrorEvent"msg_LogErrorEvent""integer iErrorNumber string sErrortext" ;
1620"Place error in event log" 1621 1622End_procedure 1623 1624 // includes interface to create an auto-entry screen
1625ProcedureRegisterAutoEntryInterface 1626 1627SendRegisterInterfaceset_psAutoEntryLabelStart"set_psAutoEntryLabelStart""string sHtmlTag" ;
1628"Define start tag for Auto Entry Label" 1629 1630SendRegisterInterfaceset_psAutoEntryLabelEnd"set_psAutoEntryLabelEnd""string sHtmlTag" ;
1631"Define End tag for Auto Entry Label" 1632 1633SendRegisterInterfaceset_psAutoEntryDataStart"set_psAutoEntryDataStart""string sHtmlTag" ;
1634"Define start tag for Auto Entry data cell" 1635 1636SendRegisterInterfaceset_psAutoEntryDataEnd"set_psAutoEntryDataEnd""string sHtmlTag" ;
1637"Define End tag for Auto Entry data cell" 1638 1639SendRegisterInterfaceget_AutoEntry"get_AutoEntry""string sTable" ;
1640"Create an auto-entry HTML form for every column in DD" 1641 1642End_procedure 1643 1644 // includes the standard call Interface
1645ProcedureRegisterStandardInterface 1646 1647SendRegisterInterfaceset_pbReportErrors"Set_pbReportErrors""boolean bReportErrors" ;
1648"Report Request_xxx errors back to Html page" 1649 1650SendRegisterInterfaceset_pbClearAfterSave"Set_pbClearAfterSave""boolean bClear" ;
1651"Clear DDO after successful save" 1652 1653SendRegisterInterfaceget_CreateFindIndexCombo"get_CreateFindIndexCombo" ;
1654"string sComboName string sTable integer iIndex returns string" ;
1655"Create an Index combo form" 1656 1657SendRegisterInterfaceget_WMLCreateFindIndexSelect"get_WmlCreateFindIndexSelect" ;
1658"string sSelectName string sTable integer iIndex returns string" ;
1659"Create an WML Index select" 1660 1661SendRegisterInterfaceget_peFieldMultiUser"get_peFieldMultiUser""returns integer" ;
1662"Do column level change checking 0=no, 1=yes-required, 2=yes-if possible" 1663 1664SendRegisterInterfaceget_IndexMainField"get_IndexMainField""string sTable integer iIndex returns string""get main column name of passed index" 1665 1666SendRegisterBasicErrorInterface 1667 1668End_Procedure 1669 1670ProcedureRegisterDDInterface 1671 1672SendRegisterInterfacemsg_setDdValue"msg_setDDValue""string sTableColumn string sNewValue" ;
1673"Set DD file/field value to value" 1674 1675SendRegisterInterfaceget_ddFind"get_ddFind""string sTable string sFieldorIndex integer iFindMode returns boolean" ;
1676"Find: Pass # for index, name for field, returns True if found" 1677 1678SendRegisterInterfaceget_ddFindFirst"get_ddFindFirst""string sTable string sFieldorIndex returns boolean" ;
1679"Find first: Pass # for index, name for field, returns True if found" 1680 1681SendRegisterInterfaceget_ddFindLast"get_ddFindLast""string sTable string sFieldorIndex returns boolean" ;
1682"Find Last: Pass # for index, name for field, returns True if found" 1683 1684SendRegisterInterfaceget_ddFindNext"get_ddFindNext""returns boolean";
1685"Find next: returns True if found" 1686 1687SendRegisterInterfaceget_ddFindPrev"get_ddFindPrev""returns boolean";
1688"Find Previous: returns True if found" 1689 1690SendRegisterInterfaceget_ddFindByRecId"get_ddFindbyRecId""string sTable string sRecId returns boolean";
1691"Obsolete, use ddFindbyRowId - Find by record id: returns True if found" 1692 1693SendRegisterInterfaceget_ddFindbyRowId"get_ddFindbyRowId""string sTable string sSerializedRowId returns boolean";
1694"Find by serialized Row id: returns True if found" 1695 1696SendRegisterInterfaceget_ddClear"get_ddClear""string sTable returns boolean" ;
1697"perform a DD clear, returns true if ok" 1698 1699SendRegisterInterfaceget_ddSave"get_ddSave""string sTable returns boolean" ;
1700"perform a DD validate and save, returns true if ok" 1701 1702SendRegisterInterfaceget_ddDelete"get_ddDelete""string sTable returns boolean" ;
1703"perform a DD delete, returns true if ok" 1704 1705SendRegisterInterfaceget_ddValidate"get_ddValidate""string sTable returns boolean" ;
1706"perform a DD validate, returns true if ok" 1707 1708SendRegisterInterfaceget_ddValue"get_ddValue""string sTableColumn integer iDDOption string sParams returns string" ;
1709"returns a ddValue with no HtmlEncoding" 1710 1711SendRegisterInterfaceget_ddValue"get_ddValueEncode""string sTableColumn integer iDDOption string sParams returns string" ;
1712"returns a ddValue with HtmlEncoding. Same as using direct ddValue method." 1713 1714End_procedure 1715 1716End_Class 1717