Probleme mit Barcode Druck von HBPrint [erledigt]

Moderator: Moderatoren

Antworten
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Probleme mit Barcode Druck von HBPrint [erledigt]

Beitrag von Schorsch »

Hallo,
ich nutze die Druckerklasse von Hubert und auch die Möglichkeit Barcode EAN13 zu drucken seit einiger Zeit bisher ohne Probleme.
Für mich ziemlich unvermittelt treten jetzt ab und zu Probleme auf, bei denen es aussieht, als ob 2 Zahlen übereinander gedruckt würden.
Immer an der 4ten und letzten Stelle und ersmals ist das Problem auch aufgetreten beim drucken in Datei mit dem PDFcreator.
Barcode_Druckerfehler.docx
Barcode-Druckerfehler
(420.93 KiB) 162-mal heruntergeladen
Im Beiliegenden Dokument habe ich die 3 Beispiele dargestellt und die Code-Zeilen, mit denen ich drucke bzw den Barcode erzeuge.
Diese Probleme sind erstmals aufgetreten, als ich den Barcode von der Größe 0,82 auf 1 geändert habe.
Gruß
Schorsch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

du solltest den Quellcode posten, damit man mehr sehen kann.

local cEan12 := "2230"+cExemplar+"0"+strZero(val(cLiefSNr),6,0)

für mich sieht das nach 12 Stellen + Prüfziffer erstmal richtig aus, aber die Länge von cExemplar ist unbekannt.
Es scheint als ob zusätzliche Zeichen auf diese Stellen gedruckt werden, keine Ahnung warum.

Ich habe mit meinem Beispielprogramm deine Werte eingegeben, 100 % entspricht Faktor 1, und auf meinen Standarddrucker (eDocPrinter PDF Pro) ausgegeben. Fehlerfrei.
Xbase++ Spooled Print Job.pdf
(6.99 KiB) 170-mal heruntergeladen
In meinem Quellcode der Funktion werden auch die 3 Blocks eindeutig in einem Rutsch gedruckt, wodurch ein "überdrucken" hier nicht möglich ist:

Code: Alles auswählen

// 1. Ziffer links vor dem Block
x := aPos[1] + nBarLineDim * 4
y := aPos[2] + nBarShortLineOffset + (nBarShortLineOffset-nBarLongLineOffset)/2
GraStringAt(oPS, {x,y}, left(uEAN13_Nr,1) )

//  2. Text beginnt: linker Rand + 3 Startsequenz + 7 Linien
x := aPos[1] + nBarLineDim * (nBarLeftBlankLines+3+7)
y := aPos[2] + nStringOffset
GraStringAt(oPS, {x,y}, substr(uEAN13_Nr,2,6) )

//  3. Text beginnt: linker Rand + 3 Startsequenz + 6*7 Linien + 5 Mitte + 4
x := aPos[1] + nBarLineDim * (nBarLeftBlankLines+3+6*7+5+4)
y := aPos[2] + nStringOffset
GraStringAt(oPS, {x,y}, substr(uEAN13_Nr,8,6) )
Ich vermute daher, dass durch die Faktor Änderung der Block etwas größer wurde und mit einem anderen Text von dir zusammentrifft.
Gruß
Hubert
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

brandelh hat geschrieben: Mi, 04. Aug 2021 0:44 du solltest den Quellcode posten, damit man mehr sehen kann.

local cEan12 := "2230"+cExemplar+"0"+strZero(val(cLiefSNr),6,0)

für mich sieht das nach 12 Stellen + Prüfziffer erstmal richtig aus, aber die Länge von cExemplar ist unbekannt.
Es scheint als ob zusätzliche Zeichen auf diese Stellen gedruckt werden, keine Ahnung warum.
Halio Hubert,
erstmal Dank für die schnelle Antwort und die ersten Hinweise.
ich poste hier den anonymisierten Teil eines Lieferscheindrucks bei dem dieser beschriebene Fehler auftritt - allerdings auf dem Drucker für mich nicht reproduzierbar.
Dein Hinweis auf die Variable "cExemplar" ist wahrscheinlich bei der Fehlersuche entscheidend. Sie ist 1stellig Character und kann die Werte 1-5 annehmen. Dadurch, dass immer die 5te und die 13te Stelle des Barcode überdruckt wird ist meine Vermutung, dass der Barcode 2 mal gedruckt wird mit jeweil einer anderen(nächsten) Exemplarnummer.
Denn dieses Phänomen lässt sich bei der Druck-Vorschau (Preview) beim Druck von allen 5 Exemplaren reproduzieren- und es tritt nicht auf, wenn nur ein einzelnes Exemplar gedruckt(angezeigt) wird.
Was bei der Druck-Vorschau auch komisch ist, dass auch bei einseitigem Lieferschein (und nur ein Exemplar) eine 2te Seite angezeigt wird, auf der nur der Barcode angezeigt wird - sonst garnix.
Ich stehe vor einem ziemlichen Rätsel, da ich keine Stelle bei mir im Code finde, in dem der Barcode 2 mal gedruckt werden soll.

Code: Alles auswählen

/*  erstellt 24.1.2015 hje

   Drucken des Lieferscheins  -> HBPrint im GUI/Grafikmodus
   Spezialitaet: "Komplett" = 5 Kopien (identischer Inhalt) mit 4 Exemplaren mit
   bunten Streifen am rechten Rand und alle mit einer "Empf„ngerzeile" unter dem Logo
   Parameter: Lieferschein-Nummer   / Formular(nummer) (0=alle5,1=Kunde,2=Spedi,3=Kommi,4=Lager,5=Dispo, 7=1+2+4)

   Verwendung von HB_Print Class Spezialit„t - eigene Methode PrintInhalt definiert um denselben Liefer-
   schein 5 mal mit Formularfarbe und Exemplar-Name zu drucken.
 ----------------------------------------------------------------------
	Last change: HJE 04.08.2021 22:23:17
 */
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "xbpdev.ch"

procedure LiefWDru(cLiefersNr,nFormular)

local oHBPrinter


private n1TextZeile     := 740      && Zeile 11
private n2TextZeile     := 740      && Zeile 11
private cAusgabeTxt     :=  ""       && Zusammenbau von Textzeilen


oHBPrinter := LiefPrinter():New():create()

if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
    cls
    *N_meldung(2,"Standarddrucker ist nicht verfgbar !")

    ErrBox("Standarddrucker ist nicht verfgbar !","Druckerfehler")
   ?
   ? "Status: ",oHBPrinter:printerStatus(),"=",cPrinterStatus(oHBPrinter:printerStatus())
   ?
   wait
else
   *---------------- Fonts nur einmal erzeugen - create fonts only once ------
    #define HB_FONT_7Arial          1
    #define HB_FONT_8Arial          2
    #define HB_FONT_14Arial         3
    #define HB_FONT_10Arial         4
    #define HB_FONT_12Arial         5
    #define HB_FONT_12Arialfett     6
    #define HB_FONT_20Arial         7

   oHBPrinter:addFont("7.Arial")
   oHBPrinter:addFont("8.Arial")
   oHBPrinter:addFont("14.Arial")
   oHBPrinter:addFont("10.Arial")
   oHBPrinter:addFont("12.Arial")
   oHBPrinter:addFont({"Arial",12,.t.,.f.})
   oHBPrinter:addFont({"Arial",20,.f.,.f.})


   oHBPrinter:nDokument := nFormular   && kommt als šbergabeparameter 0-5
   oHBPrinter:acFormularTitel := { "Exemplar fr Kunde", "Exemplar fr Spedition","Exemplar fr Kommission","Exemplar fr Lager","Exemplar fr Disposition" }
   oHBPrinter:nSeiteImDokument := 1   && muss extra verwaltet werden da 5 Dokumente geduckt werden

   oHBPrinter:PrintingDialog( .t. ,;   // ESC -> close
              .t. ,;   // ALT+Enter and Enter will Print
              xbeK_ALT_P)  // ALT+P will print
endif

if select("KuStamm") > 0
   close KuStamm
endif
if select("Lieftext") > 0
   close Lieftext
endif
if select("RechPos") > 0
   close RechPos
endif
if select("ArtStamm") > 0
   close ArtStamm
endif
if select("Baustell") > 0
   close Baustell
endif

return

* Lieferscheindruckprogramm beendet


*-----------------------------------------------------------------------------------------------------



CLASS  LiefPrinter from HBPrinter

   EXPORTED:
      METHOD Print            // Alle variablen Druckausgaben werden hier definiert, wenn n”tig wird ein
                              // Seitenwechsel durchgefhrt, der Seitenz„hler erh”ht und ::PrintForm() aufgerufen.
      METHOD PrintForm        // Alle fixen Bestandteile einer Seite, egal ob unten oder oben werden hier definiert,
                              // hier wird KEIN Seitenumbruch aufgerufen, denn der k”nnte unn”tig sein (1.Seite).
                              // Never call ::NewPage() inside.
      METHOD PrintInhalt      // konstanten Inhalt der 5 Kopien der variablen Anteile von Print
      VAR nDokument           // wenn mehre (in unserem Fall maximal 5) in einem Druckjob sind, muss man sie sich merken
      VAR nFormularArt        // hier wird  in Print() "0=alle5",1="Kunde",2=Spedi,3=Kommi,4=Lager,5=Dispo"   eingetragen
                              // und  PrintForm() reagiert mit Titel und Farbe
      VAR cFormularFarbe      // als Farbwert vor dem Aufruf von PrintKopf() oder als Array wenn FormularArt als Index dient.1=weiss,2=grau,3=rot,4=gelb,5=blau
      VAR acFormularTitel     // { "Exemplar fr Kunde", "Exemplar fr Spedition","Exemplar fr Kommission","Exemplar fr Lager","Exemplar fr Disposition"]
                              // => ::FormularTitel[::FormularArt] => "Exemplar fr Kunde" bei ArrayPlatz[1]
      VAR nSeiteImDokument    // bei mehreren gleichen Exemplaren in einem Druckjob, passt der eingebaute Seitenz„hler nicht mehr, selbst verwalten !

ENDCLASS




*-------------------------------------------------------------
* die folgenden Methoden anpassen - folowing methods has to be modified
*-------------------------------------------------------------
METHOD LiefPrinter:PrintForm()        // Alle fixen Bestandteile einer Seite, egal ob unten oder oben werden hier definiert,
                                      // hier wird KEIN Seitenumbruch aufgerufen, denn der k”nnte unn”tig sein (1.Seite).
                                      // Never call ::NewPage() inside.
   local altFont, cText,cAusgabeTxt ,at_pseudo
   local nSelectMerk := 0       // um zum Kundenstamm wechseln zu k”nnen wegen Verarbeiter-Suche
   local aAttribAlt             // Array um Farbattribute zu merken


   MEMVAR n1TextZeile, n2TextZeile, cBauOrt, cBauStrasse, cBauPLZ, cBauBemerk, cAvisMobil, cBauName
   MemVar cGewichtDruck , cSpedName

   altFont := ::SetFont(HB_FONT_10Arial)

   // Kopf mit Logo  drucken kopf.jpg muss im Verzeichnis stehen
   ::PrintBmp(180,400,1800,320,"kopf.jpg")
   ::SetFont(HB_FONT_10Arial)  && ca 52 Zeilen/Seite

    do case
      case ::nSeiteImDokument = 1
           ::PrintText( 200,495, rtrim(Kustamm->Kuname)+rtrim(" "+kustamm->KuNamZu))  // Kundenname in Zeile 6
           cAusgabeTxt := dtoc(lieftext->liefdatum)  // Lieferschein-Belegdatum
           ::PrintText( 1992,544, cAusgabeTxt,"R")  // Datum auf Zeile 7 Drucken
           ::PrintText( 200,593, Kustamm->KUSTRASSE)  //  in Zeile 8
           cAusgabeTxt := "Unser Zeichen: "+ Name_lang(LiefText->PName_Kurz)  // Unser zeichen
           ::PrintText( 1992,593, cAusgabeTxt,"R")  // Unser zeichen auf Zeile 8 Drucken
           cAusgabeTxt := "eMail: "+eMail_Adr(LiefText->PName_Kurz)
           ::PrintText( 1992,642, cAusgabeTxt,"R")  // Mailadresse auf Zeile 9 Drucken
*mehrerer Printtext-Ausgaben
           if len(trim(LiefText->KuBestNr)) > 0
              ::PrintText( 200,n1TextZeile, "Kundenbestellnummer: "+LiefText->KuBestNr)  //  maximal in Zeile 16
              n1TextZeile := n1TextZeile +::LineFeed()
          endif

           n1TextZeile := n1TextZeile +::LineFeed()
           n2TextZeile := n1TextZeile
*Barcode
           ::PrintBarCodeEan13(1640,n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1)),1.0) && barcode drucken

      otherwise
           n2TextZeile := 544      && zeile 7
   endcase
   * Formularexemplar(fr wen) direkt unter Logo HB_FONT_12Arialfett
    * 1892  als rechten Rand gew„hlt um bndig mit Aussenrand Logo zu sein
   cAusgabeTxt := ::acFormularTitel[::nFormularArt]  // Welches der 5 Exemplare wird gerade gedruckt = oHBPrinter:nFormularArt
   ::SetFont(HB_FONT_12Arialfett)   && groáe Schrift

   ::PrintText( 1992,446, cAusgabeTxt,"R")  // Exemplarempf„nger auf Zeile 5 Drucken (20.4.2020 von 6 auf 5)

   ::SetFont(HB_FONT_20Arial)   && groáe Schrift

   ::PrintText(200,n2TextZeile, "LIEFERSCHEIN Nr. "+ltrim(lieftext->liefersnr) )  // Text fr alle Seiten - text for all pages

   ::SetFont(HB_FONT_10Arial)   && zurck auf Normalschrift
   ::PrintTextAlltrim := .f.  // fhrende Blanks mit drucken !
   cAusgabeTxt := "Kundennummer "+LiefText->KUNUMMER
   cText ="Hinweis: Aus versicherungstechnischen Grnden "+;
          "Verladung der Ware selbst verantwortlich!"

   ::SetFont(HB_FONT_7Arial)
   if cSpedName = "Selbstabholer"
     *rot drucken und nur wenn selbstabholer
     ::PrintMemo( 200, 2679 , cText, "L",,,GRA_CLR_RED,,2725)  // Fusszeile ab Zeile ?
   endif
   cText := "4 zeiliger text"
   ::PrintMemo( 200, 2747 , cText, "L",,,,,2936)  // Fusszeile ab Zeile 51
   //::PrintMemo( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, cHochQuer, nMaxBis,nLineFeed )

   ::SetFont(altFont)
   *GRA_CLR_BLUE        Blau
   *GRA_CLR_RED         Rot
   *GRA_CLR_YELLOW      Gelb
   *GRA_CLR_PALEGRAY    Hellgrau
   *GRA_CLR_WHITE       Weiá
    aAttribAlt := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_WHITE }} )   // Farblos als Grundeinstellung
    do case
        case ::nFormularArt = 1 && Kunde /weiss
           at_pseudo := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_WHITE }} )
        case ::nFormularArt = 2 && Spedition /grau
           at_pseudo := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_PALEGRAY }} )
        case ::nFormularArt = 3 && Kommission / rot
           at_pseudo := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_RED }} )
        case ::nFormularArt = 4 && Lager / gelb
           at_pseudo := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_YELLOW }} )
        case ::nFormularArt = 5 && Disposition / blau
           at_pseudo := ::SetAttrArea( {{ GRA_AA_COLOR, GRA_CLR_BLUE }} )
    endcase
    ::PrintBox(2030,472,50,2710,"R", GRA_FILL ) // Parameter nFill => GraBox()
    ::ReSetAttrArea( aAttribAlt )



return self

*-------------------------------------------------------------
METHOD LiefPrinter:Print()            // Alle variablen Druckausgaben werden hier definiert, wenn n”tig wird ein
                                      // Seitenwechsel durchgefhrt, der Seitenz„hler erh”ht und ::PrintForm() aufgerufen.
local i ,nPosY

   *  Versuch Seitennummer 1 nicht setzen (auf default vertrauen) (dann wird nur Seite 2 ohne 1 in Vorschau angezeigt)
   ::nPageNo := 1
   ::lFirstPageForm := .t.     // Formular 1. Seite noch nicht gedruckt - form 1. page not printed

   ::SetFont(HB_FONT_10Arial)

   if str(::nDokument,1,0) $ "12345" && Einzelformuladruck nur 1-5 zul„ssig  (nicht bei 0 und 7und 8)
      ::nFormularArt := ::nDokument   && kommt als šbergabeparameter 1-5
      ::nSeiteImDokument := ::nPageNo
      ::PrintForm()      // nur gewnschte Kopie-Nr (1-5) drucken
      ::PrintInhalt()
   endif
   if ::nDokument  = 0     && alle 5 Kopien nacheinader ausgeben
      for i = 1 to 5
          * ab 8.9.2016 Formular Druckreihenfolge 3 1 2 4 5
          * ::nFormularArt := i && 1-5 in derselben Reihenfolge(bis 8.9.16)
          do case
             case i = 1
              ::nFormularArt := 3
              nPosY := ::nFirstLine
              ::nSeiteImDokument := ::nPageNo
              *::NewPage()
              ::PrintForm()
              ::PrintInhalt()
          case i = 2
              ::nFormularArt := 1
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintForm()
              ::PrintInhalt()
          case i = 3
              ::nFormularArt := 2
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintForm()
              ::PrintInhalt()
          case i = 4
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintForm()
              ::PrintInhalt()
          case i = 5
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintForm()
              ::PrintInhalt()
          endcase
      next
  endif
return self

*-------------------------------------------------------------
* die folgenden Methoden anpassen - folowing methods has to be modified
*-------------------------------------------------------------
METHOD LiefPrinter:PrintInhalt()  // Alle variablen Inhalte pro Lieferschein - die aber konstant pro Kopie bleiben,

   local PosX, PosY
   local nAnzVollPal    := 0   && Bei Umrechnungsm”glichkeit  Anzahl volle Paletten
   local nAnzRestStueck := 0   && Bei Umrechnungsm”glichkeit  Anzahl Rest in Stck
   local nAnzLagen      := 0   && Bei Umrechnungsm”glichkeit  Anzahl komplette Lagen
   local cAusgabeTxt    := ""

   MEMVAR n1TextZeile, n2TextZeile
   MemVar cSpedName , cArbeitsort,cGewichtDruck
   
   private sum_qm := 0.00        && QM pro Lieferschein summieren
   private PosXMenge := (387+60)      && spalten merken frs drucken  rechtsbndig  (alle +60 nach rechts-29.1.15)
   private PosXMeh := (407+60)        && spalten merken frs drucken
   private PosXArtNummer := (494+60)  && spalten merken frs drucken
   private PosXArttext := (790+50)       && Abstand zu rechtem Rand ?
   private cLogDatei := ConfDat("LiefLogW.TXT")  && um bei Bedarf Zwischenwerte zu speicher mit set alternate

   PosX := 200    && linker Rand erste Printposition

   do case
      case ::nSeiteImDokument = 1
         ::nFirstLine := n1TextZeile
     otherwise
         ::nFirstLine := n2TextZeile
   endcase
   PosY := ::nFirstLine   && erst jetzt ist PosY richtig besetzt (HB)

     select RechPos
     set relation to RechPos->artnummer into artstamm
     seek LIEFTEXT->LIEFERSNR   && Positionsendatei steht auf erster Position

     do while RechPos->LIEFERSNR = LIEFTEXT->LIEFERSNR .and. .not. eof()

       if (PosY+::LineFeed(5)) >= 2748 .or. PosY < 0    // Passen 5 Zeilen(=1 Position noch hin oder ist voll (Zeile 51=2700 =Unterkante Zeile 51)
          PosY += ::LineFeed()   && Zeilenvorschub
          ::PrintText(1992, 2700 ,"Fortsetzung ->","R")  // Zeile 51
          ::nSeiteImDokument := ::nSeiteImDokument + 1
          ::NewPage()
          ::PrintForm()
          if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             exit
          endif
          PosX := 200
         *PosY := ::nFirstLine
          PosY := n2TextZeile
       endif
       ::PrintText( PosX+60, PosY ,RechPos->LIEFPOSNR,"R",60)
       ::PrintText( PosXMenge, PosY ,Transform(RechPos->LIEFMENGE,"@E 99,999.99"),"R",210)
        do case
         case RechPos->MERECH = "QM "
            ::PrintText( PosXMeh, PosY ,"mý ")
            if val(Artstamm->EloesKonto) = 10    // QM Summen ermitteln
               sum_qm := sum_qm+RechPos->liefmenge
            endif
         case RechPos->MERECH = "M  "
            ::PrintText( PosXMeh, PosY ,"m  ")

         case RechPos->MERECH = "CBM"
            ::PrintText( PosXMeh, PosY ,"CBM") // noch fr hoch 3 suchen

         case RechPos->MERECH = "ST "
            ::PrintText( PosXMeh, PosY ,"St.")

         case RechPos->MERECH = "L  "
            ::PrintText( PosXMeh, PosY ,"l  ")

         otherwise
            ::PrintText( PosXMeh, PosY ,RechPos->merech)

         endcase
         * PosXArtNummer := PosX              && beginn der Stelle fr die Artikelnummer merken wg ™norm
         ::PrintText( PosXArtNummer, PosY ,RechPos->ARTNUMMER)

         ::PrintText( PosXArttext, PosY,ArtTextZeile(1,65),"L")  && ohne L„ngenbegrenzung
         PosY += ::LineFeed()
         if rechpos->liefstueck <> 0 .and. .not. rtrim(ARTSTAMM->MERECH) $ 'ST,SET'
            ::PrintText( PosXMenge, PosY ,Transform(RechPos->liefstueck,"@E 999,999"),"R",210)
            ::PrintText( PosXMeh, PosY ,"St.")
         endif

         if len(trim(ArtTextZeile(2,65))) > 0
            ::PrintText( PosXArttext, PosY ,ArtTextZeile(2,65))
            if len(trim(ArtTextZeile(3,65))) > 0
               PosY += ::LineFeed()
               ::PrintText( PosXArttext, PosY ,ArtTextZeile(3,65))
            endif
            if len(trim(ArtTextZeile(4,65))) > 0
               PosY += ::LineFeed()
               ::PrintText( PosXArttext, PosY ,ArtTextZeile(4,65))
            endif
          endif
          if rechpos->Liefstueck <> 0
             cAusgabeTxt := ""        && Text leeren, denn falls Umrechnung nicht m”glich wird sonst der letzte Text ausgegeben
             if artstamm->STPROPAL > 0
                nAnzVollPal    := int(rechpos->Liefstueck / Artstamm->StProPal)
                nAnzRestStueck := rechpos->Liefstueck % artstamm->StProPal
                cAusgabeTxt := "kompl ="+ltrim(str(nAnzVollPal,3,0))
                if artstamm->STPROLAGE > 0
                   if nAnzRestStueck <> 0
                      nAnzLagen      := int(nAnzRestStueck / artstamm->StProLage)
                      nAnzRestStueck := nAnzRestStueck % artstamm->StProLage
                      if nAnzLagen <> 0
                         cAusgabeTxt := cAusgabeTxt + " Lagen ="+ltrim(str(nAnzLagen,3,0))
                      endif
                   endif
                   if nAnzRestStueck <> 0
                        cAusgabeTxt := cAusgabeTxt +  " lose Stck ="+ltrim(str(nAnzRestStueck,3,0))
                   endif
                endif
             endif
             if len(trim(ArtTextZeile(2,65))) > 0  && Neu Zeile nur wenn 2te Artikeltextzeile vorhanden
                PosY += ::LineFeed()            && sonst in dieselbe Zeile drucken wie "Stckzahl"
             endif
             ::PrintText( PosXArttext, PosY ,cAusgabeTxt)
          endif
          if len(trim(Artstamm->OeNorm)) > 0
             PosY += ::LineFeed()
             ::PrintText(PosXArtNummer, PosY ,"™Norm/DIN")
             ::PrintText(PosXArttext, PosY ,ARTSTAMM->oenorm)
          endif

         skip+1
         PosY += ::LineFeed()   && Zeilenvorschub
         PosX := 200            && Startwert linker Rand
     enddo
    if sum_qm > 0                     // Summe QM pro LiefText speichern
       select LiefText
       reclock(30)
       LiefText->LIEFSUQM := sum_qm
       dbcommit()
       dbunlock()
    endif
    if (PosY+::LineFeed(10)) >= 2728 .or. PosY < 0    // Passen 9 Zeilen noch hin oder ist voll (Zeile 59=2727 =Unterkante Zeile 59)
          PosY += ::LineFeed()   && Zeilenvorschub
          ::PrintText(PosXArtNummer, PosY ,"F O R T S E T Z U N G -->")
          ::nSeiteImDokument := ::nSeiteImDokument + 1
          ::NewPage()
          ::PrintForm()
          PosX := 200
          PosY := n2TextZeile
    endif

    PosX := 200 && linken Rand wieder auf 200 setzen
    PosY += ::LineFeed(2)   && Zeilenvorschub  2 zeilen(damit 1 Leerzeile ensteht)

    //  ---  Einmalige Lieferschein Fusstexte

   if cSpedName = "Selbstabholer"
      if (PosY+::LineFeed(12)) >= 2749 .or. PosY < 0    // Passen 9 Zeilen noch hin oder ist voll Zeile 51 endet bei 2748
         PosX := 230
         PosY += ::LineFeed()   && Zeilenvorschub
         ::PrintText(PosXArtNummer, PosY ,"F o r t s e t z u n g-->")
         ::nSeiteImDokument := ::nSeiteImDokument + 1
         ::NewPage()
         ::PrintForm()
         PosY := n2TextZeile
      endif
      ::PrintText(PosX, PosY , "Transport .")
      if kustamm->KULAND <> "DE"
          PosY += ::LineFeed(1)   && Zeilenvorschub
         ::PrintText(PosX, PosY ,"Auslieferung ")
      endif
   else
         ::PrintText(PosX, PosY , "Gefahren durch: "+trim(substr(cSpedName,1,30))+"   Rckgabe.")
   endif
   if cGewichtDruck = "J"
      PosY += ::LineFeed(1)   && Zeilenvorschub
      ::PrintText(PosX, PosY , "Objekt Nr:" + str(LiefText->LiefGewi,8,0))
      ::PrintText(PosXArttext, PosY ,"Abgeladen")
   endif            // if cGewichtDruck = "J"

   PosY += ::LineFeed(2)   && Zeilenvorschub
   ::PrintText(PosX, PosY , "_____________________________")

    if cArbeitsort = "DS"

      if (PosY+::LineFeed(9)) >= 2749 .or. PosY < 0    // Passen 9 Zeilen noch hin oder ist voll Zeile 51 endet bei 2748
         PosX := 230
         PosY += ::LineFeed()   && Zeilenvorschub
         ::PrintText(PosXArtNummer, PosY ,"F o r t s e t z u n g-->")
         ::nSeiteImDokument := ::nSeiteImDokument + 1
         ::NewPage()
         ::PrintForm()
         PosY := n2TextZeile
      endif
      PosY += ::LineFeed(2)   && Zeilenvorschub
      ::SetFont(HB_FONT_12Arialfett)
      ::PrintText(PosX, PosY ,">>  Qualit„t ")
      ::SetFont(HB_FONT_10Arial)
       PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   KG")
      PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   Lager")
      PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   An ")
      PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   7")
       PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   T")
       PosY += ::LineFeed()   && Zeilenvorschub
      ::PrintText(PosX, PosY ,"   F")
    endif

return self
*---------------------------------------------------------------------------------------
/*
        Name : Make_LS_EAN13(Lieftext->Liefersnr,cExemplar)
        Does : generiert aus der Lieferscheinnummer und dem Exemplar einen 13stelligen EANCode

  Parameters : Lieferscheinnummer(mit fhrenden 0) und Exemplar beide caracter
     Returns : EAN-Code fr das jeweilie Lieferscheinexemplar
       Notes : Konzeptionell setzt sich der EAN fr Lieferscheine folgendermassen zusammen:
               - Stelle 1 = "2"         ->Festlegung fr "private" EAN13-Numern
               - Stelle 2-4 = "230"      ->Dokumentenschlssel
               - Stelle 5 = "1"-"5"     ->fr die Subkategorie der Lieferscheine
               - Stelle 6 = "0"         ->aktuell nicht benutzt
               - Stelle 7-12 = 6-stellige Lieferscheinnummer mit fhrender 0
               - Stelle 13 ="?"         ->Werte 0-9 ist die Prfziffer fr EAN13


      Author : hje
Date Created : 17.04.2021
Time Created : 19:17
*/
FUNCTION Make_LS_EAN13(cLiefSNr,cExemplar)
local cEan13Nr := ""
local cEan12 := "2230"+cExemplar+"0"+strZero(val(cLiefSNr),6,0)
* Zusammensetzen
cEan13Nr := cEan12+GraBarcodeEAN13_CalcCheckDigit(cEan12)

RETURN (cEan13Nr)
*---------------------------------------------------------------------------------------

* eof LiefWDru
Gruß
Schorsch
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo Hubert,
ich habe mit dem oben gezeigten Lieferscheindruckprogramm jetzt einige Stunden getestet.
Als erstes habe ich die 5 erzeugten Barcodes an unterschiedliche Stellen im jeweiligen Dokument plaziert (nebeneinander).
Dadruch habe ich folgendes festgestellt:
Vorausschicken muss ich, das ich immer deinen HBDialog verwende
1. Beim direkten Drucken des Gesamtpaketes (alle 5 Exemplare) ist kein Fehler feststellbar.Auf jeder Seite wird der richtige Barcode an der vorgesehenen Stelle gedruckt.
2. Bei der Vorschau-Anzeige des Gesamtpaketes werden auf allen Seiten alle 5 Barcodes angezeigt plus einer 6ten Seite, auf der nur die 5 Barcodes ohne sonstigen Text angezeigt werden.
3. Beim Drucken der 6ten Seite wärend dem Vorschau-Anzeigen wird auch auf dem Drucker die gewünschte Seite mit allen 5 Barcodes gedruckt.
Ich vermute deshalb einen Zusammenhang zwischen Vorschau-Aufbereitung und Barcode-Ausgabe. Es erscheint so, als ob die Barcode-Ausgabe "stehen bleibt" für alle Seiten und dies dann unter diesen Umständen auch beim Drucken fortsetzt/beibehält.

Ich muss zugeben, dass ich deine Klassen(HBPrint Version 1.41 + HB_XPP_Barcode_EAN13 1.0 2003-05-16) nur benutze und nicht wirklich analysieren kann, deshalb meine BItte um Erläuterung, ob ich dies nur falsch benutze oder wirklich ein Fehler vorliegt.
Danke
Gruß
Schorsch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

Ich sehe bei dir teilweise private oder public Variablen, gemischt mit local und Member Variablen.
Ich nutze nie private !
Weiterhin wird im Dokument oft eine direkte 1/10mm Angabe geschrieben, das ist mit der Zeit unübersichtlich.

Entweder es sind fixe Werte, dann setze ich #define ein oder ich erweitere (wie du teilweise auch) die Class um exported Membervars.

Code: Alles auswählen

CLASS  LiefPrinter from HBPrinter

   EXPORTED:
      METHOD Print            // Alle variablen Druckausgaben werden hier definiert, wenn nötig wird ein
                              // Seitenwechsel durchgefhrt, der Seitenzähler erhäht und ::PrintForm() aufgerufen.
      METHOD PrintForm        // Alle fixen Bestandteile einer Seite, egal ob unten oder oben werden hier definiert,
                              // hier wird KEIN Seitenumbruch aufgerufen, denn der könnte unnötig sein (1.Seite).
                              // Never call ::NewPage() inside.
      METHOD PrintInhalt      // konstanten Inhalt der 5 Kopien der variablen Anteile von Print
      VAR nDokument           // wenn mehre (in unserem Fall maximal 5) in einem Druckjob sind, muss man sie sich merken
      VAR nFormularArt        // hier wird  in Print() "0=alle5",1="Kunde",2=Spedi,3=Kommi,4=Lager,5=Dispo"   eingetragen
                              // und  PrintForm() reagiert mit Titel und Farbe
      VAR cFormularFarbe      // als Farbwert vor dem Aufruf von PrintKopf() oder als Array wenn FormularArt als Index dient.1=weiss,2=grau,3=rot,4=gelb,5=blau
      VAR acFormularTitel     // { "Exemplar fr Kunde", "Exemplar fr Spedition","Exemplar fr Kommission","Exemplar fr Lager","Exemplar fr Disposition"]
                              // => ::FormularTitel[::FormularArt] => "Exemplar fr Kunde" bei ArrayPlatz[1]
      VAR nSeiteImDokument    // bei mehreren gleichen Exemplaren in einem Druckjob, passt der eingebaute Seitenz„hler nicht mehr, selbst verwalten !
Meine Druckvorschau biegt einfach die Presentationspace von einem Drucker auf das Static des Fensters und danach zurück.
Beim Drucken wird alles neu ausgegeben, somit dürfte es keine Wechselwirkungen geben, aber die Private könnten da irgendwie noch anders besetzt sein !

Was ich sicher sagen kann ist, dass wenn wirklich 2 Barcodes mit unterschiedlichen EAN Nummern übereinander gedruckt werden würden, dann müssten die Linien der Barcodes sich von den anderen ausdrucken unterscheiden, denn die Linien des Barcodes sind ja die codierte Nummer. Die 6. Seite sollte nur dann einen Inhalt anzeigen, wenn PRINT auch diese ausgibt.

Wenn die Linien der Barcodes nicht unterschiedlich sind, muss der eine unterschiedliche Buchstabe von einer andern Druckausgabe kommen, ich weiß jetzt nicht welche 1/10 mm Angabe diese Zeile des Barcodes hat, aber mit Messen und nachsehen sollte man das finden.

Meine Klassen drucken nicht von sich aus Inhalte doppelt, würden sie das tun, müsste das immer vorkommen.

Eine Wechselwirkung mit private vars kann ich aber auch nicht ausschließen, daher verwende ich diese nicht.

Beispiel für meine #defines:

#define nLogoX 200
#define nLogoY 2700 // ausgerechnet aus Seitenhöhe-Bildhöhe ...
#define nAdressY ....
#define nLinkerRand 250

der Nachteil von #defines ist, dass diese nicht im Programm dynamisch berechnet werden können (z.B. Oberer Rand - tatsächliche Bildhöhe des Logos)

daher bin ich großzügig mit member vars für solche Angaben.

Egal wie man es macht, wenn man so alle fixen Punkte an einer Stelle definiert hat, fällt einem leichter auf, dass sich da was überschneiden könnte.
Die dynamischen Zeilen z.B. durch größere Elemente in einen fixen Druckbereich rutschen.

Mehr ist anhand dessen was ich sehe nicht zu sagen, wenn du das in eine eigene PRG auslagern kannst mit cmd die es compiliert, kann ich mir das Verhalten mal genauer ansehen.

Im einfachen TEST.PRG sieht man, wie die Vorschau auf tatsächliche Seiten begrenzt wird, das beschleunigt die Vorschau-Ausgabe:

Code: Alles auswählen

          if ::IsAfterLastPage()                  // Ist Shortcut möglich ? (spart Zeit, wichtig für Vorschau !)
             exit                                 // is shortcut possible ? (saves time. Preview needs this ! )
          endif
Gruß
Hubert
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo Hubert,
aufgrund deiner Hinweise habe ich folgendes im beiligende Code geändert:
1. keine public-Variablen mehr verwendet
2. den Barcode für jedes Exemplar an eine andere Stelle auf derselben Zeile gedruckt
3. in die Schleife(n) die, von Dir vorgeschlagenen 3 Zeilen eingebaut
if ::IsAfterLastPage() // Ist Shortcut möglich ? (spart Zeit, wichtig für Vorschau !)
exit // is shortcut possible ? (saves time. Preview needs this ! )
endif
4. alle möglichen Druckzeilen auf ein Minimum reduziert, so dass auf keinen Fall ein "Überdrucken" der Barcodes vorkommt

Mit diesem Rumpf-Code habe ich nun die 5 Exemplare des Lieferscheins angezeigt und gedruckt und im Druckdialog (bei Anzeige aller 5 Exemplare) die Seite 2 extra gedruckt.
Die Ergebnisse habe ich als PDF-Files beigelegt.
Das Drucken eines kompletten Exemplar-Satzes funktioniert ohne Problem - jeder Barcode des zugehörigen Exemplars wird an seinem Platz gedruckt.

Bei der Druck-Vorschau wird nicht auf jeder Seite nur ein Barcode augegeben, so wie beim korrekten Druckoutput, und wenn nur eine Seite ausgewählt wird zum Drucken, ist auch mehr als 1 Barcode drauf .
Mir erscheint es so, als ob es zwischen Druckvorschau oder Einzelseitendruck und Barcode-Ausgabe eine Konflikt gibt, den ich nicht beeinflussen kann.

Noch zu deinem Hinweis:
Was ich sicher sagen kann ist, dass wenn wirklich 2 Barcodes mit unterschiedlichen EAN Nummern übereinander gedruckt werden würden, dann müssten die Linien der Barcodes sich von den anderen ausdrucken unterscheiden, denn die Linien des Barcodes sind ja die codierte Nummer.
Bei meinem ersten Beispiel(Barcode_Druckerfehler.docx) sieht man deutlich, dass die Linien über der Exemplarnummer und der Prüfziffer unterschiedlich sind was für mich der Hinweis war, dass die Barcodes übereinandergerdruckt wurden, denn alle andern Ziffern/Linien waren ja identisch und korrekt.

Da ich offensichtlich keine 3 PDF Dateien anhängen kann, hänge ich an eine weiter Anwort die korrekte Druckausgabe.

Vielen Dank für die Hilfe beim Fehlersuchen.

Code: Alles auswählen

/*  erstellt 24.1.2015 hje

   Drucken des Lieferscheins aus Vorlage RechWDru -> HBPrint im GUI/Grafikmodus
   Spezialitaet: "Komplett" = 5 Kopien (identischer Inhalt) mit 4 Exemplaren mit
   bunten Streifen am rechten Rand und alle mit einer "Empf„ngerzeile" unter dem Logo
   Parameter: Lieferschein-Nummer   / Formular(nummer) (0=alle5,1=Kunde,2=Spedi,3=Kommi,4=Lager,5=Dispo, 7=1+2+4)

   Verwendung von HB_Print Class Spezialit„t - eigene Methode PrintInhalt definiert um denselben Liefer-
   schein 5 mal mit Formularfarbe und Exemplar fr,,, zu drucken.
 ----------------------------------------------------------------------
	Last change: HJE 11.08.2021 18:13:21
 */
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "xbpdev.ch"

procedure LiefWDru(cLiefersNr,nFormular)

local oHBPrinter



oHBPrinter := LiefPrinter():New():create()

oHBPrinter:n1TextZeile     := 740      && Zeile 11
oHBPrinter:n2TextZeile     := 740      && Zeile 11

if oHBPrinter:IsPrinterError()             // Fehler verhindern, avoid errors
    cls
    *N_meldung(2,"Standarddrucker ist nicht verfgbar !")

    ErrBox("Standarddrucker ist nicht verfgbar !","Druckerfehler")
   ?
   ? "Status: ",oHBPrinter:printerStatus(),"=",cPrinterStatus(oHBPrinter:printerStatus())
   ?
   wait
else
   *---------------- Fonts nur einmal erzeugen - create fonts only once ------
    #define HB_FONT_7Arial          1
    #define HB_FONT_8Arial          2
    #define HB_FONT_14Arial         3
    #define HB_FONT_10Arial         4
    #define HB_FONT_12Arial         5
    #define HB_FONT_12Arialfett     6
    #define HB_FONT_20Arial         7

   oHBPrinter:addFont("7.Arial")
   oHBPrinter:addFont("8.Arial")
   oHBPrinter:addFont("14.Arial")
   oHBPrinter:addFont("10.Arial")
   oHBPrinter:addFont("12.Arial")
   oHBPrinter:addFont({"Arial",12,.t.,.f.})
   oHBPrinter:addFont({"Arial",20,.f.,.f.})


   oHBPrinter:nDokument := nFormular   && kommt als šbergabeparameter 0-5
   oHBPrinter:acFormularTitel := { "Exemplar fr Kunde", "Exemplar fr Spedition","Exemplar fr Kommission","Exemplar fr Lager","Exemplar fr Disposition" }
   oHBPrinter:nSeiteImDokument := 1   && muss extra verwaltet werden da 5 Dokumente geduckt werden

   oHBPrinter:PrintingDialog( .t. ,;   // ESC -> close
              .t. ,;   // ALT+Enter and Enter will Print
              xbeK_ALT_P)  // ALT+P will print
endif

if select("Lieftext") > 0
   close Lieftext
endif
if select("RechPos") > 0
   close RechPos
endif
if select("ArtStamm") > 0
   close ArtStamm
endif

return

* Lieferscheindruckprogramm beendet


*-----------------------------------------------------------------------------------------------------



CLASS  LiefPrinter from HBPrinter

   EXPORTED:
      METHOD Print            // Alle variablen Druckausgaben werden hier definiert, wenn n”tig wird ein
                              // Seitenwechsel durchgefhrt, der Seitenz„hler erh”ht und ::PrintForm() aufgerufen.
      METHOD PrintForm        // Alle fixen Bestandteile einer Seite, egal ob unten oder oben werden hier definiert,
                              // hier wird KEIN Seitenumbruch aufgerufen, denn der k”nnte unn”tig sein (1.Seite).
                              // Never call ::NewPage() inside.
      METHOD PrintInhalt      // konstanten Inhalt der 5 Kopien der variablen Anteile von Print
      VAR nDokument           // wenn mehre (in unserem Fall maximal 5) in einem Druckjob sind, muss man sie sich merken
      VAR nFormularArt        // hier wird  in Print() "0=alle5",1="Kunde",2=Spedi,3=Kommi,4=Lager,5=Dispo"   eingetragen
                              // und  PrintForm() reagiert mit Titel und Farbe
      VAR cFormularFarbe      // als Farbwert vor dem Aufruf von PrintKopf() oder als Array wenn FormularArt als Index dient.1=weiss,2=grau,3=rot,4=gelb,5=blau
      VAR acFormularTitel     // { "Exemplar fr Kunde", "Exemplar fr Spedition","Exemplar fr Kommission","Exemplar fr Lager","Exemplar fr Disposition"]
                              // => ::FormularTitel[::FormularArt] => "Exemplar fr Kunde" bei ArrayPlatz[1]
      VAR nSeiteImDokument    // bei mehreren gleichen Exemplaren in einem Druckjob, passt der eingebaute Seitenz„hler nicht mehr, selbst verwalten !
VAR  n1TextZeile         && StartzeileZeile
VAR  n2TextZeile         && StartzeileZeile

ENDCLASS




*-------------------------------------------------------------
* die folgenden Methoden anpassen - folowing methods has to be modified
*-------------------------------------------------------------
METHOD LiefPrinter:PrintForm()        // Alle fixen Bestandteile einer Seite, egal ob unten oder oben werden hier definiert,
                                      // hier wird KEIN Seitenumbruch aufgerufen, denn der k”nnte unn”tig sein (1.Seite).
                                      // Never call ::NewPage() inside.
   local altFont, cText,cAusgabeTxt ,at_pseudo
   local nSelectMerk := 0       // um zum Kundenstamm wechseln zu k”nnen wegen Verarbeiter-Suche
   local aAttribAlt             // Array um Farbattribute zu merken
   local nFormularNrMerk := 0
   local nSpalte := 1640


   altFont := ::SetFont(HB_FONT_10Arial)

   ::SetFont(HB_FONT_10Arial)  && ca 52 Zeilen/Seite

    do case
      case ::nSeiteImDokument = 1
          * zur Kontrolle
          ::PrintText( 1992,446+::LineFeed(), ",str(::nFormularArt,1): "+str(::nFormularArt,1),"R")  // Exemplar/Formular
           cAusgabeTxt := "Unser Zeichen: " // Unser zeichen
           ::PrintText( 1992,593, cAusgabeTxt,"R")  // Unser zeichen auf Zeile 8 Drucken
           ::n1TextZeile := 787  && Zeile 12
*mehrerer Printtext-Ausgaben

           ::n1TextZeile := ::n1TextZeile +::LineFeed(2)  && um Abstand herzustellen
           ::n2TextZeile := ::n1TextZeile
*Barcode   jetzt alle nebeneinander /nich an derselben Steee drucken/ausgeben
           do case
               case ::nFormularArt = 1
                    ::PrintBarCodeEan13(nSpalte,::n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1))) && barcode drucken
               case ::nFormularArt = 2
                   nSpalte := nSpalte- 360
                   ::PrintBarCodeEan13(nSpalte,::n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1))) && barcode drucken
               case ::nFormularArt = 3
                   nSpalte := nSpalte- 720
                   ::PrintBarCodeEan13(nSpalte,::n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1))) && barcode drucken
               case ::nFormularArt = 4
                   nSpalte := nSpalte- 1080
                   ::PrintBarCodeEan13(nSpalte,::n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1))) && barcode drucken
               case ::nFormularArt = 5
                   nSpalte := nSpalte- 1440
                   ::PrintBarCodeEan13(nSpalte,::n2TextZeile+20,make_LS_EAN13(lieftext->liefersnr,str(::nFormularArt,1))) && barcode drucken
           otherwise
           endcase


      otherwise
           ::n2TextZeile := 544      && zeile 7
   endcase
   * Formularexemplar(fr wen) direkt unter Logo HB_FONT_12Arialfett
    * 1892  als rechten Rand gew„hlt um bndig mit Aussenrand Logo zu sein
   cAusgabeTxt := ::acFormularTitel[::nFormularArt]  // Welches der 5 Exemplare wird gerade gedruckt = oHBPrinter:nFormularArt
   ::SetFont(HB_FONT_12Arialfett)   && groáe Schrift

   ::PrintText( 1992,446, cAusgabeTxt,"R")  // Exemplarempf„nger auf Zeile 5 Drucken (20.4.2020 von 6 auf 5)

   ::n2TextZeile := ::n2TextZeile + ::LineFeed(2)     && 1 Zeilen

   ::SetFont(HB_FONT_20Arial)   && groáe Schrift

   ::PrintText(200,::n2TextZeile, "LIEFERSCHEIN Nr. "+ltrim(lieftext->liefersnr) )  // Text fr alle Seiten - text for all pages

   ::SetFont(HB_FONT_10Arial)   && zurck auf Normalschrift
   ::PrintTextAlltrim := .t.  // fhrende Blanks NICHT mit drucken !

   ::n2TextZeile := ::n2TextZeile + ::LineFeed()     && 1 Zeilen

   ::n1TextZeile := ::n2TextZeile

   ::SetFont(HB_FONT_7Arial)
   cText := "4 zeiliger text"
   ::PrintMemo( 200, 2747 , cText, "L",,,,,2936)  // Fusszeile ab Zeile 51
   //::PrintMemo( nPosX, nPosY, cTxt, cAusrichtung, nMaxLen, cArt, nFarbe, cHochQuer, nMaxBis,nLineFeed )

   ::SetFont(altFont)



return self

*-------------------------------------------------------------
METHOD LiefPrinter:Print()            // Alle variablen Druckausgaben werden hier definiert, wenn n”tig wird ein
                                      // Seitenwechsel durchgefhrt, der Seitenz„hler erh”ht und ::PrintForm() aufgerufen.
local nPosY, i
   *  Versuch Seitennummer 1 nicht setzen (auf default vertrauen) (dann wird nur Seite 2 ohne 1 in Vorschau angezeigt)
   ::nPageNo := 1
   ::lFirstPageForm := .f.     // Formular 1. Seite noch nicht gedruckt - form 1. page not printed

   ::SetFont(HB_FONT_10Arial)

   if str(::nDokument,1,0) $ "12345" && Einzelformuladruck nur 1-5 zul„ssig  (nicht bei 0 und 7und 8)
                                     // nur gewnschtes Exemplar-Nr (1-5) drucken
      ::nFormularArt := ::nDokument   && kommt als šbergabeparameter 1-5
      ::nSeiteImDokument := ::nPageNo
      ::PrintInhalt()
   endif
   if ::nDokument  = 0     && alle 5 Exempare nacheinader ausgeben
      for i = 1 to 5
                       *  Formular Druckreihenfolge 3 1 2 4 5
                       * ::nFormularArt := i
          do case
             case i = 1
              ::nFormularArt := 3
              nPosY := ::nFirstLine
              ::nSeiteImDokument := ::nPageNo
              *::NewPage()
              ::PrintInhalt()
          case i = 2
              ::nFormularArt := 1
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 3
              ::nFormularArt := 2
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 4
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 5
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          endcase
          if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             exit
          endif
      
      next
  endif
   if ::nDokument  = 7     && nur FormularArt  1 + 2 + 4  ausgeben
      for i = 1 to 3
          do case
             case i = 1
              ::nFormularArt := i
              nPosY := ::nFirstLine
              ::nSeiteImDokument := ::nPageNo
              *::NewPage()
              ::PrintInhalt()
          case i = 2
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 3
              ::nFormularArt := 4
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          endcase
          if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             exit
          endif
      next
  endif
   if ::nDokument  = 8     && nur Formular  1 + 2 + 4 +5  ausgeben (18.7.17 eingefhrt)
      for i = 1 to 4
          do case
             case i = 1
              ::nFormularArt := i
              nPosY := ::nFirstLine
              ::nSeiteImDokument := ::nPageNo
              *::NewPage()
              ::PrintInhalt()
          case i = 2
              ::nFormularArt := i
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 3
              ::nFormularArt := 4
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          case i = 4
              ::nFormularArt := 5
              ::nSeiteImDokument := 1
              ::NewPage()
              ::PrintInhalt()
          endcase
          if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             exit
          endif
      next
  endif
return self

*-------------------------------------------------------------
* die folgenden Methoden anpassen - folowing methods has to be modified
*-------------------------------------------------------------
METHOD LiefPrinter:PrintInhalt()  // Alle variablen Inhalte pro Lieferschein - die aber konstant pro Kopie bleiben,

   local PosX, PosY
   local cAusgabeTxt    := ""
   local PosXMenge := (387+60)      && spalten merken frs drucken  rechtsbndig  (alle +60 nach rechts-29.1.15)
   local PosXMeh := (407+60)        && spalten merken frs drucken



   ::PrintForm()

   PosX := 200    && linker Rand erste Printposition

   do case
      case ::nSeiteImDokument = 1
         ::nFirstLine := ::n1TextZeile
     otherwise
         ::nFirstLine := ::n2TextZeile
   endcase
   PosY := ::nFirstLine   && erst jetzt ist PosY richtig besetzt (HB)

     select RechPos
     set relation to RechPos->artnummer into artstamm
     seek LIEFTEXT->LIEFERSNR   && Positionsendatei steht auf erster Position

     do while RechPos->LIEFERSNR = LIEFTEXT->LIEFERSNR .and. .not. eof()

       if (PosY+::LineFeed(5)) >= 2748 .or. PosY < 0    // Passen 5 Zeilen(=1 Position noch hin oder ist voll (Zeile 51=2700 =Unterkante Zeile 51)
          PosY += ::LineFeed()   && Zeilenvorschub
          ::PrintText(1992, 2700 ,"Fortsetzung ->","R")  // Zeile 51
          ::nSeiteImDokument := ::nSeiteImDokument + 1
          ::NewPage()
          ::PrintForm()
          if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
             exit
          endif
          PosX := 200
          PosY := ::n2TextZeile
       endif
       ::PrintText( PosX+60, PosY ,RechPos->LIEFPOSNR,"R",60)
       ::PrintText( PosXMenge, PosY ,Transform(RechPos->LIEFMENGE,"@E 99,999.99"),"R",210)
        do case
         case RechPos->MERECH = "QM "
            ::PrintText( PosXMeh, PosY ,"mý ")
         case RechPos->MERECH = "M  "
            ::PrintText( PosXMeh, PosY ,"m  ")

         case RechPos->MERECH = "CBM"
            ::PrintText( PosXMeh, PosY ,"CBM") // noch fr hoch 3 suchen

         case RechPos->MERECH = "ST "
            ::PrintText( PosXMeh, PosY ,"St.")

         case RechPos->MERECH = "L  "
            ::PrintText( PosXMeh, PosY ,"l  ")

         otherwise
            ::PrintText( PosXMeh, PosY ,RechPos->merech)

         endcase
             ::PrintText(PosXMeh+100, PosY ,"™Norm/DIN")

         skip+1
         PosY += ::LineFeed()   && Zeilenvorschub
         PosX := 200            && Startwert linker Rand

         if ::IsAfterLastPage()  // Ist Shortcut m”glich ? (spart Zeit, wichtig fr Vorschau !)
            exit
         endif
     enddo
    if (PosY+::LineFeed(10)) >= 2728 .or. PosY < 0    // Passen 9 Zeilen noch hin oder ist voll (Zeile 59=2727 =Unterkante Zeile 59)
          PosY += ::LineFeed()   && Zeilenvorschub
          ::PrintText(PosXArtNummer, PosY ,"F O R T S E T Z U N G -->")
          ::nSeiteImDokument := ::nSeiteImDokument + 1
          ::NewPage()
          ::PrintForm()
          PosX := 200
          PosY := ::n2TextZeile
    endif

    PosX := 200 && linken Rand wieder auf 200 setzen
    PosY += ::LineFeed(2)   && Zeilenvorschub  2 zeilen(damit 1 Leerzeile ensteht)

    //  ---  Einmalige Lieferschein Fusstexte

      ::PrintText(PosX, PosY , "Transport .")

   PosY += ::LineFeed(2)   && Zeilenvorschub
   ::PrintText(PosX, PosY , "_____________________________")


return self
*---------------------------------------------------------------------------------------
/*
        Name : Make_LS_EAN13(Lieftext->Liefersnr,cExemplar)
        Does : generiert aus der Lieferscheinnummer und dem Exemplar einen 13stelligen EANCode

  Parameters : Lieferscheinnummer(mit fhrenden 0) und Exemplar beide caracter
     Returns : EAN-Code fr das jeweilie Lieferscheinexemplar
       Notes : Konzeptionell setzt sich der EAN fr Lieferscheine folgendermassen zusammen:
               - Stelle 1 = "2"         ->Festlegung fr "private" EAN13-Numern
               - Stelle 2-4 = "230"      ->Dokumentenschlssel
               - Stelle 5 = "1"-"5"     ->fr die Subkategorie der Lieferscheine
               - Stelle 6 = "0"         ->aktuell nicht benutzt
               - Stelle 7-12 = 6-stellige Lieferscheinnummer mit fhrender 0
               - Stelle 13 ="?"         ->Werte 0-9 ist die Prfziffer fr EAN13


      Author : hje
Date Created : 17.04.2021
Time Created : 19:17
*/
FUNCTION Make_LS_EAN13(cLiefSNr,cExemplar)
local cEan13Nr := ""
local cEan12 := "2230"+cExemplar+"0"+strZero(val(cLiefSNr),6,0)
* Zusammensetzen
cEan13Nr := cEan12+GraBarcodeEAN13_CalcCheckDigit(cEan12)

RETURN (cEan13Nr)
*---------------------------------------------------------------------------------------

* eof LiefWDru
Dateianhänge
Barcode_LS_Seite_2_von5Formularen.pdf
(170.5 KiB) 159-mal heruntergeladen
Vorschau_Harcopy_Seite1bis6.pdf
(314.91 KiB) 150-mal heruntergeladen
Gruß
Schorsch
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo,
hier noch die Barcode-Druckausgabe, wie sie korrekt ist.
Dateianhänge
Drucken_auf_PDFDrucker_Seiten_alle.pdf
(181.45 KiB) 153-mal heruntergeladen
Gruß
Schorsch
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von ramses »

Hallo Schorsch

ich würde mal prüfen ob in deiner Methode ::PrintBarCodeEan13() der verwendete PS nach der Ausgabe gelöscht wird.
Oder ob du immer im selben PS schreibst was dann zu den erwähnten Doppel führen könnte .......
Valar Morghulis

Gruss Carlo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

das ist eine Idee ....

Ich muss das mal untersuchen. Was du machen kannst ist Bitmaps zu erzeugen und diese zu drucken.
Gruß
Hubert
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo Carlo,
leider durchschaue ich die PS-Nutzung des Print-Dialogs (Preview) und der Barcode-Ausgabe nicht.

Hallo Hubert,
ich habe deinen Hinwis mit dem Bild-drucken gleich mal probiert und statt der Barcodes 1-4 Bilder genommen und nur den 5ten Barcode gelassen
mit folgendem Ergebnis:
Die Druckvorschu für die Seiten 1-3 war ok, auf Seite 4 war der Barcode5 und das Bild4 gleichzeitig zu sehen, auf Seite 5 nur der Barcode5 und
auf Seite 6 ebenfalls Barcode5.
Der Ausdruck der Seite 4 auf den PDF-Drucker ist identisch mit der Druckvorschau der Seite 4.
Ich habe die 2 Files hier angehängt.
Wenn das die Lösung ist, bräuchte ich noch den Hinweis, wie ich den jeweiligen Barcode in eine JPG oder BMP Datei speichern kann um ihn danach zu drucken.
Vielen Dank bis dahin.
Dateianhänge
Vorschau_Harcopy_Seite1bis6_mit_Bildern.pdf
(279.66 KiB) 161-mal heruntergeladen
LS_Seite4_PDFDrucker.pdf
(175.24 KiB) 163-mal heruntergeladen
Gruß
Schorsch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

Ich muss deinen Quellcode - nur für die Druckausgabe - zum Testen haben,
ähnlich wie ich die Test.prg gemacht habe wäre es schön wenn du ein kleines Beispiel mit belanglosem Textinhalt aber deinen Nummern im Barcode senden könntest (per eMail)
es kann aber dauern, ich hab viel zu tun und die Hitze ist aktuell ein echtes Problem.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

Ich habe die Datei durchgesehen, und was gefunden ...

Der Druck stimmt :!:

EDIT: solange man immer alle Seiten druckt (die Methode dient dem Überspringen von nicht zu druckenden Seiten)

die Vorschau nicht, hier sammeln sich alle Barcodes ... der Fehler liegt bei mir.

Ich nutzt für Druck und Vorschau die gleiche Methode, beim Drucken wird das einmal durchlaufen und gut ist.
Bei der Vorschau, muss ich aber für jede Seite dennoch von Anfang an durchlaufen und mit ::IsPageToPrint() intern
die Ausgabe unterdrücken, wenn die Seite übersprungen werden soll.

Als ich die Barcode Methode eingebaut habe, muss ich damals vergessen haben das auch zu berücksichtigen.
Vorab hänge ich mal eine verbesserte HBPRINT-PRG an, aber ich fürchte es fehlt an ein paar weiteren Stellen ;-)

Ich rate aber dringend dazu, zuerst die Daten die gedruckt werden sollen zu ermitteln, z.B. im Array oder DataObjects().
Diese Daten im RAM dann der Druckroutine übergeben, sonst muss für den Ausdruck und jede Vorschauseite wieder auf die Felder zugegriffen werden.
Wenn man das sauber trennt, ist auch die Umstellung der Druckausgabe viel einfacher.

PS: ich habe mir erlaubt einige off topic Beiträge zu löschen, damit die Übersicht verbessert wird. Ich hoffe auf Verständnis ;-)
Dateianhänge
HBPRINT.PRG
Das ist die ANSI Version
(130.9 KiB) 163-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo Hubert,
deine Änderung hat sowohl im Testprogramm als auch im Original super fuktioniert. Ich habe keine Probleme mehr festgestellt.
Ich danke für die schnelle und effiziente Hilfe.
Ein Frage hätte ich noch:
Du hast die ANSI Version geschickt - was ist denn der genaue Unterschied zwischen OEM und ANSI Version ? Sind es nur die Umlaute in den Kommentaren oder hat es im Code auch Auswirkungen ?
Insgesamt habe ich bei der Aktion auch wieder dazugelernt.
Ich gehe davon aus, dass es irgenwann auch mal eine neue Version deiner Klasse geben wird - bis dahin viel Spaß noch.

Mir macht die Hitze auch etwas zu schaffen, aber ich suche kühle Räume auf und versuche keine Klimaanlage zu verwenden - auch wenn ich den Strom dafür seit 20 Jahren mit meiner, inzwischen 2ten, PV-Anlage erzeuge.
Gruß
Schorsch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von brandelh »

Eventuelle Fehlermeldungen, aber ich glaube nur die Texte in HBPRINTD sind wirklich von der Version abhängig, das wollte ich eh mal anpassen ... es geht ja auch anders.
Dateianhänge
HBPRINT.PRG
Das ist die OEM Version
(130.87 KiB) 176-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
Schorsch
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 45
Registriert: So, 21. Sep 2008 19:21
Wohnort: Sinsheim im Kraichgau

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Schorsch »

Hallo Hubert,
nochmals vielen Dank.
Du kannst sicher als Moderator das "Problem" auf [erledigt] setzen, denn das ist es nach meiner Meinung.
Gruß
Schorsch
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Probleme mit Barcode Druck von HBPrint

Beitrag von Wolfgang Ciriack »

Du kannst sicher als Moderator das "Problem" auf [erledigt] setzen, denn das ist es nach meiner Meinung.
Kannst du selbst, indem du den Betreff deines ersten Beitrags editierst.
Viele Grüße
Wolfgang
Antworten