0

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

null
    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

     

    Bildschirmfoto 2021-08-20 um 10.54.41

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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 + get

    FX 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 + get

    Im ganzen ergieb das das gewünchte ergebnis ..... hoffe das klappt auch mit den ganzen anderen kategorien.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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***

    • DV digital vereinfacht GmbH
    • Sebastian_Kalberg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    anbei mal ne datei zum probieren.... Hoffe es kann einer von euch helfen.

     

    https://gofile.me/4mF3s/Eq0MgUfND

    • Carsten_Losch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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  

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hat keiner ne idee ? 😟

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    👍

    aber warum muss man hier mit sleep() arbeiten? Die einzelnen if bedingungen werden doch nacheinander abgearbeitet.

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Stimmt hier funktioniert es ohne sleep. Zuhause ist das I-net nicht schnell.. daher dann auch der vermeindliche fehler.  Wieder was gelernt 

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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;

    Bildschirmfoto 2021-08-24 um 13.32.35

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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 

    👍

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    'Platzhalter 1':=rpad(" ", 5, "
    ")

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Michi,

    ---

    'Platzhalter 1':=if cnt(array(numbers('Buffet auswahl'),numbers('Getränke wählen'))))<7 then rpad(" ", 5, "
    ") else null end

    ---

    Leo