Drucken mit HBPrinter - Was geht wie warum ???

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Wer kennt, nutzt oder verabscheut HBPrinterX ?

Ich nutze HBPrinterX ausschließlich
6
16%
Ich nutze HBPrinterX gelegentlich bzw. zusätzlich
9
24%
HBPrinterX habe ich früher mal genutzt
1
3%
geprüft, aber für mich ungeeignet
1
3%
der Schrott gehört verboten
0
Keine Stimmen
In nutze grundsätzlich keine Fremdprodukte
0
Keine Stimmen
Noch nie gehört oder kein Interesse
1
3%
Ich nutze Reportgeneratoren oder ähnliches
9
24%
Ich nehme XbpPrinter() pur
10
27%
 
Abstimmungen insgesamt : 37

Drucken mit HBPrinter - Was geht wie warum ???

Beitragvon brandelh » Fr, 16. Feb 2007 9:33

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: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Frage: Wie binde ich HBPrinter ein ...

Beitragvon brandelh » Do, 01. Mär 2007 8:53

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Lutz Rübe » Di, 17. Apr 2007 11:07

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon brandelh » Di, 17. Apr 2007 12:04

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Jan » Di, 17. Apr 2007 12:10

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
Jan
Foren-Administrator
Foren-Administrator
 
Beiträge: 11619
Registriert: Fr, 23. Sep 2005 17:23
Wohnort: 49328 Melle

Beitragvon Lutz Rübe » Di, 17. Apr 2007 12:25

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]
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon brandelh » Di, 17. Apr 2007 13:38

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: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon brandelh » Di, 17. Apr 2007 13:46

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Lutz Rübe » Di, 17. Apr 2007 14:33

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon brandelh » Di, 17. Apr 2007 15:39

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Lutz Rübe » Do, 03. Mai 2007 10:58

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon andreas » Do, 03. Mai 2007 11:13

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.
Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
 
Beiträge: 1575
Registriert: Mi, 28. Sep 2005 9:53
Wohnort: Osnabrück

Beitragvon Lutz Rübe » Do, 03. Mai 2007 12:33

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon brandelh » Do, 03. Mai 2007 13:19

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Lutz Rübe » Do, 03. Mai 2007 19:58

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon brandelh » Fr, 04. Mai 2007 8:32

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Beitragvon Lutz Rübe » Fr, 04. Mai 2007 13:16

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
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 117
Registriert: Mi, 02. Aug 2006 17:13
Wohnort: 24536 Neumünster

Beitragvon henxl » So, 06. Mai 2007 16:21

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
henxl
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 87
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitragvon brandelh » Mo, 07. Mai 2007 8:28

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: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Version 1.33 freigegeben

Beitragvon brandelh » Mi, 23. Sep 2009 22:19

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
-> 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Schorsch » So, 29. Nov 2009 18:53

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
Schorsch
Rookie
Rookie
 
Beiträge: 14
Registriert: So, 21. Sep 2008 18:21
Wohnort: Sinsheim im Kraichgau

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

Beitragvon brandelh » Mo, 30. Nov 2009 8:38

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: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon brandelh » Di, 01. Dez 2009 10:21

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13327
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Schorsch » Di, 01. Dez 2009 22:37

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
Schorsch
Rookie
Rookie
 
Beiträge: 14
Registriert: So, 21. Sep 2008 18:21
Wohnort: Sinsheim im Kraichgau

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

Beitragvon messing » Mi, 17. Feb 2010 14:55

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
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Nächste

Zurück zu Drucken und Export

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast