Drucken mit HBPrinter - Was geht wie warum ???

Moderator: Moderatoren

Antworten

Wer kennt, nutzt oder verabscheut HBPrinterX ?

Ich nutze HBPrinterX ausschließlich
6
14%
Ich nutze HBPrinterX gelegentlich bzw. zusätzlich
10
24%
HBPrinterX habe ich früher mal genutzt
1
2%
geprüft, aber für mich ungeeignet
1
2%
der Schrott gehört verboten
0
Keine Stimmen
In nutze grundsätzlich keine Fremdprodukte
0
Keine Stimmen
Noch nie gehört oder kein Interesse
2
5%
Ich nutze Reportgeneratoren oder ähnliches
11
26%
Ich nehme XbpPrinter() pur
11
26%
 
Insgesamt abgegebene Stimmen: 42

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

Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von brandelh »

Hi,

ab und an erhalte ich private eMail mit Fragen zu meiner Druckerklasse.
Seit es dieses Forum gibt, verweise ich die Anfragen an dieses Forum.
Einerseits spart mir das Zeit, andererseits nützt es mehreren.

In all den Jahren habe ich zwar - aus meiner Sicht - viele Beispiele erstellt, die alles erklären sollten, aber wie immer ist die Sicht des Autors weit von der Anderer entfernt ;-)

Auch gibt es Anforderungen, die ich selbst nicht habe, aber der Klasse dienen. Zuletzt habe ich auch gerne resonanz darüber, ob die Klasse überhaupt von anderen verwendet wird, daher gleich noch eine Abstimmung dazu :D

PS: meine Stimme (die 1. gezählte) ist natürlich ganz oben, denn ich nutzte meine Druckerklasse ausschließlich für alle Programme, seit ich diese erstellt habe.

PS: Ich lösche alle nicht wirklich zum Thema wichtigen postings (auch von mir) hier nach einiger Zeit wieder raus, damit dieser Thread leicht lesbar bleibt und eine Art Anleitung wird. Bitte nicht böse sein, Thread Punkte hat jeder jetzt wohl genug ;-)
Zuletzt geändert von brandelh am Do, 01. Mär 2007 9:02, insgesamt 2-mal geändert.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Frage: Wie binde ich HBPrinter ein ...

Beitrag von brandelh »

per eMail erreichte mich diese Frage. Hier die Antwort für alle (die es interessiert):

Grundsätzlich wird je nach Bedarf entweder nur HBPrinter.PRG oder alle 3 *.PRG Dateien in das eigene Projectfile unter den PRG eingefügt und pbuild /G aufgerufen.

Code: Alles auswählen

   Beispiel Project File:

   [DeineExe.EXE]
         ...
         DeineExe.PRG
         Sonstige.PRG
         HBPrint.PRG  // reicht wenn man keinen Dialog braucht.
         HBPrintD.PRG    // nötig für Druckdialog mit preview.
         _HBPrintD.PRG
         ...
PBUILD /G nicht vergessen !

Nun stehen die Klassen und Funktionen im eigenen Programm zur Verfügung.

Die TEST*.PRG Dateien zeigen wie man im eigenen Programm diese Klassen und Funktionen aufruft. Die MAIN im Test entspricht also entweder deiner Main oder einer anderen Prozedur die von deiner main aufgerufen wurde. Bitte ansehen !

Wenn es unklar ist, wie man die Sachen einbindet, mach doch einfach ein kleines Xbase++ Programm, das eine Liste mit set printer to druckt und die passende kleine project Datei. Beides bitte als Code-Tag ins Forum posten und ich binde dann HBPrinter ein. Vielleicht wird es dann ersichtlicher.[/code]
Gruß
Hubert
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

ich arbeite mit VX 2.0. Wo kann ich da die Option /G für den PBUILD angeben ?

ich möchte den Printing-Dialog einbinden und bekomme laufend Fehlermeldungen

xxxx already defined in _HBPrintD.obj

bzw.

unresolved external symbol _HBPRINTDIALOG.

Deine 3 Dateien habe ich in mein "Projektverzeichnis" kopiert und dort in die Programm-Liste mit aufgenommen.

Ohne den PrintingDialog funktioniert alles bestens !!

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

Beitrag von brandelh »

Hallo Lutz,

zunächst, ich arbeite nicht mit VX. Auf jeden Fall sollte es möglich sein im Project-Verzeichnis eine CMD Eingabeseite aufzumachen und Pbuild /g aufzurufen. Hast du irgendwo INCLUDE ... auf meine _HBPRINT.PRG im Quellcode eingetragen ? Das sollte man nicht.

Eventuell mal alle OBJ Dateien von den PRG Dateien löschen.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Lutz,

unter VX brauchst Du das /g nicht. Wenn Du ein neues Projekt erstellt hast klickst Du links im Fenster einfach mit der rechten Maustaste auf den .exe-Namen. Du kannst dann eine neue Datei anlegen oder eine bestehende hinzufügen. Die wird dann sofort ganz korrekt in die Projektdatei eingefügt.

Jan
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

ich habe keine Eintragungen beim INCLUDE auf Deinen Quellcode. Außerdem habe ich schon mehrfach alle OBJ-Dateien gelöscht, habe die Dependencies und mit REBUILD das Project neu erstellt (löscht u.a. die OBJ-Dateien).
brandelh hat geschrieben: Hast du irgendwo INCLUDE ... auf meine _HBPRINT.PRG im Quellcode eingetragen ? Das sollte man nicht.

Eventuell mal alle OBJ Dateien von den PRG Dateien löschen.
Ich möchte eigentlich nur folgendes:

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create()
oHBPrinter:PrintingDialog()

// setzen der sonstigen Druck-Parameter (Fonts, Copies etc.)

oHBPrinter:StartDoc("Teilnehmer-Liste")

oHBPrinter:PrintText( nCol  , nLine, "Mein Text","C")

oHBPrinter:EndDoc()
oHBPrinter:Destroy()
Was mache ich da jetzt falsch ? Reihenfolge ? Denkfehler ?

Kann ich statt Deinem PrintingDialog() den "Standard" Dialog

Code: Alles auswählen

oDlg := XbpPrintDialog():new()
oDlg:create()
oHBPrinter := oDlg:display()
oDlg:destroy()
benutzen ?

Im Moment brauche ich auch keine Vorschau, mag zwar sein, dass ich diese irgendwann mal einbauen möchte, aber derzeit benutze ich den Adobe Acrobat Writer als "Vorschau".

Gruß
Lutz[[/code]
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Lutz Rübe hat geschrieben: Ich möchte eigentlich nur folgendes:

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create()
oHBPrinter:PrintingDialog()

// setzen der sonstigen Druck-Parameter (Fonts, Copies etc.)

oHBPrinter:StartDoc("Teilnehmer-Liste")

oHBPrinter:PrintText( nCol  , nLine, "Mein Text","C")

oHBPrinter:EndDoc()
oHBPrinter:Destroy()
genau das ist die Frage, was möchtest du ?

1. Einfach den Text auf den Standarddrucker (oder bekannten Namen) senden, dann muss man:

Code: Alles auswählen

oHBPrinter := HBPrinter():New():create(cDruckerName)
if oHBPrinter:IsPrinterError() //// IMMER ABFRAGEN
   Fehlermeldung
else
   // setzen der sonstigen Druck-Parameter (Fonts, Copies etc.) 
   oHBPrinter:StartDoc("Teilnehmer-Liste")
   oHBPrinter:PrintText( nCol  , nLine, "Mein Text","C")
   ... weitere Druckkomandos
   oHBPrinter:EndDoc()
   oHBPrinter:Destroy()
endif
***>>> also KEINE Druckerauswahl.

2. Du möchtest die Druckerauswahl (und Vorschau) haben, dann musst
du aber eine eigene Klasse von HBPrinter ableiten und Print und
Printform definieren !
Als Muster kannst du in TEST.PRG MyHBPrinter ansehen.
Natürlich könnte man auch in HBPRINT.PRG ändern, aber beim nächsten Update
ist dann alles weg ;-)

In diesem Falle also dieses:

Code: Alles auswählen

oHBPrinter := MyHBPrinter():New():create()
oHBPrinter:PrintingDialog()   // hier wird alles geregelt
...
aber man muss die Druckausgabe definieren:

CLASS  MyHBPrinter from HBPrinter
   EXPORTED:
      METHOD Print           // Alle variablen Druckausgaben
      METHOD PrintForm    // Alle fixen Bestandteile einer Seite
ENDCLASS

METHOD MyHBPrinter:PrintForm() 
   local altFont, x,y, nWinkel
   ::HBPrinter:PrintForm()
   altFont := ::SetFont(HB_FONT_14Arial)
   // Reihenfolge ist egal, hier die Kopfzeile
   ::PrintText( 200,150, "Kopfzeile" )
   // Fußzeile oder einfach alles gemischt.
   ::PrintText( 200,2800, "Seite:"+str(::nPageNo),,, "box" )
   ::SetFont(altFont)

   // eventuell auch Abhängig von ::nPageNo, aber diese hier nicht ändern !
return self

*-------------------------------------------------------------
METHOD MyHBPrinter:Print()  // diese Funktion wird nur einmal aufgerufen !
   local x, nMaxX, PosX, PosY, cTxt
   ::nPageNo := 1
   ::lFirstPageForm := .f.         // Formular 1. Seite noch nicht gedruckt
   * Hier folgt ihr Code
   ::HBPrinter:Print()     
   * in abgeleiteten Klasse 

   ::nFirstLine := 250
   PosX := 200
   PosY := ::nFirstLine
   ::SetFont(HB_FONT_12TimesNewRoman)
   nMaxX := 600
   ::PrintForm()      // erste Seite Formular drucken

   for x := 1 to nMaxX

       if PosY >= 2750 .or. PosY < 0              // Seite voll
          ::NewPage()
          ::PrintForm()
          if ::IsAfterLastPage()       // spart Zeit bei Seitenauswahl
             exit                              
          endif
          PosY := ::nFirstLine
       endif
       ::PrintText( PosX, PosY , "Zeile:"+str(x)+str(PosY) )
       PosY += ::LineFeed()
   next

return self
wie ich gesehen habe werden noch diese beiden Funktionen benötigt, das muss ich wieder ändern:

Code: Alles auswählen

*--------------------- allgemeine Funktionen - einmalig im Programm -------
Function ErrBox(uText,cTitel)
   local cText,x,xMax
   DEFAULT cTitel TO "Fehlermeldung"
   do case
      case valtype(uText) = "A"
           cText := uText[1]
           xMax  := len(uText)
           for x := 2 to xMax
               cText += chr(13) + uText[x]
           next
      case valtype(uText) = "C"
           cText := uText
      otherwise
           cText := "ErrBox wurde mit falschem Parameter "+;
                    " uText  aufgerufen ! Type "+valtype(uText)+;
                    " statt C oder A"+chr(13)+;
                    "Bitte diesen Fehler melden."
   endcase
   MsgBox(cText,cTitel)
return NIL

*---------------------------------------------------------------------------
function ntrim( nVar )
return strTran(alltrim( str( nVar ) ),".",",")
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Lutz Rübe hat geschrieben: Kann ich statt Deinem PrintingDialog() den "Standard" Dialog

Code: Alles auswählen

oDlg := XbpPrintDialog():new()
oDlg:create()
oHBPrinter := oDlg:display()
oDlg:destroy()
Der Standarddialog gibt immer einen Standarddrucker zurück, keinen HBPrinter(). Daher geht das so nicht.

Das Einbinden in VX ist einfach, aber man muss folgendes beachten:

1. Der Editor und Compiler kommt damit klar, dass die PRG nicht im aktuellen Verzeichnis liegen. Der LINKER aber nicht. Daher immer die
Quellcodes zuerst per Explorer in das Projektverzeichnis kopieren, falls diese nicht schon dortliegen.

2. Im Projekt selbst (VX) die neuen (bestehenden) PRG einbinden, dann geht alles automatisch.

3. Die PROJECT.PRG nicht mehr direkt ändern, da VX diese dauernd aus den Einstellungen neu erzeugt ! Einstellungen ändern !

4. Ich hatte Probleme mit dem ß in meinem Dialog, da die PRG noch OEM war. Trotz Konverterschalter in den Einstellungen gab es Probleme.
Wieder mein Rat, alle PRGs in ANSI speichern und KEINE Konvertierung einstellen - wer es anders hinbekommt gut für ihn.
Gruß
Hubert
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

ich hatte irgendwie eine "Denksperre".

Ich habe das Problem jetzt wie folgt gelöst:

Code: Alles auswählen

      oDlg := XbpPrintDialog():new()
      oDlg:create()
      oStdDrck := oDlg:display()
      oDlg:destroy()
      cDruckerName:= oStdDrck:devName
      oStdDrck:destroy()
      oHBPrinter := HBPrinter():New():create(cDruckerName)
Was ich eigentlich wollte und mit dem obigen Code jetzt gelöst ist, war folgendes:

Die vorhandenen Drucker anzeigen, einen davon auswählen und für den jeweiligen Druckjob zum "Standard-Drucker" machen, ohne dass die Windows-Einstellungen ("Drucker als Standard definieren") konstant verändert werden.

Was ich also gesucht habe war die Auswahl eines Druckers, die Bestimmung seines Namens und die Übergabe des Namen an Deine Druckerklasse.

Gibt es dafür eigentlich eine elegantere Lösung als die, welche ich jetzt gefunden habe ?

Auf jeden Fall haben mir hier die Diskussion und die Lösungsansätze zu einer Lösung verholfen. Danke.

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

Beitrag von brandelh »

Hi,

meine Druckerdialog ist in meiner Klasse integriert etwas 'eleganter', aber vielleicht fällt dir das mit den Klassen schwerer oder du willst den Standarddialog wählen ...

In eigenen Programmen habe ich auch eine einfache Listboxauswahl ähnlich einem achoice die die Namen anzeigt und in der einer speichert.

Vom Grundsatz her druckt man entweder wie du oben alles in der Liste die man Programmiert hat, oder man übergibt gleich an meinen Druckerdialog, der dann Print aufruft, das wiederum Printpage aufruft.
Bei diesem muss man sich num startdoc und destroy nicht kümmern, allerdings kann man auch noch keinen Namen für den Druckauftrag vergeben. Da muss ich nochwas anpassen.
Gruß
Hubert
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

ich habe jetzt - wie schon vorher beschrieben - meinen Drucker-Auswahldialog in die Anwendung integriert. Das funktioniert zur vollsten Zufriedenheit.

Jetzt habe ich jedoch noch eine Frage: Wenn ich jetzt im Rahmen des Druckerauswahldialoges die Druckereigenschaften ändere (Anzahl Kopien, Querformat, Beidseitig, Fachauswahl etc.), werden diese nicht in Deine Druckerklasse übernommen.

Ist das richtig ? Muß ich alle diese Einstellungen über Deine Druckerklasse vornehmen ?

Gruß
Lutz
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Lutz,

ich weiss nicht, wie die Klasse von Hubert funktioniert, aber wenn du da die Werte einstellen kannst, die du benötigst, könntest du diese auch aus deiner Druckerabfrage übernehmen. Wenn du XbpPrinterDialog benutzt, gibt es da passende Variablen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Andreas,

der XbpPrinterDialog bietet mir die Möglichkeit, einen vorhandenen, installierten Drucker auszuwählen. Wenn ich im Rahmen dieses Dialoges auf die Druckereigenschaften des Drucker gehe, kann ich ja diverse Einstellungen vornehmen (Fachauswahl, Querformat, Papierformat etc).

Diese werden aber anscheinend nicht in das XbpPrinter Objekt übernommen bzw. in die HBPrinterClass Objekte.

Beispiel: ich habe in meinem xBase Programm keine Querformat-Angaben. Übernehme daher die Standardvorgaben. Nun wollte ich im Rahmen des XbpPrinterDialogs über die Druckereigenschaften ausnahmsweise einmal im Querformat drucken. Dafür will und wollte ich nicht den Source Code verändern. Diese Änderung im "Druckertreiber" wurde in der PrinterClass von Hubert nicht übernommen.

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

Beitrag von brandelh »

Hallo Lutz, Hallo Andreas,

die HBPrinter-Klasse entspricht einem Presentationspace und nicht dem Drucker. Meine Klasse geht natürlich davon aus, dass der eigene Druckerauswahldialog benutzt wird. Dieser würde das intern regeln, wobei wie schon öffters geschrieben meine Druckerklasse auf älteren Xbase++ Versionen geschrieben wurde und auch funktionieren muss.

Grundsätzlich gibt es die Möglichkeit die Einstellungen die interessieren Anzahl der Kopien etc. abzufragen und neu zu setzen. Die 1.90 Methoden dazu sind integriert, aber bisher nicht in der Praxis im Einsatz (ich mach das anders...).

Code: Alles auswählen

[color=red]jetzt einfach so aus dem Gedächtnis, ohne es getestet zu haben:[/color]

oPrnDlg := XbpPrinterDialog():new():create()
oPrnXP := oPrnDlg:display()
oPrnDlg:destroy()

if oPrnXP # NIL
   
   oHBPrn := HbPrinter():New():create(oPrn:devName) // Name  des Druckers übergeben
   oHBPrn:SetCollationMode( oPrnXP:SetCollationMode() )
   oHBPrn:SetNumCopies( oPrnXP:SetNumCopies() )
   etc.

wie gesagt. Eigentlich müsste es genau wie gewünscht funktionieren, aber ich habe es nicht so im Einsatz ... bei der Entwicklung wurde es so getestet und muss wohl funktioniert haben.
Gruß
Hubert
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

danke für Deinen Hinweis, so habe ich es ja auch in meinem Programm bereits eingebaut.

Nun habe ich aber die Situation, dass ich nur für einen einzigen Ausdruck eine besondere Eigenschaft eines Druckers (z.B. Duplex) nutzen. Dafür möchte oder kann ich aber nicht mein Programm ändern (für diese einmalige Situation) sondern die Einstellungen, wie ich sie im Druckertreiber vornehmen kann.

Dies funktionierte nicht bisher nicht bei mir.

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

Beitrag von brandelh »

Hallo Lutz,

also wenn im Xbase++ Programm nichts eingestellt wird, müsste er eigentlich die Standardeinstellungen des Druckertreibers nutzen.
So habe ich das ja früher geregelt.

2 Druckerobjekte, der eine druckt normal, der andere immer Dublex.
Das sollte immer funktionieren, du mußt das aber VOR dem Ausdruck direkt im Druckertreiber ändern, nicht erst in der Druckerauswahl.

Der eine heißt z.B. LASER SINGEL und der zweite LASER DUBLEX.
Den gewünschten wählst du dann nur noch aus und ab damit.

Einstellungen am DRUCKER selbst werden vom Druckertreiber oft zurückgesetzt, außer du hast dort die Auswahl Standard oder Vorgabe, das kommt aufs Druckermodell an.
Gruß
Hubert
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Hallo Hubert,

aus der Anzahl meiner Anfragen kannst Du sicherlich erkennen, dass ich mindestens zu 95 % Deine Druckerklasse benutze und ich sehr, sehr zufrieden damit bin....

Nicht nur mit der Druckerklasse, auch mit dem dazugehörenden Support !

Gruß
Lutz
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Hubert,

ich habe zwischzeitlich (wir haben Ende März Nachwuchs bekommen und unser Sohn beansprucht unsere Zeit) auch abgestimmt. Ich nutze Deine Klasse ausschließlich.
Allerdings habe ich einige Änderungen vorgenommen, zum Beispiel das Umgehen des Druckdialogs, wenn mal einfach nur mit den Standardeinstellungen durch Klick auf das Druck-Icon geduckt werden soll. Oder die Anzahl der Drucke aus meinem Programm heraus voreingestellt.
Ich will Dich ermutigen, die Klasse weiterzuentwickeln. Mir jedenfalls hat sie sehr geholfen und vieles vereinfacht.

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

henxl hat geschrieben:Ich will Dich ermutigen, die Klasse weiterzuentwickeln.
Keine Angst, ich entwickle diese weiter. Ich (ge-)brauche sie ja selbst. :D
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Version 1.33 freigegeben

Beitrag von brandelh »

Hallo,

die neue Version meiner Druckerklasse ist nun in 2 Versionen erhältlich, ANSI / OEM ;-)
-> http://www.familie-brandel.de

weitere Infos gibt es hier
-> http://www.xbaseforum.de/viewtopic.php?f=17&t=3659

ob der Marktplatz aber der richtige Ort ist ... schließlich wird ja nix verkauft, is ja FREEWARE :D .
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: Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von Schorsch »

Hallo Hubert,
ich habe deine Durckerklasse ersmals benutzt und stehe vor folgendem Problem:
Ich nutze den Dialog zur Druckerauswahl und bei der ersten Anzeige der Vorschau wird nur das "Formular" angezeigt (ohne den variablen print() Teil). Blättere ich allerdings zurück , dann wird die Seite komplett und richtig dargestellt _ auch wenn ich weiter vor und zurückblättere.
Das Problem tritt beim ersten Anzeigen auf und beim Drucken stell es sich so dar, dass die 1ste Seite das Formular druckt und die 2te Seite dann das Formular + inhalt der ersten Seite.
Ich habe leider keine Idee mehr, wo ich suchen soll um dies zu beheben. Für einen "systematischen" Tip wäre ich sehr dankbar.

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

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von brandelh »

Hi,

auf der ersten Seite darf noch kein Seitenvorschub definiert werden, ansonsten bräuchte ich den (gekürzten) Quellcode um mehr zu sehen. Notfalls per eMail an meine Adresse ;-) hubert PUNKT brandel AT gmx PUNKT de
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von brandelh »

Hallo Schorsch,

mir vielen 3 Sachen auf, 2 sind Schönheitsfehler, der 3. der Grund warum es bei dir so ist ;-)

1. In Print die Vorgaben richtig setzen, also am Anfang:

Code: Alles auswählen

::nPageNo := 1
::lFirstPageForm := .f.         // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
* Hier folgt ihr Code
::HBPrinter:Print()      // m”glich, aber eigentlich unn”tig - it's possible, but I think useless
* in abgeleiteten Klasse - in derived classes
::nFirstLine := 250
::nPageNo := 1 // das ist zwar nicht nötig, aber sicherer ;-)
::lFirstPageForm := .f. // Formular 1. Seite noch nicht gedruckt - form 1. page not printed
diese Variable verhindert, dass bereits auf der ersten Seite eine NewPage() ausgeführt wird.
Intern wird diese dann auf .t. gesetzt und somit erfolgt später denn alles richtig.
Bei .t. KANN es sein, dass am Anfang eine leere Seite gedruckt wird !
::nFirstLine // legt in der Klasse die Position fest, an der der Ausdruck von oben beginnt.
Sehr wichtig falls automatisch eine neue Seite benötigt wird (PrintMemo) ...

Diese Variablen sind in den Beispielen immer gesetzt.

2. Gerade für die Vorschau ist es wichtig, dass die unnötigen Seiten NACH der aktuell angezeigten
nicht berechnet werden müssen, daher ist diese Abfrage in den Beispielen enthalten

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
Wenn diese Abfrage fehlt, und man auf der 2. von 10000 Seiten ist, versteht man, warum es eingebaut wurde ;-)

3. Unglückliche Verkettung von fehlender Vorgabe und dieser Abfrage ...

Code: Alles auswählen

   PosY := ::nFirstLine  // ::nFirstLine ist noch auf Vorgabe, je nach Drucker auch NEGATIV !
   ::PrintForm()      // erste Seite Formular drucken
   do case
      case ::nPageNo = 1
         ::nFirstLine := n1TextZeile
     otherwise
         ::nFirstLine := n2TextZeile
   endcase
Beim 1. Aufruf ist also PosY NEGATIV ! und trifft auf ...

Code: Alles auswählen

     do while AuftPos->AuftragNr = Auftrag->AuftragNr .and. .not. eof()
       nPosBetrag    := 0.00
       nFrachtBetrag := 0.00
       nRabattBetrag := 0.00
       nRabattPreis  := 0.00

       if PosY >= 2485 .or. PosY < 0              // Seite voll
hier wird dann, da ja PosY negativ ist, erst auf der nächsten Seite mit der ersten Zeile begonnen.
Sobald man blättert wird aber PosY richtig gesetzt und die Zeilen erscheinen wie gewohnt.

LÖSUNG: Reihenfolge hier umdrehen:

Code: Alles auswählen

   ::PrintForm()      // erste Seite Formular drucken
   do case
      case ::nPageNo = 1
         ::nFirstLine := n1TextZeile
     otherwise
         ::nFirstLine := n2TextZeile
   endcase
   PosY := ::nFirstLine  // nun ist ::nFirstLine auf jeden Fall gesetzt
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: Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von Schorsch »

Hallo Hubert,

vielen Dank für die Mühe - aber es hat sich gelohnt - ich habe alle deine Vorschläge eingebaut und zack- es klappt genau so wie gewünscht.
Aber alleine wäre ich nicht auf diese Lösung gekommen. (grün hüpfender Smily)
Gruß
Schorsch
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Drucken mit HBPrinter - Was geht wie warum ???

Beitrag von messing »

Vielen Dank für die erste Hilfe per E-Mail.
Habe hbprint erfolgreich eingebunden.
Werde hbprintd auch einbinden, da dann die Druckerauswahl vorhanden sein sollte.

Da ich jedoch noch nicht weiß, wie ich wo und wann etwas bewirke, anbei mein Druckmodul.

Wäre Dankbar, wenn Du an entsprechenden Stellen zeigst wo und was

Danke
Messing


Code: Alles auswählen

* Programmname        : rech01.prg Rechnungsmodul - provisorisch
* wird aufgerufen von : haupt.prg
* Letzte Žnderung am  : 05.09.92
*  Auftraggerberlisten und Summen
* SET FUNKTIONEN
* --------------
* VARIABLEN
* -------------------------------------------------------------------------
* PRIVATE = In dieser Routine und in Unterroutinen
* PUBLIC  = In allen Routinen (auch šbergeordnete)
* LOCAL   = NUR in der aktuellen Routine
* STATIC  = NUR in der aktuellen Routine aber auch noch nach dem Verlassen!
* -------------------------------------------------------------------------
*---------------------------HAUPTPROGRAMM----------------------------------
PROCEDURE rech01
field zaehler,datum1,auftraggeb,ladestelle,termin1,colli,kg_m3,entladeste
field termin2,fahrzeug,fahrer,zeichen,dm_km,dm_pauscha,kilometer,dm_ok,km_ok
field datum2,zeit2,in_ausland,kfzart,pronummer,gebuehren,mwsteuer,rechnung
field name1,name2,strasse,plz_ort,kd_bez,druck
field rg_nummer,dm_netto,dm_steuer,dm_summe,dm_gebueh,dm_enbet,saetze
field rg_von_dat,rg_bis_dat,rg_von_pos,rg_bis_pos

field e_name,e_name1,e_inhaber,e_strasse,e_ort,e_tel,e_tel1,e_fax,b_name1
field b_lz1,kto_nr1
field dm_kg

memvar fenster2,getlist,taste1,laufwerk1
local eauftraggeber,evon1,evon2,ebis1,ebis2,ekfzart,ein_ausland,rgfrage
local edruck
local eingabeok
local periode
local satzzahl
local rechnr,rgnummer
local temp1,temp2
local rgvondat,rgbisdat,rgvonpos,rgbispos
local cotemp1

local drname,drname1,drinhaber,drstrasse,drort,drtel,drtel1,drfax,drbname1
local drblz1,drktonr1

local altbereich

************ Adressvariablen ****************
local ename1,ename2,estrasse,eanschrift
local seitenzahl,position
************ Steuer- Betragsvariablen *********************************
local emwst1,emwst2,summe1,summe2,summe3,summe4,summe5
set decimals to 2
temp1:=laufwerk1 + "\" + "drucken.dbf"

use selbst shared new
drname:=e_name
drname1:=e_name1
drinhaber:=e_inhaber
drstrasse:=e_strasse
drort:=e_ort
drtel:=e_tel
drtel1:=e_tel1
drfax:=e_fax
drbname1:=b_name1
drblz1:=b_lz1
drktonr1:=kto_nr1
use

select felder
evon1:=zaehler
evon2:=date()
**ctod("")
ebis1:=zaehler
ebis2:=date()
**ctod("")
eauftraggeber:="***"    // auftraggeb
ekfzart:=kfzart
ein_ausland:="*"      // in_ausland
periode:=space(2)
rgfrage:="J"
eingabeok:="N"
select arbeit
fenster2:=wopen(1,0,24,79)
wbox()
CLS
@ 01,00 say center("Auftraggeber - Rechnung - Modul")
set confirm on
SET ESCAPE off
setcursor(1)
@ 03,05 say "Bitte Namen w„hlen:"
SAVE SCREEN
do while eauftraggeber="***"
    kunden->(DBEDIT( 3, 27, 20, 48,{"kd_bez"},,,{"KUNDENLISTE"}))
    eauftraggeber:=kunden->KD_BEZ
enddo
RESTORE SCREEN
@ 03,28 say eauftraggeber       // picture "@!"
@ 05,05 say "Von / Pos.Nr.:"
@ 05,20 get evon1
@ 05,35 say "Bis / Pos.Nr.:"
@ 05,50 get ebis1
@ 07,05 say "VON / BIS = 0 - Abfrage nach Datum"
@ 09,05 say "Von / Termin :"
@ 09,20 get evon2 picture "@D" when evon1=0 .and. ebis1=0
@ 09,35 say "Bis / Termin :"
@ 09,50 get ebis2 picture "@D" when evon1=0 .and. ebis1=0
@ 11,05 say "Kfzart:"
@ 11,25 say "****** = Alles"
read
SAVE SCREEN
use kfz01 shared new
DBEDIT(10, 14, 20, 22,{"kfzart"},,,{"KFZART"})
ekfzart:=KFZART
RESTORE SCREEN
use
select arbeit
@ 11,13 say ekfzart    // picture "@!"
@ 11,25 say "Inland - Ausland (I/A/*):"
@ 11,51 get ein_ausland picture "@!" valid ein_ausland="I" .or. ein_ausland="A" ;
.or. ein_ausland="*"
@ 11,54 say "* = Alles"
@ 13,05 say "Periode (1 - 13):"
@ 13,23 get periode picture "99"
@ 15,05 say "Mit Rechnungsnummer ? (J/N)"
@ 15,34 get rgfrage picture "@!" valid rgfrage="J" .or. rgfrage="N"
@ 17,05 say "Eingabe OK ? (J/N)"
@ 17,25 get eingabeok picture "!@" valid eingabeok="J" .or. eingabeok="N"
read
if eingabeok="N"
    wclose(fenster2)
    return
endif
********** Anschrifteingabe *************
select kunden
emwst1:=0
cls
eauftraggeber=kd_bez
ename1:=name1
ename2:=name2
estrasse:=strasse
eanschrift:=plz_ort
edruck:=druck
@ 03,05 say "Firmenname:"
@ 04,05 say ename1
@ 06,05 say ename2
@ 08,05 say "Straáe:"
@ 09,05 say estrasse
@ 11,05 say "Postleitzahl und Ort:"
@ 12,05 say eanschrift
@ 15,05 say "MwSt.:"
@ 16,06 get emwst1 picture "##.##"
read
setcursor(0)
select arbeit
if edruck="J"
    if evon1=0 .and. ebis1=0
        set filter to auftraggeb=eauftraggeber .and. termin1>=evon2 .and. termin1<=ebis2
    else
        set filter to auftraggeb=eauftraggeber .and. zaehler>=evon1 .and. zaehler<=ebis1
    endif
    go top
    copy to (temp1) // drucken
    use (temp1) exclusive new
    index on zaehler to tempzae
    select drucken
    if ekfzart="******" .and. ein_ausland="*"
        set filter to
        go top
    endif
    if ein_ausland="*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart="******"
        set filter to in_ausland=ein_ausland
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart .and. in_ausland=ein_ausland
        go top
    endif
    go top
    rgvondat:=termin1
    rgvonpos:=zaehler
    go bottom
    rgbisdat:=termin1
    rgbispos:=zaehler
    go top
    count to satzzahl
    if satzzahl=0
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        if filedelete(temp1)
            cls
            ?
            ? "Keine Daten zum Druck vorhanden !!!"
            ?
            ? "Bitte Taste!"
            inkey(0)
            select arbeit
            set filter to
            go top
            wclose(fenster2)
            return
        endif
    endif
    sum dm_pauscha to summe1
    summe1:=round(summe1,2)
    if emwst1 > 0
        summe2:=round(summe1/100*emwst1,2)
    else
        summe2:=0
    endif
    emwst1:=round(emwst1,2)
    summe2:=round(summe2,2)
    summe3:=round(summe1+summe2,2)
    summe3:=round(summe3,2)
    cls
    ?
    ? ename1
    ? ename2
    ? estrasse
    ? eanschrift
    ?
    ? "Netto:         ",summe1
    ? "Mehrwertsteuer:",summe2
    ? "Endbetrag:     ",summe3
    ?
    ?
    ?
    go top
    if printready(1)
        ?
        ?
        ?
        ?
        ? "Rechnung wird gedruckt !"
        set printer on
        set device to printer
        set console off
    else
        ?
        ?
        ?
        ?
        ? "Drucker nicht bereit !!!"
        ?
        ?
        ? "Bitte Taste !"
        inkey(0)
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        filedelete(temp1)
        select arbeit
        set filter to
        go top
        wclose(fenster2)
        return
    endif
********************** Rechnungsdatenkank etc. **********
    if rgfrage="J"
        use rgdat index rgdzaeh,rgdnumm,rgdkd_b alias rechnung shared new
        append blank
        select rechnung
        rechnr:=dtos(date()) + str(recno(),5)
        rgnummer:=strtran(rechnr," ","0")
        replace zaehler with recno()
        replace rg_nummer with rgnummer
        replace kd_bez with eauftraggeber
        replace dm_netto with summe1
        replace mwsteuer with emwst1
        replace dm_steuer with summe2
        replace dm_summe with summe3
        replace dm_gebueh with 0
        replace dm_endbet with summe3
        replace saetze with satzzahl
        replace rg_datum with date()
        replace rg_von_dat with rgvondat
        replace rg_bis_dat with rgbisdat
        replace rg_von_pos with rgvonpos
        replace rg_bis_pos with rgbispos
        replace kfzart with ekfzart
        use
        select drucken

        altbereich:=SELECT()
        select arbeit
        go top
        flock()
        replace rechnung with "X" all
        unlock
        select (altbereich)

    endif
******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
*** "Inh. Rainer Dittel"
    @07,06 say drort
*** "65451 Kelsterbach"
    @07,46 say "Bankverbindung:"
    @08,06 say drtel
*** "Tel.: 06107/3023"
    @08,46 say drbname1
*** "Kreissparkasse Gross - Gerau"
    @09,06 say drfax
*** "Fax: 06107/61706"
    @09,46 say "Kto.:"
    @09,51 say drktonr1
    @09,62 say "BLZ:"
    @09,66 say drblz1
***  5108337    BLZ:508 52 553"
    @13,06 say ename1
    @14,06 say ename2
    @15,06 say estrasse
    @16,06 say eanschrift
    @18,46 say "Datum:"
    @18,54 say date()
    @ 20,06 say "R E C H N U N G"
    if rgfrage="J"
        @ 20,22 say "-"
        @ 20,24 say rgnummer
    endif
    if periode<>" "
        @ 20,46 say "Periode:"
        @ 20,56 say periode
    endif
    @ 22,05 say ekfzart
    if ein_ausland="I"
        @ 22,25 say "Inland"
    endif
    if ein_ausland="A"
        @ 22,25 say "Ausland"
    endif
    @ 24,05 say "Pr.-Nr.:             von:                 nach:               Betrag:"
    setprc(0,0)
    position:=0
    go top
    do while .not. eof()
        do while position < 35
            @ 01,05 say pronummer
            @ 01,26 say ladestelle
            @ 01,47 say entladeste
            @ 01,68 say dm_pauscha
            setprc(0,0)
            skip
            if .not. eof()
                position:=position+1
                if position=35
                    eject
                    position:=40
                endif
            else
                position:=100
            endif
        enddo
        do while position < 100
            if position=40
                @ 04,05 say "Pr.-Nr.:             von:                 nach:               Betrag:"
                setprc(0,0)
            endif
            @ 01,05 say pronummer
            @ 01,26 say ladestelle
            @ 01,47 say entladeste
            @ 01,68 say dm_pauscha
            setprc(0,0)
            skip
            if eof()
                position:=100
            else
                position:=position+1
                if position=95
                    eject
                    position:=40
                endif
            endif
        enddo
    enddo
    @ 03,05 say "Nettosumme / DM"
    @ 03,25 say "MwSt.:"
    @ 03,32 say emwst1
    @ 03,38 say "%"
    @ 03,51 say "Rechnungsbetrag / DM :"
    @ 04,05 say summe1
    @ 04,25 say summe2
    @ 04,51 say summe3
    setprc(0,0)
    printsend(027)
    printsend(087)
    printsend(001)
    @02,03 say "Rechnungsbetrag:"
    @02,18 say summe3
    @02,34 say "DM"
    printsend(027)
    printsend(087)
    printsend(000)
    setprc(0,0)
    if printready(1)
        eject
        set printer off
        set console on
        set device to screen
        use
        if rgfrage="J"
            temp1:=laufwerk1 + "\" + "drucken.dbf"
            temp2:="rgdaten\"+substr(rgnummer,3,6)+substr(rgnummer,-2)+".dbf"
            if filemove(temp1,temp2)=0
                ?
                ? "Druck beendet!!!"
                ?
            else
                temp1:=laufwerk1 + "\" + "drucken.dbf"
                if filedelete(temp1)
                    ?
                    ? "Druck beendet!!!"
                    ?
                endif
            endif
            select arbeit
        endif
    endif
endif
if edruck="N" .or. edruck=" "
    if evon1=0 .and. ebis1=0
        set filter to auftraggeb=eauftraggeber .and. termin1>=evon2 .and. termin1<=ebis2
    else
        set filter to auftraggeb=eauftraggeber .and. zaehler>=evon1 .and. zaehler<=ebis1
    endif
** set filter to zaehler >= evon1 .and. zaehler <= ebis1 .and. auftraggeb=eauftraggeber
    go top
    copy to (temp1) // drucken
    use (temp1) exclusive new
    index on zaehler to tempzae
    select drucken
    if ekfzart="******" .and. ein_ausland="*"
        set filter to
        go top
    endif
    if ein_ausland="*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart="******"
        set filter to in_ausland=ein_ausland
        go top
    endif
    if ein_ausland<>"*" .and. ekfzart<>"******"
        set filter to kfzart=ekfzart .and. in_ausland=ein_ausland
        go top
    endif
    go top
    go top
    rgvondat:=termin1
    rgvonpos:=zaehler
    go bottom
    rgbisdat:=termin1
    rgbispos:=zaehler
    go top
    count to satzzahl
    if satzzahl=0
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        if filedelete(temp1)
            cls
            ?
            ? "Keine Daten zum Druck vorhanden !!!"
            ?
            ? "Bitte Taste!"
            inkey(0)
            select arbeit
            set filter to
            go top
            wclose(fenster2)
            return
        endif
    endif
    sum dm_pauscha to summe1
    summe1:=round(summe1,2)
    if emwst1 > 0
        summe2:=round(summe1/100*emwst1,2)
    else
        summe2:=0
    endif
    emwst1:=round(emwst1,2)
    summe2:=round(summe2,2)
    summe3:=round(summe1+summe2,2)
    summe3:=round(summe3,2)
    sum gebuehren to summe4
    summe4:=round(summe4,2)
    summe5:=round(summe4+summe3,2)
    summe5:=round(summe5,2)
    cls
    ?
    ? ename1
    ? ename2
    ? estrasse
    ? eanschrift
    ?
    ? "Netto:          ",summe1
    ? "Mehrwertsteuer: ",summe2
    ? "Endbetrag:      ",summe3
    ? "Gebhren:       ",summe4
    ? "Rechnungsbetrag:",summe5
    ?
    go top
    if printready(1)
        ?
        ?
        ?
        ?
        ? "Rechnung wird gedruckt !"
        set printer on
        set device to printer
        set console off
    else
        ?
        ?
        ?
        ?
        ? "Drucker nicht bereit !!!"
        ?
        ?
        ? "Bitte Taste !"
        inkey(0)
        use
        temp1:=laufwerk1 + "\" + "drucken.dbf"
        filedelete(temp1)
        select arbeit
        set filter to
        go top
        wclose(fenster2)
        return
    endif
********************** Rechnungsdatenkank etc. **********
    if rgfrage="J"
        use rgdat index rgdzaeh,rgdnumm,rgdkd_b alias rechnung shared new
        append blank
        select rechnung
        rechnr:=dtos(date()) + str(recno(),5)
        rgnummer:=strtran(rechnr," ","0")
        replace zaehler with recno()
        replace rg_nummer with rgnummer
        replace kd_bez with eauftraggeber
        replace dm_netto with summe1
        replace mwsteuer with emwst1
        replace dm_steuer with summe2
        replace dm_summe with summe3
        replace dm_gebueh with summe4
        replace dm_endbet with summe5
        replace saetze with satzzahl
        replace rg_datum with date()
        replace rg_von_dat with rgvondat
        replace rg_bis_dat with rgbisdat
        replace rg_von_pos with rgvonpos
        replace rg_bis_pos with rgbispos
        replace kfzart with ekfzart
        use
        select drucken

        altbereich:=SELECT()
        select arbeit
        go top
        flock()
        replace rechnung with "X" all
        unlock
        select (altbereich)

    endif
******************* Kopf und Anschrift drucken **************
    printsend(027)
    printsend(087)
    printsend(001)
    @03,03 say drname
*** "KELSTERB.- TRUCK - SERVICE"
*    @04,06 say drname1
*** "INTERNATIONALE SPEDITION"
    printsend(027)
    printsend(087)
    printsend(000)
    @03,10 say drname1
    @04,06 say drinhaber
    @06,06 say drstrasse
*** "Im Taubengrund 21"
*    @06,46 say drinhaber
*** "Inh. Rainer Dittel"
    @07,06 say drort
*** "65451 Kelsterbach"
    @07,46 say "Bankverbindung:"
    @08,06 say "Tel.:"
    @08,12 say drtel
*** "Tel.: 06107/3023"
    @08,46 say drbname1
*** "Kreissparkasse Gross - Gerau"
    @09,06 say "Fax:"
    @09,11 say drfax
*** "Fax: 06107/61706"
    @09,46 say "Kto.:"
    @09,51 say drktonr1
    @09,62 say "BLZ:"
    @09,66 say drblz1
***  5108337    BLZ:508 52 553"
    @13,06 say ename1
    @14,06 say ename2
    @15,06 say estrasse
    @16,06 say eanschrift
    @18,46 say "Datum:"
    @18,54 say date()
******************* Kopf und Anschrift drucken **************
    @20,06 say "R E C H N U N G"
    if rgfrage="J"
        @ 20,22 say "-"
        @ 20,24 say rgnummer
    endif
    ?
    setprc(0,0)
    position:=0
    do while .not. eof()
        do while position < 6
            @ 02,05 say "Posnr.:"
            @ 02,15 say "Pr.-Nr.:"
            @ 02,39 say "KFZ-Art"
            @ 02,50 say "Termin:"
            if gebuehren > 0
                @ 02,65 say "Gebhren:"
            endif
            @ 03,05 say zaehler
            @ 03,15 say pronummer
            @ 03,39 say kfzart
            @ 03,50 say termin1
            if gebuehren > 0
                @ 03,65 say gebuehren
            endif
            @ 04,05 say "Von:"
            @ 04,28 say "Nach:"
            @ 04,50 say "Colli:"
            @ 04,58 say "KG:"
            @ 04,65 say "KM:"
***            @ 04,71 say "Betrag:"
            @ 05,05 say ladestelle
            @ 05,28 say entladeste
            @ 05,50 say colli
            @ 05,58 say kg_m3
            @ 05,65 say kilometer
***            @ 05,71 say dm_pauscha
            @ 06,05 say "DM / KM:"
            @ 06,20 say "DM / KG:"
            @ 06,70 say "Betrag:"
            @ 07,05 say dm_km
            @ 07,20 say dm_kg
            @ 07,70 say dm_pauscha
            @ 08,05 say "--------------------------------------------------------------------------"
            setprc(0,0)
            skip
            if .not. eof()
                position:=position+1
                if position=5
                    eject
                    position:=10
                endif
            else
                position:=25
            endif
        enddo
        do while position < 17
            if position=10
                ?
                ?
                ?
                ?
                setprc(0,0)
            endif
            @ 02,05 say "Posnr.:"
            @ 02,15 say "Pr.-Nr.:"
            @ 02,39 say "KFZ-Art"
            @ 02,50 say "Termin:"
            if gebuehren > 0
                @ 02,65 say "Gebhren:"
            endif
            @ 03,05 say zaehler
            @ 03,15 say pronummer
            @ 03,39 say kfzart
            @ 03,50 say termin1
            if gebuehren > 0
                @ 03,65 say gebuehren
            endif
            @ 04,05 say "Von:"
            @ 04,28 say "Nach:"
            @ 04,50 say "Colli:"
            @ 04,58 say "KG:"
            @ 04,65 say "KM:"
***            @ 04,71 say "Betrag:"
            @ 05,05 say ladestelle
            @ 05,28 say entladeste
            @ 05,50 say colli
            @ 05,58 say kg_m3
            @ 05,65 say kilometer
***            @ 05,71 say dm_pauscha
            @ 06,05 say "DM / KM:"
            @ 06,20 say "DM / KG:"
            @ 06,70 say "Betrag:"
            @ 07,05 say dm_km
            @ 07,20 say dm_kg
            @ 07,70 say dm_pauscha
            @ 08,05 say "--------------------------------------------------------------------------"
            setprc(0,0)
            skip
            if eof()
                position:=25
            else
                position:=position+1
                if position=17
                    eject
                    position:=10
                endif
            endif
        enddo
    enddo
    @ 02,05 say "Nettosumme / DM:"
    @ 02,30 say summe1
    @ 02,44 say "DM"
    @ 03,05 say "MwSt./ %:"
    @ 03,15 say emwst1
    @ 03,30 say summe2
    @ 03,44 say "DM"
    @ 04,05 say "Endbetrag: / DM:"
    @ 04,30 say summe3
    @ 04,44 say "DM"
    @ 05,05 say "Gebhren / DM  :"
    @ 05,30 say summe4
    @ 05,44 say "DM"
    @ 06,05 say "Rechnungsbetrag:"
    @ 06,30 say summe5
    @ 06,44 say "DM"
    setprc(0,0)
    printsend(027)
    printsend(087)
    printsend(001)
    @02,03 say "Rechnungsbetrag:"
    @02,18 say summe5
    @02,34 say "DM"
    printsend(027)
    printsend(087)
    printsend(000)
    setprc(0,0)
        eject
        set printer off
        set console on
        set device to screen
        use
        if rgfrage="J"
            temp1:=laufwerk1 + "\" + "drucken.dbf"
            temp2:="rgdaten\"+substr(rgnummer,3,6)+substr(rgnummer,-2)+".dbf"
            if filemove(temp1,temp2)=0
                ?
                ? "Druck beendet!!!"
                ?
                sound(131,40)
            endif
        endif
        if rgfrage="N"
                temp1:=laufwerk1 + "\" + "drucken.dbf"
                if filedelete(temp1)
                    ?
                    ? "Druck beendet!!!"
                    ?
                endif
        endif
endif
set printer off
set console on
set device to screen
select arbeit
set filter to
go top
?
? "Bitte Taste !"
inkey(0)
wclose(fenster2)
return
* Programmende  EOF *
Gruß
Bruno
Messing
Antworten