open-insight/SYSPROG/STPROC/O4WI_FORMDESIGNER_WIDGET_XXX.txt
2024-03-25 15:17:34 -07:00

737 lines
26 KiB
Plaintext

Function O4WI_FORMDESIGNER_WIDGET_XXX(ACTION, headerInfo, formInfo, elementID, param1, param2, param3, param4, param5, param6, param7, param8)
*#!Precompile
/*
* This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without
* written permission from Revelation Technologies, Inc.
!
*
* VERSION : 1.0
*
*
* AUTHOR : Revelation Software, Inc., All Rights Reserved
*
* CREATED : July 20, 2015
*
*
!
*
* REVISION HISTORY (Most CURRENT first) :
*
* DATE IMPLEMENTOR FUNCTION
* -------- ----------- --------
*
*
*/
*
$Insert o4wcommon
$Insert o4wequates
$Insert O4W_DESIGN_FORM_EQUATES
If Assigned(ACTION) Else ACTION = ""
If Assigned(formInfo) Else formInfo = ""
If Assigned(elementID) Else elementID = ""
If Assigned(param1) Else param1 = ""
If Assigned(param2) Else param2 = ""
If Assigned(param3) Else param3 = ""
If Assigned(param4) Else param4 = ""
If Assigned(param5) Else param5 = ""
If Assigned(param6) Else param6 = ""
If Assigned(param7) Else param7 = ""
If Assigned(param8) Else param8 = ""
RSLT = ""
elementName = "Control name here"
If Not(Num(action)) Or action < WIDGET_ACTION_MIN_VALUE$ Or action > WIDGET_ACTION_MAX_VALUE$ Then
rslt = WIDGET_ACTION_INVALID$
End Else
On action Gosub doInit, getInfo, doDraw, getProps, doUpdate, doValidate, handleEvent, getPropsForTab, getValue, getRecordInfo
End
Return RSLT
doInit:
title = elementName; text = elementName; image = "../images/widgets/jqm_radio_button.svg"
param1 = title
param2 = text
param3 = image
return
GetInfo:
Gosub getFormInfo
infoTypes = param1
num.info = dcount(infoTypes, @FM)
For each.info = 1 To num.info
infoType = infoTypes<each.info>
Begin Case
Case infoType = WIDGET_INFO_CONTAINER$
* return "1" if a container and the childTYpe is allowed or Null
* return "0" if a container and the childType is NOT allowed
* return "" if not a container
childType = param2<each.info>
* DO CONTROL-SPECIFIC WORK
Case infoType = WIDGET_INFO_ASSOCIATED_LABEL$
* return "1" if this is an element that can be associated with a label
* return "" else
* DO CONTROL-SPECIFIC WORK
Case infoType = WIDGET_INFO_CAN_DELETE$
* return "1" if this element can be deleted
* return "0" if it cannot
* DO CONTROL-SPECIFIC WORK
Case infoType = WIDGET_INFO_DB$
* return the table/fieldname for this element
*If table <> "" then
* rslt = table:@VM:fieldName
*end
Case infoType = WIDGET_INFO_ID$
Rslt<each.info> = elementID:DRSuffix@
Case infoType = WIDGET_INFO_DETAILS$
* return generic info
RSLT<each.info> = COMMENT
If RSLT<each.info> = "" THEN
* DO CONTROL-SPECIFIC WORK
RSLT<each.info> = ELEMENTNAME
End
Case infoType = WIDGET_INFO_INPUT$
* return 1 if input element and enabled
* return 0 if input element and disabled
* return null otherwise
If roFlag <> "1" Then
rslt<each.info> = "1"
End Else
rslt<each.info> = "0"
end
Case infoType = WIDGET_INFO_ALIGN$
rslt<each.info> = controlalign
Case infoType = WIDGET_INFO_BGCOLOR$
rslt<each.info> = bgcolor
Case infoType = WIDGET_INFO_EVENTS$
If cmBefore Then
rslt<each.info,1,-1> = WIDGET_EVENT_BEFORE$
rslt<each.info,2,-1> = "N/A"
End
If cmAfter Then
rslt<each.info,1,-1> = WIDGET_EVENT_AFTER$
rslt<each.info,2,-1> = "N/A"
End
If cmChange Then
rslt<each.info,1,-1> = WIDGET_EVENT_CHANGED$
rslt<each.info,2,-1> = "N/A"
End
If updateAssociated <> "" Then
rslt<each.info,1, -1> = WIDGET_EVENT_ASSOCIATED$
rslt<each.info,2,-1> = updateAssociated
End
Case infoType = WIDGET_INFO_NAME$
rslt<each.info> = name
End Case
Next each.info
Return
doValidate:
Gosub getFormInfo
updateList = ""
If COMMENT = "" And table <> "" Then
comment = Xlate("DICT.":table, fieldname, 3, "X")
Convert @VM:@SVM:@TM To " " In comment
FORMINFO<FORMINFO_COMMENT$, POSN> = COMMENT
End
* DO CONTROL-SPECIFIC WORK
rslt = O4WI_FORMDESIGNER_WIDGET_HELPER("VALIDATE_ADV", headerInfo, formInfo, "","","", adv_props)
If rslt = "" then
Gosub handleAssociated
end
param1 = updateList
Return
handleEvent:
setupInfo = param1
event = setupInfo<1>
runMode = setupInfo<2>
bMobile = setupInfo<3>
suffix = setupInfo<4>
save.drrecords = DRRecords@
save.keys = DRKeys@
Gosub getValue
DRRecords@ = param4
DRKeys@ = param5
Begin Case
Case event _eqc "CHANGE"
If updateAssociated <> "" Then
* tell all the associated fields that they must be redrawn
numAssociated = dcount(updateAssociated, @TM)
For each.associated = 1 To numAssociated
this.other = Field(updateAssociated, @TM, each.associated)
needRefresh = o4wi_formdesigner_helper(this.other, headerInfo, formInfo, "1", runMode, bMobile, err)
Next each.associated
rslt = 1 ;* report that this has been handled here
End
If cmChange Then
* call the commuter module
end
Case event _eqc "PRE_FIELD"
If cmBefore Then
* call the commuter module
end
Case event _eqc "POST_FIELD"
If cmAfter Then
* call the commuter module
end
End Case
DRRecords@ = save.DRRecords
DRKeys@ = save.Keys
Return
doDraw:
setupInfo = param1
isReplace = param4 + 0
runMode = setupInfo<1>
bMobile = setupInfo<2>
parentStyles = setupInfo<3>
* if isReplace, and we can't just update our value/style, we have to redraw our parent and ourselves
parentSectionID = setupInfo<4>
parentSectionStyle = setupInfo<5>
needRefresh = 0
Gosub getFormInfo
Gosub getRecordInfo
oldUIFlag = headerInfo<HEADER_UI_MODE$>+0
inlinePromptFlag = (headerInfo<HEADER_DEFAULT_LABELTYPE$> = HEADER_DEFAULT_LABELTYPE_INLINE$)
* DO CONTROL-SPECIFIC WORK
If DRROOverrideFlag@ <> "" Then
roFlag = DRROOverrideFlag@
end
If roFlag Then
style := @SVM:"readOnly"
End Else
style := @SVM:"readWrite"
end
If oldUIFlag Then
style := @SVM:"classicUI"
End
Style := @SVM:classes
num.data = dcount(datastyles_names, @TM)
For each.data = 1 To num.data
Style := @SVM:o4wdatastyle("", Field(datastyles_names, @TM, each.data), Field(datastyles_values, @TM, each.data))
Next each.data
If isReplace Then
* use o4wupdate
End Else
* draw for real
If html_before <> "" Then
o4wraw(html_before)
End
* element specific instructions
If html_after <> "" Then
o4wraw(html_after)
end
End
param2 = "0" ;* must call "buildParent"?
param3 = "" ;*blankLine:@FM:sizeStyle:@FM:specialStyle:@FM:divHeader:@FM:divHeaderSize
rslt = needRefresh
return
getValue:
Gosub getFormInfo
currentValue = ""
iValue = ""
dict.Info = ""
atRecord = ""
recordList = ""
keyList = DRKeys@
posn = ""
convError = ""
special.conv = ""
If table <> "" And fieldName <> "" then
Locate table In DRTables@ using @FM setting posn Else
DRTables@<posn> = table
end
Open "DICT",table To @DICT Else null
Read dict.info From @DICT, fieldName Else dict.Info = ""
atrecord = Field(DRRecords@, @RM, posn)
key = DRKeys@<posn, 1>
end
bUseDict = 0
Begin Case
Case conv_i = "NONE"
conv_i = ""
Case conv_i = "USER"
*conv_i = conv_i_userdef
Case conv_i = "-"
conv_i =dict.info<11>
bUseDict = 1
End Case
currentValue = o4wGetValue(name)
iValue = currentValue
If conv_i <> "" Then
* Convert 'standard' user-defined formats to our own (non-ui) versions
Swap "EMAIL_FORMAT" With "EMAIL_FORMAT_INTERNAL" In conv_i
Swap "PHONE_FORMAT" With "PHONE_FORMAT_INTERNAL" In conv_i
Swap "ZIP_FORMAT" With "ZIP_FORMAT_INTERNAL" In conv_i
Swap "SSN_FORMAT" With "SSN_FORMAT_INTERNAL" In conv_i
status() = 0
If bUseDict Then
* use in.value to handle the validation/input conversion
Declare Function in.value
bIsValid = 1
num.vals = dcount(iValue, @VM)
iNewValue = ""
For each.val = 1 To num.vals While bIsValid
this.newValue = iValue<1,each.val>
this.iNewValue = in.value(this.newValue, conv_i, bIsValid)
If bIsValid = 0 And conv_i[1,1] <> "(" Then
bIsValid = 1
this.iNewValue = in.value(this.newValue, "(":conv_i:")", bIsValid)
End
If (bIsValid = 0 Or status()) Then
bIsValid = 0
convError<1,-1> = "Error converting '":this.newValue:"' using conversion code '":conv_i:"'"
End
iValue<1, each.val> = this.iNewValue
Next each.val
End else
iValue = Iconv(iValue, conv_i)
If status() Then
convError<1,-1> = "Error converting '":currentValue:"' using conversion code '":conv_i:"'"
End
End
* don't really care (here) if it's an invalid value...
status() = 0
* special case for MC (masked character) conversions - ONLY operate as OCONV
If (conv_i = "MCU" Or conv_i = "MCL") And special.conv = "" Then
special.conv = conv_i[3,1]
end
end
If special.conv <> "" Then
* special.conv is either U or L to uppercase or lowercase the input value
currentValue = Oconv(iValue, "MC":special.conv)
end
param1 = currentValue
param2 = iValue
If roFlag <> "1" And DRROOverrideFlag@ <> "1" And dict.Info <> "" Then
If dict.info<1>[1,1] = "F" Or dict.info<1>[1,1] = "S" Then
fieldNo = dict.info<2>
If Num(fieldNo) And fieldNo <> "" Then
If fieldNo = 0 Then
keyPart = dict.info<5>
If Num(keyPart) And keyPart <> "" And keyPart <> "0" Then
key = fieldstore(key, "*", keyPart, 1, iValue)
End Else
key = iValue
end
keyList<posn, 1> = key
End else
atRecord<fieldNo> = iValue
recordList = fieldstore(DRRecords@, @RM, posn, 1, atRecord)
end
end
End
End
param3 = atRecord
param4 = recordList
param5 = keyList
param6 = convError
Return
getPropsForTab:
passedInfo = param1
currTab = param2
If currTab _nec PROPS_TAB_NAME_FMT$ Then Return ;* only care when we leave the db tab
* get the current info
reqd_props = passedInfo<FORMINFO_PARAM_R$>
opt_props = passedInfo<FORMINFO_PARAM_O$>
db_props = passedInfo<FORMINFO_DB_INFO$>
fmt_props = passedInfo<FORMINFO_FMT_INFO$>
mob_props = passedInfo<FORMINFO_MOB_INFO$>
evt_props = passedInfo<FORMINFO_EVT_INFO$>
adv_props = passedInfo<FORMINFO_ADV_INFO$>
parent = passedInfo<FORMINFO_PARENT$>
Gosub extractDetails
* something here has changed - reset the fields
reqd_info = ""
opts_info = ""
db_info = ""
fmt_info = ""
mob_info = ""
evt_info = ""
adv_info = ""
propName = elementName
Gosub getPropsFmt
param3 = PROPS_TAB_NUM_FMT$
param4 = FMT_info
Return
getProps:
passedInfo = param1
reqd_props = passedInfo<FORMINFO_PARAM_R$>
opt_props = passedInfo<FORMINFO_PARAM_O$>
db_props = passedInfo<FORMINFO_DB_INFO$>
fmt_props = passedInfo<FORMINFO_FMT_INFO$>
mob_props = passedInfo<FORMINFO_MOB_INFO$>
evt_props = passedInfo<FORMINFO_EVT_INFO$>
adv_props = passedInfo<FORMINFO_ADV_INFO$>
parent = passedInfo<FORMINFO_PARENT$>
Gosub extractDetails
reqd_info = ""
opts_info = ""
db_info = ""
fmt_info = ""
mob_info = ""
evt_info = ""
adv_info = ""
propName = ""
* DO CONTROL-SPECIFIC WORK
adv_info = O4WI_FORMDESIGNER_WIDGET_HELPER("DISPLAY_ADV", headerInfo, formInfo, "","","", adv_props)
* SET UP PROPNAME, XXX_INFO
getPropsFmt:
param2 = reqd_info
param3 = opts_info
param4 = db_info
param5 = fmt_info
param6 = mob_info
param7 = evt_info
param8 = adv_info
rslt = propName
Return
getFormInfo:
bFound = 0
comment = ""
ctype = ""
parent = ""
children = ""
reqd_props = ""
opt_props = ""
db_props = ""
fmt_props = ""
mob_props = ""
evt_props = ""
adv_props = ""
locn = ""
associated = ""
Locate elementID In formInfo<FORMINFO_ID$> using @VM setting posn Then
bFound = 1
COMMENT = FORMINFO<FORMINFO_COMMENT$, POSN>
CTYPE = FORMINFO<FORMINFO_TYPE$, POSN>
PARENT = FORMINFO<FORMINFO_PARENT$, POSN>
CHILDREN = FORMINFO<FORMINFO_CHILDREN$, POSN>
REQD_PROPS = FORMINFO<FORMINFO_PARAM_R$, POSN>
OPT_PROPS = FORMINFO<FORMINFO_PARAM_O$, POSN>
db_props = forminfo<FORMINFO_DB_INFO$, POSN>
fmt_props = forminfo<FORMINFO_FMT_INFO$, POSN>
mob_props = forminfo<FORMINFO_MOB_INFO$, POSN>
evt_props = formInfo<FORMINFO_EVT_INFO$, POSN>
adv_props = formInfo<FORMINFO_ADV_INFO$, POSN>
LOCN = FORMINFO<FORMINFO_POSN$, POSN>
ASSOCIATED = FORMINFO<FORMINFO_ASSOCIATED$, POSN>
ASSOCIATED_LABEL_TYPE = FORMINFO<FORMINFO_LABEL_TYPE$, POSN>
end
* fall through to extractDetails
extractDetails:
* PULL OUT CONTROL-SPECIFIC DETAILS
dummy = O4WI_FORMDESIGNER_WIDGET_HELPER("EXTRACT_ADV", headerInfo, formInfo, "","","", adv_props, html_before, html_after, classes, datastyles_names, datastyles_values)
Return
/*
AddElement:
newPosn = o4wi_formdesigner_widget_new(headerInfo, formInfo, thisID, parent, childtype, prop_locn, elementID, bProtected, addBefore)
Return
*/
handleAssociated:
If associated = "" Then return
Locate associated<1,1,1> In formInfo<FORMINFO_ID$> using @VM setting aPos then
CTYPE = formInfo<FORMINFO_TYPE$, aPos>
supportName = UCASE(DESIGN_SUPPORT_PREFIX$:CTYPE)
whichTypes = ""
whichValues = ""
* headerText = opt_props<1,1,2>
* headerSize = opt_props<1,1,3>
*whichTypes = "TEXT":@fm:"SIZE"
*whichValues = headerText:@FM:headerSize
call @supportName(WIDGET_ACTION_UPDATE$, headerInfo, formInfo, associated, elementID, whichTypes, whichValues)
End
Return
doUpdate:
* our associated element has changed - update ourselves
Gosub getFormInfo
associatedID = param1
whichParameter = param2
newValues = param3
num.params = dcount(whichParameter, @FM)
For each.param = 1 To num.params
this.param = whichParameter<each.param>
this.value = newValues<each.param>
Begin Case
case this.param = WIDGET_MSG_LABEL$ Or this.param = WIDGET_MSG_LEGEND$
reqd_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_BTN_DEFAULT$
If this.value = "0" Or this.value = "1" then
reqd_props<1,1,2> = this.value
end
Case this.param = WIDGET_MSG_OMIT_LABEL$
If this.value = "0" Or this.value = "1" then
reqd_props<1,1,2> = this.value + 0
End
Case this.param = WIDGET_MSG_LABEL_PLACEMENT$
reqd_props<1,1,3> = this.value
Case this.param = WIDGET_MSG_NAME$
reqd_props<1,1,4> = this.value
Case this.param = WIDGET_MSG_FONT_NAME$
fmt_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_FONT_COLOR_BG$
fmt_props<1,1,2> = this.value
Case this.param = WIDGET_MSG_FONT_COLOR_FG$
fmt_props<1,1,3> = this.value
Case this.param = WIDGET_MSG_FONT_BOLD$
if this.value = "0" or this.value = "1" then
fmt_props<1,1,4> = this.value
end
Case this.param = WIDGET_MSG_FONT_ITALIC$
if this.value = "0" or this.value = "1" then
fmt_props<1,1,5> = this.value
end
Case this.param = WIDGET_MSG_FONT_ALIGN$
if num(this.value) then
fmt_props<1,1,6> = this.value
end
Case this.param = WIDGET_MSG_FONT_SIZE$
fmt_props<1,1,7> = this.value
Case this.param = WIDGET_MSG_CONTROL_ALIGN$
If Num(this.value) Then
fmt_props<1,1,8> = this.value
end
Case this.param = WIDGET_MSG_MOB_ICON$
mob_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_MOB_THEME$
mob_props<1,1,2> = this.value
Case this.param = WIDGET_MSG_MOB_LAYOUT$
mob_props<1,1,3> = this.value
Case this.param = WIDGET_MSG_MOB_MINI$
If this.value = "0" Or this.value = "1" then
mob_props<1,1,4> = this.value
end
Case this.param = WIDGET_MSG_OPT_HEIGHT$
opt_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_OPT_WIDTH$
opt_props<1,1,2> = this.value
Case this.param = WIDGET_MSG_SELECT_MULTI$
If this.value = "0" Or this.value = "1" then
opt_props<1,1,3> = this.value
end
Case this.param = WIDGET_MSG_SUPPRESS_DESIGN$
If this.value = "0" Or this.value = "1" then
opt_props<1,1,4> = this.value
End
Case this.param = WIDGET_MSG_DB_TABLE$
db_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_DB_FIELD$
db_props<1,1,2> = this.value
Case this.param = WIDGET_MSG_DB_MV$
If this.value = "0" Or this.value = "1" then
db_props<1,1,3> = this.value + 0
end
Case this.param = WIDGET_MSG_CONV_O$
db_props<1,1,4> = this.value
Case this.param = WIDGET_MSG_CONV_O_USER$
db_props<1,1,5> = this.value
Case this.param = WIDGET_MSG_CONV_I$
db_props<1,1,6> = this.value
Case this.param = WIDGET_MSG_CONV_I_USER$
db_props<1,1,5> = this.value
Case this.param = WIDGET_MSG_SET_SHOWNONE$
If this.value = "0" Or this.value = "1" then
db_props<1,1,5> = this.value
End
Case this.param = WIDGET_MSG_LINK$
If this.value = "" Or this.value = "0" Then
* no link here
opt_props<1,1,1> = 0
opt_props<1,1,2> = ""
opt_props<1,1,3> = ""
End Else If this.value = "1" then
* link here
opt_props<1,1,1> = 1
end
Case this.param = WIDGET_MSG_LINK_TYPE$
If opt_props<1,1,1> = "1" Or opt_props<1,1,1> = "" Then
opt_props<1,1,1> = "1"
opt_props<1,1,2> = this.value
End
Case this.param = WIDGET_MSG_LINK_URL$
If opt_props<1,1,1> = "1" Or opt_props<1,1,1> = "" Then
opt_props<1,1,1> = "1"
opt_props<1,1,3> = this.value
End
Case this.param = WIDGET_MSG_EVENT_POPUP$
If this.value = "1" Or this.value = "0" Then
evt_props<1,1,1> = this.value
end
Case this.param = WIDGET_MSG_EVENT_CLICK$
If this.value = "1" Or this.value = "0" Then
evt_props<1,1,2> = this.value
end
Case this.param = WIDGET_MSG_EVENT_UPDATE_ASSOCIATED$
evt_props<1,1,1> = this.value
Case this.param = WIDGET_MSG_EVENT_BEFORE$
If this.value = "1" Or this.value = "0" Then
evt_props<1,1,2> = this.value
end
Case this.param = WIDGET_MSG_EVENT_CHANGED$
If this.value = "1" Or this.value = "0" Then
evt_props<1,1,3> = this.value
end
Case this.param = WIDGET_MSG_EVENT_AFTER$
If this.value = "1" Or this.value = "0" Then
evt_props<1,1,4> = this.value
end
Case this.param = WIDGET_MSG_LIST_SOURCE$
reqd_props<1,1,3> = this.value
Case this.param = WIDGET_MSG_LIST_TABLE$ Or this.param = WIDGET_MSG_LIST_STPROC$
reqd_props<1,1,4> = this.value
Case this.param = WIDGET_MSG_LIST_CODE_RECORD$
reqd_props<1,1,5> = this.value
Case this.param = WIDGET_MSG_LIST_CODE_FIELD_VALUE$ Or this.param = WIDGET_MSG_LIST_SELECT$
reqd_props<1,1,6> = this.value
Case this.param = WIDGET_MSG_LIST_CODE_FIELD_DESC$
If reqd_props<1,1,3> = "2" Then
reqd_props<1,1,7> = this.value
End Else
reqd_props<1,1,5> = this.value
End
Case this.param = WIDGET_MSG_LABEL_TYPE$
ASSOCIATED_LABEL_TYPE = this.value
Case 1
* see if these are advanced properties
dummy = O4WI_FORMDESIGNER_WIDGET_HELPER("UPDATE_ADV", headerInfo, formInfo, "","","", adv_props, this.param, this.value)
End CASE
Next each.param
* make sure forminfo is updated
FORMINFO<FORMINFO_COMMENT$, POSN> = COMMENT
FORMINFO<FORMINFO_TYPE$, POSN> = CTYPE
FORMINFO<FORMINFO_PARENT$, POSN> = PARENT
FORMINFO<FORMINFO_CHILDREN$, POSN> = CHILDREN
FORMINFO<FORMINFO_PARAM_R$, POSN> = REQD_PROPS
FORMINFO<FORMINFO_PARAM_O$, POSN> = OPT_PROPS
forminfo<FORMINFO_DB_INFO$, POSN> = db_props
forminfo<FORMINFO_FMT_INFO$, POSN> = fmt_props
formInfo<FORMINFO_MOB_INFO$, POSN> = mob_props
formInfo<FORMINFO_EVT_INFO$, POSN> = evt_props
formInfo<FORMINFO_ADV_INFO$, POSN> = adv_props
FORMINFO<FORMINFO_POSN$, POSN> = LOCN
FORMINFO<FORMINFO_ASSOCIATED$, POSN> = ASSOCIATED
FORMINFO<FORMINFO_LABEL_TYPE$, POSN> = ASSOCIATED_LABEL_TYPE
Return
getRecordInfo:
currentValue = ""
iValue = ""
If runMode = 1 then
If Len(TABLE) then
Locate table In DRTables@ using @FM setting posn Else posn = 1
Open "DICT",table To @DICT then
Read dict.info From @DICT, fieldName Else dict.Info = ""
Begin Case
Case conv_o = "NONE"
conv_o = ""
Case conv_o = "USER"
*conv_o = conv_o_userdef
Case conv_o = "-"
conv_o = dict.info<7>
End Case
Begin Case
Case conv_i = "NONE"
conv_i = ""
Case conv_i = "USER"
*conv_i = conv_i_userdef
Case conv_i = "-"
conv_i = dict.info<11>
End Case
@record = Field(DRRecords@, @RM, posn)
@id = DRKeys@<posn,1>
valno = DRKeys@<posn, 2>
iValue = calculate(fieldName)
end
End
If bIsMV then
DRNumMV@ = dcount(iValue, @VM)
If DRMV@ + 0 Then
iValue = iValue<1, DRMV@>
End Else If DRNumMV@ > 1 Then
If valno Then
iValue = iValue<1, valno>
DRNumMV@ = 1 ;* if we've got a valno in the key list, then we just want _this_ value
End Else
* TO DO
end
End
end
currentValue = iValue
If conv_o <> "" then
currentValue = Oconv(iValue, conv_o)
end
End
return