![]() |
FastReport - Zuordnung Page zu DataSet-Record
Moin,
wie bekommt man es am Einfachsten hin, zu einem Record-Datensatz die gedruckte Seite zuzuordnen? Also Record in frxReport1.Dataset zu den Seiten/Bildern vom TfrxBMPExport. So lange alles perfekt läuft, erzeugt jeder Datensatz eine Seite. (PageNo = RecNo) Gibt es aber Probleme, z.B. weil der QR-Code zu groß wird, dann sind es mehrere Seiten pro Datensatz. Nach dem Prepare/Export müsste ich dann wohl irgendwie auf die Komponenten der Seiten zugreifen und mir von dort irgendwie einen Wert rausholen. frxReport1.PreviewPages.Page[i] ??? Genau hab ich im HauptDataset ein Field und dessen Inhalt hätte ich gern, jeweils zu den Seiten des Exports. * es gibt auf der Design-Page "ein" vollflächiges TfrxMasterData mit Memos, Barcode usw. * und jetzt bräuchte ich nach dem Prepare/Export auf den Pages irgendwo einen gespeicherten Wert * im Barcode. oder frxMemo.TagStr ließe sich über eine Variable <WorkSql."esl_barcode"> der Wert hinterlegen (diese eine Komponente müsste ich dann auch noch irgendwie identifizieren) * einfacher wäre es wohl sowas direkt an der frxMasterData zu haben, aber dort gibt es kein TagStr, in Description werden Variablen nicht ersetzt und sonst gibt es nichts (im PropertyEditor zu finden) * * aber eventuell kennt ja das MasterData auch schon intern (codeseitig) seine Zuordnung zu seinem DataSet (RecNo oder eine ID oder Kopie der Fields) Im Grunde geht es jetzt darum, dass ich die Bilder vom Report zu ESLs zuordnen zu können und die Ausgabe dann an diese Devices zu übertragen. ![]() (im Moment nehme ich mir einfach die erste Seite und schicke sie an die ID aus dem ersten aktuellen Record) |
AW: FastReport - Zuordnung Page zu DataSet-Record
Ich habe die Tage was vergleichbares gebraucht, bin "einfach" hergegangen und habe keinen Gesamtreport erstellt und als PDF Einzelseiten exportiert, sondern halt Einzelpdf (also für einen Datensatz einen Report, den exportieren,...). nicht schön, dauert lange, funktioniert aber. Über welche Menge von Bildern sprechen wir denn?
|
AW: FastReport - Zuordnung Page zu DataSet-Record
Das funktioniert aktuell schon, also je ein Gerät einzeln.
Aber wenn jetzt z.B. ein Artikel mehrere Lagerorte hat und man überall die Labels aktualisieren will, müssten mehrere Reports, bzw. mehrmals der gleiche Report (mit anderen Daten) gedruckt werden und das ist schon bissl unpraktisch. Nja, mehr als 4-5 werden es wohl nicht werden, außer jemand will mal ALLE Labels für ALLES aktualsieren (z.B. weil neues Design des Reports) :lol: Wie gesagt, wenn alles super läuft, dann ist es einfach und ich könnte Seite mit RecNo gleichsetzen, aber schon beim zweiten Test war es mit passiert, dass der QR-Code fehlplatziert war und somit einen Seitenumbruch erzeugte. Gehe ich dann einfach mit PageNo=RecNo ran, würden ab dem zweiten Gerät die Inhalte nicht mehr stimmen. Siehe Bild: ![]() Falls es einen "falschen" Seitenumbruch gibt, und nur die erste Hälfte vom Label zu sehen wäre, wäre nicht so schlimm, so lange es wenigstens der richtige (zugehörige) halbe Inhalt ist und bei den nachfolgenden Labels nicht das Falsche drauf stünde. |
AW: FastReport - Zuordnung Page zu DataSet-Record
Dass es möglich ist und der FR weiß was wo ist, das hatte ich heute schon erfahren/gesehn.
Mitbekommen, dass wir für einen Kunden mal was gebaut hatten. (von dem, der jetzt die neuen Labels designen soll) Da kann man in der Druckvorschau auf Zahlen (frxMemos) klicken, im OnClick geht ein InputQuery auf, man kann andere Werte eingeben und die werden dann zurück in die Datenbank geschrieben. Der bekommt im OnClick (FastScript) das Memo als Sender und das kennt alles Nötige (z.B. seine ID im .TagStr) .... ich muß jetzt nur noch rausbekommen, wie ich von außen da dran komm. |
AW: FastReport - Zuordnung Page zu DataSet-Record
Zitat:
Delphi-Quellcode:
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.
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; Wenn es dir weiter hilft, kannst du meine ![]() Bis bald... Thomas |
AW: FastReport - Zuordnung Page zu DataSet-Record
klar, Einzeln drucken ist nicht so sexi - aber es erfüllt halt seinen Zweck. Vor allem wenn du das Resultat einzeln dann an das jeweilige Gerät übertragen musst.
|
AW: FastReport - Zuordnung Page zu DataSet-Record
Liste der Anhänge anzeigen (Anzahl: 4)
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. |
AW: FastReport - Zuordnung Page zu DataSet-Record
Zitat:
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 |
AW: FastReport - Zuordnung Page zu DataSet-Record
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. :stupid: ![]() Das mit fr01cm war schon bekannt, daher schon lange
Delphi-Quellcode:
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. |
AW: FastReport - Zuordnung Page zu DataSet-Record
Nach langer Suche dort angekommen
![]() mir ganz unten den vesteckten Hinweis im Gauge1OnContentChanged zu Herzen genommen
Delphi-Quellcode:
{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:
Weiter rein, sagen sämtliche Indexwerte rein garnichts und das DataSet ist auch immer NIL.
--- 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
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:
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)
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 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. :angle2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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