{"id":1779,"date":"2024-02-27T09:42:30","date_gmt":"2024-02-27T08:42:30","guid":{"rendered":"https:\/\/www.isa.de\/?p=1779"},"modified":"2024-06-20T10:31:11","modified_gmt":"2024-06-20T08:31:11","slug":"sample-idm6","status":"publish","type":"post","link":"https:\/\/www.isa.de\/en\/sample-idm6\/","title":{"rendered":"Sample dialog for the ISA Dialog Manager data model 6"},"content":{"rendered":"<p>Der Beispieldialog zeigt einen Shop mit vier Fenstern (Ansichten). Die Daten sind in IDM-Records und -Variablen enthalten. Der Dialog demonstriert die neuen Funktionen, mit denen GUI-Objekte und Daten verbunden werden k\u00f6nnen. Anweisungen im Zusammenhang mit dem Datenmodell sind hervorgehoben und ausf\u00fchrlich kommentiert.<\/p>\n<p><strong>Hinweis<\/strong><\/p>\n<p>Eine der Ansichten und Datenstrukturen sowie diverse Anweisungen, die f\u00fcr die zu demonstrierenden Funktionen keine Rolle spielen, wurden ausgelassen, damit der Beispieldialog \u00fcberschaubar bleibt und nicht zu lang wird.<\/p>\n<h4>Screenshots<\/h4>\n<p>Klicken Sie f\u00fcr eine gr\u00f6\u00dfere Darstellung auf die Bilder.<\/p>\n<p><a href=\"\/wp-content\/uploads\/Qt_Datenmodell_1_4-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3797\" title=\"Beispiel Datenmodell: Produktauswahl\" src=\"\/wp-content\/uploads\/Qt_Datenmodell_1_4-1.jpg\" alt=\"Beispiel Datenmodell: Produktauswahl\" width=\"171\" height=\"187\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_1_4-1.jpg 1012w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_1_4-1-275x300.jpg 275w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_1_4-1-939x1024.jpg 939w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_1_4-1-768x838.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_1_4-1-11x12.jpg 11w\" sizes=\"auto, (max-width: 171px) 100vw, 171px\" \/><\/a> <a href=\"\/wp-content\/uploads\/Qt_Datenmodell_2_4-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3794\" title=\"Beispiel Datenmodell: Produkt-Details\" src=\"\/wp-content\/uploads\/Qt_Datenmodell_2_4-1.jpg\" alt=\"Beispiel Datenmodell: Produkt-Details\" width=\"212\" height=\"186\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1.jpg 1040w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1-300x263.jpg 300w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1-1024x896.jpg 1024w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1-768x672.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1-14x12.jpg 14w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_2_4-1-400x350.jpg 400w\" sizes=\"auto, (max-width: 212px) 100vw, 212px\" \/><\/a>  <a href=\"\/wp-content\/uploads\/Qt_Datenmodell_3_4-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3795\" title=\"Beispiel Datenmodell: Warenkorb\" src=\"\/wp-content\/uploads\/Qt_Datenmodell_3_4-1.jpg\" alt=\"Beispiel Datenmodell: Warenkorb\" width=\"213\" height=\"187\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1.jpg 1040w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1-300x263.jpg 300w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1-1024x896.jpg 1024w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1-768x672.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1-14x12.jpg 14w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_3_4-1-400x350.jpg 400w\" sizes=\"auto, (max-width: 213px) 100vw, 213px\" \/><\/a>  <a href=\"\/wp-content\/uploads\/Qt_Datenmodell_4_4-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3796\" title=\"Beispiel Datenmodell: Checkout\" src=\"\/wp-content\/uploads\/Qt_Datenmodell_4_4-2.jpg\" alt=\"Beispiel Datenmodell: Checkout\" width=\"196\" height=\"186\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_4_4-2.jpg 960w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_4_4-2-300x284.jpg 300w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_4_4-2-768x728.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/Qt_Datenmodell_4_4-2-13x12.jpg 13w\" sizes=\"auto, (max-width: 196px) 100vw, 196px\" \/><\/a><\/p>\n<h4>Dialog<\/h4>\n<p>Die beiden Schaubilder sollen Ihnen die Verbindungen zwischen Daten und Ansichten verdeutlichen, die durch die Anweisungen im Dialog hergestellt werden.<\/p>\n<p><a href=\"\/wp-content\/uploads\/BsplDatenmodell1_DE.jpg\">\u00a0<\/a><a href=\"\/wp-content\/uploads\/BsplDatenmodell1_DE.jpg\">\u00a0<\/a><a href=\"\/wp-content\/uploads\/BsplDatenmodell1_DE.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3354\" title=\"Beispiel Datenmodell: Interaktionen zwischen den Dialogen\" src=\"\/wp-content\/uploads\/BsplDatenmodell1_DE.jpg\" alt=\"Beispiel Datenmodell: Interaktionen zwischen den Dialogen\" width=\"401\" height=\"292\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell1_DE.jpg 1312w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell1_DE-300x219.jpg 300w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell1_DE-1024x747.jpg 1024w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell1_DE-768x560.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell1_DE-16x12.jpg 16w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><\/a><a href=\"\/wp-content\/uploads\/BsplDatenmodell2_DE.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3352\" title=\"Beispiel Datenmodell: Interaktionen zwischen den Dialogen\" src=\"\/wp-content\/uploads\/BsplDatenmodell2_DE.jpg\" alt=\"Beispiel Datenmodell: Interaktionen zwischen den Dialogen\" width=\"400\" height=\"292\" srcset=\"https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell2_DE.jpg 1313w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell2_DE-300x219.jpg 300w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell2_DE-1024x746.jpg 1024w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell2_DE-768x560.jpg 768w, https:\/\/www.isa.de\/wp-content\/uploads\/BsplDatenmodell2_DE-16x12.jpg 16w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<pre>dialog D\r\n\r\n<span class=\"ml-comment\">\/* Beispiel Shop f\u00fcr das Datenmodell des ISA Dialog Managers. Das Datenmodell ist eine neue\r\n * Funktion, die im ISA Dialog Manager 6 eingef\u00fchrt wird.\r\n *\r\n * Das Beispiel zeigt einen Shop, dessen Produktliste in einem Record gespeichert ist.\r\n * Dieser Record dient als Datenmodell f\u00fcr verschiedene Ansichten (Views). Au\u00dferdem wird ein\r\n * Datenmodell genutzt, um den Warenkorb mit den Eink\u00e4ufen eines Benutzers zu verwalten.\r\n *\r\n * Rechtliche Hinweise:\r\n * Der Code dient ausschlie\u00dflich zur Demonstration von Funktionen und ist nicht f\u00fcr den\r\n * produktiven Einsatz gedacht.\r\n * ISA Informationssysteme GmbH (ISA) \u00fcberl\u00e4sst Ihnen dieses Programm so wie es ist. ISA\r\n * leistet keinerlei Gew\u00e4hrleistung oder Support zu diesem Programm und \u00fcbernimmt keinerlei\r\n * Haftung f\u00fcr Sch\u00e4den, die durch den Einsatz dieses Programms entstehen.\r\n *\r\n * Hier gezeigte Funktionen k\u00f6nnen sich bis zur Fertigstellung der Version noch \u00e4ndern.\r\n *\/<\/span>\r\n\r\n\r\n<span class=\"sl-comment\">\/\/ Definitionen von Tiles, Colors und Defaults ausgelassen.<\/span>\r\n\r\n\r\n<span class=\"ml-comment\">\/* Der Record Product enth\u00e4lt alle Informationen zu einem Produkt.\r\n *\/<\/span> \r\nrecord Product\r\n{\r\n  <span class=\"ml-comment\">\/* Das Attribut .dataoptions[enum] steuert, wann der Record \u00c4nderungen seiner Attribute\r\n   * an verkn\u00fcpfte Ansichten (Views) weitergibt. Die Weitergabe bei jeder \u00c4nderung\r\n   * (dopt_propagate_on_changed) wird hier ausgeschaltet, um eine mehrfache Verwendung\r\n   * durch MWiProduct zu erleichtern.\r\n   *\/<\/span>\r\n  <span class=\"dm\"><span class=\"kw\">.dataoptions[dopt_propagate_on_changed]<\/span> false;<\/span>\r\n\r\n  integer Id := 0;\r\n  string Name := \"\";\r\n  object Picture := null;\r\n  string Description := \"\";\r\n  string Confection :=  \"\";\r\n  integer Price := 0;\r\n\r\n  rule boolean Get(integer Id)\r\n  {\r\n    this.Id := Id;\r\n    if fail(this.Name := ProductList.Name[Id]) then\r\n      return false;\r\n    endif\r\n    this.Price := ProductList.Price[Id];\r\n    this.Picture := ProductList.Picture[Id];\r\n    this.Description := ProductList.Description[Id];\r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n<span class=\"ml-comment\">\/* Der Record ProductList enth\u00e4lt die Warenliste des Shops. Er liefert die Produktinforma-\r\n * tionen Id, Name, Picture, Icon,, Price und Description f\u00fcr diverse Ansichten (Views).\r\n *\/<\/span>\r\nrecord ProductList\r\n{\r\n  integer Id[10] := 0;\r\n  .Id[1] := 1;\r\n  <span class=\"sl-comment\">\/\/ Id[2-9]<\/span>\r\n  .Id[10] := 10;\r\n\r\n  string Name[10] := \"\";  \r\n  .Name[1] := \"Denim Jeans\";\r\n  <span class=\"sl-comment\">\/\/ Name[2-9]<\/span>\r\n  .Name[10] := \"Umbrella\";\r\n\r\n  object Picture[10] := null;\r\n  .Picture[1] := TiJeans;\r\n  <span class=\"sl-comment\">\/\/ Picture[2-9]<\/span>\r\n  .Picture[10] := TiUmbrella;\r\n\r\n  object Icon[10] := null;\r\n  .Icon[1] := TiJeansIcon;\r\n  <span class=\"sl-comment\">\/\/ Icon[2-9]<\/span>\r\n  .Icon[10] := TiUmbrellaIcon;\r\n\r\n  integer Price[10] := 0;\r\n  .Price[1] := 125;\r\n  <span class=\"sl-comment\">\/\/ Price[2-9]<\/span>\r\n  .Price[10] := 19;\r\n\r\n  string Description[10] := \"...\";\r\n  .Description[1] := \"Close-fitting and durable jeans for leisure and business.\";\r\n  <span class=\"sl-comment\">\/\/ Description[2-9]<\/span>\r\n  .Description[10] := \"Turns even a long rainy walk into fun!\";\r\n}\r\n\r\n\r\n<span class=\"ml-comment\">\/* Im Record ShoppingBasket ist der Warenkorb mit den vom Benutzer ausgew\u00e4hlten Produkten\r\n * gespeichert. Der Warenkorb berechnet Gesamtzahl und -preis dieser Produkte.\r\n *\/<\/span>\r\nrecord ShoppingBasket\r\n{\r\n  integer TotalPrice := 0;\r\n  integer TotalItems := 0;\r\n\r\n  integer Id[0] := 0;\r\n  string  Name[0] := \"\";\r\n  integer  Price[0] := 0;\r\n  integer  Quantity[0] := 0;\r\n\r\n  rule void Update(integer Id, integer Count)\r\n  {\r\n    variable integer I;\r\n\r\n    if (Id &lt; 1) then\r\n      return;\r\n    endif\r\n    I := this:find(.Id, Id);\r\n    if (I &lt; 1) then\r\n      I := this.count[.Id] + 1;\r\n      this.count[.Id] := I;\r\n      this.count[.Price] := I;\r\n      this.count[.Name] := I;\r\n      this.count[.Quantity] := I;\r\n      this.Id[I] := Id;\r\n      this.Name[I] := ProductList.Name[I];\r\n      this.Price[I] := ProductList.Price[I];\r\n      this.Quantity[I] := 0;\r\n    endif\r\n\r\n    this.Quantity[I] := this.Quantity[I] + Count;\r\n    if (this.Quantity[I] &lt; 0) then\r\n      this.Quantity[I] := 0;\r\n    endif\r\n    this:UpdateTotal();\r\n  }\r\n  \r\n  rule void Clear()\r\n  {\r\n    this.count[.Id] := 0;\r\n    this.count[.Name] := 0;\r\n    this.count[.Price] := 0;\r\n    this.count[.Quantity] := 0;\r\n    this.TotalPrice := 0;\r\n    this.TotalItems := 0;\r\n  }\r\n  \r\n  on .Quantity changed\r\n  {\r\n    this:UpdateTotal();\r\n  }\r\n\r\n  <span class=\"ml-comment\">\/* Die Aktualisierungen von .TotalPrice und .TotalItems werden \u00fcber Data-Changed-\r\n   * Ereignisse an die verkn\u00fcpften Ansichten weitergegeben.\r\n   *\/<\/span>\r\n  rule void UpdateTotal()\r\n  {\r\n    variable integer I, N:=0, P:=0, Q;\r\n\r\n    for I:=1 to this.count[.Id] do\r\n      Q := this.Quantity[I];\r\n      N := N + Q;\r\n      P := P + this.Price[I] * Q;\r\n    endfor\r\n    this.TotalPrice := P;\r\n    this.TotalItems := N;\r\n  }\r\n}\r\n\r\n<span class=\"sl-comment\">\/\/ ...<\/span>\r\n\r\n<span class=\"ml-comment\">\/* Die Variable ActiveProductId wird als Datenmodell verwendet. Sie steuert die \r\n * Sensitivit\u00e4t von ImDetail und ImQuickAdd im Hauptfenster WiShop.\r\n *\/<\/span>\r\nvariable integer ActiveProductId := 0;\r\n\r\n\r\n<span class=\"ml-comment\">\/* Detailansicht eines Produkts, von der mehrere Instanzen existieren k\u00f6nnen. Jede Instanz\r\n * wird mit einem Record Product als Datenmodell verkn\u00fcpft und mit den Daten aus dem Record\r\n * bef\u00fcllt, wenn sie sichtbar gemacht wird. \r\n *\/<\/span>\r\nmodel window MWiProduct\r\n{\r\n  <span class=\"sl-comment\">\/\/ ...<\/span>\r\n  .title \"Product Details\";\r\n  .visible false;\r\n  \r\n  integer Id := 0;\r\n  \r\n  <span class=\"ml-comment\">\/* Hier wird die Ansicht mit dem Datenmodell verbunden. Im Id-Attribut der Ansicht wird\r\n   * die Produkt-Id gespeichert. Dies wird durch eine Definition .dataget[A] B definiert,\r\n   * wobei A das Attribut der Ansicht ist, das den Wert von Attribut B des Datenmodells\r\n   * erhalten soll.\r\n   * Dataget definiert eine Verbindung in einer Richtung, bei der Daten vom Datenmodell an\r\n   * die Ansicht weitergereicht werden. Sollen umgekehrt \u00c4nderungen, die in der Ansicht\r\n   * erfolgen (z.B. durch Benutzereingaben) an das Datenmodell weitergegeben werden, kann\r\n   * dies mit dem Attribut .dataset[] definiert werden.\r\n   *\/<\/span>\r\n  <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> Product;<\/span>\r\n  <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.Id<span class=\"kw\">]<\/span> .Id;<\/span>\r\n\r\n  image ImPicture\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .sensitive false;\r\n    \r\n    <span class=\"ml-comment\">\/* Verbindung mit dem Picture-Attribut des Datenmodells. *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> Product;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.picture<span class=\"kw\">]<\/span> .Picture;<\/span>\r\n  }\r\n  \r\n  statictext { .text \"Name\"; <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n  \r\n  edittext EtName {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .editable false;\r\n    \r\n    <span class=\"ml-comment\">\/* Verbindung mit dem Name-Attribut des Datenmodells. Standardm\u00e4\u00dfig wird das Content-\r\n     * Attribut der Ansicht verbunden. Deshalb braucht hier das zu verbindende Attribut der\r\n     * Ansicht nicht explizit definiert zu werden.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> Product;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget<\/span> .Name;<\/span>\r\n  }\r\n  \r\n  <span class=\"sl-comment\">\/\/ ...<\/span>\r\n\r\n  statictext { .text \"Price\"; <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n\r\n  edittext EtPrice {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .editable false;\r\n    \r\n    <span class=\"ml-comment\">\/* Verbindung des Content-Attributs der Ansicht mit dem Price-Attribut des Daten-\r\n     * modells. Weil die Verkn\u00fcpfung des Content-Attributs den Standard darstellt, braucht\r\n     * .dataget nicht indiziert zu werden.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> Product;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget<\/span> .Price;<\/span>\r\n\r\n    <span class=\"ml-comment\">\/* Hier werden die Daten f\u00fcr die Anzeige formatiert. Die Represent-Methode wird vom\r\n     * Datenmodell implizit aufgerufen, wenn Daten an die Ansicht weitergereicht werden\r\n     * sollen. Die Methode kann \u00fcberschrieben werden, um die Darstellung an eigene Anfor-\r\n     * derungen anzupassen. Eigene Implementierungen sollten am Ende die Methode des\r\n     * Modells bzw. Defaults aufrufen, damit alle Vorg\u00e4nge ausgef\u00fchrt werden, die zum\r\n     * Anzeigen der Daten notwendig sind.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">:represent()<\/span><\/span>\r\n    {\r\n      if (Attribute = .content) then\r\n        Value := sprintf(\"%d Euro\", Value);\r\n      endif\r\n      pass this:super();\r\n    }\r\n  }\r\n  \r\n  statictext { .text \"&amp;Quantity\"; <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n  \r\n  edittext EtQuantity\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .content \"1\";\r\n    .format \"%3d\";\r\n    .active true;\r\n  }\r\n  \r\n  \r\n  pushbutton PbAdd\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .text \"&amp;Add to Basket\";\r\n\r\n    on select\r\n    {\r\n      <span class=\"ml-comment\">\/* Die gespeicherte Id wird f\u00fcr die Aktualisierung des Warenkorbs verwendet.\r\n       *\/<\/span>\r\n      ShoppingBasket:Update(this.window.Id, atoi(this.window.EtQuantity.content));\r\n      this.window.visible := false;\r\n    }\r\n  }\r\n  \r\n  pushbutton PbClose\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .text \"&amp;Close\";\r\n    \r\n    on select\r\n    {\r\n      this.window.visible := false;\r\n    }\r\n  }\r\n  \r\n  rule void Open()\r\n  {\r\n    variable integer I;\r\n    variable object Wi;\r\n\r\n    if Product:Get(ActiveProductId) then\r\n      for I:=1 to MWiProduct.count[.instance] do\r\n        Wi :=  MWiProduct.instance[I];\r\n        if (not Wi.visible) then\r\n      Wi.visible := true;\r\n          return;\r\n    endif\r\n       endfor\r\n      Wi := this:create(this.dialog, true);\r\n      Wi.title := Wi.title + \" #\" + MWiProduct.count[.instance];\r\n      Wi.visible := true;\r\n    endif\r\n  }\r\n}\r\n\r\n\r\n\r\n<span class=\"ml-comment\">\/* Ansicht des Warenkorbs.\r\n*\/<\/span>\r\nwindow WiBasket\r\n{\r\n  <span class=\"sl-comment\">\/\/ ...<\/span>\r\n  .title \"Basket\";\r\n  .visible false;\r\n  \r\n  tablefield Tf \r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n\r\n    .multisel false;\r\n    .selection[sel_row] true;\r\n    .selection[sel_single] false;\r\n    .selection[sel_header] false;\r\n\r\n    .content[1,1] \"Article\"; \r\n    .content[1,2] \"Price\"; \r\n    .content[1,3] \"Quantity\";\r\n    .rowheader 1;\r\n\r\n    <span class=\"ml-comment\">\/* Record ShoppingBasket ist das Datenmodell dieses Tablefields. *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ShoppingBasket;<\/span>\r\n    \r\n    <span class=\"ml-comment\">\/* Hier werden die Daten des Warenkorb-Modells auf verschiedene Spalten des Tablefields\r\n     * verteilt. Man sollte sich an dieser Stelle noch einmal klar machen, dass Name, Id,\r\n     * Price und Quantity des ShoppingBaskets selbst indizierte Attribute sind, also Listen\r\n     * darstellen.\r\n     * Beginnen wir mit dem Attribut .Id: Dieses wird an .userdata des Tablefields weiter-\r\n     * gereicht. Da .userdata doppelt indiziert ist, muss festgelegt werden, wo sich die\r\n     * Id-Liste innerhalb der Matrix befinden soll. Dies wird durch .dataindex[.userdata]\r\n     * definiert. [0,1] bedeutet, dass die Id-Liste auf die erste Spalte der Userdata-\r\n     * Matrix abgebildet wird. [4,0] w\u00fcrde die Liste beispielsweise auf die vierte Zeile\r\n     * abbilden.\r\n     * Etwas komplizierter ist es f\u00fcr die Attribute Name, Price und Quantity des Waren-\r\n     * korbs, die alle im Tablefield angezeigt und auf dessen Field-Attribut abgebildet\r\n     * werden sollen. Zur Erinnerung: Das Field-Attribut repr\u00e4sentiert alle Zellen des\r\n     * Tablefields ohne die Zeilen- und Spaltenk\u00f6pfe. Da alle Attribute des Datenmodells an\r\n     * dasselbe Attribut der Ansicht (View) weitergereicht werden, wird bei der Definition\r\n     * der Verkn\u00fcpfungen indirekt vorgegangen. Mit den Dataget-Definitionen werden die\r\n     * Datenmodell-Attribute auf beliebige vordefinierte oder benutzerdefinierte Attribute\r\n     * der Ansicht abgebildet, in diesem Fall auf .content, .value und .count. Dann werden\r\n     * die gew\u00e4hlten Attribute der Ansicht mit den Datamap-Definitionen auf das eigentliche\r\n     * Zielattribut .field abgebildet. Schlie\u00dflich werden mit den Dataindex-Definitionen\r\n     * den gew\u00e4hlten Attributen Field-Spalten zugeordnet. Insgesamt wird also die Name-\r\n     * Liste von ShoppingBasket mit der ersten Datenspalte der Tabelle verkn\u00fcpft, die\r\n     * Price-Liste mit der zweiten und die Quantity-Liste mit der dritten Datenspalte.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.content<span class=\"kw\">]<\/span> .Name;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.userdata<span class=\"kw\">]<\/span> .Id;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.value<span class=\"kw\">]<\/span> .Price;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.count<span class=\"kw\">]<\/span> .Quantity;<\/span>\r\n\r\n    <span class=\"dm\"><span class=\"kw\">.datamap[<\/span>.content<span class=\"kw\">]<\/span> .field;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamap[<\/span>.value<span class=\"kw\">]<\/span> .field;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamap[<\/span>.count<span class=\"kw\">]<\/span> .field;<\/span>\r\n\r\n    <span class=\"dm\"><span class=\"kw\">.dataindex[<\/span>.content<span class=\"kw\">]<\/span> [0,1];<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataindex[<\/span>.value<span class=\"kw\">]<\/span> [0,2];<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataindex[<\/span>.count<span class=\"kw\">]<\/span> [0,3];<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataindex[<\/span>.userdata<span class=\"kw\">]<\/span> [0,1];<\/span>\r\n\r\n    on select\r\n    if (first(thisevent.index) &gt; this.rowheader)\r\n    {\r\n        <span class=\"ml-comment\">\/* Der Benutzer w\u00e4hlt eine Position im Warenkorb aus. In EditQuantity wird die\r\n         * Spinbox SbQuantity mit der Menge dieser Warenkorb-Position verkn\u00fcpft.\r\n         *\/<\/span>\r\n        this.window:EditQuantity(first(thisevent.index) - 1);\r\n    }\r\n  }\r\n  \r\n  statictext StQuantity { .text \"Quantity\"; <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n  \r\n  spinbox SbQuantity\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .minvalue 0;\r\n    .maxvalue 100;\r\n    .curvalue 0;\r\n    statictext { .sensitive true; }\r\n\r\n    <span class=\"ml-comment\">\/* Automatische Aktualisierung des Warenkorbs, wenn die Menge ver\u00e4ndert wird\r\n     * (.dataset). Die Aktualisierung erfolgt sofort beim Ereignis (dopt_apply_on_event).\r\n     * Eine andere Option der Aktualisierung w\u00e4re dopt_apply_on_unmap, also beim\r\n     * Unsichtbarmachen.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ShoppingBasket;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget<\/span> .Quantity;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataset<\/span> .Quantity;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataoptions[dopt_apply_on_event]<\/span> true;<\/span>\r\n  }\r\n  \r\n  statictext { .text \"Total Price\"; <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n  \r\n  edittext EtTotalPrice\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .editable false;\r\n    \r\n    <span class=\"ml-comment\">\/* Verkn\u00fcpfung mit dem Gesamtpreis des Warenkorbs.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ShoppingBasket;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget<\/span> .TotalPrice;<\/span>\r\n    \r\n    <span class=\"ml-comment\">\/* \u00dcberdefinition der Represent-Methode um den Wert zu formatieren.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">:represent()<\/span><\/span>\r\n    {\r\n      Value := sprintf(\"%d Euro\", Value);\r\n      pass this:super();\r\n    }\r\n  }\r\n\r\n  pushbutton PbBuy\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .text \"Buy...\";\r\n\r\n    <span class=\"ml-comment\">\/* Hier wird die automatische Konvertierung zwischen verschiedenen Datentypen genutzt,\r\n     * um den Integer-Wert .TotalPrice in einen Boolean-Wert f\u00fcr das Sensitive-Attribut des\r\n     * Pushbuttons zu wandeln.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ShoppingBasket;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.sensitive<span class=\"kw\">]<\/span> .TotalPrice;<\/span>\r\n    \r\n    on select\r\n    {\r\n      this.window.visible := false;\r\n      <span class=\"sl-comment\">\/\/ Fenster zum Bezahlen des Einkaufs \u00f6ffnen.<\/span>\r\n    }\r\n  }\r\n  \r\n  pushbutton PbClose\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    .text \"Close\";\r\n\r\n    on select\r\n    {\r\n      this.window.visible := false;\r\n    }\r\n  }\r\n  \r\n  rule void Open()\r\n  {\r\n    this.SbQuantity.visible := false;\r\n    this.StQuantity.visible := false;\r\n    this.visible := true;\r\n  }\r\n  \r\n  rule void EditQuantity(integer Pos)\r\n  {\r\n    <span class=\"ml-comment\">\/* Verkn\u00fcpfen der Mengen-Spinbox in der Ansicht mit der entsprechenden Position des\r\n     * Warenkorbs. \r\n     *\/<\/span>\r\n    <span class=\"dm\">this.SbQuantity<span class=\"kw\">.dataindex[<\/span>.Quantity<span class=\"kw\">]<\/span> := Pos;<\/span>\r\n    \r\n    this.StQuantity.visible := true;\r\n    this.SbQuantity.visible := true;\r\n  }\r\n}\r\n\r\n<span class=\"sl-comment\">\/\/ ...<\/span>\r\n\r\n<span class=\"ml-comment\">\/* Hauptansicht des Shops mit der Produktliste und einer Symbolleiste mit Images, \u00fcber die\r\n * der Benutzer Einkaufsfunktionen aufrufen kann.\r\n *\/<\/span>\r\nwindow WiShop\r\n{\r\n  .title \"Shop Demo (Datamodel)\";\r\n  <span class=\"sl-comment\">\/\/ ...<\/span>\r\n  \r\n  toolbar Tb\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n    image ImDetails\r\n    {\r\n      <span class=\"sl-comment\">\/\/ ...<\/span>\r\n      .text \"Details\";\r\n      .picture TiDetail;\r\n\r\n      <span class=\"ml-comment\">\/* Nutzung der globalen Variablen ActiveProductId um die Sensititvit\u00e4t des Images zu\r\n       * steuern.\r\n       *\/<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ActiveProductId;<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.sensitive<span class=\"kw\">]<\/span> .value;<\/span>\r\n      \r\n      on select\r\n      {\r\n        MWiProduct:Open();\r\n      }\r\n    }\r\n    \r\n    image ImQuickAdd\r\n    {\r\n      <span class=\"sl-comment\">\/\/ ...<\/span>\r\n      .text \"Add\";\r\n      .picture TiAdd;\r\n      \r\n      <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ActiveProductId;<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.sensitive<span class=\"kw\">]<\/span> .value;<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.userdata<span class=\"kw\">]<\/span> .value;<\/span>\r\n      \r\n      on select\r\n      {\r\n        ShoppingBasket:Update(this.userdata, 1);\r\n      }\r\n    }\r\n    \r\n    image ImBasket\r\n    {\r\n      <span class=\"sl-comment\">\/\/ ...<\/span>\r\n      .picture TiBasket;\r\n\r\n      <span class=\"ml-comment\">\/* Anzeige der Gesamtzahl von Artikeln im Warenkorb. Wenn sich Artikel im Warenkorb\r\n       * befinden, kann dieser durch Klicken auf das Bild angezeigt werden. TotalItems des\r\n       * ShoppingBaskets wird automatisch in Boolean f\u00fcr die Sensitivit\u00e4t des Images\r\n       * konvertiert.\r\n       *\/<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ShoppingBasket;<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.text<span class=\"kw\">]<\/span> .TotalItems;<\/span>\r\n      <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.sensitive<span class=\"kw\">]<\/span> .TotalItems;<\/span>\r\n\r\n      on select\r\n      {\r\n    WiBasket:Open();\r\n      }\r\n    }\r\n    \r\n    image ImPay { <span class=\"ml-comment\">\/* ... *\/<\/span> }\r\n  }\r\n  \r\n  treeview Tv\r\n  {\r\n    <span class=\"sl-comment\">\/\/ ...<\/span>\r\n\r\n    <span class=\"ml-comment\">\/* Zeigt die Namen und Vorschaubilder (.Icon) der einzelnen Produkte aus dem Produkt-\r\n     * listenmodell an. Die Ids werden in .userdata[] gespeichert um bei Selektion eines\r\n     * Produkts die globale Variable ActiveProductId auf die Id des aktiven Produkts zu\r\n     * setzen.\r\n     *\/<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.datamodel<\/span> ProductList;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.content<span class=\"kw\">]<\/span> .Name;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.userdata<span class=\"kw\">]<\/span> .Id;<\/span>\r\n    <span class=\"dm\"><span class=\"kw\">.dataget[<\/span>.picture<span class=\"kw\">]<\/span> .Icon;<\/span>\r\n\r\n    on select\r\n    {\r\n      ActiveProductId := this.userdata[this.activeitem];\r\n    }\r\n    \r\n    on dbselect\r\n    {\r\n      MWiProduct:Open();\r\n    }\r\n  }\r\n  \r\n  on close { exit(); }\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>The example dialog shows a shop with four windows (views). The data is contained in IDM records and variables. The dialog demonstrates the new functions with which<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_analysis_target_kw":"Beispieldialog","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[5],"tags":[110,109],"class_list":["post-1779","post","type-post","status-publish","format-standard","hentry","category-produkte","tag-dialog","tag-example"],"author_meta":{"display_name":"Website Admin","author_link":"https:\/\/www.isa.de\/en\/author\/admin\/"},"featured_img":null,"coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/www.isa.de\/en\/produkte\/\" class=\"advgb-post-tax-term\">Produkte<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Produkte<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/www.isa.de\/en\/produkte\/\" class=\"advgb-post-tax-term\">Dialog<\/a>","<a href=\"https:\/\/www.isa.de\/en\/produkte\/\" class=\"advgb-post-tax-term\">Example<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Dialog<\/span>","<span class=\"advgb-post-tax-term\">Example<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 2 years ago","modified":"Updated 2 years ago"},"absolute_dates":{"created":"Posted on 27. February 2024","modified":"Updated on 20. June 2024"},"absolute_dates_time":{"created":"Posted on 27. February 2024 9:42","modified":"Updated on 20. June 2024 10:31"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/posts\/1779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/comments?post=1779"}],"version-history":[{"count":43,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/posts\/1779\/revisions"}],"predecessor-version":[{"id":6148,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/posts\/1779\/revisions\/6148"}],"wp:attachment":[{"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/media?parent=1779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/categories?post=1779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.isa.de\/en\/wp-json\/wp\/v2\/tags?post=1779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}