tüit Logo Direkt zum Hauptinhalt

Tabelleninhalte aus einer Tabelle befüllen

Einleitung

In dieser Anleitung finden wir ein Beispiel wie wir eine Tabelle in einer Transaktion mit Inhalten aus einer Tabelle einer Vorlage füllen kann.



DocType Template erstellen

Zunächst wollen wir ein Dokument erstellen in welchem wir unser Template festhalten, damit wir diese als Vorlage für unsere Transaktion verwenden können. Dazu erstellen wir hier Transaction Template.

Das Transaction Template nehmen wir in diesem Beispiel als Platzhalter. Es könnte z.B. auch eine Angebotsvorlage sein in welcher wir eine bestimmte Sammlung von Artikeln halten welche wir immer wieder zum Einsatz bringen wollen.

Im gezeigten Beispiel haben wir ein Template mit dem Namen Colors erstellen und mit den werden Red und Green.

Hier die wesentlichen Inhalte des DocTypes

image-1655481331120.png

Und die dazu gehörige Untertabelle "Transaction Items"

image-1655481373379.png

Ist der DocType erstellt, erstellen wir direkt eine Instanz.

image-1655480982303.gif

DocType Transaktion erstellen

Nun erstellen wir einen weiteren DocType der die eigentliche Transaktion repräsentiert. Diese kann z.B. ein Angebot sein in welches wir Artikel aus unserer Angebotsvorlage importieren. In diesem Beispiel importieren wir lediglich zwei Felder mit Werten vom Typ Data. Dem Beispiel folgend werden es der Wert Red und Green.

image-1655481740696.gif

Der DocType ist wie folgt erstellt


image-1655481555158.png

Dazu die Untertabelle Transaction Items

image-1655481597921.png

Button in Transaktion erstellen

Nun wollen wir über einen Button die Möglichkeit bereit stellen, dass wir die Daten aus dem Template in die Transaction übertragen können. Dazu erstellen wir ein Client Script welches einen Button auf unser DocType Transaction bereitstellt über welchen wir per Dialog aus einem Template wählen können.

Nun haben wir alles eingebaut um eine neue Transaktion zu erstellen und dort Werte aus einem Template zu holen.

Dazu erstellen wir ein Custom Script

 

 

mit dem folgenden Code

// The fetch-from fields
var fields = [
  "value_1",
  "value_2"];

frappe.ui.form.on('Transaction Document', {
	refresh(frm) {
	    var cur_frm = frm;
	    console.log("Add button");
	    frm.add_custom_button('Transaction Template', function () { frm.trigger('get_items') }, __("Get Items From"));
	},
	get_items(frm){
	    start_dialog(frm);
	}
});

function start_dialog(frm) {
	let dialog = new frappe.ui.form.MultiSelectDialog({

		// Read carefully and adjust parameters
		doctype: "Transaction Template", // Doctype we want to pick up
		target: cur_frm,
		setters: {
		},
		date_field: "creation", // "modified", "creation", ...
		get_query() {
			// MultiDialog Listfilter
			return {
				filters: {  }
			};
		},
		action(selections) {
	        var name = selections[0];
	        frappe.db.get_doc("Transaction Template", name) // Again, the Doctype we want to pick up
            .then(doc => {
                // Copy the items from the template and paste them into the cur_frm
                for(var n = 0; n < doc.transaction_items.length; n++){
                    var item=doc.transaction_items[n];
                    
                    // Copy-Paste Operation
                    var child = {};
                    for(var m = 0; m < fields.length; m++){
                        child[fields[m]] = item[fields[m]];
                    }
                    cur_frm.add_child("transaction_items",child);
                    cur_frm.refresh_fields("transaction_items"); // Refresh Tabelle
                }
            });
		}
	});
}
// The fetch-from fields
var fields = [
  "value_1",
  "value_2"];

frappe.ui.form.on('Transaction Document', {
    refresh(frm) {
        var cur_frm = frm;
        console.log("Add button");
        frm.add_custom_button('Transaction Template', function () { frm.trigger('get_items') }, __("Get Items From"));
    },
    get_items(frm){
        start_dialog(frm);
    }
});

function start_dialog(frm) {
    let dialog = new frappe.ui.form.MultiSelectDialog({

        // Read carefully and adjust parameters
        doctype: "Transaction Template", // Doctype we want to pick up
        target: cur_frm,
        setters: {
        },
        date_field: "creation", // "modified", "creation", ...
        get_query() {
            // MultiDialog Listfilter
            return {
                filters: {  }
            };
        },
        action(selections) {
            var name = selections[0];
            frappe.db.get_doc("Transaction Template", name) // Again, the Doctype we want to pick up
            .then(doc => {
                // Copy the items from the template and paste them into the cur_frm
                for(var n = 0; n < doc.transaction_items.length; n++){
                    var item=doc.transaction_items[n];
                    
                    // Copy-Paste Operation
                    var child = {};
                    for(var m = 0; m < fields.length; m++){
                        child[fields[m]] = item[fields[m]];
                    }
                    cur_frm.add_child("transaction_items",child);
                    cur_frm.refresh_fields("transaction_items"); // Refresh Tabelle
                }
            });
        }
    });
}


Demo

Hier sehen wir wie wir eine neue Transaktion erstellen und diese gleich mit den Werten einer Vorlage füttern.

image-1655482289546.gif