CASE m.lcType == "C" lnLen = Min(LEN(m.lvValue), 254) lcFields = m.lcFields + "(" + LTRIM(STR(lnLen)) + ")"I suppose the real solution would be to use a Memo type in this case so that no data would be lost off the end of the string.
>loObj = CREATEOBJECT("Empty") >ADDPROPERTY(m.loObj, "id", 1) >ADDPROPERTY(m.loObj, "name", "test") >ADDPROPERTY(m.loObj, "bdate", DATE(1980, 1, 1)) > >IF CreateCursorFromObject(m.loObj, 'test') > SELECT test > BROWSE >ENDIF > >*!* A very simple cursor from object function >*!* not contain field width / error handler >FUNCTION CreateCursorFromObject(toObject, tcCursor) > LOCAL ARRAY laFields[1] > LOCAL i, lcFields, lcField, lvValue, lcType, lcTemp, lnPos, lnLen, lnDec > lcFields = "" > FOR i = 1 TO AMEMBERS(laFields, m.toObject) > lcField = m.laFields[m.i] > lvValue = EVALUATE("m.toObject." + m.lcField) > lcType = VARTYPE(m.lvValue) > lcFields = m.lcFields + "," + m.lcField + " " + m.lcType > DO CASE > CASE m.lcType == "C" > lcFields = m.lcFields + "(" + LTRIM(STR(LEN(m.lvValue))) + ")" > CASE m.lcType $ "NY" > lcTemp = TRANSFORM(m.lvValue) > lnLen = LEN(m.lcTemp) > lnPos = AT(".", m.lcTemp) > IF m.lnPos > 0 > lnDec = m.lnLen - m.lnPos - 1 > lnLen = m.lnLen - m.lnDec - 1 > lcFields = m.lcFields + "(" + LTRIM(STR(m.lnLen)) + "," + LTRIM(STR(m.lnDec)) + ")" > ELSE > lcFields = m.lcFields + "(" + LTRIM(STR(m.lnLen)) + ")" > ENDIF > CASE m.lcType $ "DT" > ENDCASE > ENDFOR > IF !EMPTY(m.lcFields) > m.lcFields = TRIM(SUBSTR(m.lcFields, 2)) > CREATE CURSOR (m.tcCursor) ( &lcFields. ) > APPEND BLANK > GATHER NAME m.toObject > ENDIF > RETURN USED(m.tcCursor) >ENDFUNC >