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
Hola buenas tardes, espero se encuentren bien.
ResponderBorrarEstoy en busca de alguien que me pueda ayudar para generar un código de una factura electrónica en Colombia, si hay en otros países revisar como la podemos adaptar.
muchas gracias.