Tabelle dynamisch befüllen

Hallo liebe Community :slight_smile:

Ich hab vor einigen Tagen mit List & Label angefangen zu arbeiten.
Derzeit verwende ich noch die LL Trial Version.

Ich arbeit zurzeit an einem Reporting (Listen) und versuche dynamisch eine Rechnung zu generieren.

Sprache: Java
Daten: Werden erstmal statisch generiert in Form einer ArrayList

Variabeln in meinem Report einfließen zu lassen, funktioniert bis jetzt einwandfrei.
Sobald ich aber Felder in meiner Tabelle anzeigen lassen will, scheitert es leider :frowning:

Es wird leider nur die letzte Position meiner Liste immer in meiner Tabelle angehängt und nicht wie gewollt alle Positionen. Auch nach stundenlangem durchstöbern der Doku komme ich nicht weiter und hoffe hier etwas Hilfe zu bekommen.

Code um die Felder zu übergeben:

List<Rechnungsposition> rechnungspositionen = new ArrayList<>();
    rechnungspositionen.add(new Rechnungsposition("Fernseher", 2, 2000));
    rechnungspositionen.add(new Rechnungsposition("Kaffeemaschine", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("Buch", 3, 20));

    // Löscht den Puffer der Felder
    Ll.LlDefineFieldStart(nLLJob_);

    for (Rechnungsposition position : rechnungspositionen) {
      int pos = rechnungspositionen.indexOf(position) +1; 
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", Integer.toString(pos));
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", position.getArtikelname());
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", Integer.toString(position.getMenge()));
      Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", Double.toString(position.getEinzelpreis()));
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", Double.toString(position.getGesamtpreis()));

      // Setzt die Felder pro Loop
      Ll.LlPrintFields(nLLJob_);
    }

    Ll.LlPrintFieldsEnd(nLLJob_);

Designer

Variablen und Felder werden wie gewollt, übergeben nur füllt sich die Tablle leider nicht :frowning:

Mit freundlichen Grüßen
Federico

HI Federico, willkommen im LL Forum,
versuche mal

        int nRet = Ll.LlPrintFields(nLLJob_);
        while (nRet == CmbtLL28.LL_WRN_REPEAT_DATA)
        {
          Ll.LlPrint(nLLJob_);
          nRet = Ll.LlPrintFields(nLLJob_);
        }

in deiner Array Schleife, du müsstest das auch für PrintFieldsEnd analog machen, sonst druckt es immer nur eine Fusszeile, falls mehrere vorhanden.

btw. du darfst nicht Ll.LlDefineFieldStart(nLLJob_); in der Druckschleife aufrufen, wie dein Kommentar schon sagt, es löscht den Puffer, das kann zu unerwarteten Verhalten führen, also immer vor Druckstart :wink:

1 Like

Danke für schnelle Antwort :open_mouth:

Meinst du so?

   for (Rechnungsposition position : rechnungspositionen) {
      int pos = rechnungspositionen.indexOf(position) +1; 
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", Integer.toString(pos));
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", position.getArtikelname());
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", Integer.toString(position.getMenge()));
      Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", Double.toString(position.getEinzelpreis()));
      Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", Double.toString(position.getGesamtpreis()));

      int nRet = Ll.LlPrintFields(nLLJob_);
      while (nRet == CmbtLL28.LL_WRN_REPEAT_DATA)
      {
        Ll.LlPrint(nLLJob_);
        nRet = Ll.LlPrintFields(nLLJob_);
      }

      int xRet = Ll.LlPrintFieldsEnd(nLLJob_);
      while (xRet == CmbtLL28.LL_WRN_REPEAT_DATA)
      {
        Ll.LlPrint(nLLJob_);
        xRet = Ll.LlPrintFieldsEnd(nLLJob_);
      }

    }

Eigentlich ja, was spuckt er den aus wenn du es so laufen lässt?

soweit keine Fehlermeldung und auch keine änderung in der Tabelle :smiley:

Hab nochmal drüber geschaut, ich bin jetzt kein java entwickler, aber ist die For Schleife korrekt? Dein erster code sollte auch funktionieren, also im .NET wäre es z.B.

         for (int i = 0; i < rechnungspositionen.Count; i++)

Und vorher natürlich PrintStart und LlPrint…etc.

also vor der For Schleife

            Ll.Core.LlPrintWithBoxStart(LlProject.List,"test.lst", LlPrintMode.Preview, LlBoxType.Normalwait, IntPtr.Zero, "");
            Ll.Core.LlPrint();
            for (int i = 0; i < rechnungspositionen.Count; i++)

sonst poste mal die gesamte Routine mit PrintStart und End usw.

1 Like

Der Teil muß richtig so aussehen :

int xRet = Ll.LlPrintFieldsEnd(nLLJob_);
      while (xRet == CmbtLL28.LL_WRN_REPEAT_DATA)
      {
        xRet = Ll.LlPrintFieldsEnd(nLLJob_);
      }

Vielleicht gibt es ja einfach ein Missverständnis? Mir scheint, dass du erwartest im Designer die Tabelle gedruckt zu sehen. Das funktioniert unter Java m.W. so nicht, dafür müsste der Druck in einen eigenen Track ausgelagert werden und der Code auf diverse Notifications reagieren.

Um die Tabelle zu füllen muss der Druckcode ausgeführt werden, ich nehme an das ist in deinem Code ein separater Aufruf hinter einem anderen Menüpunkt/Button.

Hilft das weiter? Sonst frag gerne weiter nach - wir helfen gerne.

1 Like

Dankeschön.

Ja ich möchte meine Tabelle im Designer befüllt haben. Und in gedruckter Form natürlich auch.
Ich bin in dem Gebiet L&L ein ziemlicher neuling :stuck_out_tongue:

Gibt es denn zufällig eine Beispiel Java Datei?
Dann würde ich Schritt für Schritt den Code durchgehen und versuchen zu verstehen.

Ich habe in meinem Program kein Druckcode, is gebe lediglich bis jetzt nur Variablen und Felder mit in den Designer und weiße sie zu.

Ah, das ist dann vermutlich das Problem. Die Vorschau im Designer gibt es - leider - nur in einigen Programmiersprachen. In Java m.W. nicht. Klar haben wir ein Beispiel, du müsstest es im Programmfolder unter “Beispiele\Java” finden. Alternativ auch hier auf GitHub:

Kurz zusammengefasst: im Designer siehst du “nur” das Layout, um den gefüllten Report zu sehen musst du das Layout speichern und den Druck starten. In den Samples wird das gezeigt, in diesem File ist z.B. der Design- und Druckcode für ein Etikett und eine Liste drin. Da musst du “nur” noch die Datenversorgung wie von dir benötigt dahinterhängen oder anders herum den relevanten Code aus dem Sample in deine Anwendung aufnehmen.

1 Like

Ich schaff es einfach leider nicht die Tabelle mit mehr als 1 Datensatz zu befüllen …
Der Druck bzw. die Vorschau funktioniert einwandfrei, nur bleibt die Tabelle immer mit einem Datensatz bestehen.

Hier mal mein ganzer Code, ich weiß nicht was ich falsch mache.

package llsample;
import combit.*;
import javax.swing.*;



/**
 * <p>Title: List & Label Sample</p>
 * <p>Description: List & Label Sample</p>
 * <p>Copyright: Copyright (C) combit GmbH</p>
 * <p>Company: combit GmbH</p>
 * @author combit GmbH
 * @version 28.0
 */

public class Application extends JFrame{
  boolean packFrame = false;
  //Create List & Label object
  CmbtLL28 Ll;
  int nLLJob_;
  long hWnd_;

  //Construct the application
  public Application(){}

  public boolean initializeLL()
  {
    //Create List & Label object
    Ll = new CmbtLL28();
    
    //Try to get the window handle for List & Label dialogs
    if(hWnd_ == 0)
    	hWnd_ = combit.WinHelper.getWindowHandle(this);
    

      //Ll.LlSetDebug(CmbtLL28.LL_DEBUG_CMBTLL);
      Ll.LlSetDebug(0);
    
    
    //Open List & Label job
    if (nLLJob_ <= 0)
    {
      nLLJob_ = Ll.LlJobOpen(CmbtLL28.CMBTLANG_DEFAULT);
      if (nLLJob_ == CmbtLL28.LL_ERR_BAD_JOBHANDLE)
      {
        JOptionPane.showMessageDialog(this, "Job can't be initialized!",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
      else if (nLLJob_ == CmbtLL28.LL_ERR_NO_LANG_DLL)
      {
        JOptionPane.showMessageDialog(this, "Language file not found!\nEnsure that *.lng files can be found in your LuL DLL directory.",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
    }
    return true;
  }


  //=============================================================================
  void JButtonLLPrintReport_actionPerformed()
//=============================================================================
  {
    StringBuffer bufferFilename = new StringBuffer("*.lst");
    String sTemp = "", sTemp2 = "", sBoxText = "";
    
    //Initialize the List & Label Job
    if (initializeLL() == false)
    {
      return;
    }
    
    //Select project file via file select dialog
    if (Ll.LlSelectFileDlgTitleEx(
        nLLJob_,
        hWnd_,
        "",
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename,
        0) < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    //Define variables for load check
    Ll.LlDefineVariableStart(nLLJob_);

    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringAnschrift", "Herr Max Mustermann\n Musterstraße 1\n 1234 Musterstadt");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringKdnr", "Kundennummer\n85855225");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringLeistungsDatum", "Liefer- /Leistungsdatum\n22.02.2023");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringRechnungsDatum", "Rechnungsdatum\n22.02.2023");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringRechnungsNr", "12345");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringKurztext", "Wir bedanken uns für die gute Zusammenarbeit und stellen Ihnen verinbarungsgemäß folgende Leiferungen in Rechnung");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringBankverb", "Volksbank Musterstadt\nIBAN: DE34344004333401\nBIC: GENODEG1FR1\nKto. Inh.: Max Mustermann");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringAnschrift", "Tel.: (+49) 1234/98 76 54\nFax.: (+49) 1234/98 76 54\nE-Mail: max.mustermann@mustermann.com\nWeb: www.mustermann.com");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringFirma", "Musterman Deutschland GmbH\nMüller Straße 1\n83233 Musterstadt");
    
    
    //Define the used database fields
    //Important: Normally you'd use here your database functions
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "1");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 1");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
    Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");

    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "2");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 2");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
    Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");
   

    
    //Definition of a numerical variable
    //Important: Normally you'd use here your database functions
    Ll.LlDefineFieldExt(
        nLLJob_,
        "NumericalField",
        "1",
        CmbtLL28.LL_NUMERIC,
        0);
    
    
    //Start printing
    if (Ll.LlPrintWithBoxStart(
        nLLJob_,
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename.toString(),
        CmbtLL28.LL_PRINT_EXPORT,
        CmbtLL28.LL_BOXTYPE_NORMALMETER,
        hWnd_,
        "Printing...") < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }
    
    //Predifined selections for print options dialog
    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_COPIES,
        CmbtLL28.LL_COPIES_HIDE);

    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_STARTPAGE,
        1);

    if (Ll.LlPrintOptionsDialog(
        nLLJob_,
        hWnd_,
        "Select printing options") < 0)
    {
      Ll.LlPrintEnd(nLLJob_, 0);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    StringBuffer bufferPrinter = new StringBuffer();
    StringBuffer bufferPort = new StringBuffer();
    int nRecCount = 2, nErrorValue = 0, nRecno;
    long nLastPage = 0;

    Ll.LlPrintGetPrinterInfo(
        nLLJob_,
        bufferPrinter,
        bufferPort);

    nLastPage = Ll.LlPrintGetOption(nLLJob_, CmbtLL28.LL_OPTION_LASTPAGE);
    nRecno = 1;
    
    //Do printing loop only when there is any data to be printed and no error has occurred
    while (nRecno < nRecCount &&
           (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage) &&
           (nErrorValue == 0 || nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA))
    {
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + "record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      nErrorValue = Ll.LlPrint(nLLJob_);
      while (nRecno < nRecCount && (nErrorValue == 0) &&
             (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage))
      {
        for (int i = 1; i < 10; i++)
        {
          sTemp = "Field" + i;
          if (Ll.LlPrintIsFieldUsed(nLLJob_, sTemp) < 0)
          {
            if (i == 1) {
              //Simulate a "groupable" field contents to demonstrate grouping specified at runtime in the designer
              sTemp2 = "group" + nRecno / 4;
            }
            else {
              sTemp2 = "contents of Field" + i + " record " + nRecno;
            }
            Ll.LlDefineField(nLLJob_, sTemp, sTemp2);
          }
        }
        if (Ll.LlPrintIsFieldUsed(nLLJob_, "NumericalField") < 0)
        {
          sTemp2 = String.valueOf(nRecno);
          Ll.LlDefineFieldExt(nLLJob_, "NumericalField", sTemp2,
                          CmbtLL28.LL_NUMERIC, 0);
        }
        
        //Set percentage
        sBoxText = "printing on " + bufferPrinter.toString() + " " + bufferPort.toString();
        nErrorValue = Ll.LlPrintSetBoxText(nLLJob_,
                                           sBoxText,
                                           (100 * nRecno / nRecCount));
        if (nErrorValue == CmbtLL28.LL_ERR_USER_ABORTED)
        {
          Ll.LlPrintEnd(nLLJob_, 0);
          
          //Close the List & Label job
          Ll.LlJobClose(nLLJob_);
          nLLJob_ = -1;

          return;
        }
        
        //Now print the table line
        nErrorValue = Ll.LlPrintFields(nLLJob_);

        if (nErrorValue == 0) //Everything fine, record could have been printed...
        {
          //...but probably the user defined a filter condition!
          //So before updating time dependent variables we have to check if the record really has been printed
          if (Ll.LlPrintDidMatchFilter(nLLJob_) < 0)
          {
            //Update the time dependent variable 'FixedVariable2'
            //coming after printing the list(s)
            sTemp2 = "FixedVariable2, record " + nRecno;
            Ll.LlDefineVariable(nLLJob_, "FixedVariable2", sTemp2);
          }
          
          //Now (virtually) goto next record
          nRecno++;
        }
      }
    }

    //All records have been printed, now flush the table
    //If footer doesn't fit to this page try again for the next page

    nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    while (nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA)
    {
      //Update the definitions of your page dependent variables here...
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          //Special: 'FixedVariable2' shall be a time dependent fixed variable in this example!
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + " record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      //... and then try again
      nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    }
    
    //End print job
    Ll.LlPrintEnd(nLLJob_, 0);
    
    //Close the List & Label job
    Ll.LlJobClose(nLLJob_);
    nLLJob_ = -1;
  }



  //Main method
  public static void main(String[] args) {
    // new Application();
    Application frame = new Application();
    // frame.JButtonLLDesignReport_actionPerformed();
    frame.JButtonLLPrintReport_actionPerformed();
  }
}

Vorschau - Druck

Du müsstest diese Aufrufe weiter “hinten” in der Schleife machen. Zwischen den beiden Definitionen muss immer ein LlPrintFields() mit Rückgabewertprüfung passieren. Ich hab eben mal versucht, das im Trockenschwimmdurchgang zu machen, schau mal ob das hier besser klappen würde. Beachte insbesondere die Stelle mit

		// hier sollte natürlich eigentlich sowas wie "liefere die Felder aus dem aktuellen Datenbank-Record" stehen.
		// Stark vereinfacht...

Da habe ich dran gedreht:

package llsample;
import combit.*;
import javax.swing.*;



/**
 * <p>Title: List & Label Sample</p>
 * <p>Description: List & Label Sample</p>
 * <p>Copyright: Copyright (C) combit GmbH</p>
 * <p>Company: combit GmbH</p>
 * @author combit GmbH
 * @version 28.0
 */

public class Application extends JFrame{
  boolean packFrame = false;
  //Create List & Label object
  CmbtLL28 Ll;
  int nLLJob_;
  long hWnd_;

  //Construct the application
  public Application(){}

  public boolean initializeLL()
  {
    //Create List & Label object
    Ll = new CmbtLL28();
    
    //Try to get the window handle for List & Label dialogs
    if(hWnd_ == 0)
    	hWnd_ = combit.WinHelper.getWindowHandle(this);
    

      //Ll.LlSetDebug(CmbtLL28.LL_DEBUG_CMBTLL);
      Ll.LlSetDebug(0);
    
    
    //Open List & Label job
    if (nLLJob_ <= 0)
    {
      nLLJob_ = Ll.LlJobOpen(CmbtLL28.CMBTLANG_DEFAULT);
      if (nLLJob_ == CmbtLL28.LL_ERR_BAD_JOBHANDLE)
      {
        JOptionPane.showMessageDialog(this, "Job can't be initialized!",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
      else if (nLLJob_ == CmbtLL28.LL_ERR_NO_LANG_DLL)
      {
        JOptionPane.showMessageDialog(this, "Language file not found!\nEnsure that *.lng files can be found in your LuL DLL directory.",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
    }
    return true;
  }


  //=============================================================================
  void JButtonLLPrintReport_actionPerformed()
//=============================================================================
  {
    StringBuffer bufferFilename = new StringBuffer("*.lst");
    String sTemp = "", sTemp2 = "", sBoxText = "";
    
    //Initialize the List & Label Job
    if (initializeLL() == false)
    {
      return;
    }
    
    //Select project file via file select dialog
    if (Ll.LlSelectFileDlgTitleEx(
        nLLJob_,
        hWnd_,
        "",
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename,
        0) < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    //Define variables for load check
    Ll.LlDefineVariableStart(nLLJob_);

    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringAnschrift", "Herr Max Mustermann\n Musterstraße 1\n 1234 Musterstadt");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringKdnr", "Kundennummer\n85855225");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringLeistungsDatum", "Liefer- /Leistungsdatum\n22.02.2023");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringRechnungsDatum", "Rechnungsdatum\n22.02.2023");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringRechnungsNr", "12345");
    Ll.LlDefineVariable(nLLJob_ , "KopfZeile.ymringKurztext", "Wir bedanken uns für die gute Zusammenarbeit und stellen Ihnen verinbarungsgemäß folgende Leiferungen in Rechnung");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringBankverb", "Volksbank Musterstadt\nIBAN: DE34344004333401\nBIC: GENODEG1FR1\nKto. Inh.: Max Mustermann");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringAnschrift", "Tel.: (+49) 1234/98 76 54\nFax.: (+49) 1234/98 76 54\nE-Mail: max.mustermann@mustermann.com\nWeb: www.mustermann.com");
    Ll.LlDefineVariable(nLLJob_ , "FußZeile.ymringFirma", "Musterman Deutschland GmbH\nMüller Straße 1\n83233 Musterstadt");
    
    //Definition of a numerical variable
    //Important: Normally you'd use here your database functions
    Ll.LlDefineFieldExt(
        nLLJob_,
        "NumericalField",
        "1",
        CmbtLL28.LL_NUMERIC,
        0);

	//Define the used database fields
	//Important: Normally you'd use here your database functions
	Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "1");
	Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 1");
	Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
	Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
	Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");    
    
    //Start printing
    if (Ll.LlPrintWithBoxStart(
        nLLJob_,
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename.toString(),
        CmbtLL28.LL_PRINT_EXPORT,
        CmbtLL28.LL_BOXTYPE_NORMALMETER,
        hWnd_,
        "Printing...") < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }
    
    //Predifined selections for print options dialog
    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_COPIES,
        CmbtLL28.LL_COPIES_HIDE);

    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_STARTPAGE,
        1);

    if (Ll.LlPrintOptionsDialog(
        nLLJob_,
        hWnd_,
        "Select printing options") < 0)
    {
      Ll.LlPrintEnd(nLLJob_, 0);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    StringBuffer bufferPrinter = new StringBuffer();
    StringBuffer bufferPort = new StringBuffer();
    int nRecCount = 2, nErrorValue = 0, nRecno;
    long nLastPage = 0;

    Ll.LlPrintGetPrinterInfo(
        nLLJob_,
        bufferPrinter,
        bufferPort);

    nLastPage = Ll.LlPrintGetOption(nLLJob_, CmbtLL28.LL_OPTION_LASTPAGE);
    nRecno = 1;
    
    //Do printing loop only when there is any data to be printed and no error has occurred
    while (nRecno <= nRecCount &&
           (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage) &&
           (nErrorValue == 0 || nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA))
    {
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + "record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      nErrorValue = Ll.LlPrint(nLLJob_);
      while (nRecno < nRecCount && (nErrorValue == 0) &&
             (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage))
      {
        for (int i = 1; i < 10; i++)
        {
          sTemp = "Field" + i;
          if (Ll.LlPrintIsFieldUsed(nLLJob_, sTemp) < 0)
          {
            if (i == 1) {
              //Simulate a "groupable" field contents to demonstrate grouping specified at runtime in the designer
              sTemp2 = "group" + nRecno / 4;
            }
            else {
              sTemp2 = "contents of Field" + i + " record " + nRecno;
            }
            Ll.LlDefineField(nLLJob_, sTemp, sTemp2);
          }
        }
		
		// hier sollte natürlich eigentlich sowas wie "liefere die Felder aus dem aktuellen Datenbank-Record" stehen.
		// Stark vereinfacht...
		if (nRecno == 1)
		{
			//Define the used database fields
			//Important: Normally you'd use here your database functions
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "1");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 1");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
			Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");
		}
		else
		{
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "2");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 2");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
			Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
			Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");		
		}
		
		
		
        if (Ll.LlPrintIsFieldUsed(nLLJob_, "NumericalField") < 0)
        {
          sTemp2 = String.valueOf(nRecno);
          Ll.LlDefineFieldExt(nLLJob_, "NumericalField", sTemp2,
                          CmbtLL28.LL_NUMERIC, 0);
        }
        
        //Set percentage
        sBoxText = "printing on " + bufferPrinter.toString() + " " + bufferPort.toString();
        nErrorValue = Ll.LlPrintSetBoxText(nLLJob_,
                                           sBoxText,
                                           (100 * nRecno / nRecCount));
        if (nErrorValue == CmbtLL28.LL_ERR_USER_ABORTED)
        {
          Ll.LlPrintEnd(nLLJob_, 0);
          
          //Close the List & Label job
          Ll.LlJobClose(nLLJob_);
          nLLJob_ = -1;

          return;
        }
        
        //Now print the table line
        nErrorValue = Ll.LlPrintFields(nLLJob_);

        if (nErrorValue == 0) //Everything fine, record could have been printed...
        {
          //...but probably the user defined a filter condition!
          //So before updating time dependent variables we have to check if the record really has been printed
          if (Ll.LlPrintDidMatchFilter(nLLJob_) < 0)
          {
            //Update the time dependent variable 'FixedVariable2'
            //coming after printing the list(s)
            sTemp2 = "FixedVariable2, record " + nRecno;
            Ll.LlDefineVariable(nLLJob_, "FixedVariable2", sTemp2);
          }
          
          //Now (virtually) goto next record
          nRecno++;
        }
      }
    }

    //All records have been printed, now flush the table
    //If footer doesn't fit to this page try again for the next page

    nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    while (nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA)
    {
      //Update the definitions of your page dependent variables here...
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          //Special: 'FixedVariable2' shall be a time dependent fixed variable in this example!
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + " record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      //... and then try again
      nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    }
    
    //End print job
    Ll.LlPrintEnd(nLLJob_, 0);
    
    //Close the List & Label job
    Ll.LlJobClose(nLLJob_);
    nLLJob_ = -1;
  }



  //Main method
  public static void main(String[] args) {
    // new Application();
    Application frame = new Application();
    // frame.JButtonLLDesignReport_actionPerformed();
    frame.JButtonLLPrintReport_actionPerformed();
  }
}

Danke für die Mühe nun habe ich 1500 Seiten + und immenroch 1 Datensatz in der Tabelle :slight_smile:
Btw. Die Felder und Variablen werden so in etwas aufbereitet da wir keine möglichkeit haben von unserem ERP an die Datenbank zu kommen.

Ich schau mal, ob ich das hier direkt selbst ans Fliegen bekomme - dann kann ich dir besser weiterhelfen.

1 Like

Kleine Ursache - große Wirkung. Bitte mach aus

ein

while (nRecno <= nRecCount && (nErrorValue == 0) &&

Dann klappt es. Mein Kollege hat mich eben auch darauf hingewiesen, dass wir durchaus ein Java-Sample haben, das die Echtdatenvorschau im Designer umsetzt :slight_smile:. Daneben werden darin auch relationale Datenstrukturen gezeigt (1:n-Relationen). Wenn das - ggf. auch später - ein Thema für dich ist wäre das andere Sample also der bessere Ausgangspunkt, wenn es “nur” darum geht, diesen Beleg zu PDF zu bringen solltest du mit der kleinen Änderung oben am Start sein.

1 Like

Ich danke dir vielmals :slight_smile:

Jetzt funktioniert der Druck auch einwandfrei, nur ein problem besteht noch :smiley:
Sobald ich mehr als 18 Elemente in meiner Tabelle habe wird auch nur eine Seite gedruckt, die zweite wird komischerweise ignoriert.

Wir haben testhalber mal auf 40 Records erhöht:

int nRecCount = 40, nErrorValue = 0, nRecno;

Das klappt hier:

Hast du noch mehr Informationen? Oder klappt es auch bei dir jetzt :slight_smile: ?

Leider nicht.
Es wird nur eine Seite gedruckt egal wie viele Positionen ich habe.

package llsample;
import combit.*;

import java.util.ArrayList;
import java.util.List;

import javax.swing.*;



/**
 * <p>Title: List & Label Sample</p>
 * <p>Description: List & Label Sample</p>
 * <p>Copyright: Copyright (C) combit GmbH</p>
 * <p>Company: combit GmbH</p>
 * @author combit GmbH
 * @version 28.0
 */

public class Print extends JFrame{
  boolean packFrame = false;
  //Create List & Label object
  CmbtLL28 Ll;
  int nLLJob_;
  long hWnd_;

  //Construct the application
  public Print(){}

  public boolean initializeLL()
  {
    //Create List & Label object
    Ll = new CmbtLL28();
    
    //Try to get the window handle for List & Label dialogs
    if(hWnd_ == 0)
    	hWnd_ = combit.WinHelper.getWindowHandle(this);
    

      //Ll.LlSetDebug(CmbtLL28.LL_DEBUG_CMBTLL);
      Ll.LlSetDebug(0);
    
    
    //Open List & Label job
    if (nLLJob_ <= 0)
    {
      nLLJob_ = Ll.LlJobOpen(CmbtLL28.CMBTLANG_DEFAULT);
      if (nLLJob_ == CmbtLL28.LL_ERR_BAD_JOBHANDLE)
      {
        JOptionPane.showMessageDialog(this, "Job can't be initialized!",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
      else if (nLLJob_ == CmbtLL28.LL_ERR_NO_LANG_DLL)
      {
        JOptionPane.showMessageDialog(this, "Language file not found!\nEnsure that *.lng files can be found in your LuL DLL directory.",
                                      "List & Label Sample App",
                                      JOptionPane.ERROR_MESSAGE);
        return false;
      }
    }
    return true;
  }


  //=============================================================================
  void JButtonLLPrintReport_actionPerformed(List<Rechnungsposition> rechnungspositionen)
//=============================================================================
  {
    StringBuffer bufferFilename = new StringBuffer("*.lst");
    String sTemp = "", sTemp2 = "", sBoxText = "";
    
    //Initialize the List & Label Job
    if (initializeLL() == false)
    {
      return;
    }
    
    //Select project file via file select dialog
    if (Ll.LlSelectFileDlgTitleEx(
        nLLJob_,
        hWnd_,
        "",
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename,
        0) < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    //Define variables for load check
    Ll.LlDefineVariableStart(nLLJob_);

    // Kopfzeile
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Anschrift.ymringName", "Herr Max Mustermann");
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Anschrift.ymringStrasse", "Musterstraße 1");
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Anschrift.ymringOrt", "1234 Mustertadt");
    
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Daten.ymringKdnr", "85855225");
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Daten.ymringLeistungsDatum", "22.02.2023");
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Daten.ymringRechnungsDatum", "22.02.2023");

    Ll.LlDefineVariable(nLLJob_ , "Kopf.Daten.ymringRechnungsNr", "12345");
    Ll.LlDefineVariable(nLLJob_ , "Kopf.Daten.ymringKurztext", "Wir bedanken uns für die gute Zusammenarbeit und stellen Ihnen verinbarungsgemäß folgende Leiferungen in Rechnung");
    
    // Fußzeile
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Gesetz.ymringParagraph", "Nach § 19 Abs. 1 U StG wird keine Umsatzsteuer berechnet.");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Gesetz.ymringZahlung", "Zahlung innerhalb von 14 Tagen ab Rechnungseingang ohne Abzüge an die unten angegebene Bankverbindung.");

    Ll.LlDefineVariable(nLLJob_ , "Fuß.Firma.ymringName", "Muster GmbH");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Firma.ymringStrasse", "Am Musterweg 1");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Firma.ymringOrt", "85525 Musterstadt");

    Ll.LlDefineVariable(nLLJob_ , "Fuß.Bank.ymringBank", "Volksbank Musterstadt");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Bank.ymringIBAN", "IBAN: DE34344004333401");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Bank.ymringBIC", "BIC: GENODEG1FR1");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Bank.ymringKontoInh", "Kto. Inh.: Max Mustermann");

    Ll.LlDefineVariable(nLLJob_ , "Fuß.Kontakt.ymringTele", "Tel.: (+49) 1234/98 76 54");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Kontakt.ymringFax", "Fax.: (+49) 1234/98 76 54");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Kontakt.ymringEmail", "E-Mail: max.mustermann@maschinenringe.com");
    Ll.LlDefineVariable(nLLJob_ , "Fuß.Kontakt.ymringWeb", "Web: www.mustermann.com");
      
    //Define the used database fields
    //Important: Normally you'd use here your database functions
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", "1");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", "Dienstleistung 1");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.menge", "8h");
    Ll.LlDefineField(nLLJob_,"Tabelle.Positionen.ep", "120");
    Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.gp", "960");
    
    //Definition of a numerical variable
    //Important: Normally you'd use here your database functions
    Ll.LlDefineFieldExt(
        nLLJob_,
        "NumericalField",
        "1",
        CmbtLL28.LL_NUMERIC,
        0);
  
    
    //Start printing
    if (Ll.LlPrintWithBoxStart(
        nLLJob_,
        CmbtLL28.LL_PROJECT_LIST,
        bufferFilename.toString(),
        CmbtLL28.LL_PRINT_EXPORT,
        CmbtLL28.LL_BOXTYPE_NORMALMETER,
        hWnd_,
        "Printing...") < 0)
    {
      JOptionPane.showMessageDialog(
          this,
          "Error While Printing.",
          "List & Label Sample App",
          JOptionPane.ERROR_MESSAGE);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }
    
    //Predifined selections for print options dialog
    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_COPIES,
        CmbtLL28.LL_COPIES_HIDE);

    Ll.LlPrintSetOption(
        nLLJob_,
        CmbtLL28.LL_PRNOPT_STARTPAGE,
        1);

    if (Ll.LlPrintOptionsDialog(
        nLLJob_,
        hWnd_,
        "Select printing options") < 0)
    {
      Ll.LlPrintEnd(nLLJob_, 0);
      
      //Close the List & Label job
      Ll.LlJobClose(nLLJob_);
      nLLJob_ = -1;

      return;
    }

    StringBuffer bufferPrinter = new StringBuffer();
    StringBuffer bufferPort = new StringBuffer();
    int nRecCount = 72, nErrorValue = 0, nRecno;
    long nLastPage = 0;

    Ll.LlPrintGetPrinterInfo(
        nLLJob_,
        bufferPrinter,
        bufferPort);

    nLastPage = Ll.LlPrintGetOption(nLLJob_, CmbtLL28.LL_OPTION_LASTPAGE);
    nRecno = 1;
    
    //Do printing loop only when there is any data to be printed and no error has occurred
    while (nRecno <= nRecCount &&
           (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage) &&
           (nErrorValue == 0 || nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA))
    {
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + "record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      nErrorValue = Ll.LlPrint(nLLJob_);
      while (nRecno <= nRecCount && (nErrorValue == 0) &&
             (Ll.LlPrintGetCurrentPage(nLLJob_) <= nLastPage))
      {
        for (int i = 1; i < 10; i++)
        {
          sTemp = "Field" + i;
          if (Ll.LlPrintIsFieldUsed(nLLJob_, sTemp) < 0)
          {
            if (i == 1) {
              //Simulate a "groupable" field contents to demonstrate grouping specified at runtime in the designer
              sTemp2 = "group" + nRecno / 4;
            }
            else {
              sTemp2 = "contents of Field" + i + " record " + nRecno;
            }
            Ll.LlDefineField(nLLJob_, sTemp, sTemp2);
          }
        }
		
        // print data while loop 
        int pos = 1;
        for (Rechnungsposition position : rechnungspositionen) 
        {
          Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", Integer.toString(pos));
          Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", position.getArtikelname());
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.menge",position.getMenge(),CmbtLL28.LL_NUMERIC,0);
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.ep",position.getEinzelpreis(),CmbtLL28.LL_NUMERIC,0);
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.gp",position.getGesamtpreis(),CmbtLL28.LL_NUMERIC,0);
          Ll.LlPrintFields(nLLJob_);
          pos++;
         }
         Ll.LlPrintFieldsEnd(nLLJob_);
		
		
        if (Ll.LlPrintIsFieldUsed(nLLJob_, "NumericalField") < 0)
        {
          sTemp2 = String.valueOf(nRecno);
          Ll.LlDefineFieldExt(nLLJob_, "NumericalField", sTemp2,
                          CmbtLL28.LL_NUMERIC, 0);
        }
        
        //Set percentage
        sBoxText = "printing on " + bufferPrinter.toString() + " " + bufferPort.toString();
        nErrorValue = Ll.LlPrintSetBoxText(nLLJob_,
                                           sBoxText,
                                           (100 * nRecno / nRecCount));
        if (nErrorValue == CmbtLL28.LL_ERR_USER_ABORTED)
        {
          Ll.LlPrintEnd(nLLJob_, 0);
          
          //Close the List & Label job
          Ll.LlJobClose(nLLJob_);
          nLLJob_ = -1;

          return;
        }
        
        //Now print the table line
        nErrorValue = Ll.LlPrintFields(nLLJob_);

        if (nErrorValue == 0) //Everything fine, record could have been printed...
        {
          //...but probably the user defined a filter condition!
          //So before updating time dependent variables we have to check if the record really has been printed
          if (Ll.LlPrintDidMatchFilter(nLLJob_) < 0)
          {
            //Update the time dependent variable 'FixedVariable2'
            //coming after printing the list(s)
            sTemp2 = "FixedVariable2, record " + nRecno;
            Ll.LlDefineVariable(nLLJob_, "FixedVariable2", sTemp2);
          }
          
          //Now (virtually) goto next record
          nRecno++;
        }
      }
    }

    //All records have been printed, now flush the table
    //If footer doesn't fit to this page try again for the next page

    nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    while (nErrorValue == CmbtLL28.LL_WRN_REPEAT_DATA)
    {
      //Update the definitions of your page dependent variables here...
      for (int i = 1; i < 10; i++)
      {
        if (i != 2)
        {
          //Special: 'FixedVariable2' shall be a time dependent fixed variable in this example!
          sTemp = "FixedVariable" + i;
          sTemp2 = "FixedVariable" + i + " record " + nRecno;
          Ll.LlDefineVariable(nLLJob_, sTemp, sTemp2);
        }
      }

      //... and then try again
      nErrorValue = Ll.LlPrintFieldsEnd(nLLJob_);
    }
    
    //End print job
    Ll.LlPrintEnd(nLLJob_, 0);
    
    //Close the List & Label job
    Ll.LlJobClose(nLLJob_);
    nLLJob_ = -1;
  }



  //Main method
  public static void main(String[] args) {
    Print frame = new Print();

    List<Rechnungsposition> rechnungspositionen = new ArrayList<>();
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));
    rechnungspositionen.add(new Rechnungsposition("Laptop", 1, 1500));
    rechnungspositionen.add(new Rechnungsposition("Headphones", 2, 100));
    rechnungspositionen.add(new Rechnungsposition("Mouse", 3, 25));
    rechnungspositionen.add(new Rechnungsposition("Keyboard", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Monitor", 2, 400));
    rechnungspositionen.add(new Rechnungsposition("Speaker", 1, 300));
    rechnungspositionen.add(new Rechnungsposition("Printer", 1, 150));
    rechnungspositionen.add(new Rechnungsposition("Scanner", 1, 100));
    rechnungspositionen.add(new Rechnungsposition("External Hard Drive", 1, 200));
    rechnungspositionen.add(new Rechnungsposition("Webcam", 1, 50));
    rechnungspositionen.add(new Rechnungsposition("Tablet", 2, 300));
    rechnungspositionen.add(new Rechnungsposition("Smartphone", 3, 600));

    frame.JButtonLLPrintReport_actionPerformed(rechnungspositionen);
  }
}

Du hast den Code deutlich verändert :slight_smile: - so kann es nicht mehr funktionieren, es fehlt das gesamte Umbruchshandling. Der Teil nach

// print data while loop 

Darf immer nur einen Datensatz anmelden. Und beim nächsten Schleifendurchlauf den nächsten. Dann wäre es mit der alten Logik korrekt.

Ein “quick and dirty” Fix für deinen Code wäre vermutlich:

        // print data while loop 
        int pos = 1;
        for (Rechnungsposition position : rechnungspositionen) 
        {
          Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.pos", Integer.toString(pos));
          Ll.LlDefineField(nLLJob_, "Tabelle.Positionen.bez", position.getArtikelname());
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.menge",position.getMenge(),CmbtLL28.LL_NUMERIC,0);
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.ep",position.getEinzelpreis(),CmbtLL28.LL_NUMERIC,0);
          Ll.LlDefineFieldExt(nLLJob_,"Tabelle.Positionen.gp",position.getGesamtpreis(),CmbtLL28.LL_NUMERIC,0);
          
          // correctly handle page break
          while (Ll.LlPrintFields(nLLJob_) == CmbtLL28.LL_WRN_REPEAT_DATA)
               Ll.LlPrint(nLLJob_);
          pos++;
         }
         while (Ll.LlPrintFieldsEnd(nLLJob_) == CmbtLL28.LL_WRN_REPEAT_DATA);
1 Like

Ah okey verstanden … sorry für die umstände :slight_smile:
Jetzt funktioniert alles <3

1 Like