Summe aus verschiedenen Feldern errechnen
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 09.12.2013 - 17:40 Uhr in
Hallo,
ich weiß noch nicht genau, ob ich hier richtig bin, folgendes ist mein Ausgangssituation für ein geschlossenes System:
Der erste Inhaltstyp ist "Planungsjahre", dieses kann angelegt werden und heißt dann zum Beispiel '2013' und hat folgende Felder.
Titel: 2013
Produktion: 2500 // Anzahl der produzierten Stücke
Stundenlohn: 20 // in Euro (ist allerdings einfache eine Dezimalzahl
...
Ein weiterer Inhalt könnte nun sein:
Titel: 2014
Produktion: 3500 // Anzahl der produzierten Stücke
Stundenlohn: 25 // in Euro (ist allerdings einfache eine Dezimalzahl
...
Der zweite Inhaltstyp heißt 'Bedarf' und hat folgende Felder:
Titel: Mehraufwand wegen erhöhter Qualität
Aufwände // Unlimited Values - Field-Collection mit folgenden Werten
- Planungsjahr // Node-Reference
- Stunden // Einfache Zahl // gemeint ist Mehrstunden pro Produktionsstück
- Summe
Wenn nun ein ein Bedarf angelegt wird, können für mehrere Jahre (z.B. 2013 und 2014) Werte angegeben werden. Das Feld SUMME soll sich selbst berechnen.
Also
SUMME = Stunden * Stundenlohn (aus der entsprechenden Node-Reference, die über Planungsjahr ausgewählt wurde) * Produktion (aus der entsprechenden Node-Reference)
Wenn ich mich richtig belesen habe, kommen zwei Module in Frage: Rules oder Computed Field. Ich komme bei beiden nicht so richtig weiter. Hat jemand eine Idee für den Code-Schnippsel in Computed Field, oder kann mir sagen, wie ich eine entsprechende Regel in Rules anlegen kann?
Gruß und Danke,
Yannick
- Anmelden oder Registrieren um Kommentare zu schreiben
Moin, das wird Rules -meiner
am 09.12.2013 - 18:46 Uhr
Moin,
das wird Rules -meiner Erfahrung nach- nicht bewältigen können. Da müsstest Du schon mit Computed Field oder gänzlich in einem Custom Module eine entsprechende Datenbankabfrage bauen und dann mit den Werten das Ergebnis errechnen. Ohne die Struktur Deiner DB Tabellen zu kennen, kann Dir hier niemand entsprechenden Code aufschreiben.
Drupal erstellt für jedes Feld eine Tabelle in der DB. Du musst halt in der Datenbank die relevanten Tabellen suchen und gucken, wie diese miteinander verknüpft sind. Ein wenig Plan von der DB API , PHP und MySQL sind dafür schon nötig.
Moin, danke erst einmal. An
am 09.12.2013 - 18:54 Uhr
Moin,
danke erst einmal. An PHP und MySQL soll es nicht scheitern. Das konnte ich zumindest mal (frische es gerade ein wenig auf). Mir fehlt nur ein wenig die Ahnung, Anleitung, Tipp bzw. der entscheidende Hinweis wie ich die Daten Abfrage. Habe gerade schon eine manuelle SQL-Query erstellt, die schmeißt Computed Field aber wieder raus und gibt mir den Fehler:
Deprecated function: mysql_query(): The mysql extension is deprecated and will be removed in the future
.
Kennst du eine gute Einsteiger-Anleitung für die DB-API bzw. für die Entity Funktionen?
Gruß,
Yannick
eigentlich steht alles hier:
am 09.12.2013 - 20:32 Uhr
eigentlich steht alles hier: https://drupal.org/developing/api/database
Wenn das nicht ausreicht, guckst Du hier rein: http://it-ebooks.info/book/1472/
Eigentlich ganz easy (nach
am 09.12.2013 - 21:15 Uhr
Eigentlich ganz easy (nach ca. 6 Stunden) ;)
Code für das computed field summe
<?php
$nid = $entity->field_planungsjahr['und'][0]['nid'];
$application = node_load($nid);
// Werte aus referenziertem Planungsjahr
$Stundenlohn = $application->field_stundenlohn['und'][0]['value'];
// Werte aus collected field
$mehrstunden = $entity-> field_mehrstunden['und'][0]['value'];
// Summe in Feld schreiben
$entity_field[0]['value'] = $Stundenlohn * $mehrstunden;
?>
Gruß,
Yannick
Rules kann das auch.
am 09.12.2013 - 23:45 Uhr
In Rules steckt sehr viel Macht. Man kann Variablen erstellen, Werte aus Entities oder Views laden, andere Rules aufrufen und deren Rückgabe-Werte weiterverarbeiten auch in einer Schleife usw.
In diesem Fall kann man die verknüpfte Entity laden und hat dann dessen Felder zur Verfügung. Mittels der Action "Calculate a value" kann man die beiden Werte multiplizieren und dessen Ergebnis in einer Hilfsvariable speichern. Diese kann dann mit der Action "set a data value" in das Zielfeld gespeichert werden.
Das Problem von computer field ist, daß es ein eigenes Feld erzeugt, das dann nicht so flexibel ist wie andere Felder. Z.B. wenn das Zeil einer Rule die Verknüpfung mittels Entity-Referenz ist. Anders herum lässt sich die Rules-Lösung auch an schon bestehende Felder anknüpfen. Von der Macht der GUI ganz zu schweigen ...
Im Alltag neige ich inzwischen dazu für Rules selbst Events, Conditions und Actions zu programmieren, wenn mir andere Rules-Module nicht weiter helfen.
Rules-Beispiel für field_c = field_a * field_b
am 09.12.2013 - 23:54 Uhr
Beispiel mit drei integer Feldern am Node type "article" zum befüllen von field_c bei einem Node-Update:
{ "rules_testme" : {
"LABEL" : "testmerule",
"PLUGIN" : "reaction rule",
"WEIGHT" : "2",
"REQUIRES" : [ "rules" ],
"ON" : [ "node_update" ],
"IF" : [
{ "node_is_of_type" : { "node" : [ "node" ], "type" : { "value" : { "article" : "article" } } } },
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_a" } },
{ "NOT data_is_empty" : { "data" : [ "node:field-a" ] } },
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_b" } },
{ "NOT data_is_empty" : { "data" : [ "node:field-b" ] } },
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_c" } }
],
"DO" : [
{ "data_calc" : {
"USING" : {
"input_1" : [ "node:field-a" ],
"op" : "*",
"input_2" : [ "node:field-b" ]
},
"PROVIDE" : { "result" : { "result" : "Calculation result" } }
}
},
{ "data_set" : { "data" : [ "node:field-c" ], "value" : [ "result" ] } }
]
}
}