11 de marzo de 2017

Técnicas de macrosustitución en VFP

Artículo original: VFP Macro Substitution Techniques
http://rickschummer.com/blog/2006/06/vfp-macro-substitution-techniques.html
Autor: Rick Schummer
Traducido por: Ana María Bisbé York


Hace un par de semanas programé un generador que se encarga de manipular propiedades. Estuve tratando de volver a utilizar una técnica con macro-sustitución que utilizaba hace un par de años para hacerlo todo.

Abrí la herramienta Referencias de código (Code Reference) y comencé a buscar por "..&" (punto, punto, ampersand) porque pensé que era eso lo que necesitaba. No obtuve resultados. Me sorprendió. Podría jurar que necesitaba los dos puntos.

Obtuve resultados cuando busqué ".&" (punto, ampersand). Lo que yo intentaba hacer era concatenar el nombre de una propiedad macro sustituida al final de una referencia a un objeto en el diseñador. El código final es muy sencillo una vez que se conoce lo que se necesita. En este caso, tenía un combobox con una lista de objetos en el diseñador de clase o formulario. El combo tiene una matriz con un contenedor al objeto del contenedor superior. Para obtener una referencia de objeto he ejecutado el siguiente código.

lnComboRowSelected = this.cboObjectsToPickFrom.ListIndex
lcAddPath = this.cboObjectsToPickFrom.aItems[lnComboRowSelected, 2]
loPickedControl = this.oControlList.oObject.&lcAddPath

Las propiedades en que estaba trabajando eran en control listbox con selección múltiple. Para obtener el valor de la propiedad en el control yo utilicé el siguiente código:

lcProperty = ALLTRIM(this.lstCommonProperties.aItems[lnI, 1])
lcPropertyValue = loPickedControl
&lcProperty

En este generador en particular (que se mostrará en el próximo número de Advisor's Guide to Microsoft Visual FoxPro) básicamente permito seleccionar los controles, seleccionar las propiedades que desea que sean idénticas y el generador va a migrar las propiedades. Esto es utilizando el framework BuilderControls que también se describe en el artículo. He empleado la misma técnica dos veces en el mismo método que mueve el valor de la propiedad entre los controles.

Me preocupó que no podía saber por qué originalmente pensé que necesitaba los dos puntos. Entonces, la semana pasadaTracy Pearson escrbió en ProFox algo que me hizo recordar en lo que yo estaba pensando y me di cuenta que yo estaba empleando la segunda técnica de macrosustitución.

Trabajo frecuentemente con tablas o cursores para guardar datos y conozco frecuentemente la estructura utilizando AFIELDS() o algunas otras técnicas. Controlo el alias del cursor por programación y lo guardo en una variable de memoria. Si deseo un valor específico de una columna y necesito incluir el alias ( a veces deseo siempre eliminar el factor ambiguedad) en la referencia a la columna. Si el código es genérico al cursor puedo utilizar macro sustitución para manipular el dato:

lcAlias = ALIAS()
ldInvoice = &lcAlias..dInvoice
lcCustomerName = &lcAlias..cCustName 

Como escribió Tracy en su post: "un punto para el final de la macrosustitución y otro punto para señalar tabla.campo"

Esto me hizo sentir mejor ya que existe la técnica de macrosustitución con dos puntos, espero que usted no pierda media hora buscando los dos puntos de forma incorrecta, o que sirvan estas líneas como recuerdo de que existen y son completamente diferentes.

2 comentarios :

  1. lcAlias = Alias()
    ldInvoice = Evaluate(m.lcAlias+".dInvoice)
    lcCustomerName = Evaluate(m.lcAlias+".cCustName)
    *En general:
    lcAlias = ALIAS()
    FOR i = 1 TO FCOUNT(m.lcAlias)
    ? EVALUATE(m.lcAlias + "." + FIELD(m.i , m.lcAlias) )
    NEXT

    ResponderBorrar
  2. Una pregunta. Para una propiedad se puede? He intentado y me da error. Es decir creo una table creo una propiedad le pasa el nombre de la tabla a la propiedad y cuando deseo referenciar a un grid en recordsource y las columnas no puedo me da error. Es decir ejemplo. Mygrid.recorsource = this.nametable, mygrid.columna = this.nametable..fields1 me da error. He probado colocando &this..fields, eval('&this..fields') y nada. Lo que haga es una variable pulica le pasa el nombre y empiezo a rellena y funciona bien. Pero para this. No puedo referenciar. No se sim entienden. Espero respuesta. Muchas gracias.

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.