Thanks Lukas.

2011/9/16 Lukas Zeller <l...@plan44.ch>

> Hello Roger,
>
> On Sep 16, 2011, at 16:28 , Roger KeIrad wrote:
>
> > hello,
> > any help please?
> > thanks in advance.
>
>
> There are a number of GetValueXXX variants. GetValue() is only for single
> values.
>
> For arrays, you need to use GetValueByID(), which has a arrIndex parameter.
> To get the ID for a name, use GetValueID(). You can get the size of the
> array by appending VALSUFF_ARRSZ to the array field name, and call
> GetValue() with that - you'll get the number of elements back.
>
> See sysync_SDK/Sources/enginemodulebase.h for more detailed description of
> all the Get/SetValue functions, and engine_defs.h for the VALNAME_xxx and
> VALSUFF_xxx explanations.
>
> Pseudo code to get all elements of an array would look like:
> SDK_InterfaceType
> // get size of array
> uInt16 arraySize;
> memsize n;
> GetValue("arrayFieldName" VALSUFF_ARRSZ, VALTYPE_INT16,
> &arraySize,sizeof(arraySize),n);
>
> // get elements of array
> long arrayFieldID = GetValueID("arrayFieldName");
> for (int i=0; i<arraySize; i++) {
>  GetValueByID(arrayFieldID, i, VALTYPE_XXX, &buffer, maxSize, n);
>  // do something with the value
> }
>
>
>
> Below is a more elaborate routine, which prints out all values for a given
> aItemKey, including array fields:
>
>
> /* Show all fields/variables of item represented by aItemKey */
> static void ShowFields(DB_Callback cb, appPointer aItemKey)
> {
>  const stringSize maxstr = 128;
>  appChar fnam[maxstr];
>  appChar fval[maxstr];
>  appChar ftz[maxstr];
>  uInt16 fvaltype;
>  uInt16 farrsize;
>  uInt16 arridx;
>  bool fisarray;
>  uInt32 valsize;
>  TSyError err;
>  uInt32 valueID,nameFlag,typeFlag,arrszFlag,tznamFlag;
>  // set desired time mode
>  cb->ui.SetTimeMode(cb, aItemKey, TMODE_LINEARTIME+TMODE_FLAG_FLOATING);
>  // get flags that can be combined with valueID to get attributes of a
> value
>  nameFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALNAME");
>  typeFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALTYPE");
>  arrszFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.ARRAYSIZE");
>  tznamFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.TZNAME");
>  // iterate over all fields
>  // - start iteration
>  valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_FIRST);
>  while (valueID != KEYVAL_ID_UNKNOWN && valueID != KEYVAL_NO_ID) {
>    // get field name
>    err = cb->ui.GetValueByID(cb,
>      aItemKey,
>      valueID + nameFlag,
>      0,
>      VALTYPE_TEXT,
>      fnam,
>      maxstr,
>      &valsize
>    );
>    // get field type
>    err = cb->ui.GetValueByID(cb,
>      aItemKey,
>      valueID + typeFlag,
>      0,
>      VALTYPE_INT16,
>      &fvaltype,
>      sizeof(fvaltype),
>      &valsize
>    );
>    // check if array, and if array, get number of elements
>    err = cb->ui.GetValueByID(cb,
>      aItemKey,
>      valueID + arrszFlag,
>      0,
>      VALTYPE_INT16,
>      &farrsize,
>      sizeof(farrsize),
>      &valsize
>    );
>    fisarray = err==LOCERR_OK;
>
>    if (!fisarray) {
>      // single value
>      err = cb->ui.GetValueByID(cb, aItemKey, valueID, 0, VALTYPE_TEXT,
> fval, maxstr, &valsize);
>      if (err==LOCERR_OK) {
>        if (fvaltype==VALTYPE_TIME64) {
>          // for timestamps, get time zone name as well
>          cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, 0,
> VALTYPE_TEXT, ftz, maxstr, &valsize);
>          DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = %s
> timezone=%s",fnam,fvaltype,fval,ftz);
>        }
>        else
>          DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = '%s'",fnam,fvaltype,fval);
>      }
>      else
>        DEBUG_(cb, "- %-20s (VALTYPE=%2hd) : No value,
> error=%hd",fnam,fvaltype,err);
>    }
>    else {
>      // array
>      DEBUG_(cb, "- %-20s (VALTYPE=%2d) = Array with %d
> elements",fnam,fvaltype,farrsize);
>      // show elements
>      for (arridx=0; arridx<farrsize; arridx++) {
>        err = cb->ui.GetValueByID(cb, aItemKey, valueID, arridx,
> VALTYPE_TEXT, fval, maxstr, &valsize);
>        if (err==LOCERR_OK) {
>          if (fvaltype==VALTYPE_TIME64) {
>            // for timestamps, get time zone name as well
>            cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, arridx,
> VALTYPE_TEXT, ftz, maxstr, &valsize);
>            DEBUG_(cb, "           %20s[%3hd] = %s
> timezone=%s",fnam,arridx,fval,ftz);
>          }
>          else
>            DEBUG_(cb, "           %20s[%3hd] = '%s'",fnam,arridx,fval);
>        }
>        else
>          DEBUG_(cb, "           %20s[%3hd] : No value,
> error=%hd",fnam,arridx,err);
>      }
>    }
>    // next value
>    valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_NEXT);
>  } // while more values
> } /* ShowFields */
>
>
_______________________________________________
os-libsynthesis mailing list
os-libsynthesis@synthesis.ch
http://lists.synthesis.ch/mailman/listinfo/os-libsynthesis

Reply via email to