#628 closed defect (fixed)
Creación de una variable con datos y sin expresión — at Version 4
Reported by: | imendez | Owned by: | Pedro Gea |
---|---|---|---|
Priority: | critical | Milestone: | Release 0.6 |
Component: | Variables | Keywords: | |
Cc: |
Description (last modified by )
Hola, a la hora de añadir una variable a un DataSet hay (al menos) dos opciones:
- Con una expresión TOL
- Apostándole los datos de forma explícita.
Al hacerlo de la segunda forma, me da error al intentar recuperar los datos, creo que porque intenta obtener la expresión:
NameBlock aux = DataSet.Ejemplo::CreateVariable ([[ Text _.name = "Aux"; Text _.description = "Prueba"; Text _.type = "Serie"; Serie _.data = SubSer(CalInd(WD(5), Diario), y2009, y2010) ]]); Serie auxData = aux::GetData(?);
Warning: [37] La función Eval ha fallado en : Eval(expression3) Warning: [38] La función :: ha fallado en : space::LocalEval(expression) ERROR: [49] data no se pudo crear. [Call stack] [2] Anything MMS::@Variable::_.ObtainData (Text expression, Set variables, Text scenario, NameBlock parent) [1] Anything aux::variable::variable::GetData (Real void) ERROR: [50] [@Variable::_.ObtainData] Error en el acceso a los datos.
Por cierto, al intentar crear la variable con el atributo _.data y sin el _.type da error: ¿no podría deducir el tipo de datos a partir de la gramática de éstos, al igual que hace cuando se crea la variable con _.expression?
Gracias.
Change History (4)
comment:1 Changed 14 years ago by
comment:2 Changed 14 years ago by
Description: | modified (diff) |
---|---|
Milestone: | → Release 0.6 |
Status: | new → accepted |
El comportamiento que indicas es consecuencia de que el argumento _.data
se está ignorando. El argumento implementado para incluir los datos es Set _.data.
.
Si hacemos la llamada así:
NameBlock aux = DataSet.Ejemplo::CreateVariable([[ Text _.name = "Aux"; Text _.description = "Prueba"; Text _.type = "Serie"; Set _.data. = [[ Serie SubSer(CalInd(WD(5), Diario), y2009, y2010) ]] ]]);
no encontrarás esos problemas.
Haciéndolo así, el argumento _.type
es opcional y el argumento _.expression
es secundario y solo se usará al hacer un UpdateData
.
comment:3 Changed 14 years ago by
¿Por qué el argumento es _.data. (con punto) y no _.data?
Internamente este argumento para la creación de la variables se corresponde con el atributo (que también es un conjunto) denominado _.data.
.
El nombre _.data.
acabado en punto (".") quiere indicar que el atributo en sí mismo (los datos) no es el conjunto en sí mismo sino el elemento que contiene. Este convenio para los atributos se utiliza en más de un sitio en MMS aunque quizá no en todos.
La razón de usar un conjunto para albergar un atributo responde a varias razones entre ellas:
- Hacer posible que el atributo sea opcional.
- Permitir que el atributo pueda ser de distinto tipo para distintas instancias ya que no se trabaja bien con atributos de tipo Anything.
- Permitir que el atributo mantenga su nombre. En este caso el nombre de la serie es
Name(_.data.[1]
y ahorrándonos así tener que darle un nombre en cada llamada aGetData
.
comment:4 Changed 14 years ago by
Description: | modified (diff) |
---|---|
Resolution: | → fixed |
Status: | accepted → closed |
Si se definen los datos de dos maneras, mediante _.expression y _.data, tiene prioridad _.expression:
Creo que en este caso debería dar al menos un Warning (avisando que se utilizará la expresión en lugar de los datos) o quizá incluso un error, pues como ocurre en el ejemplo anterior ambas definiciones pueden ser contradictorias.
Un saludo.