In questo post vediamo come aggiungere un campo di tipo lookup-multiselect che punta alle delivery modes ad una form STD (CustParameters nel nostro caso). Ho trovato in giro diverse soluzioni, quella che mi sembra logicamente più corretta è quella di memorizzare i valori selezionati in una tabella dedicata, piuttosto che scrivere i valori sul controllo unbound stesso.
1) Per prima cosa creiamo una tabella che conterrà i recId delle delivery mode selezionate.La tabella che chiameremo LILCustParametersDlvMode conterrà quindi un campo "DlvModeRecId" chiave primaria
2) Aggiungiamo ora un controllo di tipo string alla form CustParameters nel tab general e settiamo le seguenti proprietà:
- Autodeclaration = Yes
- Name = CustParameters_DlvModes
- Filter Expression = %1
- Label = @SYS210
[ExtensionOf(formStr(CustParameters))]
final class LILCustParametersForm_Extension
{
private SysLookupMultiSelectCtrl msCtrlDlvMode;
//effettual il binding dei valori tra il campo e la tabella LILCustParametersDlvMode
void bindCustParametersDlvMode()
{
container catalogIds, catalogValues;
LILCustParametersDlvMode custParametersDlvMode;
DlvMode dlvMode;
container dlvModeIds,
dlvModeValues;
while select custParametersDlvMode
join dlvMode
where dlvMode.RecId == custParametersDlvMode.DlvModeRecId
{
dlvModeIds += [dlvMode.RecId];
dlvModeValues += [dlvMode.Code];
}
msCtrlDlvMode.set([dlvModeIds, dlvModeValues]);
}
public void saveDlvMode()
{
int counter;
RecId recId;
LILCustParametersDlvMode custParametersDlvMode;
container dlvModes = msCtrlDlvMode.get();
ttsBegin;
//elimina i valori preesistenti
delete_from custParametersDlvMode;
//Salva i nuovi valori selezionati
for (counter = 1; counter <= conlen(dlvModes); counter++)
{
recId = any2int64(conpeek(dlvModes, counter));
if (recId)
{
custParametersDlvMode.clear();
custParametersDlvMode.DlvModeRecId = recId;
custParametersDlvMode.insert();
}
}
ttsCommit;
}
private void initAndBindCustParametersDlvMode()
{
msCtrlDlvMode = SysLookupMultiSelectCtrl::construct(this, CustParameters_DlvModes, queryStr(LILDlvModeQuery));
this.bindCustParametersDlvMode();
}
public void init()
{
next init();
this.initAndBindCustParametersDlvMode();
}
}
class LILCustParametersFormEH
{
[FormControlEventHandler(formControlStr(CustParameters, CustParameters_DlvModes), FormControlEventType::Modified)]
public static void CustParameters_DlvModes_OnModified(FormControl sender, FormControlEventArgs e)
{
FormRun formRun = sender.formRun() as FormRun;
formRun.saveDlvMode();
}
}