Script que inserta en un formulario en tiempo de diseño un control label y textbox mediante técnica de arrastrar y soltar desde una columna de una base de datos remota usando la aplicación Dataexplorer.app
Hace poco me puse a investigar el Dataexplorer.App y descubrí que se puede configurar algunas características a fin de hacer mas rápido el desarrollo de aplicaciones, en mi caso particular, cuando trabajo con base de datos remota como SQL Server.
Por defecto el Dataexplorer.app al arrastrar desde una columna de la base de datos remota hacia un Form te inserta un control grid junto con el cursoradapter respectivo. En mi caso particular no me sirve ya que en mis desarrollos tengo clases que me crean el entorno de datos para mis formularios. Me sería mas útil que inserte la columna como un control Textbox y su control Label respectivo. Así es que revisando el código fuente del Script que realiza esa funcionalidad, descubrí que se podía modificar, así es que he creado un script que hace lo que necesito.
Aquí les presento el código:
* <oParameter> = parameter object
* oParameter members:
* DropText - populate this with the text to drop
* Cancel - set to .T. to cancel the drag/drop operation
* Continue - set to .F. to stop processing additional add-ins
* oDataExplorerEngine
* TreeNode
* RootNode
* MouseXPos
* MouseYPos
* NodeData
* CurrentNode
* ParentNode
* ControlName
* ClassName
* ClassLocation
* PropertyList
* Caption
*
LPARAMETERS oParameter
LOCAL lcInc, lcName, loSource, laObjs, lcInitCode, lcAutoOpenCode
LOCAL cConnString, oConn, lcTable, lcAlias, lcSelectStr, lcName2,loForm
DIMENSION laObjs[1]
loForm=SYS(1270)
* Check for DE. Only support for forms
lnCount=ASELOBJ(laObjs,2) && check for DE
IF lnCount = 0 OR TYPE("loForm") <> 'O'
oParameter.Continue = .T.
RETURN
ENDIF
* Get Column Name
DO CASE
CASE oParameter.CurrentNode.NodeData.Type == "Column"
* Handle dragdrop from field node in table/view
lcTable = oParameter.ParentNode.NodeData.Name
lcTable = IIF(ATC(" ",lcTable)>0,"["+lcTable+"]", lcTable)
lcAlias = oParameter.ParentNode.NodeData.Name
ENDCASE
IF UPPER(loForm.Baseclass)=="FORM"
LOCAL iTop as Integer, iLeft as Integer
iTop = MROW(0,3)
iLeft = MCOL(0,3)
* Control TextBox
lcInc = ""
lcName2 = oParameter.ControlName
lcName2 = CHRTRAN(lcName2," ","_")
DO WHILE TYPE("loForm." + m.lcName2 + m.lcInc)#"U"
m.lcInc = ALLTRIM(STR(VAL(m.lcInc)+1))
ENDDO
lcName2 = m.lcName2 + m.lcInc
loForm.NewObject(lcName2, oParameter.ClassName, oParameter.ClassLocation)
IF PEMSTATUS(loForm.&lcName2, "ControlSource", 5)
WITH loForm.&lcName2
.ControlSource = ALLTRIM(lcTable)+"."+ALLTRIM(oParameter.CurrentNode.NodeData.Name)
.Top = iTop
.Left = iLeft + 100
.Name = left(LOWER(.Name),3)+PROPER(SUBSTR(.Name,4,50))
ENDWITH
ENDIF
* Control Label
lcIncLbl=""
lcNameLabel="lbl"+ALLTRIM(oParameter.CurrentNode.NodeData.Name)
DO WHILE TYPE("loForm." + m.lcNameLabel + m.lcIncLbl)#"U"
m.lcIncLbl = ALLTRIM(STR(VAL(m.lcIncLbl)+1))
ENDDO
lcNameLabel = m.lcNameLabel + m.lcIncLbl
loForm.addObject(lcNameLabel, "Label")
IF PEMSTATUS(loForm.&lcNameLabel, "Caption", 5)
WITH loForm.&lcNameLabel
.Name = left(LOWER(.Name),3)+PROPER(SUBSTR(.Name,4,50))
.Top = iTop
.Left = iLeft
.Caption = ALLTRIM(oParameter.CurrentNode.NodeData.Name)
.Autosize = .t.
ENDWITH
ENDIF
ENDIF
oParameter.ClassName = ""
oParameter.Continue = .F.
Con este Script logro insertar en mi formulario en tiempo de diseño un control Textbox junto con su respectivo control label. En el control textbox se configuran la propiedad ControlSource con el nombre de la Tabla y el nombre de la columna (TableName.ColumnName). La propiedad Name se define anteponiendo la palabra "txt" seguido del nombre de la columna de la tabla (txtColumnName). En el caso del control Label la propiedad Caption se define con el nombre de la columna y su propiedad Name se define anteponiendo la palabra "lbl" mas el nombre de la columna de la tabla.
CONFIGURACION
Llamar al Dataexplorer.App desde la ventana de comandos con DO HOME() + "dataexplorer.app"
Hacer Click en el Boton Options y entrar a Manage Drag/Drop. Seleccionar la opción Drag/Drop to Designe Surface e Insertar un nuevo registro haciendo Click en el Boton New.
En la pestaña General poner en el campo Caption una descripción o etiqueta para el script, por ejemplo "SQL/ADO Fields" sin las comillas. Ir a la pestaña Script to Run y poner en el campo Execute Only for the following Nodes (comma - separated) lo siguiente: "ADOColumnNode,SQLColumnNode" sin las comillas y en el campo Code to Execute upon Drop copiar el script mostrado arriba. Grabar haciendo click en el botón Save o Apply.
Ahora lo único que falta es desactivar la funcionalidad que viene por defecto a fin de que se ejecute nuestro nuevo script. Para hacer esto seleccionar de la lista el registro SQL/ADO Tables, Views and Fields. Ir a la pestaña Script to Run y eliminar del campo Execute Only for the following Nodes (comma - separated) las siguientes etiquetas: ADOColumnNode y SQLColumnNode y grabar con Save o Apply.
Espero este Scrip pueda serle útil a la gran comunidad fox.
Saludos.
Miguel Herbias
Lima - Peru