none
Abfangen einer Schleife im OnLoad() Ereignis RRS feed

  • Frage

  • Hallo,

     ich habe da eine kleine Frage.

     Ich habe im OnLoad() von der Entität Brief etwas Code, in dem eine aspx Seite aufgerufen wird. Da ich aber die LetterID benötige für die aspx Seite zum übergeben. Habe folgenden Code

    if(idLetter == null)
    {}
    else
    {
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);
         
      }

    Wenn ich nun auf Speichern drücke, bekomme ich ja die ID und alles ist gut. Aber leider läuft meine Schleife ja jetzt immer da rein,wenn ich z.B. F5 drücke oder einen vorhandenen Brief öffne. Das soll er ja eben nicht, sondern nur wenn einen neuen Brief erstelle.

    Wie kann ich das denn am besten abfangen? Vielleicht mit den FormType???

    Für Hilfe und Anregungen wäre ich sehr dankbar.

    Gruß
    Dienstag, 6. Oktober 2009 09:46

Antworten

  • var idLetter = crmForm.ObjectId;
    
    crmForm.all.bmww_ischeck.readOnly = true;
    if((idLetter != null))
    {
      if(crmForm.all.bmww_ischeck.DataValue == false)
      {
           crmForm.all.bmww_ischeck.DataValue = true;
           
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);
            crmForm.Save();
       }
    }
    
    hi,

    änder deinen onLoad erstmal so ab und prüf mal ob erst so erstmal funktioniert.
    Mittwoch, 7. Oktober 2009 10:25

Alle Antworten

  • Hallo,

    der FormType wird dir nicht weiter helfen, da nach dem Speichern der Typ von Create auf Update wechselt.
    Ich denke, das einfachste wird sein, du definierst ein Bitfeld und wenn du das erste mal die ID ermittelst hast, schreibst du eine 1 in das Feld.
    Dann musst du nur noch die Prüfung um das Bitfeld erweitern, und schon vermeidest du eine Schleife.
    Viele Grüße

    Michael Sulz
    axcentro GmbH
    MVP für Microsoft Dynamics CRM
    Dienstag, 6. Oktober 2009 09:53
  • Hallo,

    Entschuldigung jetzt die total blöde Frage. Aber wird muss ich bei dem Bifeld etwas besonderes beachten???

    Gruß

    P.S.

    Ich habe da noch eine kleine andere Frage. Wenn ich mir die ID über ein Plugin ermitteln möchte, läuft dann erst das Plugin oder der Code in den Ereignissen Onload() bzw OnSave()?
    Dienstag, 6. Oktober 2009 10:05
  • hallo ozwi,

    1. neues Attribute anlegen
    2. Beim Erzeugen des Brief crmForm.all.<deinNeuesAttribut>.DataValue = 1
    3. In deiner else Schleife eine IF Abfrage einbauen, die nur dann ausgeführt wird, wenn crmForm.all.<deinNeuesAttribut>.DataValue == 0

    P.S. 

    Zuerst werden FormScripte ausgeführt OnLoad/OnSave, dann erst Plugins


    gruß
    localh0rst
    Dienstag, 6. Oktober 2009 10:19
  • hallo localhOrst,

     irgendwie funktioniert es nicht. Ich habe eine neues Atribut erstell "bmww_ischeck" vom Type bit. Ich bekomme immer eine Fehlermeldung das es kein Object bzw NULL ist.

    Ich steh jetzt echt ganz schön aufm schlauch. Sorry!

    Wo ist denn jetzt hier mein Fehler????

    var idLetter = crmForm.ObjectId;
    if((idLetter == null))
    {
    }
    else
    {
      if(crmForm.all.bmww_ischeck.DataValue == 0)
      {
           crmForm.all.bmww_ischeck.DataValue = 1;
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);
       }

    }


    Gruß
    Dienstag, 6. Oktober 2009 11:07
  • var idLetter = crmForm.ObjectId;
    if((idLetter == null))
    {
    }
    else
    {
      if(crmForm.all.bmww_ischeck.DataValue == false)
      {
           crmForm.all.bmww_ischeck.DataValue = true;
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);
       }

    }
    Dienstag, 6. Oktober 2009 11:20
  • Super danke schön:-)

    Es lag wohl da dran, dass ich das Feld nicht auf die Form gebracht habe. Kann man das Feld eigentlich auch irgendwo auf Editable = no setzen?

    Dann habe ich jetzt noch eine Frage. Meine aspx Seite die ich aufrufe dient eigentlich dazu ein Word Dokument zu öffnen, aus Word heraus speichern ich das Word Dokument in Notizen von dem Brief. Das angehängte Word Dokument wird erst sichtbar, wenn ich auch F5 drücke. Wenn ich das mache kommt ein Hinweis

    Die bereits eingegebenen Informationen, müssen erneut gesendet werden, um die Webseite wieder anzuzeigen.
    Sie sollten auf "Abbrechen" klicken, wenn  Sie einen Einkauf durchgeführt haben, um eine doppelte Transaktion zu vermeiden.
    KLicken Sie auf "Wiederholen", um die Webseite erneut anzuzeigen.

    Vorher hatte ich diese Meldung nicht. Oder liegt es jetzt an mein neues Feld???? Muss ich da noch irgendwelche Einstellungen vornehmen beim Attribut?

    Gruß Olli
    Dienstag, 6. Oktober 2009 12:01
  • crmForm.all.<deinFeld>.readOnly = true; setzt das Feld auf ReadOnly...

    Nein, soweit ich weiß hat das was mit deiner aspx Seite zu tun.
    Du sendest Variablen an eine ASPX Datei, die ja nacher zum Dokument verarbeitet wird.
    Wenn du auf F5 drückst, sagst du dem Browser er soll den ganzen Spaß nochmal wiederholen.
    Das Problem was du dann hast ist, dass du das Dokument doppelt hast, weil durch das F5 doppelt verarbeitet wurde.

    Ich würde es anders machen...
    Du kann das Grid von den Dokumenten ohne F5 aktualisieren mit window.setTimeout(). Ist dir die Methode bekannt?


    Eine etwas bessere Idee wäre, die window.showModalDialog() / window.dialogArguments zu benutzen

    var sFeatures='dialogHeight: 400px;dialogWidth:610px';
    window.showModalDialog("<deineZielseite>",crmForm.all.<deinIframe>,sFeatures);

    ...usw

    Dienstag, 6. Oktober 2009 12:22
  • Die Methode ist mir leider nicht bekannt
    Kannst Du mir etwas da drüber erzählen oder sagen wo ich etwas da drüber finde?

    Was bewirkt denn dieses showModalDialog?  Ein IFrame habe ich gar nicht, bei mir wird über die aspx Seite Microsoft Word mit dem Dokument geöffnet.

    Gruß Olli
    Dienstag, 6. Oktober 2009 12:32
  • Mit IFrame meinte ich den Block wo die Dokumente zu dem Brief angezeigt werden...
    Ist in dem Fall glaube ich garkein IFrame :)

    Ruf deine Seite erstmal mit den folgenden Parametern auf.


    var sFeatures='dialogHeight: 400px;dialogWidth:610px';
    var oButton = document.getElementById("refreshButton");
    
    window.showModalDialog("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter,oButton,sFeatures);
    

    Lass dir im Onload der Seite default.aspx folgendes ausgeben:


    alert(window.dialogArguments);

    window.showModalDialog macht im Prinzip dasselbe wie window.open, der Unterscheid ist, mit showModalDialog kannst du das geöffnete Fenster solange nicht wegklicken bis der Benutzer erfolgreich beendet oder abbricht...


    Der Sinn der obigen showModalDialog-Anweisung ist :
    Du gibst der default.aspx das Objekt des grünen Refreshknopfes in Dokumenten mit und kannst den von der aspx Seite aus aktualisieren...
    verstanden?



    Dienstag, 6. Oktober 2009 12:44
  • Mehr oder weniger habe ich es verstanden. Leider bleibt mein showModalDialog Fenster leer. Ich kann also nichts bestätigen bzw abbrechen, damit meine Seite aufgerufen wird.

    So sieht mein Code im OnLoad von der Entität Brief aus:

    var idLetter = crmForm.ObjectId;
    if((idLetter == null))
    {
    }
    else
    {
      if(crmForm.all.bmww_ischeck.DataValue == false)
      {
           crmForm.all.bmww_ischeck.DataValue = true;
           crmForm.all.bmww_ischeck.readOnly = true;

           var sFeatures='dialogHeight: 400px;dialogWidth:610px';
           var oButton = document.getElementById("refreshButton");

           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;

           window.showModalDialog("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter,oButton,sFeatures);
           alert(window.dialogArguments);
       }
    crmForm.Save();
    }

    Habe ich da doch irgend etwas nicht ganz verstanden?

    Gruß
    Dienstag, 6. Oktober 2009 13:01
  • Warte von neu:

    Mach alles Rückgängig bis es funktioniert hat.
    Vergiss auch erstmal showModalDialog, dass kannst du nachher noch ausbessern...

    mit window.open öffnet sich bei dir ja ein Fenster...? Erklär mir mal was dort passiert? Triffst du dort eine Auswahl...?

    In deiner default.aspx baust du mal in den Onload

    alert(window.opener);

    Da müsste ein [Object]ect.. rauskommmen. Mit diesem Objekt kannst du auf dein CRM Brief Formular zugreifen.

    Wenn das soweit klappt kannst du dann auf das grüne Refreshzeichen in den Dokumenten deines Briefformulars zugreifen..
    in etwa so :

    var oBriefForm = window.opener;

    oBriefForm.document.getElementById("refreshButton").click(); // refreshButton ist die Id dieses Buttons

    Dienstag, 6. Oktober 2009 13:04
  • Ok alse folgendes passiert.

    Ich habe im grunde eine leere aspx seite, über die öffne ich Microsoft Word mit einer Vorlage die ich ausgewählt habe in der Entität Brief.

    Ein neues IE Fenster öffnet sich und es kommt ein Dateidownload Dialog mit der auswahl öffnen speichern abbrechen.

    Drücke ich auf öffnen schließt das IE Fenster und Microsoft Word öffnet sich mit der Vorlage.

    In Microsoft Word habe ich ein AddIn geschrieben. Wenn ich auf den Button drücke, dann wird diese Vorlage zurück geschrieben und als Anhang unter Notizen in Brief gespeichert.

    Das ist halt so der grobe ablauf. Ich hoffe es war verständlich?!

    Und da ich ja die Letterid benötige, habe ich das ganze im OnLoad() Ereignis von der Entität Brief gemacht. Denn wenn ich dann auf speichern drücke habe ich die ID und kann sie mitgeben.

    Gruß

    P.S.
    Hier ein wenig Code
    aspx Seite Page_Load

    byte[] file = Convert.FromBase64String(body);
                string fn = filename;
                Response.ContentType = "application/msword";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fn);
    
                Response.BinaryWrite(file);

    Default.aspx
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

    mehr steht da nicht!!!
    Dienstag, 6. Oktober 2009 13:23
  • <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>Dokument erstellen</title>
        <script> 
             window.onload = function(){
                  alert(window.opener);
              }
         </script>
    </head>
    <body>
    </body>
    </html>

    P.S:
    Der Ablauf mit dem Abspeichern und über AddIn wieder zurück ist doch ein Riesenumweg..
    Du hast im Code doch shcon die geschriebene Datei und die ID der Briefformulars... wieso lädst du es nicht gleich ins CRM??




    http://asadewa.wordpress.com/2008/06/10/crm-40-adding-attachment-notes-programmatically-to-entities/
    • Bearbeitet localh0rst Dienstag, 6. Oktober 2009 13:36
    Dienstag, 6. Oktober 2009 13:29
  • Entschuldigung bitte diese nochmals blöde frage.

    Wo soll ich das einbinden in meiner aspx Seite?

    Wenn ich das richtig verstehe wird die Funktion im Onload aufgerufen, oder?

    Gruß
    Dienstag, 6. Oktober 2009 13:33
  • richtig in deiner aspx seite...

    Default.aspx
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>Dokument erstellen</title>
        <script>
             window.onload = function(){
                  alert(window.opener);
              }
         </script>
    </head>
    <body>
    </body>
    </html>
    Dienstag, 6. Oktober 2009 13:36
  • Nun ja, das sind halt so kleine Anforderungen. Es soll möglichst alles mehr oder weniger automatisch gehen.

    Ich kann dir ja mal kurz die Vorgehensweise erklären.

    Es soll folgendermassen laufen.

    Ich habe eine Word Vorlage in der ich meine eigenen Properties angelegt habe. Diese wird ins CRM gespeichert.

    Nun gehe ich auf Kontakte, suche mir einen aus. Gehe auf Aktionen und dann auf Brief. Hier hinterlege ich meine Word Vorlage und was noch so alles muss wie Betreff usw.

    Wenn ich dann auf SPEICHERN drücke, soll sich das Microsoft Word mit der Vorlage gleich öffnen, damit man es gleich bearbeiten kann. Nach dem bearbeiten kommt dann mein Addin ins Spiel. Beim betätigen des Buttons wird das bearbeitet Dokument in der Entität Brief unter Notizen hinterlegt.

    Bis hierin läuft es ja auch fast, denn ich sehe ja mein angehängtes Dokument ja erst wenn ich meien Brief aktualisiere. Und da ist ja das Problem mit der Schleife, dass diese Meldung auf einmal kommt.

    "
    Die bereits eingegebenen Informationen, müssen erneut gesendet werden, um die Webseite wieder anzuzeigen.
    Sie sollten auf "Abbrechen" klicken, wenn  Sie einen Einkauf durchgeführt haben, um eine doppelte Transaktion zu vermeiden.
    KLicken Sie auf "Wiederholen", um die Webseite erneut anzuzeigen.
    "

    Diese Meldung hatte ich erst als ich mein Attribut erstellt habe, um meine Schleife abzufangen.

    Ich hoffe ich konnte es einigermassen verständlich erklären.

    Gruß
    Dienstag, 6. Oktober 2009 13:53
  • ich habe aber jede menge Code in meiner Default.aspx.cs

    Also ich soll ich nur das hier

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>Dokument erstellen</title>
        <script>
             window.onload = function(){
                  alert(window.opener);
              }
         </script>
    </head>
    <body>
    </body>
    </html>

    Einfügen und alles andere so lassen wie gehabt?

    Hier rufe ich doch über Response die Datei auf zum öffnen des Dokumentes?!!?


    Ich bin gerade am testen. Er mag diese Zeile nicht

    <html xmlns="http://www.w3.org/1999/xhtml" >

    Da ích mit Word 2007 arbeite, gibts da ein anderes?

    Gruß

    Dienstag, 6. Oktober 2009 14:03
  • ok zumindest das Problem hab ich schonmal verstanden.

    Poste mal deinen aktuellen OnLoad Code

    Dienstag, 6. Oktober 2009 14:25
  • Hier ist mein aktueller OnLoad Code


    var idLetter = crmForm.ObjectId;
    if((idLetter == null))
    {
    }
    else
    {
      if(crmForm.all.bmww_ischeck.DataValue == false)
      {
           crmForm.all.bmww_ischeck.DataValue = true;
           crmForm.all.bmww_ischeck.readOnly = true;
          
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);

       }
      crmForm.Save();
    }

    mehr habe ich da nicht drinne stehen.

    Ich hoffe wirklich, dass du mir da weiter helfen kannst. So langsam aber sich er verstehe ich es nicht mehr so richtig.

    Ich werde mich gleich nochmal von zu Hause melden. Es sei denn, dass du auch gleich mal Feierabend machst:-)! Dann hoffe ich ja bis morgen:-)

    Gruß
    Dienstag, 6. Oktober 2009 14:31
  • var idLetter = crmForm.ObjectId;
    
    crmForm.all.bmww_ischeck.readOnly = true;
    if((idLetter != null))
    {
      if(crmForm.all.bmww_ischeck.DataValue == false)
      {
           crmForm.all.bmww_ischeck.DataValue = true;
           
           var server = SERVER_URL;
           var s = crmForm.all.bmww_vorlageid.DataValue[0].id;
           var kontakt = crmForm.all.to.DataValue[0].id;
           window.open("http://localhost:1863/OpenDocument/default.aspx?id="+s+"&idcontact="+ kontakt+"&letterid="+idLetter);
            crmForm.Save();
       }
    }
    
    hi,

    änder deinen onLoad erstmal so ab und prüf mal ob erst so erstmal funktioniert.
    Mittwoch, 7. Oktober 2009 10:25