AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Werkzeuge FastReport - Zuordnung Page zu DataSet-Record
Thema durchsuchen
Ansicht
Themen-Optionen

FastReport - Zuordnung Page zu DataSet-Record

Ein Thema von himitsu · begonnen am 25. Okt 2022 · letzter Beitrag vom 28. Okt 2022
Antwort Antwort
mytbo

Registriert seit: 8. Jan 2007
479 Beiträge
 
#1

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 25. Okt 2022, 19:06
Dass es möglich ist und der FR weiß was wo ist, das hatte ich heute schon erfahren/gesehn.
Ja, weil jedes View im Report ein Objekt ist. Das Schema ist so (ohne Beachtung von FR Besonderheiten!):
Delphi-Quellcode:
procedure memWertPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
var
  sValue: String;
begin
  if Sender is TfrxMemoView then
  begin
    sValue := TfrxMemoView(Sender).Text;
    Modified := InputQuery('Bearbeiten', 'Wert ändern:', sValue);
    if Modified then
      TfrxMemoView(Sender).Text := sValue;
  end;
end;
Ich verstehe dein Problem nicht. Jedes Label soll auf eine Seite gedruckt werden. Ein Datensatz ist ein Label. Dann brichst du nach jedem Datensatz die Seite zwangsweise um.

Wenn es dir weiter hilft, kannst du meine Testanwendung verwenden und ein neues Projekt erstellen. Den Bericht designen und alle Daten für den Bericht als JSON Datei(en) hinterlegen und das gesamte Projektverzeichnis als Anhang hier einstellen. Dann kann ich es mir ansehen.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#2

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 25. Okt 2022, 20:44
Einzeln: Ich bekomme ja pro Seite ein Bitmap,
aber falls da was verrutscht, wäre es praktisch, wenn ich wüsste welche Seite/Bitmap zu welchem Datensatz gehört.

Aktuell verwende ich einfach blind die erste Seite (erstes exportiertes Bitmap) und sende sie an das im ersten aktuellen Datensatz verlinke Gerät.




Der Report/Designer ist in einem PixelModus:
frxReport.DotMatrixReport=True
frxDesignerForm.Units=2 (GridType=Pixel)
frxDesignerForm.Grid3=10 (GridSize in Points)
...
frxDesignerForm.ShowBandCaptions=0 -> das MasterData (alle Bänder) ohne Caption, damit die Anzeige im Designer nahezu wie im Ausdruck ist

nahezu = weil die Geräte haben nur 2 oder 3 Farben (hier Schwarz, Weiß und Rot) ... der Report und die Druckvorschau haben noch keine Farbglättung, bzw. viele Fonts auch ein Antialiasing, was später erst im exportierten Bitmap repariert wird, damit der Import nicht anfängt das häßlich zu rastern

Die Page ist z.B. 296 * 128 px groß (für den mittelgroßen kleinen ESL)

Im ReportDesigner gibt es einen TfrxMasterData, der über die ganze Seite positioniert ist.
Darin mehrere Memos, Barcode usw.
Im Prinzip gebe ich nur vor, dass es den einen MasterData gibt und wie die Seite eingerichtet ist (anhand des zugeordneten Gerätes) und dass es im DataSet eine bestimmte Spalte gebn muß, aber was da dann drin liegt, das entscheiden dann später die Designer.

Der FastReport erstellt im Prepare daraus je eine "Gruppe" pro Datensatz.

Also "normal" ein Record im frxReport.DataSet = ein MasterData + Memos usw. = eine Seite
und mehrere Records = gleichviele Seiten
ABER bei Problemen auch mal mehrere Seiten für einen Record, wenn das frxMasterData durch zu großen oder verschobenen Inhalt vergrößert wird. (den Überstand abschneiden, haben wir nicht hinbekommen)



Im Prinzip will ich jetzt einfach nur wissen welcher MasterData (oder welche Komponente ala Memo/Barcode) für einen der Datensätze auf welcher Seite liegt, bzw. auf welcher Seite das jeweilige MasterData beginnt.
Angehängte Grafiken
Dateityp: png BeispielReport.png (128,8 KB, 18x aufgerufen)
Dateityp: png BeispielPreview.png (29,2 KB, 15x aufgerufen)
Dateityp: png BeispielOverflow.png (32,6 KB, 5x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Okt 2022 um 12:59 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
479 Beiträge
 
#3

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 25. Okt 2022, 22:38
ABER bei Problemen auch mal mehrere Seiten für einen Record, wenn das frxMasterData durch zu großen oder verschobenen Inhalt vergrößert wird. (den Überstand abschneiden, haben wir nicht hinbekommen)
Das kommt nicht vor, wenn der Report richtig designt ist. Hier solltest du ansetzen. DotMatrixReport ist mit Vorsicht einzusetzen. Mit der Konstante fr01cm kannst du Pixel in Millimeter umrechnen. Ein Report mit 7,83 x 3,38 wird im BMP Export mit 296 x 128 px gespeichert.

Wie viele ESL Größen außer 296 x 128 px gibt es? Wird für jede Größe ein eigenes Label-Design hinterlegt, oder soll es nach bestimmten Regeln automatisch erfolgen?

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#4

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 26. Okt 2022, 00:22
Wie gesagt, das Drucken selber ist nicht das Problem und die Größen der Seiten (exportieren Bitmaps) passen ... abgesehn von dem Splittfehlerchen.

Wir hatten nur beim Test paar Mal das Problem, dass ein Datensatz (MasterData) auf zwei Seiten zerteilt war.


Ja, bezüglich DotMatrixReport hatte ich vorhin auch in der Hilfe gelesen, dass es nicht genau das ist, was man wir/ich sich unter dem Namen vorstellte.
https://www.fast-report.com/document...ix_reports.htm

Das mit fr01cm war schon bekannt, daher schon lange Page.SetSizeAndDimensions(DMPAPER_USER, _Width / fr01cm, _Height / fr01cm);
Überhaupt erstmal rauszubekommen was intern das für Werte sind (bisher ja immer nur über den Designer eingestellt), die man da angeben muß und dann eben auch noch das fr01cm zu finden, was schon ein bissl Arbeit,
sowie wo man gewisse Optionen programmseitig findet, welche in den OptionsDialogen gemacht werden konnten.

Aber wir sind eh noch etwas am rumprobieren, bezüglich einiger Settings.

Ja, was ist "richtig designt ist" ... sooo winzig und Pixelgenau mußte es bisher nie sein ... viele Einstellungen ausprobiert, aber dieses Problem noch nicht verhindern können.



ShiftMode bei allen Komponenten ist auf smDontShift und die Margins und Gaps sind auf 0, damit selbst bei den winzigen "Rändern", um Alles, es keine automatischen Verschiebungen gibt, denn bei den pixel-kleinen Abständen überschneiden sich auch so schon die Komponenten.
MasterData.AllowSplit=False, ShiftEngine=seDontShift, StartNewPage=True (oder False ... egal, weil kein Unterschied)
irgendwo gab es noch was bezüglich Overlap (finde es grade nicht), was wir ausprobiert hatten.

Wenn ich absichtlich den QRCode unten bzw. rechts überstehen lasse, dann kommt das im Anhang bei raus.
Das ist eigentlich aktuell unser wichtigstes Problem, weswegen ich eben nicht einfach sagen kann PageNo=RecNo und weswegen ich aus dem Report auslesen wollte was wo liegt, damit es "sicher" richtig ist.




Ja, von einem Designer hatten wir schon den Wunsch, dass man einen Report designen und auf unterschedliche Größen anpassen kann,
aber aktuell ist es eh technisch nicht möglich. (bzw. keine Zeit da jetzt auch noch einiges umzubauen)
Theoretisch könnte man im ReportScript oder in einem Feld des DataSet auch das Format mitgeben, aber intern (unser Code) ist es etwas schwer dieses dann zum ReportDesigner, bzw. für die Nach-/Vorarbeiten beim Drucken durchzureichen.
- Vor/beim Prepare, bzw. vorm Öffnen des Designers, müsste dann entsprechend die Seiten-Größe gesetzt werden (falls sie nicht passt) und auch in den Nacharbeiten am Bitmap.
- Falls der exportierte ReportDruck nicht ganz pixelgenau ist, wird das eine Rundungspixel im Width/Height nochmal angepasst, denn für Barcodes kommt es bei diesen kleinen Größen auf jedes Pixel an, da nach Übergaben an die HerstellerAPI wird das Bild im Seitenverhältnis gestetcht, falls es nicht passt. Ja, wir hatten ausversehn dort in deren API anfangs mal ein Pixel in der Höhe vergessen, dann fehlten dadurch in der Breite auch 3 Pixel und schon war der Barcode nicht mehr lesbar ... schlimmer noch, teilweise wurden auch falsche Daten erkannt und die auch noch bei jedem Scan unterschiedlich.

Also aktuell: ein designeter Report = eine GeräteGröße (ist aber für den Anfang auch erstmal OK so)



Unser Probierpacket hat 15 Verschiedne (meistens 2 von Jedem, von den Großen 1 und manche auch mehr)
Der/die Hersteller haben wesentlich mehr im Angebot. (bis hin zu extrem Großen mit mehreren Metern Länge)
Effektiv werden es wohl 1 bis vielleicht 5 sein, denke ich mal, aber das ist im Prinzip egal. (hab da meine Verwaltungsdaten und Schnittstellen relativ unabhängig gestaltet, bis hin, dass für den Export auch andere API/Anbieter hinzugefügt werden können)

Das Template lässt sich aktuell über die API nicht vom Programm erstellen (der deutsche Anbieter/Cloud hier hat auch noch eine etwas ältere API, so dass zusätzlich auch noch Anderes fehlt, was der Chinese schon bietet).
Da ich somit eh die Templates erstellen mußte (das unsere Kunden machen zu lassen ... zu gefählich ... wie gesagt, ein Pixel hatten wir auch schonmal übersehn), hab ich passend auch alle Geräte unseres Probepacks ... mir die Definitionen (Name,Width,Height,Color,Rotation) rausgesucht und als Liste in unserem System.





Nochmal, wie gesagt, im Grunde brauch ich nur eine Zuordnung von Record zu Page. (irgendwie muß das ja gehen)
Damit wäre dann auch alles egal, wie Report nicht richtig designed, sowie sonstige jetzt noch unbekannte oder zukünftige Probleme.
Da womöglich zukünftig auch einige Kunden selber solche Reports erstellen werden, kann ich garnichts ausschließen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Okt 2022 um 00:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#5

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 26. Okt 2022, 12:36
Nach langer Suche dort angekommen
https://www.fast-report.com/en/blog/...view-mode-vcl/
mir ganz unten den vesteckten Hinweis im Gauge1OnContentChanged zu Herzen genommen
{frxReport1.}PreviewPages.Page[i].AllObjects

und nun kämpfe ich mich da mal durch.

Auf den ersten Blick passt es genau, zur Report-Vorschau im Post #7 (abgesehn vom TfrxNullBand)
Code:
--- 0 -------------------------------------------
TfrxNullBand
TfrxMasterData MasterData1
TfrxMemoView Memo2
TfrxMemoView Memo3
TfrxBarCodeView BarCode1
TfrxMemoView Memo4
TfrxMemoView Memo5
--- 1 -------------------------------------------
TfrxMasterData MasterData1
TfrxBarcode2DView Barcode2D1
--- 2 -------------------------------------------
TfrxMasterData MasterData1
TfrxMemoView Memo2
TfrxMemoView Memo3
TfrxBarCodeView BarCode1
TfrxMemoView Memo4
TfrxMemoView Memo5
--- 3 -------------------------------------------
TfrxMasterData MasterData1
TfrxBarcode2DView Barcode2D1
Weiter rein, sagen sämtliche Indexwerte rein garnichts und das DataSet ist auch immer NIL.
Code:
--- 0 -------------------------------------------
[nil] [nil]
TfrxNullBand
TfrxMasterData MasterData1
   col 0
   row 0
   bnd 6
   idx 0
   grp 0
   pg0 False
   pg.idx 0
   pg.grp 0
   dsn WorkSql
   ds [nil] [nil]
   vds TfrxUserDataSet
TfrxMemoView Memo2
TfrxMemoView Memo3
TfrxBarCodeView BarCode1
TfrxMemoView Memo4
TfrxMemoView Memo5
--- 1 -------------------------------------------
[nil] [nil]
TfrxMasterData MasterData1
   col 0
   row 0
   bnd 6
   idx 0
   grp 0
   pg0 False
   pg.idx 0
   pg.grp 0
   dsn WorkSql
   ds [nil] [nil]
   vds TfrxUserDataSet
TfrxBarcode2DView Barcode2D1
--- 2 -------------------------------------------
[nil] [nil]
TfrxMasterData MasterData1
   col 0
   row 0
   bnd 6
   idx 0
   grp 0
   pg0 False
   pg.idx 0
   pg.grp 0
   dsn WorkSql
   ds [nil] [nil]
   vds TfrxUserDataSet
TfrxMemoView Memo2
TfrxMemoView Memo3
TfrxBarCodeView BarCode1
TfrxMemoView Memo4
TfrxMemoView Memo5
--- 3 -------------------------------------------
[nil] [nil]
TfrxMasterData MasterData1
   col 0
   row 0
   bnd 6
   idx 0
   grp 0
   pg0 False
   pg.idx 0
   pg.grp 0
   dsn WorkSql
   ds [nil] [nil]
   vds TfrxUserDataSet
TfrxBarcode2DView Barcode2D1
Delphi-Quellcode:
  for i := 0 to frxReport1.PreviewPages.Count - 1 do begin
    OutputDebugString(PChar('--- ' + IntToStr(i) + ' -------------------------------------------'));
    OutputDebugString(PChar(frxReport1.PreviewPages.Page[i].DataSet.SecureClassName + ' ' + frxReport1.PreviewPages.Page[i].DataSet.SecureName));
    for P in frxReport1.PreviewPages.Page[i].AllObjects do begin
      if TObject(P) is TComponent then
        OutputDebugString(PChar(TObject(P).SecureClassName + ' ' + TComponent(P).SecureName))
      else
        OutputDebugString(PChar(TObject(P).SecureClassName));

      if TObject(P) is TfrxMasterData then begin
        OutputDebugString(PChar(' col ' + IntToStr(TfrxMasterData(P).Columns)));
        OutputDebugString(PChar(' row ' + IntToStr(TfrxMasterData(P).RowCount)));
        OutputDebugString(PChar(' bnd ' + IntToStr(TfrxMasterData(P).BandNumber)));
        OutputDebugString(PChar(' idx ' + IntToStr(TfrxMasterData(P).IndexTag)));
        OutputDebugString(PChar(' grp ' + IntToStr(TfrxMasterData(P).GroupIndex)));
        OutputDebugString(PChar(' pg0 ' + BoolToStr(TfrxMasterData(P).Page = frxReport1.Pages[0], True)));
        OutputDebugString(PChar(' pg.idx ' + IntToStr(TfrxMasterData(P).Page.IndexTag)));
        OutputDebugString(PChar(' pg.grp ' + IntToStr(TfrxMasterData(P).Page.GroupIndex)));
        OutputDebugString(PChar(' dsn ' + TfrxMasterData(P).DataSetName));
        OutputDebugString(PChar(' ds ' + TfrxMasterData(P).DataSet.SecureClassName + ' ' + TfrxMasterData(P).DataSet.SecureName));
        OutputDebugString(PChar(' vds ' + TfrxMasterData(P).VirtualDataSet.SecureClassName + ' ' + TfrxMasterData(P).VirtualDataSet.SecureName));
      end;
    end;
  end;
Das "eine" Memo oder den QRCode könnte ich verwenden, aber welches soll ich da nehmen (kann ja nicht wissen, was auf dem Report drauf ist)
Das frxMasterData selber sagt bisher garnichts.
Im VirtualDataSet und der Page selber schau ich dann mal weiter.

Am Einfachsten mal den Hersteller fragen, warum TfrxMasterData kein TagStr hat und ob er es schnell einbauen kann ... dann wäre ich fertig.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Okt 2022 um 12:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#6

AW: FastReport - Zuordnung Page zu DataSet-Record

  Alt 28. Okt 2022, 15:08
wenn der Report richtig designt ist. ... DotMatrixReport ist mit Vorsicht einzusetzen.
Nja, es geht noch weiter.
Jetz hab ich erstmal eine Schleife drin, welche alle Top/Left/Width/Height/usw. auf ganze Pixel rundet.

Diesbezüglich ist DotMatrixReport wohl auch erstmal passend,
denn wie beim Nadeldrucker sind die Pixel recht groß/scharf.

Barcodekomponente um einen Bruchteil eines Pixels verschoben, schon ist er nicht mehr lesbar. Bei QRCodes ebenfalls, wenn Zoom kleiner 3.
Die Displays kennen nur zwei oder drei Farben, z.B. Schwarz/Weiß/Rot ohne Abstufungen.

Kunde bestellt sich zwar auch gerade ein neues Model, was RGB kann, aber was genau "RGB" dort bedeutet, da bin ich gespannt, denn genau heißt der ColorMode "BW_RGB_Y_Orange".
Bei RGB sind doch eigentlich alle Farben schon drin, also wozu extra nochmal Black, White, Yellow? und Orange nennen?
Und 24 Bit geht schonmal nicht, da das Bitmap maximal 600kb sein darf und so wären es fast 800kb ... also doch 16 oder 8 Bit mit Farbtabelle.


egal, zurück zum Thema

Vom Hersteller (Forum) noch keine Antwort,
aber erstmal geht es.

Wenn RecordCount=Page.Count, dann nehme ich den Wert aus dem DataSet (oder wenn nicht die Vorgabe '')
und anschließend wird nochmal durch die jeweilige PreviewPage gegangen und in allen Memo- und Barcode-Views nach einem gefüllten TagStr gesucht.
So lange RecNo=PageNo wird also automatisch ein Wert genommen und optional kann man die Zugehörigkeit auch maunell definieren.


Gesten stundenlang nochmal getestet ... und im Grunde geht es nun.
OK, abgsehn, dass der Hersteller das WebPortal und mal wieder die API geändert hat und weil zugleich auch noch einer unserer AccessPoints unbemerkt kaputt war, wurde ein Fehler an falscher lange Stelle gesucht.

Echt geil auch, dass diese API auch bei einem Sende-Fehler immer SUCCESS sagt (vermutlich "ja, ich hab es erhalten" , aber nicht "ja, das ESL ist erreichbar und ich sende es jetzt/gleich")
und "ach ja, wir haben die API geändert, aber dir nichts gesagt ... der eine Parameter ist jetzt Optional und egal was du da rein schreibts, es gibt keine Fehlermeldung, selbst wenn es komplett falsch ist" ... vor 2 Monten erst den neuen, inzwischen alten Parameter einbauen müssen, weil er Pflicht war.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Okt 2022 um 15:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz