Hallo Forum,
ich habe vor kurzen einen Scriptfetzen im Internet gefunden, mit dem es angeblich möglich sei, über umwege versteht sich, eine Multi-Select Box in CRM Formularen zu erstellen. Das Prinzip dieser Idee sieht wie folgt aus: Man hat ein ntext-Attribut, in welches die ausgewählten Werte eingetragen werden, desweiteren hat mein ein picklist-Attribut aus dem die Werte, welche man auswählt, in das ntext und der zweiten picklist (damit man sie wieder löschen kann) eingefügt werden. Etwas umständlich aber für den Anfang ok. Zuerst habe ich folgenden Code in die Global.js eingefügt (ja es gibt sicherlich einen besseren Ort dafür, aber da das ein Versuch ist und ich mir nicht mehr Arbeit als nötig machen wollte ist das Script dort erstmal gut aufgehoben), siehe hier:
/* This string separates the elements in the list.
It can behave strangely when working with existing
records which use a different separator. */
oSeparator = ';';
/********* Do not edit below here **********/
function removeAllOptions(selectbox){
var i;
/* Remove all but the first one as it has special
CRM properties that we need to submit the form. */
for(i=selectbox.options.length-1;i>=1;i--){
selectbox.remove(i);
}
}
/* function added by Ronald */
function getValues(sourceid){
oMultiValues = crmForm.all[sourceid].value.split(oSeparator);
return oMultiValues;
}
/* function bugfixed by Ronald */
function populateRemoveMulti(sourceid,oTarget){
// Fills a picklist with values from a given text field
allValues = getValues(sourceid);
// empty target first
removeAllOptions(oTarget);
if(allValues) {
// fill values
for (i=1; i< allValues.length; i++){
oTarget.AddOption(allValues[i], allValues[i]);
}
} else {
return false;
}
}
/* function bugfixed by Ronald */
function setValues(target,oFinalValues) {
// Updates a field with new values
oCleanValues = new Array();
for(i=0; i< oFinalValues.length; i++){
oCleanValues[oCleanValues.length] = oFinalValues[i];
}
// Create Array
oJoinedValues = oCleanValues.join(oSeparator);
// Strip out erroneous separator at the beginning, if there
if(oJoinedValues.substring(0,oSeparator.length) == oSeparator)
oJoinedValues = oJoinedValues.substring(oSeparator.length);
// Update the text box
crmForm.all[target].DataValue = oJoinedValues;
}
////////// Array Manipulation ///////////
function addValue(oValues, newValue) {
// Go through oValues array looking for requested addition
foundValue = 0;
autoIndex = 0 ;
if(oValues.length && oValues.length > 0) {
for(i=0; i< oValues.length; i++) {
if(oValues[i] == newValue)
foundValue = 1;
}
autoIndex = oValues.length;
}
// If not already in the array, add it to the end
if(foundValue == 0)
oValues[autoIndex] = newValue;
// Then sort and return the array
return oValues.sort();
}
function delValue(oValues, remValue) {
// Go through oValues array looking for requested item
newValues = new Array();
if(oValues.length && oValues.length > 0) {
for(i=0; i< oValues.length; i++) {
if(oValues[i] != remValue){
// add items to keep
newValues[newValues.length] = oValues[i];
}
}
}
// Then sort and return the array
return newValues.sort();
}
////////// Request Management //////////
function addMulti(target,remover) {
// Get existing values in a sorted array
aValues = getValues(target);
// Get value to add
var oField = event.srcElement;
var aAddValue = oField.options[oField.selectedIndex].text;
// If there are already values there, make sure this isn't a duplicate
if(crmForm.all[target].value != '') {
aNewValues = addValue(aValues,aAddValue);
// Update field with new values
setValues(target, aNewValues);
} else {
crmForm.all[target].DataValue = aAddValue + '; ';
}
// Update Remove Item picklist
populateRemoveMulti(target,crmForm.all[remover]);
// Forces CRM to update this field
crmForm.all[target].ForceSubmit = true;
// Notify of change
crmForm.all[target].style.fontWeight = "bold";
// Reset selection
oField.selectedIndex=0;
}
function delMulti(target) {
// Get existing values in a sorted array
dValues = getValues(target);
// Get value to remove
var dField = event.srcElement;
var dDelValue = dField.options[dField.selectedIndex].text;
//alert(dDelValue);
// If there are still values there, remove the item
if(crmForm.all[target].value != '') {
dNewValues = delValue(dValues,dDelValue);
// Update field with new values
setValues(target, dNewValues);
}
// Update Remove Item picklist
populateRemoveMulti(target,dField);
// Forces CRM to update this field
crmForm.all[target].ForceSubmit = true;
// Notify of change
crmForm.all[target].style.fontWeight = "bold";
// Reset selection
dField.selectedIndex=0;
}
///// Script-Ende /////
In dem Formular habe ich wie oben schon erklärt 3 Attribute erstellt:
new_test1 (ntext)
new_test2 (picklist-add)
new_test3 (picklist-remove)
Jetzt habe ich OnLoad in dem Formular folgendes eingefügt:
populateRemoveMulti('new_test1','new_test3');In test2 (Add-picklist):
addMulti('new_test1‘,’new_test3‘);
Und in test3 (Remove-picklist):
delMulti('new_test1');
Wenn ich jetzt das Formular öffne bekomme ich schon OnLoad den Fehler: Objekt erwartet.
Wenn ich jetzt noch die " ' " raus nehme dann bekomme ich: "new_testX" undefined.
Ich bin den Code schon etliche Male durchgegangen und habe keine Fehler gefunden, hat jemand eine Ahnung wo hier der Hase im Pfeffer liegt und kann mir helfen bevor ich die Flinte ins Korn werfe.
Gruß Maik