sábado, 12 de septiembre de 2020

Datalist Extendido

Esta funcion carga el Datalist de un textbox con un search a un folder (puede ser un keyword por ej), y agrega a esta lista los valores previamente ingresados en el mismo campo. Es decir, se va ampliando la lista con lo que se carga.

Para implementarlo creamos un Textbox enlazado a un campo, marcamos la opcion Datalist y en el ScriptBeforeRender agregamos:
DatalistExtended this, "/config/listas", "description", "type = 'Sector'"

El codigo de la funcion se recomienda incorporarlo a la biblioteca de funciones:

Sub DatalistExtended(pControl, pFolder, pField, pFormula)
	Dim sql, rcs, op, dic, fld, dom, node, newVal, i
	
	pControl.Load
	pControl.Options.RemoveAll
	
	' https://www.robvanderwoude.com/vbstech_data_sortedlist.php
	Set dic = CreateObject("System.Collections.Sortedlist")
	
	If TypeName(pFolder) = "Folder" Then
		Set fld = pFolder
	Else
		Set fld = Folder.App.Folders(CStr(pFolder))
	End If

	Set dom = fld.Search(CStr(pField), CStr(pFormula))
	For Each node In dom.documentElement.childNodes
		newVal = node.attributes(0).value
		If newVal & "" <> "" Then
			If Not dic.Contains(newVal) Then dic.Add newVal, ""
		End If
	Next

	sql = "select distinct " & pControl.DatalistField & " from SYS_FIELDS_" & pControl.DatalistFolder.Form.Id & _
		" f inner join SYS_DOCUMENTS d on f.DOC_ID = d.DOC_ID where d.FLD_ID = " & pControl.DatalistFolder.Id  & _
		" order by " & pControl.DatalistField
	Set rcs = dSession.Db.OpenRecordset(CStr(sql))
	Do While Not rcs.EOF
		newVal = rcs(pControl.DatalistField).Value
		If newVal & "" <> "" Then
			If Not dic.Contains(newVal) Then dic.Add newVal, ""
		End If
		rcs.MoveNext
	Loop
	rcs.Close

	For i = 0 To dic.Count - 1
		Set op = pControl.OptionsAdd
		op.Value = dic.GetKey(i)
	Next	
End Sub

No hay comentarios:

Publicar un comentario