Per Befehlsschaltfläche Datensätze in neue Tabelle kopieren?
Hallo,
ist es möglich mit einer Befehlsschaltfläche Datensätze von einer in eine andere Datenbank zu kopieren?
Ich habe eine Tabelle in der meine Angebote sind, falls diese angenommen werden würde ich diese gerne per Knopfdruck in eine zweite Tabelle mit meinen Rechnungen kopieren.
17 Antworten
-
Hallo,
Befehlsschaltfläche mit einem Script in der Art:
let myFeld1 := Feld1;
let myFeld2 := Feld2;
let myFeld3 := Feld3; (...)
let newRe := (create Rechnung);
newRe.(Feld1 := myFeld1);
newRe.(Feld2 := myFeld2);
newRe.(Feld3 := myFeld3); (...)
Feld1, Feld2, Feld3 und folgende sind die Felder, deren Inhalt Du aus dem Angebot in die Rechnung übernehmen willst.
Bei vielen Feldern etwas Fleißarbeit beim Scripten, aber funktioniert...
lg, Torsten
-
Hallo Thorsten,
vielen Dank für deine schnelle Antwort. Und wie bekomme ich die Positionen, die sich ja auch in einer Untertabelle befinden mit rüber?
-
Sorry für das h ;)
-
Hallo,
ganz ehrlich: ich hab 'ne Idee, aber keinen sicher validen Code, denn ich Dir dazu aus der Hüfte liefern kann.
Insofern müsste ich den Staffelstab an fortgeschrittenere Ninox-User weiterreichen...
Sorry, Torsten
-
argl, -denn +den :-/
-
Das, was der Torsten hier beschrieben hat, gilt fürs Bewegen der Daten innerhalb einer Datenbank. Die Kommunikation zwischen der Datenbanken wird via API mit der nächsten Update kommen.
Leo
-
Huhu Leo,
Öhm, ich verstehe den OP durchaus so, dass er innerhalb einer Datenbank von einer Tabelle Angebot in eine Tabelle Rechnung kopieren will.
lg, Torsten
-
Falls du doch die Datensätze zwischen zwei Tabellen kopieren möchtest: es ist auch möglich, man muss aber das Datenmodell sehen um zu wissen, welche Verknüpfungen wie aufgebaut sind. Generell ist es aber sinvoll, alle Daten in der Datenbank nur atomar zu halten. Überprüf bitte, ob du wirklich zwei identische Tabellen in einer Datenbank halten möchtest und ob es nicht sinnvoll wäre, nur eine Tabelle zu haben und die Daten mit unterschiedlichen Ansichten zu filtern.
Leo
-
Hallo Torsten,
da haben fast gleichzeitig gepostet.
auch hier würde ich versuchen die Rechnungspositionen mit Angebotspositionen in einer Tabelle zu halten. Ist aber nur meine Theorie.
Leo
-
Es geht tatsächlich um zwei Tabellen innerhalb einer Datenbank. Generell hätte ich auch nichts dagegen, die Daten in einer Tabelle zu verwalten. Problem ist da nur die Rechnungsnummer. Habe eine Befehlsschaltfläche konfiguriert, die beim Auslösen eine Rechnungsnummer vergibt. Aber dabei gibt es Probleme, weil nicht jedes Angebot zur Rechnung wird und auch nicht unbedingt in der richtigen Reihenfolge. Dadurch ist die Nummer leider nicht fortlaufend.
Folgende Trigger verwende ich:
let y := yearmonth(Datum);
let c := cnt(select Angebote where yearmonth(Datum) = y);
Rechnungsnummer := "RE" + format(Datum, "YY") + format(c, "000") -
Das Verwalten verschiedener Dokumenttypen wie Angebot und Rechnung in einer Tabelle ist kein Problem. Zur Umsetzung gibt es verschiedene Möglichkeiten, u. a. auch davon abhängig, ob die Angebote auch als Dokumente erhalten bleiben sollen. Wenn nicht, dann würde es bspw. genügen, ein zusätzliches Auswahlfeld für den Dokumenttyp zu erstellen („Angebot“/„Rechnung“) sowie eine Schaltfläche namens „Rechnung erstellen“ oder so, mit der du ggf. die Rechnungsnummer generierst (evtl. nur angezeigt, wenn Typ = „Rechnung“).
Sollen die Angebote auch als Dokumente/Datensätze erhalten bleiben, kann man folgendermaßen vorgehen (Script in Schaltfläche):
1.) Aktuellen Datensatz mitsamt Untertabelle kopieren:
duplicate(this);2.) Nummer des neuen Datensatzes ermitteln:
let NeuerDS := max((select TABELLE).number(Nr));3.) Neuen Datensatz öffnen:
openRecord(record(TABELLE,number(NeuerDS)));4.) Ggf. Statusfeld ändern:
text(Status := "Rechnung"));5.) Wie gehabt Rechnungsnummer generieren.
Hab‘s jetzt so nicht praktisch getestet, aber prinzipiell müsste es in etwa stimmen. Ansonsten bitte gerne korrigieren/präzisieren/optimieren.
-
Hallo Copytexter,
vielen Dank, für deinen Lösungsansatz. Die Untertabelle mit den Positionen wird aber leider nicht mit kopiert.
Hier mein Code:
duplicate(this);
let NeuerDS := max((select Angebote).number(Nr));
openRecord(record(Angebote,number(NeuerDS)));hab ich was falsch gemacht?
Das Problem mit den Rechnungsnummern bleibt und ich habe leider keine Ahnung wie ich es lösen kann. Ich brauche fortlaufende Rechnungsnummern, unabhängig von der Position des Datensatzes in der Tabelle.
So wie es jetzt ist, erzeugt der Datensatz an Positon 1 die Nummer 0001 und der Datensatz an Positon 5 die Nummer 5, auch wenn er als zweites eine Nummer zugewiesen bekommt. Ich bräuchte eine Nummer die ganz unabhängig von der Positon einfach +1 rechnet. Gibt es dafür eine Formel?
Nochmal vielen Dank an alle, die hier so toll unterstüzen!
-
Hm. Ich glaube, da läuft jetzt einiges durcheinander. Woher kommt in deinem Code zum Generieren der Rechnungsnummer denn eigentlich das „Datum“? Wäre es da nicht sinnvoller, sich auf das aktuelle Tagesdatum zu beziehen? Dann hat man automatisch korrekte, fortlaufende Nummern im Sinne der Finanzverwaltung.
Und wieso yearmonth(), wenn du für die Belegnummer dann doch nur das Jahr nimmst?
Wie genau soll die Rechnungsnummer vom Aufbau her am Ende aussehen?
-
Das Datum kommt aus einem Datumsfeld im Formular. Wie die Rechnungsnummer aussieht ist mir am Ende eigentlich egal, hauptsache sie ist fortlaufend. Wie sieht denn die korrekte Formel für eine Nummer mit Tagesdatum aus?
Hast du eine Idee warum meine Untertabelle nicht mit in den neuen Datensatz kopiert wird? Stimmt was an meiner Formel nicht?
Gibt es eigentlich irgendwo eine Übersicht der Befehle, wo die alle aufgelistet sind?
Nicht wundern, habe mich in meinen richtigen Account umgemeldet.
-
Habe noch mal nachgesehen, wie ich das in einem ähnlichen Fall gemacht habe (vergesse das immer wieder). Umgemünzt auf deinen Fall müsste dieser Code funktionieren.
duplicate(this);
let NeuerDS := max((select Angebote).number(Nr));
let NewRecord := (select Angebote)[number(Nr) = NeuerDS];
let ReJahr := format(today(), "YY");
let LfdNr := cnt(select Rechnung where substr(Rechnungsnummer, 2, 2) = ReJahr) + 1;
NewRecord.(Rechnungsnummer := "RE" + ReJahr + format(LfdNr, "000"));
openRecord(record(Angebote,number(NeuerDS)))Damit würde der aktuelle Datensatz kopiert, der neue Satz aktiviert und diesem eine neue, fortlaufende Rechnungsnummer im Format 18001, 18002 usw. zugewiesen. Beim Schnelltest hat's funktioniert.
-
Ach so, die Untertabelle wird dabei auch mit kopiert.
-
Das werde ich später mal ausprobieren, aber jetz wird erstmal was gegessen ;). Vielen Dank nochmal!
Content aside
- vor 6 JahrenZuletzt aktiv
- 17Antworten
- 7755Ansichten