Druck Layout
Hallo zusammen,
Ist es möglich das linke fx Feld so zu konfigurieren das es nur einmal ein Fest zugeordneten Wert enthält? In dem Fall Buffet, die restlichen Datensätze jedoch nur als Platzhalter fungierten bis zur nächsten Kategorie des rechten fx Feldes?
Mann kann ja meines Wissens nach keine Formatierung des Textes im Skript vornehmen, so könnte man jedoch Die Linke spalte anders formatieren als die rechte .
Skript in der rechten ist:
let aa := join(for i in numbers('Buffet auswahl') do
" • " + " " + record(Buffet,i).Bezeichnung
end, "
");
let bb := join(for i in numbers('Getränke wählen (DMFAF)') do
" • " + " " + record('Getränke',i).Bezeichnung
end, "
");
aa + "
" + "
" + if 'Getränke wählen (DMFAF)' then
"Geränke " + "
" + "
" + bb
end
31 Antworten
-
Hallo Michi,
so wirklich schlau werde ich aus der Formel nicht. Wie es aussieht hast du in der Tabelle Buffet mindestens 4 Records mit der Bezeichnung "Buffet". Sind auch andere Bezeichnungen vorhanden?ich kann mir für aa solche Formel vorstellen:
---
let myGroup := "";
let aa := join(for i in numbers('Buffet auswahl') do
if record(Buffet,i).Bezeichnung != myGroup then
myGroup := record(Buffet,i).Bezeichnung;
" • " + " " + myGroup
else
""
end
end, "
")
---Leo
-
Hallo Leo,
es gibt verschiedene Kategorien (Buffet , Snacks, Getränke ....) dazugehörig ist immer ein DMFA mit unterschiedlichen Records von null bis ... . Da ja aber immer unterschiedliche angebote und vorlieben bestehen, ist ein starres einfügen von Feldern im Layout nicht möglich. Daher war mein gedanke ich packe das alles zusammen in ein Fx feld zur ausgabe.
Das problem ist das es optich jetzt nicht mehr möglich ist in dem FX feld die Kategorien hervorzuheben für eine bessere übersicht. So wollt ich gerne (sofern das geht ) wenn ein Record im Rechten FX vohanden ist soll im linken FX nur die Kategorie als "überschrift" dargestellt werden. Die weiteren Records sollen in dem linken FX als platzhalter fungieren.
-
Danke Leo,
du hattest wie immer schon das richtige geschrieben.
FX skript links:
let myGroup := "";
let aa := join(for i in numbers('Buffet auswahl') do
if record(Buffet,i).Bezeichnung != myGroup then
myGroup := record(Buffet,i)."";
myGroup
else
""
end
end, "
");
let bb := join(for i in numbers('Getränke wählen') do
if record('Getränke',i).Bezeichnung != myGroup then
myGroup := record(Buffet,i)."";
myGroup
else
""
end
end, "
");
let buf := if 'Buffet auswahl' then
"Ihr leckeres Buffet" + "
" + aa + "
" + "
"
end;
let get := if 'Getränke wählen' then
"Ihre Getränke" + "
" + bb + "
" + "
"
end;
buf + getFX skipt rechts:
let aa := join(for i in numbers('Buffet auswahl') do
" • " + " " + record(Buffet,i).Bezeichnung
end, "
");
let bb := join(for i in numbers('Getränke wählen') do
" • " + " " + record('Getränke',i).Bezeichnung
end, "
");
let buf := if 'Buffet auswahl' then
aa + "
" + "
" + "
"
end;
let get := if 'Getränke wählen' then
bb + "
" + "
" + "
"
end;
buf + getIm ganzen ergieb das das gewünchte ergebnis ..... hoffe das klappt auch mit den ganzen anderen kategorien.
-
Grüß dich Leo,
hast du oder jemand anders vieleicht noch eine idee wie man es verhindern kann das das fx feld bei zu vielen einträgen kommplett auf die 2. Seite des pdf kommt? Meine idee wäre auf die erste seite, das FX feld zu platzieren. hier dürfen aber nur 20 zeilen in das FX feld. Wenn es mehr sind sollen sie in das Fx feld was auf der 2. Seite plazierte wurden. Aber natürlich nur die welche nicht in das 1. passen. also keine doppelten einträge erscheinen. so ähnlich eines übertrages.
***Wann kommt endlich der neue editor für das drucklayout***
-
Vielleicht kannst du mit zwei verschiedenen Drucklayouts arbeiten und je nach Länge des Feldes, mit einem "PDF erstellen" Button das jeweilige Layout drucken lassen.
-
Die anzahl der zeilen ist leider sehr dynamich und nicht vorhersehbar.... am layout entscheidet sich halt ob ein neuer ninox juser hinzukommt oder nicht. Hab alles für Ihn fertig .... aber es muss halt auch vernünftig abbildbar sein als pdf
-
anbei mal ne datei zum probieren.... Hoffe es kann einer von euch helfen.
-
hast du schon mal versucht auf der ersten Seite ein fx feld mit "fester Höhe" so zu platzieren, dass 20 Zeilen ausgegeben werden? Auf der Zweiten Seite dann das zweite fx Feld, welches nur erscheint, wenn das erste > 20 Zeilen hat, und auf den nur die Zeilen ab 21 gedruckt werden? die Zeilen müsstest du ja zählen können... Viele Grüße, Carsten
-
Hat keiner ne idee ?
-
Hallo Michi,
Mit Funktionsfelder kommst du im Ausdruck nicht weiter. Der einzige Weg ist es, eine extra Tabelle zu bauen und diese dann per skript füllen.
https://1drv.ms/u/s!Aoe56jabahMe4nBqfaU1f2dIdN_l?e=R8dWWL
Leo
-
Tausend Dank,
da wäre ich nie drauf gekommen. Vielen vielen Dank für deine mühe. So kommt sicher wieder ein neuer user hinzu, der sein Geschäftsfeld über Ninox abbilden kann. Bin ja in keiner weise ein profi, aber ich mag Ninox sehr. Gerade für "kleine" Firmen ist das konzept super.
Dachte ich kann die arrays irgendwie direkt aufteilen. Das tolle ist das deine lösung für viele Druckansichten anwendbar ist.
-
Ich noch mal Leo,
die auswahlen bleiben egal was man ab und zu wählt gruppengleich, wenn man jedoch zum beispiel getränke gar nicht wählt, so erscheinen alle anderen unter Buffet ausgewählten einträge nicht. Wie kann man das lösen? einfach mil else geht nicht
-
Hallo Michi,
die Formel für den Button:
---delete Printtabelle;
let me := this;
do as server
let myPos := 1;
if 'Buffet auswahl' then
for i in numbers('Buffet auswahl') do
let new := (create Printtabelle);
new.(Pos := myPos);
new.(Auswahlseite := me);
new.(Gruppe := if i = first(numbers(me.'Buffet auswahl')) then
"Buffet"
end);
new.(Bezeichnung := record(Buffet,i).Bezeichnung);
myPos := myPos + 1
end
end;
if 'Getränke auswahl' then
for i in numbers('Getränke auswahl') do
let new := (create Printtabelle);
new.(Auswahlseite := me);
new.(Pos := myPos);
new.(Gruppe := if i = first(numbers(me.'Getränke auswahl')) then
"Getränke"
end);
new.(Bezeichnung := record('Getränke',i).Bezeichnung);
myPos := myPos + 1
end
end;
if 'Desserts auswahl' then
for i in numbers('Desserts auswahl') do
let new := (create Printtabelle);
new.(Auswahlseite := me);
new.(Pos := myPos);
new.(Gruppe := if i = first(numbers(me.'Desserts auswahl')) then
"Desserts"
end);
new.(Bezeichnung := record(Dessert,i).Bezeichnung);
myPos := myPos + 1
end
end;
if 'Snacks Auswahl' then
for i in numbers('Snacks Auswahl') do
let new := (create Printtabelle);
new.(Auswahlseite := me);
new.(Pos := myPos);
new.(Gruppe := if i = first(numbers(me.'Snacks Auswahl')) then
"Snacks"
end);
new.(Bezeichnung := record(Snacks,i).Bezeichnung);
myPos := myPos + 1
end
end
end;
sleep(1000);
printRecord(this, "TABELLE")
---
Leo
-
aber warum muss man hier mit sleep() arbeiten? Die einzelnen if bedingungen werden doch nacheinander abgearbeitet.
-
Es ist so, dass die Untertabelle über do as server generiert wird und dann an den client geschickt wird. Die Erstellung der Pritntlayout entsteht ebenfalls als client-session. Wenn die Internet-verbindung langsamm ist, kann es vorkommen, dass Ninox eine PDF-Seite ohne untertabelle produziert.
-
Stimmt hier funktioniert es ohne sleep. Zuhause ist das I-net nicht schnell.. daher dann auch der vermeindliche fehler. Wieder was gelernt
-
Jetzt hab ich nur noch das problem, das mir jeweils ein gewählter record nicht aufgelistet wird. Ziel ist es noch die Leerzeile zwischen den Gruppen zu bekommen.
Das Klappt, jedoch fehlt immer ein Record, --- Wo ist denn mein fehler? delete Printtabelle;
delete Printtabelle;
let me := this;
do as server
let myPos := 1;
if 'Buffet auswahl' then
for i in numbers('Buffet auswahl') do
if i = last(numbers(me.'Buffet auswahl')) then
let new := (create Printtabelle);
new.(Dashboard := me);
new.(Pos := if i = last(numbers(me.'Buffet auswahl')) then
myPos
end)
else
let new := (create Printtabelle);
new.(Pos := myPos);
new.(Dashboard := me);
new.(Gruppe := if i = first(numbers(me.'Buffet auswahl')) then
"Buffet"
end);
new.(Bezeichnung := " • " + record(Buffet,i).Bezeichnung);
myPos := myPos + 1
end
end
end;
if 'Buffet beilagen wählen' then
for i in numbers('Buffet beilagen wählen') do
if i = last(numbers(me.'Buffet beilagen wählen')) then
let new := (create Printtabelle);
new.(Dashboard := me);
new.(Pos := if i = last(numbers(me.'Buffet beilagen wählen')) then
myPos
end)
else
let new := (create Printtabelle);
new.(Dashboard := me);
new.(Pos := myPos);
new.(Gruppe := if i = first(numbers(me.'Buffet beilagen wählen')) then
"Buffet beilagen"
end);
new.(Bezeichnung := " • " + record('Beilagen für Buffet',i).Bezeichnung);
myPos := myPos + 1
end
end
end; -
Mal etwas komplet anderes:
---
delete Printtabelle;
let me := this;
let myNameSpace := ["Buffet", "Getränke", "Desserts", "Snacks"];
let myValueSpace := ['Buffet auswahl', 'Getränke auswahl', 'Desserts auswahl', 'Snacks Auswahl'];
let myTableSpace := ["Buffet", "'Getränke'", "Dessert", "Snacks"];
let myPos := 1;
for i in range(cnt(myNameSpace)) do
let new := (create Printtabelle);
new.(Auswahlseite := me);
new.(Pos := myPos);
new.(Gruppe := item(myNameSpace, i));
new.(Bezeichnung := join(for j in numbers(item(myValueSpace, i)) do
" • " + text(eval(---
record({ item(myTableSpace, i) },{ j }).Bezeichnung
---, me))
end, "
") + "
");
myPos := myPos + 1
end
---
Hier müssen in dem Array myNameSpace die Gruppennamen rein geschrieben werden.
im myValueSpace - die Dynamishen auswahlfelder angeklickt
im myTableSpace - die Namen der entsprechenden Tabellen und zwar so wie es in den Skripten vorkommt (z.B. "'Getränke'")Als Ergebniss kriegt man eine viel kleinere Printtabelle mit Gruppenzeilen wo die Komponenten im Feld runtergeschrieben sind. Im Formular hat man zwar das Problem dass die Komponente nacheinander geschrieben werden, aber im Printlayout wird die Komplette Gruppe auf die nächste verschoben.
Im Printlayout musst du in der zweiten Spalte entsprechend den Punkt (" • ") weg lassen.Leo
-
Jetzt sollte alles perfekt sein. Hab nur noch : if 'Buffet auswahl' = null then
delete (select Printtabelle where Gruppe = "Buffet")
end; hinzugefügt um die nicht gewählten gruppen zu löschen.Danke nochmals
-
Hallo Leo,
Hallo Forum,
Dein letzter Code funktioniert super. Wie bekomme ich noch ein zusatzfeld in die printtabelle?
Es soll eine Beschreibung sein.
Also alles wie es ist, jedoch ist noch das textfeld Beschreibung dazugekommen. New.(beschreibung:= ......)
Wenn ich dein Code umbauen funktioniert das nur ohne do as Server und er meckert rum. Was zur Wirkung hat das der Button mit dem Code nicht gespeichert wird
-
Hat sich erledigt,
das selbe gemacht wie gestern... nur heute kommt keine fehlermeldung.
delete (select 'Printtabelle Extras');
do as server
let me := this;
let myNameSpace := ["Bitte Optionale extras wählen" + "
" + "(nicht im Angebotspreis enthalten)"];
let myValueSpace := ['Mögliche extras'];
let myTableSpace := ["Extras"];
let myPos := 1;
for i in range(cnt(myNameSpace)) do
let new := (create 'Printtabelle Extras');
new.(Dashboard := me);
new.(Position := myPos);
new.(Gruppe := item(myNameSpace, i));
new.(Beschreibung := join(for j in numbers(item(myValueSpace, i)) do
text(eval(---
record({ item(myTableSpace, i) },{ j }).Beschreibung
---, me))
end, "
") + "
");
new.(Bezeichnung := join(for j in numbers(item(myValueSpace, i)) do
" ___ " + text(eval(---
record({ item(myTableSpace, i) },{ j }).Bezeichnung
---, me))
end, "
") + "
");
myPos := myPos + 1
end
end -
Kann man das skript einfacher schreiben?
Hab 5 DMFA wo die einträge gezählt werden sollen um im anschluß einen Platzhalter im Layout zu befüllen.
let bu := for i in numbers('Buffet auswahl') do
record(Buffet,i).Bezeichnung
end;
let get := for i in numbers('Getränke wählen') do
record('Getränke',i).Bezeichnung
end;
if cnt(bu) + cnt(get) < 7 then
'Platzhalter 1' := " " + "
" + "
" + "
" + "
" + "
"
else
'Platzhalter 1' := null
end -
'Platzhalter 1':=rpad(" ", 5, "
") -
Danke Leo,
Wenn ich das richtig verstehe setzt dein Code 5 Leerzeilen, das ist schon mal kurz und knackig
Kann man das zählen der einzelnen rekords, irgendwie abkürzen in dem man sie alle als array einbinden kann und nicht jedes einzelne separat in eine variable packen muss?
Danke michi
-
Hallo Michi,
---
'Platzhalter 1':=if cnt(array(numbers('Buffet auswahl'),numbers('Getränke wählen'))))<7 then rpad(" ", 5, "
") else null end
---
Leo
Content aside
- vor 3 JahrenZuletzt aktiv
- 31Antworten
- 1622Ansichten