Multi-Select Box in CRM

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




AW: Multi-Select Box in CRM

Hi Maik,


also Du hast http://www.jameswilcox.ca/post/63 gelesen oder bist Du nur über Ronald´s Blog Eintrag http://blogs.msdn.com/crm/archive/2007/02/15/many-to-many-relationships-in-ms-dynamics-crm-3-0.aspx (1. Beschriebener Weg) gestolpert.


James hat in den letzten Tagen ein Update seines Scripts gepostet, da noch einige Bug´s im Code enthalten waren. Vielleicht checkst Du mal Deine Version und gleichst diese mit der neuen ab.


Gruß



AW: Multi-Select Box in CRM

Ich bin häufiger Besucher verschiedener CRM Blogs, unter anderem auch der von James, aber das er in den letzten Tagen ein Update gebracht hat ist mir unbekannt, in seinem blog ist der letzte Eintrag von August und schon im Januar schrieb er im CRM-Folder seines Blogs: " I am finally free of supporting MSCRM and no longer have access to the software to test it." Jedenfalls liegt meinem Projekt die Version 1.1 von James script zu Grunde und das ist das aktuellste ich gefunden haben, selbst die Version aus Ronalds Eintrag habe ich überprüft und sie ist identisch mit meiner. Kannst du mir vllt den Link schicken, bezüglich der neuen Version von James Script, vllt entsteht ja dann Klarheit.


AW: Multi-Select Box in CRM

Dagegen ist nichts zu sagen... Ich habe mir die .js Datei jetzt mal angesehen und Sie mit dem auf meinem Test-System implementierten Release abgeglichen. Der Download-Link war mir spontan nicht verfügbar. Die .js-Datei stimmt soweit mit meiner getesten überein.


Die Fehler sind also vermutlich im Aufruf der Funktion zu suchen. Komme vielleicht die Tage dazu hier nachzusehen.


Gruß



AW: Multi-Select Box in CRM

Danke, das würde mir echt weiterhelfen. Auf jedenfall schonmal schon mal ein herzliches Dankeschön für die schnelle Hilfe auch wenn sich das Problem noch nicht restlos beseitigen ließ, zumindest weiss ich jetzt schon mal das ich die aktuelle Version hab :-).