OBS/Adminhilfe/RTF: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 335: Zeile 335:
<source lang="delphi">
<source lang="delphi">
     if (DB_SOpen(oDB,'SELECT * FROM rechsta WHERE ' + DB_SQLInstr('sys_uid',cRechNr,','),A_Query,False,'')) then begin
     if (DB_SOpen(oDB,'SELECT * FROM rechsta WHERE ' + DB_SQLInstr('sys_uid',cRechNr,','),A_Query,False,'')) then begin
</source>
----
=== Seriennummern drucken ===
Über den Programmparameter 420 lässt sich das drucken von Seriennummern Steuern. In den Drucken ist dafür nicht immer etwas enthalten. Folgendes ist dafür vor der Bedingung für den Artikelnummenrdruck einzufügen:
<source lang="delphi">
   
                if (PMode_Ja(420)) then begin
                  cBuffer := '';
                  cSql := 'SELECT * FROM serien WHERE ruid = '+DB_SQLVal(AZ_Query.A2C('az_uid'),'C');
                  if (DB_SOpen(oDB,cSql,qSerien,'',False)) then begin
                    while (not(qSerien.Eof)) do begin
                      cBuffer := cBuffer + AllTrim(qSerien.A2C('snr')) + ',' + CRLF;
                      qSerien.Next;
                    end;
                    cBuffer := LeftStr(cBuffer,Length(cBuffer)-3);
                  end;
                  DB_Close(qSerien);
                  if (not empty(cBuffer)) then begin
                    cBuffer := 'SERNR.: ' + cBuffer;
                    iZeilen := MLCount(cBuffer,100);
                    if (empty (cResultvor)) or (cResultvor = 'Seriennr') then begin
                      for j := nWelcheZeile to iZeilen do begin
                        Inc(y);
                        if (y >= iSeitenlaenge -iFusszeilen) then begin
                          cWo := 'Seriennr';
                          cWelcheZeile := IntToStr(j);
                          break;
                        end;
                        qRep_SText(EZ,'bez1',StrTran(MemoLine(cBuffer,200,j),#13#10,''),qRep_YPos(EZ,y));
                      end;
                      if(cWo <> '') then begin
                          break;
                      end else begin
                      nWelcheZeile := 1;
                      cWelcheZeile := '';
                      cResultvor := '';
                      end;
                    end;
                    cBuffer := '';
                  end;
                end;
</source>
</source>


----
----

Version vom 1. November 2011, 10:30 Uhr

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration

Umstellung auf RTF

Was ist zu tun?

  1. PMode 916 auf Ja stellen
  2. Drucke für RTF anpassen
  3. Kontrollieren ob die Wörterbuchdateien (Datei:DICT.ZIP) im Verzeichnis (obs\data\DICT\) liegen

Druckanpassungen

In den vars hinzufügen (Vorbildprint nur wenn auch Bilder ausgedruckt werden sollen):

    vorbildprint       : String;
    nRTFStart          : integer;
    nRTFCharCount      : integer;

Nach

    // KOPFTEXT ANFANG

suchen und den Abschnitt durch folgendes ersetzen:

    if (lKopfFuss) then begin
      cBuffer := A_Query.FieldByName('a_kopftext').asString;
      if (not empty(Alltrim(cbuffer))) then begin
        LangtextDruck(cBuffer,'posnr',cResultVor);
        Inc(y,0.5);
        cBuffer := '';
      end;
    end;

Nach

procedure Positionen();

suchen und in den Vars einfügen:

    nAnzCharDruck : Integer;
    cRTFOrg       : String;
    nLMemo        : Integer;

Nach

    cWelcheZeile   := Token(cWWI,'|',3);

Suchen, danach hinzufügen:

    nLMemo         := 0;

Nach

cBuffer := AZ_Query.FieldByName('az_memofeld').asString;

in Positionen(); suchen und alles was in nachfolgendem IF vorkommt ersetzen mit:

                 if (not empty(cBuffer)) then begin
                   if (empty (cResultvor)) then begin
                     inc(y);
                   end;
                   if PositionLangtextDruck(cBuffer,nWelcheZeile,cWo,cWelcheZeile,cResultVor,RTF_LANGTEXT) then begin
                     break;
                   end;
                   Dec(y);
                 end;
                 if (y >= iSeitenlaenge -iFusszeilen) then begin
                   break;
                 end;

Wiederholen, bis alle az_memofeld-Benutzungen (3x) in Positionen so umgestellt sind.


In Positionen am ende des Cases einen neuen Punkt

          17 : begin
                  if Pagebreak(cWo,cResultvor) then begin
                     break;
                  end;
               end;

hinzufügen.


Suche

TextFuss();

Ersetzen durch

 TextFussRich();

Für das Drucken von Bildern nach

    cBuffer := AZ_Query.A2C('az_bez2');

in Positionen suchen, danach hinzufügen:

                             // Bildermodul-Funktionsaufruf
                             BilderModul(AZ_Query,vorbildprint);

Wichtig ist hierbei, dass nach dem Langtext y inkremetiert wird, falls y niedriger ist, als das Bildende. Für die feste Bildgröße gibt es die Konstante PIC_HEIGHT (deklariert in QStandard.inc). Einzufügen ist im Code folgendes:

neue Variable in Positionen():

    nPicPos       : Integer;

Setzen nach Bildermodul-Aufruf:

                 // Bildermodul-Funktionsaufruf
                 BilderModul(AZ_Query,vorbildprint);
                 nPicPos := y;

vor Bedingung für PosLine():

                 if (not empty(vorbildprint)) then begin
                     if ((nPicPos + PIC_HEIGHT) > y) then begin
                         y := nPicPos + PIC_HEIGHT;
                     end;
                 end;

                 if Pmode_Nein(303) then begin
                     PosLine();
                     PosCalcUebertrag();
                 end;

Allgemeine Umstellung Drucke

Druckanpassungen

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.FieldByName('az_lsnr').AsString <> '') then begin
                   cBuffer := cAllg10+AZ_Query.FieldByName('az_lsnr').AsString;
                 end;
                 if ( (not empty(AZ_Query.FieldByName('az_lsdat').AsString)) and 
                      (AZ_Query.FieldByName('az_lsdat').AsFloat > 0) )       then begin
                   if (empty(cBuffer)) then begin
                     cBuffer := AZ_Query.FieldByName('az_lsdat').AsString;
                   end else begin
                     cBuffer := cBuffer + ' / ' + AZ_Query.FieldByName('az_lsdat').AsString;
                   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.FieldByName('az_kolli').asString,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.FieldByName('az_inhalt').asFloat,12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y));
      qRep_SText(EZ,'menge'  ,TStr(AZ_Query.FieldByName('az_menge').asFloat,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.FieldByName('az_einheit').AsString,'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.


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

Versandanschrift bei Auftragsbestätigungen drucken


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.FieldByName('az_artnr').AsString)) then begin

muss innerhalb der Bedingung nach dem Inc und vor Artikelnummerndruck:

                   if (y >= iSeitenlaenge -iFusszeilen) then begin
                     break;
                   end;

                   qSetRepStyle(EZ,fsItalic);
                   qRep_SText(EZ,'bez1','Art-Nr.: '+AZ_Query.FieldByName('az_artnr').AsString,qRep_YPos(EZ,y));
                   qSetRepStyle(EZ,fsNormal);

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:

von:

                 if (lTitelSeite) and (empty(cResultvor)) and (i <> 1) then begin
                   cWo := 'Titel Zeile';
                   cWelcheZeile := '1';
                   break;
                 end;

                 Inc(y);
                 qSetRepStyle(EZ,fsItalic);
                 qRep_SText(EZ,'bez1',cAllg6,qRep_YPos(EZ,y));
                 qSetRepStyle(EZ,fsNormal);


nach:

                 if (lTitelSeite) and (empty(cResultvor)) and (i <> 1) then begin
                   cWo := 'Titel Zeile';
                   cWelcheZeile := '1';
                   break;
                 end;

                 cBuffer := '';
                 if (AZ_Query.A2C('az_posart') = '2') then begin
                     cBuffer := 'Alternativer ';
                 end;

                 Inc(y);
                 qSetRepStyle(EZ,fsItalic);
                 qRep_SText(EZ,'bez1',cBuffer + cAllg6,qRep_YPos(EZ,y));
                 qSetRepStyle(EZ,fsNormal);

ACHTUNG! Sinnvoller wäre es für mich dies als neue Variable zu machen (cAllg11) und den Variablenblock in die Sprachen.inc zu verschieben. Dann wären auch neue Variablen an der Stelle in Zukunft nicht so problematisch wie zuletzt cKopf12 und dieser Fall hier.


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

Seriennummern drucken

Über den Programmparameter 420 lässt sich das drucken von Seriennummern Steuern. In den Drucken ist dafür nicht immer etwas enthalten. Folgendes ist dafür vor der Bedingung für den Artikelnummenrdruck einzufügen:

    
                 if (PMode_Ja(420)) then begin
                   cBuffer := '';
                   cSql := 'SELECT * FROM serien WHERE ruid = '+DB_SQLVal(AZ_Query.A2C('az_uid'),'C');
                   if (DB_SOpen(oDB,cSql,qSerien,'',False)) then begin
                     while (not(qSerien.Eof)) do begin
                       cBuffer := cBuffer + AllTrim(qSerien.A2C('snr')) + ',' + CRLF;
                       qSerien.Next;
                     end;
                     cBuffer := LeftStr(cBuffer,Length(cBuffer)-3);
                   end;
                   DB_Close(qSerien);

                   if (not empty(cBuffer)) then begin
                     cBuffer := 'SERNR.: ' + cBuffer;
                     iZeilen := MLCount(cBuffer,100);
                     if (empty (cResultvor)) or (cResultvor = 'Seriennr') then begin
                       for j := nWelcheZeile to iZeilen do begin
                         Inc(y);
                         if (y >= iSeitenlaenge -iFusszeilen) then begin
                           cWo := 'Seriennr';
                           cWelcheZeile := IntToStr(j);
                           break;
                         end;
                         qRep_SText(EZ,'bez1',StrTran(MemoLine(cBuffer,200,j),#13#10,''),qRep_YPos(EZ,y));
                       end;
                       if(cWo <> '') then begin
                          break;
                       end else begin
                       nWelcheZeile := 1;
                       cWelcheZeile := '';
                       cResultvor := '';
                       end;
                     end;
                     cBuffer := '';
                   end;
                 end;