List & Label "set relation"

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

List & Label "set relation"

Beitrag von AUGE_OHR »

hi,
Ich versuche mich an LL13 und fand auf der Devcon CD ein Beispiel mit
LL_PrintMixed() in IN_PRINT.PRG "changed by Thomas Liehr"

Wenn ich das richtig verstehe wird da mit 2 "Tabellen" gearbeitet ?

Code: Alles auswählen

Select INV_L
DbSetScope(SCOPE_BOTH,Str(nToIn_ID,5,0))
DbGotop()
LL_PrintMixed("INV","INV_L",SetAppWindow(),"invoice.lst",lDesigner,lPreview)
Nun wird ja durch das SCOPE es auf einen Bereich festgelegt. Wie
bekomme ich den da ein "wechselnde ID" rein ... oder ein SET RELATION
TO ARTNR INTO CHINABMP

und damit wäre ich auch schon bei der 2.) Frage : Wie muss ich für ein
Bitmap aus einer Memodatei Type "V" für L&L "aufbereiten" damit ich es
verarbeiten kann ( pro Line / ARTNR evtl ein BMP ) ?

gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: List & Label "set relation"

Beitrag von AUGE_OHR »

hi,
AUGE_OHR hat geschrieben: und damit wäre ich auch schon bei der 2.) Frage : Wie muss ich für ein
Bitmap aus einer Memodatei Type "V" für L&L "aufbereiten" damit ich es
verarbeiten kann ( pro Line / ARTNR evtl ein BMP ) ?
Ich suche immer noch nach der Antwort. Mein Problem ist vor allem das
ich bei L&L nicht weiss "wonach" ich suchen soll da mir nicht klar ist ob
und wie L&L ein Memo Type "V" verarbeitet.

gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Jimmy.

LL_PrintMixed() ist von mir. Den Code dafür findest Du in LLPRINT.PRG beim Beispiel. Da wird mit Scopes gearbeitet, wenn ich mich recht erinnere.

Um Bilder einzubinden, ist es am einfachsten, über die Drawing()-Funktionen innerhalb des Designers auf Pfade zuzugreifen. Was ist "Memo-Typ V"?
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben: LL_PrintMixed() ist von mir. Den Code dafür findest Du in LLPRINT.PRG beim Beispiel. Da wird mit Scopes gearbeitet, wenn ich mich recht erinnere.
ja das ist die Function die ich meine
Tom hat geschrieben: Um Bilder einzubinden, ist es am einfachsten, über die Drawing()-Funktionen innerhalb des Designers auf Pfade zuzugreifen.
Was ist "Memo-Typ V"?
Naja eine Bitmap in einer FPT Memodatei.
ich habe jetzt was mit

Code: Alles auswählen

LLObj.LlDefineFieldExtHandle("Table.Image", pictA.Handle, LL_DRAWING_HBITMAP) 
gefunden nur wie ich das verwenden ist mir noch nicht klar. Ich "sehe"
da was mit "pictA.Handle" ... was könnte damit gemeint sein ?
Wie ich ein Bitmap mit Xbase++ darstelle ist mir klar, aber was ist das
"handle" von einem Bitmap ?

gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Jimmy.

Das wäre ein Handle z.B. auf eine on the fly erstellte Metadatei aus Deiner Anwendung. Aber das willst Du ja nicht (und das geht m.E. auch mit einer Xbase-Anwendung so nicht). Du willst Grafiken zeichnen, die als Blob bzw. Binärdaten vorliegen. Solche Felder solltest Du wie gehabt publizieren (LlDefineField) und dann im Designer mit Drawing() anzeigen. Oder über die Formel-Funktionalitäten bei Bildobjekten. Am einfachsten ist es allerdings, Bilddaten aus Dateien anzuzeigen. Dazu müßtest Du innerhalb der Druckroutine Deine V-Daten in eine Temporärdatei schieben und den Namen dieser Temporärdatei als Zeichenkette veröffentlichen, um sie mit Drawing() in der Tabelle anzeigen zu lassen.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben: Das wäre ein Handle z.B. auf eine on the fly erstellte Metadatei aus Deiner Anwendung. Aber das willst Du ja nicht (und das geht m.E. auch mit einer Xbase-Anwendung so nicht). Du willst Grafiken zeichnen, die als Blob bzw. Binärdaten vorliegen. Solche Felder solltest Du wie gehabt publizieren (LlDefineField) und dann im Designer mit Drawing() anzeigen. Oder über die Formel-Funktionalitäten bei Bildobjekten.
ok das hab ich jetzt erstmal soweit:

Code: Alles auswählen

PROCEDURE LlPublishData(...)
...
CASE aType[i] $ "V" // BLOB
IF lAsFields
   LlDefineFieldExt(hJob,aField[i],Trim(MyContens),LL_DRAWING_HBITMAP,0)
ELSE
  LlDefineVariableExt(hJob,aField[i],Trim(MyContens),LL_DRAWING_HBITMAP,0)
ENDIF
damit hab ich das FELD "BITMAP" auch im Designer ... aber es passiert nix
Tom hat geschrieben: Am einfachsten ist es allerdings, Bilddaten aus Dateien anzuzeigen. Dazu müßtest Du innerhalb der Druckroutine Deine V-Daten in eine Temporärdatei schieben und den Namen dieser Temporärdatei als Zeichenkette veröffentlichen, um sie mit Drawing() in der Tabelle anzeigen zu lassen.
Da ich die in "Bilder" auch noch mal als "externe" Bitmaps hab, habe
ich das dann mal mit

Code: Alles auswählen

JOB_PATH -> vorher definierter Data Path
BILDNR     -> "C",5

Drawing(JOB_PATH+"PIC"+Rtrim$(BILDNR)+".BMP")
In der "Kontroll" Box wird die Eingabe mit dem Path richtig dargestellt
und die *.BMP Datei existiert, aber ausser das sich die "Höhe" einer
Datenzeile ändert passiert nichts...

Tja und angefangen hatte ich eigendlich mit der LL_PrintMixed() weil ich
es gleich mit SET RELATION probieren wollte ...

Frage : ist LL_PrintMixed() eine "offizielle" Lösung die irgendwo aus den
vorhandenen Sourcen stammt (und wenn welche) ?

... den irgendwie macht die das nicht so wie "erwartet".

Code: Alles auswählen

   SELECT ARTIKEL
   SET RELATION TO ARTIKEL->ARTNR INTO CHINABMP
   DbGotop()

   LL_PrintMixed("CHINABMP","ARTIKEL",SetAppWindow(),ZPath+"ART_WG.lst",lDesigner,lPreview)

   SELECT ARTIKEL
   SET RELATION TO
   CLOSE DATA
bei LL_PrintMixed() wird aus der ersten DBF "Variabeln" und aus der 2nd
DBF die "FELDER" im L&L Designer. Wenn man aber im Assisenten auf
L&L Function zugreifen will kommt man auch an die "FELDER" aber nicht
an die "Variabeln".

Leider geht es so trotzdem nicht mit der RELATION, die "Variable" bleibt
leer ... ( ARTNR INTO CHINABMP -> BILDNR = "C",5 )

jemand noch eine Idee für die Probleme : Wie setzte ich mit L&L eine 1:1
RELATION und wie bekomme ich "Externe" oder "V-Type" Bitmaps wie
bei dem Beispiel im L&L Helpfile ( "Zeichnungen" ) hin und ist bei den
Source dazu irgendwo ein Beispiel ?

gruss by OHR
Jimmy
Nachtrag:

Code: Alles auswählen

PROCEDURE LL_PrintMixed
...
* publish fields
LlPublishData(.T.,hJob,aField,aType,aLen,aDec)
//
// hier für meine SET RELATION Version notwendig
//
DbSelectArea(cDataSource1)
LlPublishData(.F.,hJob,aField1,aType1,aLen1,aDec1)
DbSelectArea(cDataSource2)
...
damit läuft zumindest die SET RELATION .)
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

"externes" Bitmap

Beitrag von AUGE_OHR »

moin,

Ich hab es nun doch mit "externen" Bitmap hin bekommen :)

Was man über L & L (13+SP1) wissen muss :
1.) unter "Hintergrund" muss "Proportionen erhalten" auf "True"
2.) unter "Layout" geht "Höhe" = 0 NICHT. "Höhe" ist abhängig von
der Bitmap "Size" und muss "ausprobiert" werden bis man was
"sieht"

wenn man das nicht so "richtig" eingestellt hat dann "sieht" man in L & L
nichts ... aber irgendwie musste es ja gehen !

Also mit den "Variabeln" in L & L hab ich ja schon erfolgreich gearbeitet.
Ich hab dann eine neue "Variable" in L & L angelegt und ihm ein BMP
zugewiesen :

Code: Alles auswählen

LlDefineVariableExt(hJob,"@BILD1","D:\ALASKA\RES\BEXIT1.BMP",LL_DRAWING,0)
sobald ich die Zeile drin hatte und "@BILD1" im L & L Designer eingefügt
habe hat sich die "Höhe" der Datenzeile vergrössert aber wieder hab ich
nichts "gesehen". Nun fing ich an mit den "Propertys" von L & L rum zu
spielen ... bis ich auf einmal das Bitmap "sah" :)

Nun wollte ich das ganze "dynamisch" haben also

Code: Alles auswählen

// aus der DEVCON REP-02 LL_PRINT.PRG
//
LlDefineFieldExt(hJob,"number",Ltrim(Str(nNumber,12,0)),LL_NUMERIC,0)
//
LlDefineVariableExt(hJob,"@BILD2",ZPATH+"PIC\"+TRIM(ARTIKEL->ARTNR)+".BMP",LL_DRAWING,0)
leider war das Resultat nicht wie erhofft ... ich "sah" die "Variabel" nicht
im L & L Designer wohl aber "number". Also noch mal in den Source von
LL_Print.PRG nach "number" gesucht und es 2x gefunden ?!
Klar da steht ja auch "number++" in der DO/WHILE also muss auch dort
mein "@BILD2" nochmal (!) hin und das war es dann. BINGO !

... aber da ist immer noch die Frage warum ich ein Bitmap (?) nicht direkt
aus einem "V" Type Memo "verarbeiten" kann ? Der L & L Designer nimmt
das Memo scheinbar als "Zeichnung" an aber ich "seh" nichts ... :(

was ist das "Handle" (LlDefineFieldExtHandle) von einem Bitmap ?

gruss by OHR
Jimmy
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

ich weiß ist zwar Uralt :-)
aber gibts das Beispiel noch-->
Ich versuche mich an LL13 und fand auf der Devcon CD ein Beispiel mit
LL_PrintMixed() in IN_PRINT.PRG "changed by Thomas Liehr"
oder ein anderes welches mir einen kleinen Einblick erlaubt, wie man für L&L Relation mit Druckschleife etc. verwendet..? danke euch..
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

@e25: Die Samples von L&L enthalten Xbase++-Beispiele. Da sieht man auch, wie eine Druckschleife aussehen sollte. Ist m.E. auch in der Trial-Version enthalten.
Herzlich,
Tom
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

Danke erstmal, die eigentlich Druckschleife ist nicht das Problem ..sondern die übergabe der Relationen etc. für den Druck (für Designer kein Problem) :-)
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

Wenn man L&L "nativ" in Xbase++ (und auch in anderen Sprachen) verwendet, muss man das Konzept verstehen, und das ist eigentlich ganz einfach. L&L ist die Datenquelle egal. Das bedeutet, dass L&L nicht "in den Daten navigiert", und es bedeutet auch, dass man L&L beliebige Daten übermitteln kann. LlDefineField[Ext]() erzeugt in L&L ein Feld, LlDefineVariable[Ext] erzeugt eine (statische) Variable (die sich dennoch innerhalb der Druckschleife ändern kann). "Label"-Projekte kennen keine Tabellen, sondern je Feld nur eine Ausprägung pro Druckseite (kann man auch austricksen), aber standardmäßig ist es so.

In der Druckschleife durchwandert man - nach dem Prolog mit LlDefineFieldStart() usw. - die zu übermittelnde Tabelle (kann auch ein Array sein) und publiziert alle Felder mit LlDefineField[Ext]. Die Beispielfunktion "DefineData" zeigt das in vereinheitlichter Form. Sobald ein Feld einen Präfix hat, der mit einem Punkt endet, gruppiert L&L diese Felder dem Präfix entsprechend (KUNDE.NAME, KUNDE.NUMMER, ARTIKEL.NUMMER, ARTIKEL.BESCHREIBUNG - es entstehen zwei Gruppen, die "KUNDE" und "ARTIKEL" heißen. Weitergehende Wirkung hat das zunächst nicht - es ist nur beim Formulardesign einfacher). In Tabellen sollte man hauptsächlich Felder drucken, aber, wie gesagt, man kann auch mit Variablen herumtricksen. LlPrint() löst dann jeweils eine Tabellenzeile aus (und noch vieles mehr, aber im Prinzip zunächst einmal eine Tabellenzeile).

Komplex wird das, wenn man verknüpfte Tabellen bzw. Kreuztabellen drucken will. Hierfür muss man mit LLDbAddTable eine Tabelle (bzw. mehrere) im "Container" anlegen und die Felder leer definieren:

LlDbAddTable(hJob,"kunden")
LlDbAddTable(hJob,"artikel")
DbSelectArea('kunden')
FOR i := 1 TO FCount()
LLDefineFieldExt(hJob,'kunden.'+FieldName(i) ...)
NEXT
usw.

Im Formular platziert man die Container nach Belieben. Im Gegensatz zum normalen Druck einer Tabelle (die sich, wie gesagt, aus verschiedenen Datenquellen speisen kann) entscheidet hier das Formular, welche Daten angefragt werden. Dafür muss man in der Druckschleife mit LlPrintDbGetCurrentTable() abfragen, für welche Tabelle/welchen Container L&L gerade Daten haben will und diese dann liefern. Dadurch kann man innerhalb einer Tabelle die Datenquelle wechseln, aber auch mehrere Tabellen oder Charts nacheinander drucken. Das geht aber im Prinzip auch über die Standard-Druckschleife (ohne LlDbAddTable()), wofür die "Darstellungsbedingungen" im Formular ein mächtiges Instrument sind. So könnte man beispielsweise eine Druckschleife bauen, die für alle Kunden alle Artikel druckt, die jeder Kunde gekauft hat. Dafür würde die Druckschleife die Kundentabelle durchwandern und in einem ersten Schritt alle Kundendaten (als Felder) publizieren. Eine zweite Schleife würde zu jedem Kunden alle Artikeldaten - wieder als Felder - publizieren und die Kundendaten unverändert lassen. In der Tabelle selbst würde man beispielsweise über eine Variable festlegen, ob Kunden- oder Artikeldaten relevant sind (neuer Kunde: Kundendaten drucken, neuer Artikel zum selben Kunden: Artikeldaten drucken) und dies über die Darstellungsbedingen der Tabellenzeilen abfangen. Und so weiter und so fort. Der Kreativität sind praktisch keine Grenzen gesetzt.
Herzlich,
Tom
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

danke Tom für die ausführliche Erklärung.
Mit einzelnen Tabellen (hintereinander gedruckt) ist das alles kein Problem, auch nicht mit der StaticTable etc.
nur sobald eben die Relation ins spiel kommt hab ich das problem..mit LldbAddrelation etc. übergebe ich die felder ..und mit Lldbaddtable etc. das passt im designer auch wunderbar..aber ich weiß eben noch nicht genau wie ich die Relationen (vom anderen Beitrag hier) in die druckschleife einbaue..aber das werd ich schon hinkriegen..thx..
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

Wenn mehrere Tabellen als Containerobjekte übermittelt wurden, darf die Druckschleife nicht mehr einem simplen DO WHILE !Eof() folgen, sondern muss so lange drucken, wie das Formular Tabellen abfragt. In einer äußeren Schleife muss als erstes über LlPrintDbGetCurrentTable(hJob,@cTableId,nTableIdLenght,.F.) ermittelt werden, welche Tabelle das Formular als nächste verlangt (Achtung: 0-terminierter String, also cTableId für Vergleichsoperationen von Chr(0) befreien!). Je nach abgefragter Tabelle müssen dann für diese ID (also "kunden", "artikel" usw.) in einer geschachtelten Schleife die Felder (LlDefineFieldExt(hJob,"kunden.name",kunden->name,LL_TEXT,0) befüllt und so oft übermittelt werden, wie sie vorliegen oder das Formular das verlangt (LL_WRN_REPEAT_DATA, wie beim Standarddruck). Die "genestete" Druckschleife ähnelt also der Standardschleife. Wenn GetCurrentTable() keine Tabelle mehr verlangt, kann die äußere Schleife - also der gesamte Ausdruck - beendet werden. Die Container platziert man im Formular entsprechend, das ähnelt dem Standard. Die Tabellendaten können als Tabellen oder Charts (oder in L&L 17 auch noch in mehr Varianten) ausgegeben werden.
Herzlich,
Tom
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

ich drucke mittels folgendem code die schleife->
Nun ist aber das Problem das bei
DbSetScope(SCOPE_BOTH,val(AllTrim(Invoice->BILLNO)))
BILLNO immer die selbe ist, somit wird immer die Tabelle Invoice gedruckt mit dem Datensatz BILLNO ="9800504"
was mach ich falsch, die ITEMS Tabelle ist ja die untertabelle von der Invoice..es müsste eigentlich erst INvoice kommen dann die DS von der Items Tabelle usw..
Brauch ich hier die SET Relations etc. (von meinem anderen Beitrag)
Danke für die Hilfe..

Code: Alles auswählen

 If sCurrentTable == "LLStaticTable"
      nRet := LlPrintFields(hJob)
      Do while nRet == LL_WRN_REPEAT_DATA
        LlPrint(hJob)
        nRet := LlPrintFields(hJob)
      End do

      RETURN nRet
    Else

      //Goto top
      if sCurrentTable == "INVOICE"
         // D: SchleIfe: Wiederholung fuer jeden Datensatz
         // US: Loop: repeat for each record
         //dbuseArea(.T.,"DBFDBE","invoice.dbf","Invoice",.T.,.F.)
         //dbSelectArea("Invoice")
         USE Invoice NEW

      else
         //dbuseArea(.T.,"DBFDBE","items.dbf","Items",.T.,.F.)
         //dbSelectArea("Items")
         //nBillNo = BILLNO
         Use ITEMS NEW
         DbSetScope(SCOPE_BOTH,val(AllTrim(Invoice->BILLNO)))

      End If

             Do While !eof()

                // D: Felder definieren
                // US: Define fields
               nRet := DefineData(hJob,.T.,sCurrentTable)

                // D: Tabellenzeile ausdrucken
                // US: Print table line
                    nRet := PrintLLTableRow(hJob,sCurrentTable)

                If .not. empty(nRet); LLErrorMessage(nRet); Exit; EndIf

                // D: Zum naechsten Datensatz wechseln
                // US: Move to next record
                SKIP

             End Do
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

Hast du mir vielleicht nen Ansatz Tom..ob ich hier DbScope einsetzen muss oder etwas anderes..ich weiß nimma weiter :-(
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

Dein Problem liegt vermutlich im Formular, nicht in der Druckschleife. Wenn Du die Tabellen unabhängig voneinander bzw. nacheinander druckst, ist nachvollziehbar, dass immer nur Positionen zu einer Auftragsnummer kommen. Du musst den zweiten Container in den ersten einbinden, also als Kreuztabelle. Alternativ und wahrscheinlich einfacher ginge auch der zweite Ansatz, den ich weiter oben skizziert habe. Du publizierst in Deiner Druckschleife immer beides, also Auftrag und Positionen, wiederholst das aber so oft, wie es Positionen gibt. Diese druckst Du im Formular in einer zweiten Datenzeile. Diese wird über eine Darstellungsbedingung ausgelöst, etwa die Variable "positionendrucken" auf "ja". Nur bei einem neuen Auftrag geht außerdem "auftragdrucken" auf "ja", wodurch die erste Datenzeile, nämlich die mit den Auftragsdaten, ausgelöst wird. Bei allen Folgepositionen ist "auftragdrucken" auf "nein", wodurch die Datenzeile (können auch mehrere sein) für den Auftrag unterdrückt wird. Das vereinfacht sowohl die Druckschleife, als auch das Formulardesign.

Edit: Nein, die Druckschleife ist doch falsch. Bei eingebetteten Tabellen/Kreuztabellen kann die Anforderung, welche Tabelle zur drucken ist, auch innerhalb des Drucks einer anderen Tabelle wechseln. Du müsstest hier also noch in der "While !Eof()"-Schleife abfangen, ob die Tabelle wechselt, weil Du ja nicht alle Datensätze erst aus einer und dann aus einer anderen Tabelle drucken willst, sondern beides gemischt. Vermutlich ist der zweite Ansatz hierfür doch besser geeignet - und simpler umzusetzen.
Herzlich,
Tom
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

Im Designer ist es auch als Untertabelle drin also
-Invoice
--Items

Wenn ich die Tabellen einfach hintereinander platziere im Designer und das DbSetScope(SCOPE_BOTH,val(nBILLNO)) in der Druckschleife auskommentiere dann funktioniert der Druck einwandfrei, es wird erst die Invoice Tbl gedruckt und danach die Items, aber sobald eben die Items als Untertabelle drin ist, bekomme ich immer nur Invoice->BillNO "9800504" zurück..liegt wohl wirklich an der Druckschleife + das übergeben der korrekten Relation..
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

Danke..
In der !EOF() Schleife wird ja -->PrintLLTableRow() aufegrufen-->
Meinst du da drin?
Aber das DBScope muss ich schon verwenden, oder muss ich irgendwo mit Relation TO und Index etc. eingreifen..

Code: Alles auswählen


Function PrintLLTableRow(hJob,sCurrentTable)

   Local nBuffer,nRet

   //Local sCurrentTable
   // D: Tabellenzeile ausdrucken
   // US: Print table line
    nRet:=LlPrintFields(hJob)

   // D: Wenn Seitenumbruch, dann neue Kopfzeile drucken und alte Daten wiederholen
   // US: On page break print new header and repeat last data
   Do while nRet=LL_WRN_REPEAT_DATA
     LlPrint(hJob)
     nRet := LlPrintFields(hJob)
   End Do

   Do while nRet==LL_WRN_TABLECHANGE
    nBuffer := LlPrintDbGetCurrentTable(hJob, "",0,.F.)

     If nBuffer >0
      sCurrentTable:=Replicate(chr(0), nBuffer)
      LlPrintDbGetCurrentTable(hJob,@sCurrentTable,nBuffer + 1,.F.)
      sCurrentTable = Left(sCurrentTable, Len(sCurrentTable)-1)
     End if

     PrintTable(sCurrentTable)

     End do

Return nRet
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

Der Scope auf die Items muss immer dann neu gesetzt werden, wenn sich der Datensatzzeiger in der Auftragsdatei bewegt.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9346
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: List & Label "set relation"

Beitrag von Tom »

Zum Verständnis: Ein Scope hat die Qualität eines Filters. Die Ergebnismenge in der gescopten Tabelle ändert sich nicht zwangsläufig durch eine Veränderung der Tabelle, die möglicherweise im Scope referenziert ist. Das ist bei Relationen anders.
Herzlich,
Tom
Benutzeravatar
e25
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 35
Registriert: Do, 22. Dez 2011 16:43

Re: List & Label "set relation"

Beitrag von e25 »

Supiiii :-)
Danke für deine tollen Antworten, habe jetzt die Relation etc. hinbekommen..
Für alle die es wissen wollen:
Ich habe anstatt USE jetzt DbUseArea() verwendet und dann -->

Code: Alles auswählen

 
Do Case
      Case sCurrentTable == "INVOICE"
         // D: SchleIfe: Wiederholung fuer jeden Datensatz
         // US: Loop: repeat for each record
         DbSelectArea("Invoice")
         INDEX ON BILLNO TO BILLNO
         SET INDEX TO BILLNO

      Case sCurrentTable == "ITEMS"
         DbSelectArea("Items")
         INDEX ON BILLNO TO InvoiceNO
         SET INDEX TO InvoiceNO
         DbSetScope(SCOPE_BOTH,Invoice->BILLNO)

      End Case

dann einfach in die Druckschleife-->

Code: Alles auswählen

 
Do While !EOF()

               nRet := DefineData(hJob,.T.,sCurrentTable)

                // D: Tabellenzeile ausdrucken
                // US: Print table line
                nRet := PrintLLTableRow(hJob,sCurrentTable)

                If .not. empty(nRet); LLErrorMessage(nRet); Exit; EndIf

                // D: Zum naechsten Datensatz wechseln
                // US: Move to next record
                 DbSkip()

             End Do

danach am Ende wieder DbSelect wieder auf Invoice damit diese weiter gedruckt wird, sonst kommt nur ein Datensatz..etc....somit passt der Druck Haupttabelle und Untertabelle..

jetzt hab ich noch das Problem bei hintereinanderfolgenden Tabellen..da wird immer nur die 1. gedruckt, aber das ist was anderes..da muss ich ja noch prüfen ob RootTabelle-->JA--Kein Filter..child-->Filter etc..(dat werd ich schon hinkriegen) :-)
thx nochma


:Ergänzung: der Vollständigkeitshalber :-)
ob es eine rootTable ist prüfe ich jetzt so:
Quick and dirty :-)

Code: Alles auswählen

Case sCurrentTable == "ITEMS"
         DbSelectArea("Items")
         INDEX ON BILLNO TO InvoiceNO
         SET INDEX TO InvoiceNO

         sCurrentTableIsRoot :=Replicate(chr(0),nBuffer)
         LlPrintDbGetCurrentTable(hJob,@sCurrentTableIsRoot,nBuffer + 1,.T.)
         IsRoot := ">" $ sCurrentTableIsRoot
         If IsRoot ==.T.
         DbSetScope(SCOPE_BOTH,Invoice->BILLNO)
         End If
Antworten