Automatische Einträge in einer Untertabelle erstellen
Hallo zusammen,
ich stehe vor folgendem Problem:
Ich habe eine Tabelle "Grundeinstellungen", in der ich einen Zahlenwert "Start" eingeben kann, z.B. "50".
Außerdem gebe ich ein, welcher Wert addiert werden soll, z.B. "20"
Und ich gebe ein wie oft der Wert addiert werden soll, z.B. "5"
In dieser Tabelle soll nun darunter eine Untertabelle (es müsste nicht unbedingt eine Untertabelle sein) erstellt werden wo in der ersten Zeile die Zahlenwerte zu finden sind. Bei den automatisch erstellten Zahlenwerten werden dann in der Untertabelle später weitere Eigenschaften ergänzt.
Also:
50
70
90
110
130
das wären die automatisch zu erstellenden Werte in der Untertabelle. Ich hoffe man versteht mich und vielleicht kann mir jemand helfen?
Vielen Dank im Voraus!
13 Antworten
-
Hallo bstn:
---
let me:=this;
for i in range ('FELDWIEOFT') do
let new:=create UNTERTABELLENNAME;
new.Grundeinstellungen:=me;
new.WERT:=me.START+me.START*i
end
---
wenn es keine Untertabelle sein soll dann musst du die Zeile
new.Grundeinstellungen:=me;
löschen
Leo
-
Oh Tippfehler
let me:=this;
for i in range ('FELDWIEOFT') do
let new:=create UNTERTABELLENNAME;
new.Grundeinstellungen:=me;
new.WERT:=me.START+me.WERT*i
end
-
Das funktioniert sehr gut, danke dafür!
Es geht bei den Werten, die dauernd erhöht werden, um Messwerte einer Strecke in [m].
Aktuell wird also nach dem Streckenbeginn gefragt und dann immer der entsprechende Wert addiert. Allerdings sollen die Werte in einer Stationierungsangabe angegeben werden.
25 Meter sind 0+025
175 Meter sind 0+175
3250 Meter sind 3+250
Ich könnte mir vorstellen, dass das sehr kompliziert wird, aber vielleicht weiß jemand eine Lösung.
Der aktuelle Code:
let me := this;
for i in range('Anzahl Messungen') do
let new := (create Messungen);
new.(Grundeinstellungen := me);
new.(Datum := me.Datum);
new.(Stationierung := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * i)
end -
Dazu noch: Kann man mit einem anderen Button die eben erstellten Messungen wieder löschen, falls man sich dann doch für andere Abstände entschieden hat?! Dann sollten natürlich nur die eben-erstellten Messungen gelöscht werden und nicht alle Werte in der Tabelle "Messungen"...
-
Ich kann mit "Stationierung" leider nicht viel anfangen. So eine Darstallung von einer Zahl kann man in einem Funktionsfweld realisieren:
---floor(Stationierung / 1000) + "+" + format(Stationierung - floor(Stationierung / 1000) * 1000, "000")
---
Die Löschung der Werte in Untertabelle efolgt mit
---
delete Messungen
---
Dabei werden nur die zugeordnete Datensätze gelöscht. Um alle Datensätze zu löschen muss man auch die ganze Tabelle auswählen:
---
delete select Messungen
---
Leo
-
Okay das klappt auch alles perfekt! Ich bin dir schon einmal sehr dankbar für deine schnellen und kompetenten Antworten!
Um mein nächstes Problem zu erklären, muss ich wahrscheinlich den Hintergrund ein wenig erklären: die Anzahl der Messungen "Anzahl Messungen" ergibt sich daraus, wie viele Meter oder Kilometer insgesamt gemessen werden müssen. Wenn ich z.B. 1200 Meter messen muss, und ich 12 Messungen brauche, dann muss ich alle 100 Meter eine Messung machen wenn ich bei 0 Meter anfange. Nun das Problem: Wenn ich den Startwert "Beginn [m]" aber jetzt auf 150 m setze dann addiert Ninox momentan trotzdem 12 mal 100 Meter drauf und erstellt natürlich 12 Messungen, wobei ich dann bei 1350 Meter lande, obwohl die Strecke ja nur 1200 Meter lang ist. Kann man einstellen, dass auch nur so viele Messungen hinzugefügt werden, bis die maximale Bahnlänge (die ich auch am anfang eingebe) erreicht ist?! Vielleicht noch mit der Meldung "Da Sie den Startwert auf 150 m gesetzt haben, konnten keine 12 Messungen auf die 1200 m gesetzt werden". Ich hoffe, dass das halbwegs verständlich rüber kam.
1000 DANK!
LG
-
Mir ist ist nicht klar wie die Anzahl der Messungn und die Interwale festgelegt werden. Muss es immer eine bestimmte Anzahl der Messungen sein oder eine bestimmte Distanz dazwischen? Ist es nicht einfacher zu sagen, wenn es z.B. 12 Messungen sein sollten dann teilt man die Restdistanz (hier 1050 m) durch 12 und bekommt einen krummen aber gleichmäsigen Abstand. Oder wenn es 100 m Messabstand sein sollte, dann errechnet mach die Anzahl der Messungen und setzt dann die letzte Messung ans Ende.
Wenn es aber deine genaue Anforderungen sind, dann:---
let me := this;
if me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * me.'Anzahl Messungen' > me.'maximale Bahnlänge' then
let myD := dialog("IRGEND ETWAS PASST NICHT", "Da Sie den Startwert auf " + me.'Beginn [m]' + " m gesetzt haben, konnten keine " + me.'Anzahl Messungen' + " Messungen auf die " + me.'maximale Bahnlänge' + " m gesetzt werden", ["Anpassen", "Abbrechen"]);
if myD = "Anpassen" then
'Anzahl Messungen' := floor(('maximale Bahnlänge' - 'Beginn [m]') / 'Alle wie viele Meter eine Messung?');
for i in range('Anzahl Messungen') do
let new := (create Messungen);
new.(Grundeinstellungen := me);
new.(Datum := me.Datum);
new.(Stationierung := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * i)
end
end
end
---
Leo
-
Ok, zu kurz gedacht:
---
let me := this;
if me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * me.'Anzahl Messungen' > me.'maximale Bahnlänge' then
let myD := dialog("IRGEND ETWAS PASST NICHT", "Da Sie den Startwert auf " + me.'Beginn [m]' + " m gesetzt haben, konnten keine " + me.'Anzahl Messungen' + " Messungen auf die " + me.'maximale Bahnlänge' + " m gesetzt werden", ["Anpassen", "Abbrechen"]);
if myD = "Anpassen" then
let myCNT := 0;
let myST := 'Beginn [m]';
while myST <= 'maximale Bahnlänge' do
let new := (create Messungen);
new.(Grundeinstellungen := me);
new.(Datum := me.Datum);
myST := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT;
new.(Stationierung := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT);
myCNT := myCNT + 1;
myST := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT
end
end
else
let myCNT := 0;
let myST := 'Beginn [m]';
while myST <= 'maximale Bahnlänge' do
let new := (create Messungen);
new.(Grundeinstellungen := me);
new.(Datum := me.Datum);
myST := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT;
new.(Stationierung := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT);
myCNT := myCNT + 1;
myST := me.'Beginn [m]' + me.'Alle wie viele Meter eine Messung?' * myCNT
end
end
---
Leo
-
Wow! Das klappt auch schon sehr gut, allerdings wenn ich "anpassen" klicke und dann nochmal den gleichen Fall durchspiele erscheint die Warnung nicht mehr ... Genau so wenn ich die Messungen mit einem anderen Button durch "delete Messungen" entferne, um dann nochmal neu zu erstellen, erscheint die Meldung ebenfalls nicht und er addiert einfach weiter die Werte drauf ohne die maximale Bahnlänge zu beachten.
-
Sicher, dass du die zweite Formel genommen hast. Genau deswegen habe ich die erste auch korrigiert.
-
Du hast Recht! Es klappt, danke dir! Es werden wahrscheinlich noch weitere Fragen kommen, bei dem was ich noch so vorhabe :-D
-
In der Untertabelle bei den erstellten Messungen (wo bis jetzt ja nur die Stationierungen zu finden sind), Mitarbeiter Messungen eintragen lassen. Dort gibt es Zahlenfelder "Messwert 1", "Messwert 2", "Messwert 3" und "Messwert 4".
Ich hätte gerne, dass immer wenn ein Messwert ins jeweilige Feld eingegeben wird, die aktuelle GPS-Koordinate (so genau wie nur möglich), auf welcher man sich während der Eingabe (Tablet oder Handy) befindet, gespeichert wird. Ich würde diese später gerne auslesen, um sie als Punkte in einem Zeichenprogramm darzustellen. Das geht doch bestimmt irgendwie, da man den Standort über das Standort-Feld ja abgreifen kann, das sollte allerdings direkt ohne ein extra Standort-Feld durch Eingabe jedes Messwerts automatisch erfolgen.
Vielen Dank!
-
*sollen Mitarbeiter nun Messungen eintragen.
Content aside
- vor 4 JahrenZuletzt aktiv
- 13Antworten
- 1208Ansichten