2 '**********************************
\r
3 ' Rico: GENERIC TABLE/VIEW EDITOR
\r
5 '**********************************
\r
8 Public TblName,alias,arFields,arData,arColInfo(100)
\r
12 class TableEditClass
\r
14 Public action,options,AutoInit,CurrentField,LookupField,sessions
\r
15 Public SvrOnly,gridID,formVar,gridVar,bufferVar,optionsVar,DefaultSort,formView
\r
18 Private objDB,CurrentPanel,oParseMain
\r
20 Private ErrorFlag,ErrorMsg,MainTbl
\r
21 Private Tables(30),TableCnt
\r
22 Private Fields(200),FieldCnt
\r
25 '*************************************************************************************
\r
27 '*************************************************************************************
\r
28 Private Sub Class_Initialize
\r
30 if IsObject(oDB) then set objDB=oDB ' use oDB global as database connection, if it exists
\r
32 set options = CreateObject("Scripting.Dictionary")
\r
33 options("TableSelectNew")="___new___"
\r
34 options("TableSelectNone")=""
\r
35 options("canAdd")=true
\r
36 options("canEdit")=true
\r
37 options("canDelete")=true
\r
38 options("ConfirmDelete")=true
\r
39 options("ConfirmDeleteCol")=-1
\r
40 options("DebugFlag")=(trim(Request.QueryString("debug"))<>"")
\r
41 options("prefetchBuffer")=true
\r
42 options("PanelNamesOnTabHdr")=true
\r
43 options("highlightElem")="menuRow"
\r
45 set SvrOnly = CreateObject("Scripting.Dictionary")
\r
46 SvrOnly("DropDownSelect")=1
\r
47 SvrOnly("SelectSql")=1
\r
48 SvrOnly("SelectFilter")=1
\r
49 SvrOnly("TableIdx")=1
\r
50 SvrOnly("AddQuotes")=1
\r
51 SvrOnly("FilterFlag")=1
\r
52 SvrOnly("XMLprovider")=1
\r
63 set oParseMain=new sqlParse
\r
68 '*************************************************************************************
\r
70 '*************************************************************************************
\r
71 Private Sub Class_Terminate ' Setup Terminate event.
\r
73 set Fields(i)=Nothing
\r
75 set options = Nothing
\r
76 set SvrOnly = Nothing
\r
77 set oParseMain = Nothing
\r
81 Public Property Let TableFilter(filter)
\r
82 oParseMain.AddWhereCondition filter
\r
86 ' returns field number if successful, empty if error
\r
87 Public Function AddEntryField(ColumnName,Heading,EntryTypeCode,DefaultValue)
\r
88 if InStr("/S/N/R/H/D/DT/I/F/B/T/TA/SL/RL/CL/tinyMCE/","/" & EntryTypeCode & "/") < 1 then
\r
89 TableEditError "invalid EntryTypeCode in TableEditClass"
\r
92 if not IncrCurrentField then exit Function
\r
93 CurrentField("ColName")=ColumnName
\r
94 CurrentField("Hdg")=Heading
\r
95 CurrentField("EntryType")=EntryTypeCode
\r
96 CurrentField("ColData")=DefaultValue
\r
97 select case EntryTypeCode
\r
98 case "D": CurrentField("type")="date"
\r
99 case "DT": CurrentField("type")="datetime"
\r
100 case "TA","tinyMCE" : CurrentField("TxtAreaRows")=4 : CurrentField("TxtAreaCols")=80
\r
101 case "R","RL": CurrentField("RadioBreak")="<br" & xhtmlcloser
\r
102 case "H": CurrentField("visible")=false
\r
105 s=Tables(MainTbl).alias & "." & ColumnName
\r
106 If InStr("/B/T/TA/tinyMCE/","/" & EntryTypeCode & "/") > 0 Then s="rtrim(" & s & ")"
\r
107 oParseMain.AddColumn s,"rico_col" & FieldCnt
\r
108 AddEntryField=FieldCnt
\r
112 ' returns field number if successful, empty if error
\r
113 Public Function AddEntryFieldW(ColumnName,Heading,EntryTypeCode,DefaultValue,Width)
\r
115 retval=AddEntryField(ColumnName,Heading,EntryTypeCode,DefaultValue)
\r
116 if not IsEmpty(retval) then CurrentField("width")=Width
\r
117 AddEntryFieldW=retval
\r
120 ' DescColName is optional - pass empty if not used
\r
121 Public Function AddLookupField(CodeColName,DescColName,CodeHdg,DisplayHdg,EntryTypeCode,DefaultValue,sql)
\r
122 dim alias,s,codeField,descField,oParseLookup
\r
123 AddLookupField=AddEntryField(CodeColName,CodeHdg,EntryTypeCode,DefaultValue)
\r
124 CurrentField("visible")=false
\r
125 CurrentField("SelectSql")=sql
\r
126 if not IsEmpty(DescColName) then
\r
127 CurrentField("DescriptionField")=ExtFieldId(FieldCnt+1)
\r
129 set LookupField=CurrentField
\r
130 set oParseLookup=new sqlParse
\r
131 alias="t" & FieldCnt
\r
132 oParseLookup.ParseSelect sql
\r
133 if ubound(oParseLookup.arSelList)=1 then
\r
134 codeField=oParseLookup.arSelList(0)
\r
135 descField=oParseLookup.arSelList(1)
\r
136 s="left join " & oParseLookup.FromClause & " " & alias & " on t." & CodeColName & "=" & alias & "." & replace(replace(codeField,"%alias%",""),"%aliasmain%","")
\r
137 if not IsEmpty(oParseLookup.WhereClause) then s=s & " and " & replace(oParseLookup.WhereClause,"%alias%",alias & ".")
\r
138 oParseMain.AddJoin s
\r
140 CurrentField("ColName")="Lookup_" & FieldCnt
\r
141 CurrentField("Hdg")=DisplayHdg
\r
142 If not IsEmpty(DescColName) then
\r
143 descField=Tables(MainTbl).alias & "." & DescColName
\r
144 CurrentField("ColName")=DescColName
\r
145 CurrentField("FormView")="hidden"
\r
146 CurrentField("EntryType")="T"
\r
147 ElseIf IsFieldName(descField) Then
\r
148 descField=alias & "." & descField
\r
150 descField=replace(replace(descField,"%alias%",alias & "."),"%aliasmain%","t.")
\r
152 oParseMain.AddColumn descField,"rico_col" & FieldCnt
\r
154 TableEditError "Invalid lookup query (" & sql & ")"
\r
156 set oParseLookup = Nothing
\r
160 ' returns field number if successful, empty if error
\r
161 Public Function AddCalculatedField(ByVal ColumnFormula, ByVal Heading)
\r
162 if not IncrCurrentField then exit Function
\r
163 if left(ColumnFormula,1) <> "(" then ColumnFormula="(" & ColumnFormula & ")"
\r
164 CurrentField("ColName")="Calc_" & FieldCnt
\r
165 CurrentField("Hdg")=Heading
\r
166 oParseMain.AddColumn ColumnFormula,"rico_col" & FieldCnt
\r
167 AddCalculatedField=FieldCnt
\r
171 Public Sub AddPanel(ByVal PanelHeading)
\r
172 if CurrentPanel >= ubound(Panels) then
\r
173 TableEditError "exceeded max # of panels in TableEditClass"
\r
176 CurrentPanel=CurrentPanel+1
\r
177 Panels(CurrentPanel)=PanelHeading
\r
181 Public Function DefineAltTable(ByVal AltTabName, arFieldList, arFieldData)
\r
182 if TableCnt >= ubound(Tables) then
\r
183 TableEditError "exceeded max # of alternate tables in TableEditClass"
\r
186 TableCnt=TableCnt+1
\r
187 set Tables(TableCnt)=new TableEditTable
\r
188 with Tables(TableCnt)
\r
189 .TblName=AltTabName
\r
190 .alias="a" & TableCnt
\r
191 .arFields=arFieldList
\r
192 .arData=arFieldData
\r
193 if ubound(.arFields) <> ubound(.arData) then
\r
194 TableEditError "# of fields does not match # of data entries supplied for table " & AltTabName
\r
198 DefineAltTable=TableCnt
\r
202 ' returns true if FieldCnt successfully incremented
\r
203 Private Function IncrCurrentField
\r
204 if FieldCnt >= ubound(Fields) then
\r
205 TableEditError "exceeded max # of columns in TableEditClass"
\r
206 IncrCurrentField=false
\r
209 FieldCnt=FieldCnt+1
\r
210 set CurrentField = CreateObject("Scripting.Dictionary")
\r
211 set Fields(FieldCnt)=CurrentField
\r
212 if CurrentPanel>=0 then CurrentField("panelIdx")=CurrentPanel else CurrentField("panelIdx")=0
\r
213 CurrentField("AddQuotes")=true
\r
214 CurrentField("ReadOnly")=false
\r
215 CurrentField("TableIdx")=MainTbl
\r
216 IncrCurrentField=true
\r
220 Public Sub SetTableName(ByVal s)
\r
222 TableCnt=TableCnt+1
\r
224 set Tables(TableCnt)=new TableEditTable
\r
225 with Tables(TableCnt)
\r
229 oParseMain.FromClause=s & " t"
\r
230 gridID=LCase(replace(replace(s,".","_")," ","_"))
\r
231 formVar=gridID & "['edit']"
\r
232 gridVar=gridID & "['grid']"
\r
233 bufferVar=gridID & "['buffer']"
\r
234 optionsVar=gridID & "['options']"
\r
235 actionparm="_action_" & gridID
\r
236 action=trim(Request.QueryString(actionparm))
\r
237 if action="" then action=trim(Request.Form(actionparm))
\r
238 if action="" then action="table" else action=lcase(action)
\r
242 Private Sub AddSort(field,direction)
\r
243 if not IsEmpty(DefaultSort) then DefaultSort=DefaultSort & ","
\r
244 DefaultSort=DefaultSort & field & " " & direction
\r
248 Public Sub SortCurrent(direction)
\r
249 AddSort oParseMain.LastColumn,direction
\r
250 options("sortCol")=FieldCnt
\r
251 options("sortDir")=direction
\r
255 Public Sub SortAsc()
\r
260 Public Sub SortDesc()
\r
265 Public Sub ConfirmDeleteColumn()
\r
266 options("ConfirmDeleteCol")=FieldCnt
\r
270 Public Sub genXHTML()
\r
275 Public Sub SetDbConn(ByRef dbcls)
\r
280 '*************************************************************************************
\r
281 ' Take appropriate action
\r
282 '*************************************************************************************
\r
283 Public Sub DisplayPage()
\r
284 if FieldCnt < 0 then exit sub
\r
285 if not ErrorFlag then GetColumnInfo
\r
286 if not ErrorFlag then
\r
288 case "del" if options("canDelete") then TableDeleteRecord
\r
289 case "ins" if options("canAdd") then TableInsertRecord
\r
290 case "upd" if options("canEdit") then TableUpdateRecord
\r
292 if sessions then session.contents(gridID)=SqlSelectData
\r
297 response.write vbLf & "<p style='color:red;'><span style='text-decoration:underline;'>ERROR ENCOUNTERED</span><br" & xhtmlcloser & ErrorMsg
\r
301 ' if AltTable has a multi-column key, then add those additional constraints
\r
302 Private function AltTableKeyWhereClause(AltTabIdx)
\r
304 for i=0 to ubound(Tables(AltTabIdx).arFields)
\r
305 if Tables(AltTabIdx).arColInfo(i).IsPKey then
\r
306 w=w & " and " & Tables(AltTabIdx).arFields(i) & "=" & Tables(AltTabIdx).arData(i)
\r
309 AltTableKeyWhereClause=w
\r
312 Private function AltTableJoinClause(alias)
\r
314 for i=0 to FieldCnt
\r
315 if Fields(i)("TableIdx")=MainTbl and not IsCalculatedField(i) then
\r
316 if Fields(i)("ColInfo").IsPKey then objDB.AddCondition w,Fields(i)("ColName") & "=" & alias & "." & Fields(i)("ColName")
\r
319 AltTableJoinClause=w
\r
322 ' form where clause based on table's primary key
\r
323 Private function TableKeyWhereClause()
\r
325 for i=0 to FieldCnt
\r
326 if Fields(i)("TableIdx")=MainTbl and not IsCalculatedField(i) then
\r
327 if Fields(i)("ColInfo").IsPKey then objDB.AddCondition w,Fields(i)("ColName") & "=" & FormatValue(trim(Request.Form("_k" & i)),i)
\r
331 TableEditError "no key value"
\r
333 TableKeyWhereClause=" WHERE " & w
\r
337 ' name used external to this script
\r
338 Private function ExtFieldId(i)
\r
339 ExtFieldId=gridID & "_" & i
\r
343 Private function IsCalculatedField(i)
\r
344 IsCalculatedField=not Fields(i).exists("EntryType")
\r
348 '*************************************************************************************
\r
349 ' Retrieves column info from database for main table and any alternate tables
\r
350 '*************************************************************************************
\r
351 Private sub GetColumnInfo()
\r
352 dim c,i,j,FieldNum,cnt,colname,Columns(250),dicColIdx
\r
353 set dicColIdx = CreateObject("Scripting.Dictionary")
\r
354 dicColIdx.CompareMode=1
\r
355 for FieldNum=0 to FieldCnt
\r
356 dicColIdx.Add Fields(FieldNum)("TableIdx") & "." & Fields(FieldNum)("ColName"),FieldNum
\r
357 if options("canEdit")=false and options("canAdd")=false then Fields(FieldNum)("ReadOnly")=true
\r
359 for i=0 to TableCnt
\r
360 cnt=objDB.GetColumnInfo(Tables(i).TblName,Columns)
\r
362 TableEditError "unable to retrieve column info for " & Tables(i).TblName & "<br>" & objDB.LastErrorMsg
\r
366 colname=trim(Columns(c).ColName)
\r
367 if dicColIdx.exists(i & "." & colname) then
\r
368 FieldNum=dicColIdx(i & "." & colname)
\r
369 set Fields(FieldNum)("ColInfo")=Columns(c)
\r
370 elseif i<>MainTbl then
\r
371 for j=0 to ubound(Tables(i).arFields)
\r
372 if colname=Tables(i).arFields(j) then set Tables(i).arColInfo(j)=Columns(c)
\r
374 elseif Columns(c).IsPKey then
\r
375 TableEditError "primary key field is not defined (" & Tables(i).TblName & "." & colname & ")"
\r
376 set dicColIdx = Nothing
\r
381 set dicColIdx = Nothing
\r
384 Private sub TableUpdateDatabase(ByVal sqltext, ByVal actiontxt)
\r
386 if ErrorFlag then exit sub
\r
387 cnt=objDB.RunActionQueryReturnMsg(sqltext,errmsg)
\r
388 if IsEmpty(errmsg) and cnt=1 then
\r
389 response.write "<p class='ricoFormResponse " & actiontxt & "Successfully'></p>"
\r
390 if options("DebugFlag") then response.write "<p class='debug'>" & sqltext & "<br" & xhtmlcloser & "Records affected: " & cnt
\r
392 TableEditError "unable to update database!<br" & xhtmlcloser & errmsg
\r
397 Private function FormatValue(ByVal v, ByVal idx)
\r
399 set fld=Fields(idx)
\r
400 addquotes=fld("AddQuotes")
\r
401 if v="" and Fields(idx)("ColInfo").Nullable then
\r
404 elseif fld("EntryType")="I" or fld("EntryType")="F" then
\r
406 if not IsNumeric(v) then v="NULL"
\r
407 elseif fld("EntryType")="N" and v=options("TableSelectNew") then
\r
408 v=trim(Request.Form("textnew__" & ExtFieldId(idx)))
\r
409 elseif InStr("SNR",left(fld("EntryType"),1)) > 0 and v=options("TableSelectNone") then
\r
413 if addquotes then v=objDB.addQuotes(v)
\r
418 Private function FormatFormValue(idx)
\r
420 if not Fields(idx).exists("EntryType") then exit function
\r
421 if Fields(idx)("EntryType")="H" or Fields(idx)("FormView")="exclude" then
\r
422 v=Fields(idx)("ColData")
\r
424 v=trim(Request.Form(ExtFieldId(idx)))
\r
426 FormatFormValue=FormatValue(v,idx)
\r
430 '*************************************************************************************
\r
431 ' Deletes the specified record
\r
432 ' Assumes any AltTable columns are handled via referential integrity/cascading deletes
\r
433 '*************************************************************************************
\r
434 Private sub TableDeleteRecord()
\r
435 TableUpdateDatabase "DELETE FROM " & Tables(MainTbl).TblName & TableKeyWhereClause(), "deleted"
\r
438 Private sub UpdateRecord(sqltext)
\r
440 objDB.RunActionQueryReturnMsg sqltext,errmsg
\r
441 if not IsEmpty(errmsg) then
\r
442 errmsg="unable to update database!<br" & xhtmlcloser & errmsg
\r
443 if options("DebugFlag") then errmsg=errmsg & "<p>SQL: " & sqltext
\r
444 TableEditError errmsg
\r
445 elseif options("DebugFlag") then
\r
446 response.write "<BR class='debug'>" & sqltext
\r
450 Private sub UpdateAltTableRecords(i)
\r
451 dim j,sqltext,colnames,coldata,c
\r
452 if ErrorFlag then exit sub
\r
454 ' delete existing record
\r
456 sqltext="delete from " & Tables(i).TblName
\r
457 sqltext=sqltext & TableKeyWhereClause()
\r
458 sqltext=sqltext & AltTableKeyWhereClause(i)
\r
459 UpdateRecord(sqltext)
\r
461 ' insert new record
\r
465 for j=0 to FieldCnt
\r
466 if Fields(j).exists("ColInfo") then
\r
467 if Fields(j)("TableIdx")=i or Fields(j)("ColInfo").IsPKey then
\r
468 colnames=colnames & "," & Fields(j)("ColName")
\r
469 coldata=coldata & "," & FormatValue(trim(Request.Form(ExtFieldId(j))),j)
\r
473 for j=0 to ubound(Tables(i).arFields)
\r
474 c=Tables(i).arFields(j)
\r
475 colnames=colnames & "," & c
\r
476 coldata=coldata & "," & Tables(i).arData(j)
\r
478 sqltext="insert into " & Tables(i).TblName & " (" & mid(colnames,2) & ") values (" & mid(coldata,2) & ")"
\r
479 UpdateRecord(sqltext)
\r
483 '*************************************************************************************
\r
484 ' Updates an existing record in the db
\r
485 '*************************************************************************************
\r
486 Private sub TableUpdateRecord()
\r
488 for i=0 to TableCnt
\r
489 if i<>MainTbl then UpdateAltTableRecords i
\r
491 for i=0 to FieldCnt
\r
492 if not IsCalculatedField(i) then
\r
493 if Fields(i)("TableIdx")=MainTbl and Fields(i)("ColInfo").Writeable and not Fields(i).exists("InsertOnly") then
\r
494 sqltext=sqltext & "," & Fields(i)("ColName") & "=" & FormatFormValue(i)
\r
498 sqltext="UPDATE " & Tables(MainTbl).TblName & " SET " & mid(sqltext,2)
\r
499 sqltext=sqltext & TableKeyWhereClause()
\r
500 TableUpdateDatabase sqltext, "updated"
\r
503 '*************************************************************************************
\r
504 ' Inserts a new record into the db
\r
505 '*************************************************************************************
\r
506 Private sub TableInsertRecord()
\r
507 dim i,sqltext,sqlcol,sqlval,keyCnt,keyIdx
\r
511 for i=0 to FieldCnt
\r
512 if not IsCalculatedField(i) and Fields(i)("TableIdx")=MainTbl and not Fields(i).exists("UpdateOnly") then
\r
513 if Fields(i)("ColInfo").IsPKey then
\r
517 if Fields(i)("ColInfo").Writeable then
\r
518 sqlcol=sqlcol & "," & Fields(i)("ColName")
\r
519 sqlval=sqlval & "," & FormatFormValue(i)
\r
523 sqltext="insert into " & Tables(MainTbl).TblName & " (" & mid(sqlcol,2) & ") values (" & mid(sqlval,2) & ")"
\r
524 TableUpdateDatabase sqltext, "added"
\r
528 Private Sub TableEditError(msg)
\r
534 Private Function IsFieldName(s)
\r
540 if (c >= "0" and c <= "9" and i > 1) or (c >= "A" and c <= "Z") or (c >= "a" and c <= "z") or (c = "_") then
\r
546 IsFieldName=(i > 1)
\r
550 '***********************************
\r
551 ' do post-processing on sql query
\r
552 '***********************************
\r
553 Private sub FinishQuery()
\r
555 dim i,s,codeField,descField,descQuery,alias,tabidx
\r
557 set oParseLookup=new sqlParse
\r
558 for i=0 to FieldCnt
\r
559 if Fields(i).exists("TableIdx") then tabidx=Fields(i)("TableIdx")
\r
560 if Fields(i).exists("FilterFlag") then
\r
561 ' add any column filters to where clause
\r
562 oParseMain.AddWhereCondition Tables(tabidx).alias & "." & Fields(i)("ColName") & "='" & Fields(i)("ColData") & "'"
\r
564 if Fields(i).exists("EntryType") then
\r
565 if InStr("CSNR",left(Fields(i)("EntryType"),1)) > 0 then
\r
566 if Fields(i).exists("SelectSql") then
\r
567 s=Fields(i)("SelectSql")
\r
568 if Fields(i).exists("SelectFilter") then
\r
569 oParseLookup.ParseSelect s
\r
570 oParseLookup.AddWhereCondition Fields(i)("SelectFilter")
\r
571 s=oParseLookup.UnparseSelect
\r
573 Fields(i)("DropDownSelect")=replace(replace(s,"%alias%",""),"%aliasmain%","")
\r
575 s=Fields(i)("ColName")
\r
576 If Fields(i).exists("ColInfo") Then
\r
577 If Fields(i)("ColInfo").ColType="CHAR" and Fields(i)("ColInfo").FixedLength Then s="rtrim(" & s & ")"
\r
579 Fields(i)("DropDownSelect")="select distinct " & s & " from " & Tables(tabidx).TblName & " where " & Fields(i)("ColName") & " is not null"
\r
584 if tabidx<>MainTbl then
\r
586 ' column from alt table - no avoiding subqueries here
\r
588 s="(select " & Fields(i)("ColName") & " from " & Tables(tabidx).TblName & " a" & i & _
\r
589 " where " & AltTableJoinClause("t") & AltTableKeyWhereClause(tabidx) & ")"
\r
590 if mid(Fields(i)("EntryType"),2)="L" and Fields(i).exists("SelectSql") then
\r
591 oParseLookup.ParseSelect Fields(i)("SelectSql")
\r
592 if ubound(oParseLookup.arSelList)=1 then
\r
593 codeField=oParseLookup.arSelList(0)
\r
594 descField=oParseLookup.arSelList(1)
\r
595 descQuery="select " & descField & " from " & oParseLookup.FromClause & " where " & codeField & "=" & s
\r
596 if not IsEmpty(oParseLookup.WhereClause) then descQuery=descQuery & " and " & oParseLookup.WhereClause
\r
597 oParseMain.arSelList(i)="(" & objDB.concat(Array("(" & descQuery & ")","'<span class=""ricoLookup"">'",objDB.Convert2Char(s),"'</span>'"), false) & ")"
\r
599 TableEditError "Invalid lookup query (" & Fields(i)("SelectSql") & ")"
\r
603 oParseMain.arSelList(i)=s
\r
609 if IsEmpty(DefaultSort) then DefaultSort=objDB.PrimaryKey(Tables(MainTbl).TblName)
\r
610 oParseMain.AddSort DefaultSort
\r
614 '***********************************
\r
615 ' returns details of sql query as an array
\r
616 '***********************************
\r
617 Public Function SqlSelectData()
\r
618 dim arr,i,SelectIdx,HdgIdx,a,b
\r
620 arr=oParseMain.ToArray()
\r
621 ReDim Preserve arr(ubound(arr)+2)
\r
628 for i=0 to FieldCnt
\r
629 if Fields(i).exists("DropDownSelect") then arr(SelectIdx)(i)=Fields(i)("DropDownSelect")
\r
630 if Fields(i).exists("Hdg") then arr(HdgIdx)(i)=Fields(i)("Hdg")
\r
636 '***********************************
\r
638 '***********************************
\r
639 Private sub TableDisplay()
\r
642 response.write vbLf & "<p class='ricoBookmark'>"
\r
643 response.write "<span id='" & gridID & "_timer' class='ricoSessionTimer'></span>"
\r
644 response.write "<span id='" & gridID & "_bookmark' class='ricoBookmark'> </span>"
\r
645 response.write "<span id='" & gridID & "_savemsg' class='ricoSaveMsg'></span>"
\r
646 response.write "</p>"
\r
647 response.write vbLf & "<div id='" & gridID & "'></div>"
\r
649 response.write vbLf & "<script type='text/javascript'>"
\r
650 response.write vbLf & "Rico.acceptLanguage('" & Request.ServerVariables("HTTP_ACCEPT_LANGUAGE") & "');"
\r
651 response.write vbLf & "var " & gridID & " = {};"
\r
652 response.write vbLf & optionsVar & " = {"
\r
653 for each o in options
\r
654 if not IsObject(options(o)) and not SvrOnly.exists(o) then response.write vbLf & " " & o & ": " & FormatOption(options(o)) & ","
\r
656 if CurrentPanel>=0 then
\r
657 response.write vbLf & " panels: ["
\r
658 for i=0 to CurrentPanel
\r
659 if i>0 then response.write ","
\r
660 response.write "'" & Panels(i) & "'"
\r
662 response.write "],"
\r
664 response.write vbLf & " columnSpecs : ["
\r
665 for i=0 to FieldCnt
\r
666 if Fields(i).exists("TableIdx") then
\r
667 if Fields(i)("TableIdx")<>MainTbl then Fields(i)("UpdateOnly")=true
\r
669 if i>0 then response.write ","
\r
670 response.write vbLf & " {"
\r
671 response.write " FieldName:'" & ExtFieldId(i) & "'"
\r
672 for each o in Fields(i)
\r
673 if not IsObject(Fields(i)(o)) and not SvrOnly.exists(o) then response.write "," & vbLf & " " & o & ": " & FormatOption(Fields(i)(o)) '& " /* " & vartype(Fields(i)(o)) & " */"
\r
675 if Fields(i).exists("ColInfo") then
\r
676 response.write "," & vbLf & " isNullable:" & FormatOption(Fields(i)("ColInfo").Nullable)
\r
677 response.write "," & vbLf & " Writeable:" & FormatOption(Fields(i)("ColInfo").Writeable)
\r
678 response.write "," & vbLf & " isKey:" & FormatOption(Fields(i)("ColInfo").IsPKey)
\r
679 if Fields(i)("ColInfo").ColLength then response.write "," & vbLf & " Length:" & FormatOption(Fields(i)("ColInfo").ColLength)
\r
681 response.write " }"
\r
683 response.write vbLf & " ]"
\r
684 response.write vbLf & "};"
\r
686 response.write vbLf & "Rico.onLoad(function() {"
\r
687 'response.write vbLf & " try {"
\r
688 response.write vbLf & " if(typeof Rico.LiveGrid=='undefined') throw('LiveGridForms requires the Rico.LiveGrid Library');"
\r
689 response.write vbLf & " if(typeof Rico.GridMenu=='undefined') throw('LiveGridForms requires the Rico.GridMenu Library');"
\r
690 response.write vbLf & " if(typeof Rico.Buffer=='undefined') throw('LiveGridForms requires the Rico.Buffer Library');"
\r
691 response.write vbLf & " if(typeof Rico.Buffer.AjaxSQL=='undefined') throw('LiveGridForms requires the Rico.Buffer.AjaxSQL Library');"
\r
692 response.write InitScript
\r
693 'response.write vbLf & " } catch(e) { alert(e.message); };"
\r
694 response.write vbLf & "});"
\r
696 response.write vbLf & "</script>"
\r
700 '********************************************************************************************************
\r
701 ' Pad a number to the specified length with leading zeroes
\r
702 '********************************************************************************************************
\r
703 Private Function PadNumber(number, length)
\r
706 if IsNull(number) or IsEmpty(number) then strNumber=String(length,"-") else strNumber = Cstr(number)
\r
707 do while len(strNumber) < length
\r
708 strNumber = "0" & strNumber
\r
711 PadNumber=strNumber
\r
714 Private Function FormatOption(s)
\r
716 FormatOption="{" & join(s,",") & "}"
\r
718 select case vartype(s)
\r
719 case 8,129,130,200,202
\r
721 FormatOption="""" & replace(s,"""","\""") & """"
\r
724 if s then FormatOption="true" else FormatOption="false"
\r
725 case 7,133,134,135:
\r
726 ' date/time, format as ISO8601
\r
727 FormatOption="'" & year(s) & "-" & PadNumber(month(s),2) & "-" & PadNumber(day(s),2) & "T" & PadNumber(hour(s),2) & ":" & PadNumber(minute(s),2) & ":" & PadNumber(second(s),2) & "'"
\r
729 'single, double, decimal variants. Changing ',' to '.'
\r
730 FormatOption=replace(CStr(s),",",".")
\r
738 Public function InitScript()
\r
739 InitScript = vbLf & bufferVar & "=new Rico.Buffer.AjaxSQL('" & options("XMLprovider") & "', {TimeOut:" & Session.Timeout & "});" & _
\r
740 vbLf & "if(typeof " & gridID & "_GridInit=='function') " & gridID & "_GridInit();" & _
\r
741 vbLf & gridVar & "=new Rico.LiveGrid ('" & gridID & "'," & bufferVar & "," & optionsVar & ");" & _
\r
742 vbLf & gridVar & ".menu=new Rico.GridMenu();"
\r
744 InitScript = InitScript & vbLf & "if(typeof " & gridID & "_FormInit=='function') " & gridID & "_FormInit();" & _
\r
745 vbLf & formVar & "=new Rico.TableEdit(" & gridVar & ");"
\r
747 InitScript = InitScript & vbLf & "if(typeof " & gridID & "_InitComplete=='function') " & gridID & "_InitComplete();"
\r