0

Tabelle für Druck umgruppieren: Zeilen splitten

Moin, ich möchte eine UntertabelleTabelle 'Positionen', die vorliegt als Spalten "Pos", "Kurztext", "Langtext", " Betrag" Wobei die Felder Kurztext und Langtext beide als mehrzeiliges Textfeld definiert sind für eine Druckaufbereitung Folgendermaßen umsortieren, so dass aus der Originaltabelle:

Aus je einer Zeile sollen 2 Zeilen werden, so dass Position als unsichtbares Sortierkriterium als Pos*2-1 und Pos*2 wieder untereinanderstehen und Kurzext in der jeweils ersten und Langtext in der jeweils 2. Zeile landen und der Betrag in der jeweils 2. Zeile, die erste leer:

Untertabelle in 'Rechnungen'         Ansicht in 'Rechungen'  
                   
Pos Kurztext Langtext Preis       Pos Text Preis
1 aaa AAA 100   -->   1 aaa  
2 bbb BBB 200       2 AAA 100
3 ccc CCC 300       3 bbb  
              4 BBB 200
              5 ccc  
              6 CCC 300 

So dass ich dann Die Ansicht in das standard-Ninox-Drucklayout einfügen kann, wie aktuell die Untertabelle

Nun komme ich gerade mit den Arrays und den select-Anweisungen in der Ansicht - Oder Formel?, was die "Ansicht in 'Rechungen'" darstellen soll gar nicht klar, da erhoffe ich mir einen Anschub. 

Die normale Ansicht mit A-Positionen, bzw

let myArray := 'A-Positionen';myArray

liefert mir die richtigen Datensätze.  Aber in dem Array dann bewegen und dieses neu zu gruppieren, was eigentlich ganz einfach ist, scheitere ich (noch) an der Umsetzung mit den Indizes, Zeilen, Spalten, ... und der Syntax. Danke schonmal bis hier her :-)

5 Antworten

null
    • T_Bartzsch
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Hallo Stefan,

    mir ist noch nicht so ganz klar, was Du da vor hast, aber prinzipiell stellen Tabellen ja Datensätze dar. Jede Zeile ist ein Datensatz. Wenn Du "Zeilen splitten" meinst, musst du für jede Zeile auch einen Datensatz in der entsprechenden Tabelle haben. Du kannst die Datensätze natürlich über diverse Filter in verschiedenen Ansichten ein- bzw. ausblenden -so kommt man dann auch zu deinem Ziel bei "Ansicht Rechnungen" - aber ich verstehe den Sinn nicht. Oder willst Du gar eine normale Rechnung erzeugen, mit ergänzenden Informationen bei den Rechnungspositionen? Gib mal ein konkretes Besipiel...

      • Stefan_Gahrmann
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Ja, so ähnlich... Daher möchte ich auch nicht die Tabelle oder Untertabelle ändern, die Informationen sind alle da. Ich (soll und) möchte eine Rechnung dahingehend formatieren, dass die Position mehrzeilig flexibel formuliert werden kann und auf der Höhe der Stundenangabe der Nettopreis steht. In der Subtabelle derart gelöst, dass es zwei Textfelder mehrzeilig gibt, als Vortext und Preistext, sowie den dazugehörigen Nettobetrag und als Sortierhilfe für die Positionen eine Positionsnummer (welche aber unsichtbar bleiben soll). 

      Da die Ninox-Standard-Druckvorlage in Tabellen den Preis in der Ersten Zeile eines Datenfeldes anordnet, kann ich in der Druckansicht das so steuern, wie oben gezeigt, wenn ich eine Tabelle so umstelle...

      Als nichtfunktionierende, unoptimierte, unflexible Idee quasi:

      let myanzPos := count('A-Positionen');
      let myNewArray := [];
      for i from 0 to myanzPos - 1 do
          let newID := item('A-Positionen'.Pos, i);
          if newID = 0 or newID = void then
              newID := i + 1
          end;
          let newVortext := item('A-Positionen'.Vortext, i);
          let newPreiszeile := item('A-Positionen'.Preiszeile, i);
          let newberNettobetrag := item('A-Positionen'.ber_Nettobetrag, i);
          let myNewZeileA := [];
          let myNewZeileB := [];
          myNewZeileA := array(myNewZeileA, [newVortext]);
          myNewZeileA := array(myNewZeileA, [void]);
          myNewZeileA := array(myNewZeileA, [newID * 2 - 1]);
          myNewZeileB := array(myNewZeileB, [newPreiszeile]);
          myNewZeileB := array(myNewZeileB, [newberNettobetrag]);
          myNewZeileB := array(myNewZeileB, [newID * 2]);
          myNewArray := array(myNewArray, myNewZeileA);
          myNewArray := array(myNewArray, myNewZeileB)
      end;
      myNewArray

      Nur das das resultierende Ergebnis-Array hier leer ist ;-) und ich grad noch den Denk-oder Syntax-Fehler oder beides suche ;-) Als Ergebnis soll eine Tabelle stehen, die mittels einer Ansicht-Formel oder Formel-Formel angezeigt wird und somit als Tabelle in die Druckansicht übernommen werden kann.

      Die Syntax und Möglichkeiten zu Arrays in Ninox habe ich auch noch nicht gut genug verstanden... Und wenn ich richtig denke, hilft mir der Ansatz auch später bei einbinden der Carbone.io

      Ergänzend - Der Datentyp für den Nettobetrag kann auch ein String sein, die Berechnung erfolgt schon woanders. 

    • T_Bartzsch
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Du must ja im Drucklayout nicht mit Tabellen arbeiten. Klar, das ist die schnellste Variante, aber nur wenn die Tabelle den Ansprüchen genügt. Wenn nicht, dann würde ich mit einer for-Schleife durch die Artikelpositionen iterieren und die Informationen ausgeben, die mich interessieren. Im besten Fall hast Du in jedem Datensatz/Artikel die benötigten Informationen abgelegt (Ein Feld "Pos", das Textfeld "Vortext" usw.... Die optische "Tabelle" muss man dann natürlich selbst gestalten. Man legt also ein leeres Textfeld an, mit farbigem Hintergrund als Kopfzeile. Dort dann Textfelder mit den Spaltennamen hinein... Dann also im Drucklayouteditor, in einem Formel-Feld anfangen mit:

    let me := this; // (damt du innerhalb der Schleife mit "me" auch bei Bedarf auf Daten aus dem aktuellen Datensatz Zugriff hast, z.B. Rechnungsnummer, Datum, Sachbearbeiter usw...)

    for i in 'A-Positionen' do
    i.(Vortext + "
    " + Artikelname + "
    " + Preistext
    ) end

    Die Zeilenumbrüche werden tatsächlich "hartkodiert" als Zeilenumbruch in den Code geschrieben...

    Nun nimmst du ein neues Formelfeld, positionierst das oben bündig mit dem vorigen Formelfeld und dort kopierst du den Code, liest nur den Preis aus, behältst aber die Struktur bei:

    for i in 'A-Positionen' do
    i.("
    " +  "
    " + Nettopreis
    ) end

    So baust Du dir Spalte für Spalte zusammen - der Vorteil dabei ist, Du kannst jede Formelspalte gesondert formatieren. Der Nachteil ist, du hast keine "one-click-fertig" Tabelle...

    • T_Bartzsch
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Hier mal ein Beispiel, wie sowas dann aussieht... Natürlich musst Du in der Formel nicht zwei Umbrüche mit einem Plus verbinden, man kann auch direkt einen doppelten Umbruch setzen. Es ging nur um Veranschaulichung des Prinzips.

    Generell würde ich für sowas aber den dynamischen Editor bemühen und mir ein Template in OpenOffice/Word anlegen. Da ist man flexibler was Formatierung angeht... und auch bei mehrseitigen Dokumenten. Das wird dann nämlich im NINOX-Editor die nächste "Hürde"

      • Stefan_Gahrmann
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Schonmal vielen Dank, das schau ich mir an, daran hatte ich (für den carbone) schon so gedacht. Mir war gar nicht aufgefallen, dass es im Standard-Editor so gehen kann, und ja mir war schon aufgefallen, dass ich für MehrSeiter sowieso umsteigen muss.

      Ich sehe hier noch das Problem, dass ich nicht weiß, wie hoch der Vortext ist, kann ich die automatischen Zeilenumbrüche zählen oder die relative Zeilennummer ermitteln?

      Was mir jetzt leider entgeht, ist der Hinweis, wie oder wo ich finden kann: Bessere Informationen oder Klarheit zu den Arrays und den Zusammenhang zwischen Array, Tabelle und der Ansicht als Ansicht oder Formel ;-), auch wenn ich unter multi dmulti array - Tipps & Tricks | Ninox Community schon sehr viel gefunden habe und das gerade durcharbeite. Hier Dank an   !

      Jetzt nach einem Jahr Ninox - und erst seit Dezember intensiver steigt meine Lernkurve merklich an und das eingeschlafene Programmiertraining kommt wieder - stelle ich bei Ninox fest, dass die ein oder andere Dokumentation noch.... verbesserungswürdig ist ;-) Dennoch, meine beiden Projekte sind nutzbar und nehmen Form an 🙂