OBS/Adminhilfe/Druckumstellung: Unterschied zwischen den Versionen
Böhrer (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
K (hat „Admin/Druckumstellung“ nach „OBS/Adminhilfe/Druckumstellung“ verschoben) |
||
| (29 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
{{ZugriffOBS}} | {{ZugriffOBS}} | ||
== Druckanpassungen == | = Probleme und Umstellung Drucke (Allgemein) = | ||
== Bekannte Probleme (Allgemein) == | |||
# Fenster für Druckeinstellung erscheint bei E-Mail, Fax und/oder Export ([[#Fenster für Druckeinstellung erscheint bei E-Mail, Fax und/oder Export|Lösung vorhanden]]) | |||
# Statt Export wird Drucken ausgeführt ([[#Statt Export wird Drucken ausgeführt|Lösung vorhanden]]) | |||
# Seitenauswahl funktioniert beim Drucken nicht. Es werden alle Seiten statt die Angegebene(n) gedruckt. ([[#Seitenauswahl in Druckeinstellungen|Lösungsansatz]]) | |||
# Zweite Seite enthält nur Mengen und Preise, jedoch keine Positionsbezeichnungen und -texte. ([[#Fehlende Positionsbezeichnungen und Langtexte auf der Folgeseite|Lösung vorhanden]]) | |||
== Lösungen zu Bekannten Problemen (Allgemein) == | |||
=== Statt Export wird Drucken ausgeführt === | |||
In älteren Drucken ist häufig noch der direkte Execute-Befehl in StartProc zu finden. | |||
<source lang="delphi"> | |||
if (lPrintModus) then begin | |||
Result := EZ.Execute(); | |||
end else begin | |||
EZ.ExecutePreview(); | |||
end; | |||
</source> | |||
Ersetzten mit: | |||
<source lang="delphi"> | |||
Result := StartPrinterStd(); | |||
</source> | |||
---- | |||
=== Fenster für Druckeinstellung erscheint bei E-Mail, Fax und/oder Export === | |||
Sollte beim Aufrufen des Exports oder beim Erstellen einer E-Mail oder eines Fax das Fenster für Druckeinstellungen erscheinen, so fehlen in dem Druck in MainSettings die Abfragen auf E-Mail, Fax oder Exportauswahl. | |||
Falsch: | |||
<source lang="delphi"> | |||
if (lPrintModus) then begin | |||
qDruckParameter(); | |||
end; | |||
</source> | |||
Richtig: | |||
<source lang="delphi"> | |||
if ( (lPrintModus) and | |||
(not(qGetRepMail(EZ)) ) and | |||
(not(qGetRepFax(EZ)) ) and | |||
(not(qGetRepExport(EZ))) ) then begin | |||
qDruckParameter(); | |||
end; | |||
</source> | |||
---- | |||
=== Seitenauswahl in Druckeinstellungen === | |||
Beim Drucken können im Druckeinsttelungsfenster die zu druckenden Seiten angegeben werden (z. B. von 2 bis 4). Dies soll aber nicht funktionieren. | |||
Aktueller Stand zu dem Problem: | |||
Bisher nur nachvollzogen, wenn noch der direkte Execute-Befehl zum Drucken genutzt wird und nicht eine der Funktionen ''StartPrinterStd()'' oder ''StartPrinter()''. Zur Behebung siehe [[#Statt Export wird Drucken ausgeführt|Statt Export wird Drucken ausgeführt]]. | |||
---- | |||
== Druckanpassungen Vorgangsdrucke (Angebote bis Rechnung und Bestellung bis Einkauf) == | |||
=== Query-Zugriffe per FieldByName === | |||
Diese sind generell mit A2C zu ersetzten. Dies ist Relativ schnell folgendermaßen zu erreichen: | |||
# Suchen nach ".FieldByName(" und ersetzen mit ".A2C(" | |||
# Suchen nach ").AsString" und ersetzen mit ")" | |||
# manuell suchen nach ".As". Den Fund entsprechend abändern (A2C in A2I/A2F/A2D und .As-Teil entfernen) | |||
---- | |||
=== Fehlende Positionsbezeichnungen und Langtexte auf der Folgeseite === | === Fehlende Positionsbezeichnungen und Langtexte auf der Folgeseite === | ||
| Zeile 27: | Zeile 107: | ||
end; | end; | ||
</source> | </source> | ||
---- | ---- | ||
=== Leerzeile statt Lieferdatum === | === Leerzeile statt Lieferdatum === | ||
| Zeile 37: | Zeile 120: | ||
<source lang="delphi"> | <source lang="delphi"> | ||
cBuffer := ''; | cBuffer := ''; | ||
if (AZ_Query. | if (AZ_Query.A2C('az_lsnr')<> '') then begin | ||
cBuffer := cAllg10+AZ_Query. | cBuffer := cAllg10+AZ_Query.A2C('az_lsnr'); | ||
end; | end; | ||
if ( (not empty(AZ_Query. | if ( (not empty(AZ_Query.A2C('az_lsdat'))) and | ||
(AZ_Query. | (AZ_Query.A2F('az_lsdat')> 0) ) then begin | ||
if (empty(cBuffer)) then begin | if (empty(cBuffer)) then begin | ||
cBuffer := AZ_Query. | cBuffer := AZ_Query.A2C('az_lsdat'); | ||
end else begin | end else begin | ||
cBuffer := cBuffer + ' / ' + AZ_Query. | cBuffer := cBuffer + ' / ' + AZ_Query.A2C('az_lsdat'); | ||
end; | end; | ||
end; | end; | ||
</source> | </source> | ||
---- | ---- | ||
=== Möglichkeit Positionsmengen und -preise in erster oder letzter Zeile zu drucken === | === Möglichkeit Positionsmengen und -preise in erster oder letzter Zeile zu drucken === | ||
| Zeile 66: | Zeile 151: | ||
if (PMode_Ja(303)) then begin | if (PMode_Ja(303)) then begin | ||
if (lTitel) then begin | if (lTitel) then begin | ||
qRep_SText(EZ,'anz' ,AZ_Query. | qRep_SText(EZ,'anz' ,AZ_Query.A2C('az_kolli'),qRep_YPos(EZ,y)); | ||
qRep_SText(EZ,'verp' ,DB_ReadSQLValue(oDB,' | qRep_SText(EZ,'verp' ,DB_ReadSQLValue(oDB,'S_VERP','vp_name','vp_nr = '+DB_SQLVal(AZ_Query.A2C('az_verpack'),'C')),qRep_YPos(EZ,y)); | ||
qRep_SText(EZ,'inh' ,TStr(AZ_Query. | qRep_SText(EZ,'inh' ,TStr(AZ_Query.A2F('az_inhalt'),12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y)); | ||
qRep_SText(EZ,'menge' ,TStr(AZ_Query. | qRep_SText(EZ,'menge' ,TStr(AZ_Query.A2F('az_menge') ,12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y)); | ||
qRep_SText(EZ,'einheit',DB_ReadSQLValue(oDB,'S_EINH','se_name','se_nr = '+DB_SQLVal(AZ_Query. | qRep_SText(EZ,'einheit',DB_ReadSQLValue(oDB,'S_EINH','se_name','se_nr = '+DB_SQLVal(AZ_Query.A2C('az_einheit'),'C')),qRep_YPos(EZ,y)); | ||
end else begin | end else begin | ||
PosLine(); | PosLine(); | ||
| Zeile 78: | Zeile 163: | ||
Zum Ende der case-of Bedingung 0 entsprechend ''PMode_Ja(303)'' mit ''PMode_Nein(303)'' ersetzten. Für Kassendrucke den Programmparameter 007 benutzen. | Zum Ende der case-of Bedingung 0 entsprechend ''PMode_Ja(303)'' mit ''PMode_Nein(303)'' ersetzten. Für Kassendrucke den Programmparameter 007 benutzen. | ||
---- | ---- | ||
=== Berechnung von Überträgen und Zwischensummen fehlerhaft === | === Berechnung von Überträgen und Zwischensummen fehlerhaft === | ||
Für die korrekte Berechnung gibt es jetzt die Prozedur ''PosCalcUebertrag()'' in QPosReportFunktionen.inc. Diese '''muss''' immer direkt nach ''PosLine()'' aufgerufen werden. Sonderfall ist hier der Angebotsdruck. Dort muss es nach der Abfrage auf lTitel (True bei "Angebot nur mit Titelsummen") aufgerufen werden. | Für die korrekte Berechnung gibt es jetzt die Prozedur ''PosCalcUebertrag()'' in QPosReportFunktionen.inc. Diese '''muss''' immer direkt nach ''PosLine()'' aufgerufen werden. Sonderfall ist hier der Angebotsdruck. Dort muss es nach der Abfrage auf lTitel (True bei "Angebot nur mit Titelsummen") aufgerufen werden. | ||
| Zeile 89: | Zeile 177: | ||
cAktPos := ''; | cAktPos := ''; | ||
</source> | </source> | ||
---- | ---- | ||
=== Auftraggeber bei Rechnung ausdrucken === | === Auftraggeber bei Rechnung ausdrucken === | ||
Im Kopf nach Auftragsnummer Kunde folgendes einfügen: | Im Kopf nach Auftragsnummer Kunde folgendes einfügen: | ||
| Zeile 99: | Zeile 190: | ||
cBuffer := A_Query.A2C('a_reempf'); | cBuffer := A_Query.A2C('a_reempf'); | ||
if (not empty(cBuffer)) then begin | if (not empty(cBuffer)) then begin | ||
if (DB_SOpen(oDB,'SELECT * FROM | if (DB_SOpen(oDB,'SELECT * FROM PERSSTA WHERE ps_nr = '+DB_SqlVal(cBuffer,'C'),qPersSta,False,'')) then begin | ||
Inc(y,0.5); | Inc(y,0.5); | ||
qSetRepStyle(EZ,fsItalic); | qSetRepStyle(EZ,fsItalic); | ||
| Zeile 105: | Zeile 196: | ||
qSetRepStyle(EZ,fsNormal); | qSetRepStyle(EZ,fsNormal); | ||
cBuffer := DB_ReadSQLValue(oDB,' | cBuffer := DB_ReadSQLValue(oDB,'PERSSTA','ps_kdnr','ps_nr = '+DB_SqlVal(A_Query.A2C('a_knr'),'C')); | ||
if (not(empty(cBuffer))) then begin | if (not(empty(cBuffer))) then begin | ||
qRep_SText(EZ,'Kastentext','Unsere Lieferanten-Nr.: '+cBuffer,qRep_YPos(EZ,y)); | qRep_SText(EZ,'Kastentext','Unsere Lieferanten-Nr.: '+cBuffer,qRep_YPos(EZ,y)); | ||
| Zeile 122: | Zeile 213: | ||
// AUFTRAGGEBER KUNDE ENDE | // AUFTRAGGEBER KUNDE ENDE | ||
</source> | </source> | ||
'''Nicht vergessen:''' ''qPersSta'' und ''cBuffer'' in den Variablen der Prozedur deklarieren, wenn diese noch nicht vorhanden sind. | |||
---- | ---- | ||
=== Versandanschrift bei Auftragsbestätigungen drucken === | === Versandanschrift bei Auftragsbestätigungen drucken === | ||
Hierfür die Prozeduren ''AdressKopfVersand(nAdrZeile: Double)'' und ''AdressKopfFolgeSeiteKurzVersand(nAdrZeile: Double)'' verwenden. | Hierfür die Prozeduren ''AdressKopfVersand(nAdrZeile: Double)'' und ''AdressKopfFolgeSeiteKurzVersand(nAdrZeile: Double)'' verwenden. | ||
---- | ---- | ||
=== PosLine() am Positionsende immer drucken === | === PosLine() am Positionsende immer drucken === | ||
| Zeile 139: | Zeile 236: | ||
end; | end; | ||
if (Pos('AU',PMode_Var(534)) <> 0) and (not empty(AZ_Query. | if (Pos('AU',PMode_Var(534)) <> 0) and (not empty(AZ_Query.A2C('az_artnr'))) then begin | ||
</source> | </source> | ||
| Zeile 155: | Zeile 252: | ||
end; | end; | ||
</source> | </source> | ||
---- | ---- | ||
=== Positionen werden trotz Einstellung "kein Druck" ausgedruckt === | === Positionen werden trotz Einstellung "kein Druck" ausgedruckt === | ||
Um dies zu beheben, muss in jedem Vorgangsdruck die Prozedur ''PositionenOhneAusdruck()'' aufgerufen werden. Diese ist in der Prozedur Positionen innerhalb der for-Schleife folgendermaßen einzufügen: | Um dies zu beheben, muss in jedem Vorgangsdruck die Prozedur ''PositionenOhneAusdruck()'' aufgerufen werden. Diese ist in der Prozedur Positionen innerhalb der for-Schleife folgendermaßen einzufügen: | ||
| Zeile 166: | Zeile 266: | ||
if (not AZ_Query.Eof) then begin | if (not AZ_Query.Eof) then begin | ||
</source> | </source> | ||
---- | ---- | ||
=== Alternativtitel auch als alternativen Titel drucken === | === Alternativtitel auch als alternativen Titel drucken === | ||
Ähnlich der Alternativposition gibt es auch Alternativtitel. Sämtliche Titelpositionen werden nicht in der Gesamtsumme erfasst. Alternativtitel sind jedoch im Ausdruck nicht ersichtlich. Um dies zu ändern in den Vorgangsdrucken nach der Prozedur ''Positionen()'' suchen. Im Case Of für Typ 7 folgende Anpassung vornehmen: | Ähnlich der Alternativposition gibt es auch Alternativtitel. Sämtliche Titelpositionen werden nicht in der Gesamtsumme erfasst. Alternativtitel sind jedoch im Ausdruck nicht ersichtlich. Um dies zu ändern in den Vorgangsdrucken nach der Prozedur ''Positionen()'' suchen. Im Case Of für Typ 7 folgende Anpassung vornehmen: | ||
| Zeile 176: | Zeile 279: | ||
7 : begin | 7 : begin | ||
if (DruckeTitel(cResultvor,cWo,cWelcheZeile,nWelcheZeile,i)) then begin | |||
break; | |||
end; | |||
end; | end; | ||
| Zeile 185: | Zeile 288: | ||
'''ACHTUNG!''' Statt ''Sprachen.inc'' die neue Datei ''qSprachen.inc'' benutzen. Die Deklaration der Sprachvariablen entsprechend aus dem Vorgangsdruck entfernen, da diese in ''qSprachen.inc'' deklariert sind. | '''ACHTUNG!''' Statt ''Sprachen.inc'' die neue Datei ''qSprachen.inc'' benutzen. Die Deklaration der Sprachvariablen entsprechend aus dem Vorgangsdruck entfernen, da diese in ''qSprachen.inc'' deklariert sind. | ||
---- | ---- | ||
=== SQL-Abfrage INSTR ersetzten === | === SQL-Abfrage INSTR ersetzten === | ||
In den Drucken befinden sich oftmals noch Statements mit INSTR im WHERE für A_Query. Dies mit DB_SQLInstr wie folgt ersetzten: | In den Drucken befinden sich oftmals noch Statements mit INSTR im WHERE für A_Query. Dies mit DB_SQLInstr wie folgt ersetzten: | ||
<source lang="delphi"> | <source lang="delphi"> | ||
if (DB_SOpen(oDB,'SELECT * FROM | if (DB_SOpen(oDB,'SELECT * FROM RECHSTA WHERE ' + DB_SQLInstr('sys_uid',cRechNr,','),A_Query,False,'')) then begin | ||
</source> | </source> | ||
'''ACHTUNG!''' Beispiel ist für Rechnungsdrucke. Bei anderen Vorgangsdrucken darauf achten, nicht einfach diese Bedigung einzufügen, sondern den Tabellennamen der die Vorgangskopfdaten sowie die Variable der System-IDs noch abzuändern! | |||
---- | ---- | ||
=== Seriennummern drucken === | === Seriennummern drucken === | ||
Um Seriennummern drucken zu können, muss Folgendes im Druck direkt vor der Artikelnummerbedingung eingefügt werden: | Um Seriennummern drucken zu können, muss Folgendes im Druck direkt vor der Artikelnummerbedingung eingefügt werden: | ||
| Zeile 202: | Zeile 313: | ||
if (DruckeSeriennummern(nWelcheZeile,cWelcheZeile,cWo,cResultvor,'auid')) then begin | if (DruckeSeriennummern(nWelcheZeile,cWelcheZeile,cWo,cResultvor,'auid')) then begin | ||
break; | |||
end; | end; | ||
</source> | </source> | ||
ACHTUNG! Je nach Vorgangsdruck muss ein anderes Uid-Feld übergeben werden. | |||
'''ACHTUNG!''' Je nach Vorgangsdruck muss ein anderes Uid-Feld übergeben werden. | |||
* AU: auid | * AU: auid | ||
* LS: luid | * LS: luid | ||
| Zeile 213: | Zeile 325: | ||
* Bon: kuid | * Bon: kuid | ||
* LS (Kasse): luid | * LS (Kasse): luid | ||
---- | |||
== Bilder drucken == | |||
Dies sollte im Regelfall nur den Druck Angebote betreffen. Im Standard findet sich dies jedoch auch im Auftragsdruck. Um Bilder überhaupt Drucken zu können, werden 3 zusätzliche Variablen benötigt. | |||
---- | |||
=== Variablen === | |||
Global: | |||
<source lang="delphi"> | |||
vorbildprint : String; | |||
</source> | |||
Lokal in der Prozedur ''Positionen()'': | |||
<source lang="delphi"> | |||
nPicPos : Integer; | |||
lPicPrinted : Boolean; | |||
</source> | |||
---- | |||
=== Funktionserweitung === | |||
Für das Drucken von Bildern nach | |||
<source lang="delphi"> | |||
case AZ_Query.A2I('az_typ') of | |||
0 : begin | |||
Inc(y); | |||
if (y >= iSeitenlaenge-iFussZeilen) then begin | |||
cWo := 'Vor Bezeichnung1'; | |||
break; | |||
end; | |||
</source> | |||
in ''Positionen()'' suchen. Zwischen ''Inc(y)'' und Abfrage folgendes einfügen: | |||
<source lang="delphi"> | |||
// *** BILDERMODUL *** | |||
cBuffer := vorbildprint; | |||
if BilderModul(AZ_Query,vorbildprint) then begin | |||
cWo := 'Vor Bezeichnung1'; | |||
break; | |||
end; | |||
lPicPrinted := (not empty(vorbildprint)) and (cBuffer <> vorbildprint); | |||
nPicPos := y; | |||
// *** BILDERMODUL *** | |||
</source> | |||
Wichtig ist hierbei, dass nach dem Langtext y inkremetiert wird, falls y niedriger ist, als das Bildende. Die benötigten Zeilen werden in der Funktion ''BilderModul'' (QStandard.inc) berechnet und in der globalen Variablen nBildInc gepeichert (deklariert in QStandard.inc). Falls aber innerhalb der Position ein Seitenumbruch stattfand und das Bild schon gedruckt wurde, darf auf der neuen Seite kein Increment von y erfolgen! | |||
Einzufügen ist im Code folgendes: | |||
vor Bedingung für PosLine(): | |||
<source lang="delphi"> | |||
if (not empty(vorbildprint)) and (lPicPrinted) then begin | |||
if ((nPicPos + nBildInc) > y) then begin | |||
y := nPicPos + nBildInc; | |||
end; | |||
end; | |||
if Pmode_Nein(303) then begin | |||
PosLine(); | |||
PosCalcUebertrag(); | |||
end; | |||
</source> | |||
---- | ---- | ||
Aktuelle Version vom 9. September 2016, 15:00 Uhr
Dies ist eine zugriffsgeschützte Seite.
- System Überwachung
- DEP deaktivieren
- Darstellung unter Windows 7
- Einwahl auf Windows 2000 Server
- Preislisten
- Datenbank Sicherung
- Customize
- Zentrale
- Support Macro
- Service Debug
- Historienprotokoll (Datenänderung OBS)
- Fernwartungsprobleme
- Startparameter
- Fehler beim Kassenabschluss
- Diverse Informationen
- A ras.pbk
- B Command Line Interpreter
- C File Zilla Benutzer XML erzeugen
- D1 OBS_UPDATE.EXE zum OBS Update Server hochladen
- D2 SUPPORT_MACRO zum OBS Update Server hochladen
- H1 Remote Service Protokoll-Übersicht (Alles)
- H Remote ServiceProtokoll-Übersicht
- I Remote Service Commands
- I1 (Admin) Globaler Hinweis für Updates
- J Liste der OBS Updates
- K Angemeldete Service Firmen
- L Systeminformationen einlesen
- M Kundendaten anzeigen
- M1 Kundendatenbankinformationen anzeigen
- N Kundendaten einlesen
- O Kunden-Update Informationen anzeigen
- P Modul Registrierung OBS
- Q App Verwaltung
- S1 Firmen Statistik Protokolle OBS
- S2 Statistik Notfallkassen
Probleme und Umstellung Drucke (Allgemein)
Bekannte Probleme (Allgemein)
- Fenster für Druckeinstellung erscheint bei E-Mail, Fax und/oder Export (Lösung vorhanden)
- Statt Export wird Drucken ausgeführt (Lösung vorhanden)
- Seitenauswahl funktioniert beim Drucken nicht. Es werden alle Seiten statt die Angegebene(n) gedruckt. (Lösungsansatz)
- Zweite Seite enthält nur Mengen und Preise, jedoch keine Positionsbezeichnungen und -texte. (Lösung vorhanden)
Lösungen zu Bekannten Problemen (Allgemein)
Statt Export wird Drucken ausgeführt
In älteren Drucken ist häufig noch der direkte Execute-Befehl in StartProc zu finden.
if (lPrintModus) then begin
Result := EZ.Execute();
end else begin
EZ.ExecutePreview();
end;
Ersetzten mit:
Result := StartPrinterStd();
Fenster für Druckeinstellung erscheint bei E-Mail, Fax und/oder Export
Sollte beim Aufrufen des Exports oder beim Erstellen einer E-Mail oder eines Fax das Fenster für Druckeinstellungen erscheinen, so fehlen in dem Druck in MainSettings die Abfragen auf E-Mail, Fax oder Exportauswahl.
Falsch:
if (lPrintModus) then begin
qDruckParameter();
end;
Richtig:
if ( (lPrintModus) and
(not(qGetRepMail(EZ)) ) and
(not(qGetRepFax(EZ)) ) and
(not(qGetRepExport(EZ))) ) then begin
qDruckParameter();
end;
Seitenauswahl in Druckeinstellungen
Beim Drucken können im Druckeinsttelungsfenster die zu druckenden Seiten angegeben werden (z. B. von 2 bis 4). Dies soll aber nicht funktionieren.
Aktueller Stand zu dem Problem: Bisher nur nachvollzogen, wenn noch der direkte Execute-Befehl zum Drucken genutzt wird und nicht eine der Funktionen StartPrinterStd() oder StartPrinter(). Zur Behebung siehe Statt Export wird Drucken ausgeführt.
Druckanpassungen Vorgangsdrucke (Angebote bis Rechnung und Bestellung bis Einkauf)
Query-Zugriffe per FieldByName
Diese sind generell mit A2C zu ersetzten. Dies ist Relativ schnell folgendermaßen zu erreichen:
- Suchen nach ".FieldByName(" und ersetzen mit ".A2C("
- Suchen nach ").AsString" und ersetzen mit ")"
- manuell suchen nach ".As". Den Fund entsprechend abändern (A2C in A2I/A2F/A2D und .As-Teil entfernen)
Fehlende Positionsbezeichnungen und Langtexte auf der Folgeseite
Am Ende der Prozedur Positionen() wird cWo mit dem Wert 'Ende' gefüllt, wenn es leer ist. Diese Abfrage ist zu erweitern. Nach
procedure Positionen();
suchen, ans Ende scrollen und Code abändern von:
if (empty (cWo)) then begin
cWo := 'Ende';
end;
cWWI := cAktPos + '|' + cWo + '|' + cWelcheZeile;
end;
nach:
if (empty (cWo)) and (AZ_Query.EoF) then begin
cWo := 'Ende';
end;
cWWI := cAktPos + '|' + cWo + '|' + cWelcheZeile;
end;
Leerzeile statt Lieferdatum
Ebenfalls in der Prozedur Positionen() zu finden (nur Rechnungsdruck). Im Case of wird unter 0 eventuell das Lieferscheindatum gedruckt. Dort wird allerdings nur der String auf not empty abgeprüft, was dazu führen kann, dass eine Leerzeile eingefügt wird, weil im Datum 30.12.1899. Zur sicherheit hier zusätzlich auf Gleitkommawert abfragen: Nach
procedure Positionen();
suchen, ans Ende scrollen und Code abändern:
cBuffer := '';
if (AZ_Query.A2C('az_lsnr')<> '') then begin
cBuffer := cAllg10+AZ_Query.A2C('az_lsnr');
end;
if ( (not empty(AZ_Query.A2C('az_lsdat'))) and
(AZ_Query.A2F('az_lsdat')> 0) ) then begin
if (empty(cBuffer)) then begin
cBuffer := AZ_Query.A2C('az_lsdat');
end else begin
cBuffer := cBuffer + ' / ' + AZ_Query.A2C('az_lsdat');
end;
end;
Möglichkeit Positionsmengen und -preise in erster oder letzter Zeile zu drucken
Dies läuft über den Programmparameter 303. Auf "Ja" gestellt ist PosLine() in der ersten Positionszeile auszuführen, bei "Nein" in der letzten. Bei Angebotsdrucken daran denken, dass dort nicht PosLine() aufgerufen wird, wenn "Angebot nur mit Titelsummen" gedruckt wird. Hier muss die komplette Bedingung innerhalb der PMode-Bedingung stehen.
oben direkt nach qRep_SText-Funktion für Spalte bez1 (kann zweimal vorkommen, dann muss es auch zweimal aufgerufen werden):
if (PMode_Ja(303)) then begin
PosLine();
end;
bzw. bei Angebot:
if (PMode_Ja(303)) then begin
if (lTitel) then begin
qRep_SText(EZ,'anz' ,AZ_Query.A2C('az_kolli'),qRep_YPos(EZ,y));
qRep_SText(EZ,'verp' ,DB_ReadSQLValue(oDB,'S_VERP','vp_name','vp_nr = '+DB_SQLVal(AZ_Query.A2C('az_verpack'),'C')),qRep_YPos(EZ,y));
qRep_SText(EZ,'inh' ,TStr(AZ_Query.A2F('az_inhalt'),12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y));
qRep_SText(EZ,'menge' ,TStr(AZ_Query.A2F('az_menge') ,12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y));
qRep_SText(EZ,'einheit',DB_ReadSQLValue(oDB,'S_EINH','se_name','se_nr = '+DB_SQLVal(AZ_Query.A2C('az_einheit'),'C')),qRep_YPos(EZ,y));
end else begin
PosLine();
end;
end;
Zum Ende der case-of Bedingung 0 entsprechend PMode_Ja(303) mit PMode_Nein(303) ersetzten. Für Kassendrucke den Programmparameter 007 benutzen.
Berechnung von Überträgen und Zwischensummen fehlerhaft
Für die korrekte Berechnung gibt es jetzt die Prozedur PosCalcUebertrag() in QPosReportFunktionen.inc. Diese muss immer direkt nach PosLine() aufgerufen werden. Sonderfall ist hier der Angebotsdruck. Dort muss es nach der Abfrage auf lTitel (True bei "Angebot nur mit Titelsummen") aufgerufen werden.
Am Anfang der Prozedur Positionen() ist die neue Variable nGPOption (in QPosReportFunktionen.inc deklariert) zu initialisieren.
nGPOption := 0.00;
cWo := '';
cAktPos := '';
Auftraggeber bei Rechnung ausdrucken
Im Kopf nach Auftragsnummer Kunde folgendes einfügen:
// AUFTRAGGEBER KUNDE ANFANG
cBuffer := A_Query.A2C('a_reempf');
if (not empty(cBuffer)) then begin
if (DB_SOpen(oDB,'SELECT * FROM PERSSTA WHERE ps_nr = '+DB_SqlVal(cBuffer,'C'),qPersSta,False,'')) then begin
Inc(y,0.5);
qSetRepStyle(EZ,fsItalic);
qRep_Text3(EZ,iLinkerRand,qRep_YPos(EZ,y),'Leistungsempfänger : '+qPersSta.A2C('ps_gesnr'));
qSetRepStyle(EZ,fsNormal);
cBuffer := DB_ReadSQLValue(oDB,'PERSSTA','ps_kdnr','ps_nr = '+DB_SqlVal(A_Query.A2C('a_knr'),'C'));
if (not(empty(cBuffer))) then begin
qRep_SText(EZ,'Kastentext','Unsere Lieferanten-Nr.: '+cBuffer,qRep_YPos(EZ,y));
end;
Inc(y);
qRep_Text3(EZ,iLinkerRand,qRep_YPos(EZ,y),qPersSta.A2C('ps_name')+' '+qPersSta.A2C('ps_zusatz1')+' '+qPersSta.A2C('ps_zusatz2'));
Inc(y);
qRep_Text3(EZ,iLinkerRand,qRep_YPos(EZ,y),qPersSta.A2C('ps_strasse'));
Inc(y);
qRep_Text3(EZ,iLinkerRand,qRep_YPos(EZ,y),qPersSta.A2C('ps_plz')+' '+qPersSta.A2C('ps_ort'));
Inc(y);
end;
cBuffer := '';
end;
// AUFTRAGGEBER KUNDE ENDE
Nicht vergessen: qPersSta und cBuffer in den Variablen der Prozedur deklarieren, wenn diese noch nicht vorhanden sind.
Versandanschrift bei Auftragsbestätigungen drucken
Hierfür die Prozeduren AdressKopfVersand(nAdrZeile: Double) und AdressKopfFolgeSeiteKurzVersand(nAdrZeile: Double) verwenden.
PosLine() am Positionsende immer drucken
Falls PosLine() am Ende einer Position ausgeführt wird, soll dies auch immer geschehen, wenn das Positionsende erreicht wird. Hier kann es sein, dass zwischen Langtextdruck und PosLine() der restliche Seitenplatz abgefragt wird. Dies darf aber nur vorm Drucken einer weiteren Zeile geschehen. Bekannt ist hier der Fall, dass es vor der Bedingung des Artikelnummerndrucks abgefragt wird. Ist der Langtext aber das Letzte was gedruckt wird, weil Artikelnummer nicht gedruckt werden sollen, und schließt mit dem Seitenende ab, so muss trotzdem mit PosLine() die Position beendet werden, da auf der nächsten Seite die eine neue Position folgt.
falsch (Abfrage vor Bedingung):
if (y >= iSeitenlaenge -iFusszeilen) then begin
break;
end;
if (Pos('AU',PMode_Var(534)) <> 0) and (not empty(AZ_Query.A2C('az_artnr'))) then begin
muss innerhalb der Bedingung nach dem Inc und vor Artikelnummerndruck:
if (y >= iSeitenlaenge -iFusszeilen) then begin
cWo := 'Vor Artikelnummer';
break;
end;
if (empty(cWo)) or (cWo = 'Vor Artikelnummer') then begin
qSetRepStyle(EZ,fsItalic);
qRep_SText(EZ,'bez1','Art-Nr.: '+AZ_Query.A2C('az_artnr'),qRep_YPos(EZ,y));
qSetRepStyle(EZ,fsNormal);
end;
Positionen werden trotz Einstellung "kein Druck" ausgedruckt
Um dies zu beheben, muss in jedem Vorgangsdruck die Prozedur PositionenOhneAusdruck() aufgerufen werden. Diese ist in der Prozedur Positionen innerhalb der for-Schleife folgendermaßen einzufügen:
for i:=1 to iPosMenge do begin
PositionenOhneAusdruck();
if (not AZ_Query.Eof) then begin
Alternativtitel auch als alternativen Titel drucken
Ähnlich der Alternativposition gibt es auch Alternativtitel. Sämtliche Titelpositionen werden nicht in der Gesamtsumme erfasst. Alternativtitel sind jedoch im Ausdruck nicht ersichtlich. Um dies zu ändern in den Vorgangsdrucken nach der Prozedur Positionen() suchen. Im Case Of für Typ 7 folgende Anpassung vornehmen:
7 : begin
if (DruckeTitel(cResultvor,cWo,cWelcheZeile,nWelcheZeile,i)) then begin
break;
end;
end;
ACHTUNG! Statt Sprachen.inc die neue Datei qSprachen.inc benutzen. Die Deklaration der Sprachvariablen entsprechend aus dem Vorgangsdruck entfernen, da diese in qSprachen.inc deklariert sind.
SQL-Abfrage INSTR ersetzten
In den Drucken befinden sich oftmals noch Statements mit INSTR im WHERE für A_Query. Dies mit DB_SQLInstr wie folgt ersetzten:
if (DB_SOpen(oDB,'SELECT * FROM RECHSTA WHERE ' + DB_SQLInstr('sys_uid',cRechNr,','),A_Query,False,'')) then begin
ACHTUNG! Beispiel ist für Rechnungsdrucke. Bei anderen Vorgangsdrucken darauf achten, nicht einfach diese Bedigung einzufügen, sondern den Tabellennamen der die Vorgangskopfdaten sowie die Variable der System-IDs noch abzuändern!
Seriennummern drucken
Um Seriennummern drucken zu können, muss Folgendes im Druck direkt vor der Artikelnummerbedingung eingefügt werden:
if (DruckeSeriennummern(nWelcheZeile,cWelcheZeile,cWo,cResultvor,'auid')) then begin
break;
end;
ACHTUNG! Je nach Vorgangsdruck muss ein anderes Uid-Feld übergeben werden.
- AU: auid
- LS: luid
- RE: ruid
- Bon: kuid
- LS (Kasse): luid
Bilder drucken
Dies sollte im Regelfall nur den Druck Angebote betreffen. Im Standard findet sich dies jedoch auch im Auftragsdruck. Um Bilder überhaupt Drucken zu können, werden 3 zusätzliche Variablen benötigt.
Variablen
Global:
vorbildprint : String;
Lokal in der Prozedur Positionen():
nPicPos : Integer;
lPicPrinted : Boolean;
Funktionserweitung
Für das Drucken von Bildern nach
case AZ_Query.A2I('az_typ') of
0 : begin
Inc(y);
if (y >= iSeitenlaenge-iFussZeilen) then begin
cWo := 'Vor Bezeichnung1';
break;
end;
in Positionen() suchen. Zwischen Inc(y) und Abfrage folgendes einfügen:
// *** BILDERMODUL ***
cBuffer := vorbildprint;
if BilderModul(AZ_Query,vorbildprint) then begin
cWo := 'Vor Bezeichnung1';
break;
end;
lPicPrinted := (not empty(vorbildprint)) and (cBuffer <> vorbildprint);
nPicPos := y;
// *** BILDERMODUL ***
Wichtig ist hierbei, dass nach dem Langtext y inkremetiert wird, falls y niedriger ist, als das Bildende. Die benötigten Zeilen werden in der Funktion BilderModul (QStandard.inc) berechnet und in der globalen Variablen nBildInc gepeichert (deklariert in QStandard.inc). Falls aber innerhalb der Position ein Seitenumbruch stattfand und das Bild schon gedruckt wurde, darf auf der neuen Seite kein Increment von y erfolgen! Einzufügen ist im Code folgendes:
vor Bedingung für PosLine():
if (not empty(vorbildprint)) and (lPicPrinted) then begin
if ((nPicPos + nBildInc) > y) then begin
y := nPicPos + nBildInc;
end;
end;
if Pmode_Nein(303) then begin
PosLine();
PosCalcUebertrag();
end;