[Gelöst] - Report - RequestForm: LookUp auf Tabelle im Optio

1. September 2006 16:45

Hallo zusammen,

so kurz vor dem Wochenende habe ich da noch ein Frage. Ich möchte in einem Bericht auf der Requestform ein Feld zum Filtern hinterlegen. Dieses Feld soll einen AssistEdit Button haben und einen LookUp auf die Tabelle Verteilercode durchführen. Alles was ich bisher zum Thema Lookup gefunden habe bezieht sich auf Controls in einer Form. Die Requestform ist zwar auch ein Formular, steht aber nicht unter LookUpFormID zur Verfügung.

Wie bekomme ich jetzt meinen Feld in den Bereich der RequestForm, welches über einen AssistEdit Button einen LookUp auf die gewünschte Tabelle macht. Uffz, alles verstanden was ich möchte? Hoffe, ich habe die Frage verständlich geschildert.

Vorab schon mal danke für die Infos und wünsche allen ein schönes Wochenende.

So long....

Markus
Zuletzt geändert von mgerhartz am 4. September 2006 16:07, insgesamt 1-mal geändert.

1. September 2006 17:08

Platziere eine TableBox auf der RequestForm und definiere eine Record-Variable in den Globals von der gewünschten Tabelle.

Trage nun in das Property 'SourceExpr' das Feld ein aus der in den Globals definierten Tabelle, z.B. Rec.Code.

Im Property 'TableRelation' trägst du dieselbe Tabelle nochmals ein, allerdings nicht die Variable, sondern die Tabelle selber.

Wenn du jetzt den Report startest, kannst du über F6 die gewünschte Auswahl treffen. In Rec.Code findest du den ausgewählten Wert.

Re: Report - RequestForm: LookUp auf Tabelle im Optionsfeld

1. September 2006 17:17

Hi Markus,

auch wenn ich das nicht ganz so verstanden habe, versuch ich mal zu helfen. ;-)

Du hast also eine TextBox auf der RequestForm. In der Eigenschaft "SourceExp" der TextBox hast du eine globale Variable vom Typ Code stehen, oder? In der Eigenschaft "TableRelation" steht "Mailing Group", oder?

Wenn du die beiden Fragen mit Ja beantworten kannst, sollte der Lookup-Button (also der, mit dem Pfeil nach oben) das entsprechende Form öffnen.

Was willst du denn jetzt mit dem AssistButton?

Gruß, Marc

1. September 2006 17:17

Mist! Roger war schneller. :-)

1. September 2006 17:24

Marc Teuber hat geschrieben:Mist! Roger war schneller. :-)


Wir Schweizer sind bekannt für unsere Schnelligkeit :wink:

4. September 2006 11:06

Hi Rotsch,
Hi Marc,

danke für Eure Antworten. Tja, leider habe ich immer noch folgendes Problem.

Ich habe wie von Rotsch beschrieben, in der Textbox auf der Requestform das Feld der Record Variable in der SourceExpression hinterlegt. (Rec_MailingGroup.Code)

Allerdings kann ich nicht das Property TableRelation hinterlegen. Der Assist Edit Button bietet mir nichts zu Auswahl an. Schreibe ich einfach den Tabellennamen in das Feld, erscheint eine Fehlermeldung.

4. September 2006 11:10

Das der Assist-Button nicht funktioniert hier, ist mir auch schon aufgefallen. Scheint ein Fehler in Navision zu sein.

Du kannst aber die Tabelle manuell einsetzen, musst aber daran denken, dass bei Tabellen, deren Namen aus mehreren Wörtern besteht, der Name in " eingefasst werden muss.

4. September 2006 12:22

Super, vielen Dank!

4. September 2006 16:11

Leider muss ich das Thema nochmals aufgreifen. Soweit hat das alles funktioniert. Allerdings habe ich noch eine Frage. Ich möchte diese Feld ähnlich verwenden können, wie ein ReqFilterField von einem DataItem. Sprich, ich möchte bspw. auf mehrere Codenummern filtern können. Die Filterung selbst programmiere ich im Code. Allerdings wird bei einem Lookup auf die besagte Tabelle immer nur eine Codenummer ausgewählt. Wie kann ich z. B. einen bestimmtern Bereich auswählen (00-250..00-280). Sobald ich den letzten Wert auswählen (..00-280) wird der aktuelle Wert (00-250) überschrieben.

4. September 2006 16:17

Setze das dazu das Property 'ClearOnLookup' der TableBox auf dem RequestForm auf No

4. September 2006 16:43

Wow, das ging ja mal wieder schnell. Jaja, die schnellen Schweizer :-) 1.000 Dank!

4. September 2006 19:40

Du kannst auch eine Mehrfachselektion mit einem Lookup machen.
Dazu aber nicht die Tablerelation verwenden, sondern
den Onlookup-trigger des Feldes programmieren.

Beispiel Artikelfilterfeld in der Form 7200 Verkaufspreise:
Code:
ItemList.LOOKUPMODE := TRUE;
IF ItemList.RUNMODAL = ACTION::LookupOK THEN
  Text := ItemList.GetSelectionFilter
ELSE
  EXIT(FALSE);

EXIT(TRUE);


Die Funktion zur Erzeugung des Filterstrings (getseletionfilter) ist auf der Lookupform programmiert.
Damit kannst du sogar auf einen Schlag eine Mehrfachselektion von nicht zusammenhängenden Zeilen machen, solange du die Feldlänge der Variablen nicht überschreitest.....

6. September 2006 16:50

Hi Michael,

leider habe ich Probleme bei der Umsetzung Deines Vorschlages. Ich habe mir überlegt, wie ich es vielleicht noch lösen könnte. Was hältst Du von folgende Methode:

Im ursprünglichen Report habe ich zwei DataItems (Customer und Ganzzahl) ohne Einrückung. Wenn ich jetzt noch ein DataItem (Mailing Group) dazwischen packe, habe ich zumindest die Möglichkeit für das besagte Feld (MailingGroupCode) einen Filter einzugeben (bspw. 00-200..00-210). Im OnAfterGetRecord Trigger von Ganzzahl könnte ich mir den Inhalt des ReqFilterFields auf der Requestform holen:

Code:
MailingGroupCodeFilter := Rec_MailingGroup.GETFILTER(MailingGroupCode);
IF MailingGroupCodeFilter <> '' THEN     
  recContactMailingGroup.SETFILTER("Mailing Group    Code",VerteilerCodeFilter);
  IF recContactMailingGroup.FIND ('-') THEN
    BEGIN
    Blablabla;
    END;


Wird das funktionieren? Und muss ich das neue DataItem einrücken? Ich werde es jedenfalls heute oder morgen früh ausprobieren. Bin wie immer für jeden Kommentar / Tipp dankbar.

Grüße

Markus

7. September 2006 00:54

Ich verstehe scheinbar nicht ganz, was du vorhast.
In der Tabelle Customer gibt's doch gar kein Feld MailingGroupCode....

8. September 2006 11:55

Hi Michael,

sorry, dass ich mich erst jetzt wieder melde. Musste ein paar wichtige Dinge erledigen. Hier also noch mal ein Erklärungsversuch. Du hast Recht, die Tabelle Customer hat kein entsprechendes Feld. Ich nehme mir die aktuelle Customer No. und suche dann in der Tabelle Mailing Group nach bestimmten Einträgen. Wenn ein Eintrag gefunden wurde, dann soll dieser beim Excel-Export besonders hervorgehoben werden.

Das Kriterium dafür ist ein bestimmter Mailing Group Code. Diesen habe ich bis jetzt fest in den Code des DataItem hinterlegt. Ich möchte unserem Kunde die Möglichkeit geben, in der Requestform diesen Code selbst zu hinterlegen. Würde es sich nur um einen einzelnen Code handeln, könnte ich das einfach mit einem Lookup auf die Tabelle Mailing Group erledigen. Ich möchte allerdings, dass der Kunde die Möglichkeit hat bestimmte Bereiche festzulegen. Bspw. (00-200..00-220).

Ich habe mich mal an Deinem Vorschlag versucht, bin allerdings bisher daran gescheitert. Deshalb dachte ich mir, ich setze einfach noch ein DataItem wie folgt dazischen:

Customer
Mailing Group
Ganzzahl

So bekomme ich die Möglichkeit auf der Requestform im ReqFilterField einen beliebigen Filter zu setzen. Diesen möchte ich mir dann per GETFILTER holen und dann im Code verarbeiten.

Wenn das eine schwachsinnige Idee von mir ist, gibt es dann eine andere Möglichkeit auf die Tabelle Mailing Group einen Lookup zu machen aber mehr als ein Feld für den Filter (00-200..00220) auszuwählen. Mit dem einfachen Lookup wird die erste Eingabe (00-200) mit der zweiten überschrieben (00-220).

8. September 2006 13:24

mgerhartz hat geschrieben:Deshalb dachte ich mir, ich setze einfach noch ein DataItem wie folgt dazischen:

Customer
Mailing Group
Ganzzahl


Das ist grundsätzlich richtig so. Einfach daran denken, auf dem OnPreDataItem-Trigger den Befehl CurrReport.BREAK abzusetzen, damit nicht alle Records der Tabelle durchlaufen werden.


mgerhartz hat geschrieben:...eine andere Möglichkeit auf die Tabelle Mailing Group einen Lookup zu machen aber mehr als ein Feld für den Filter (00-200..00220) auszuwählen. Mit dem einfachen Lookup wird die erste Eingabe (00-200) mit der zweiten überschrieben (00-220).


Wie ich hier schon gschrieben habe, hilft hier die Einstellung 'ClearOnLookup' der TableBox auf dem RequestForm auf No zu setzen. Dann wird die bestehende Eingabe bei einer zweiten Auswahl nicht überschrieben.

8. September 2006 15:31

Hi Rotsch,

o.k. das mit dem Property "Clear on LookUp" hat geklappt. Und wie kann ich jetzt den Wert der nach der Eingabe in dem Feld steht in eine Variable schreiben? Schließlich ist Feld ja jetzt keine Variable die gefüllt wird, sondern ein Feld aus der Recordvariable für den Lookup.

8. September 2006 15:39

Ich nehme an, du hast auf der TableBox als SourceExpr so etwas drin wie Tabelle.Code.

Damit solltet du jetzt forfahren können in dem Stil:

Code:
SETFILTER(Feld, '%1', Tabelle.Code);


Versuchs doch mal. Wenns nicht klappt, schauen wir weiter.

8. September 2006 15:57

Danke Rotsch! Das klapp nun auch soweit. Jetzt habe ich noch ein Problemchen mit den Operatoren. Wenn nur ein Code eingetragen wird gibts keine Probleme. Wenn man allerdings verschiedene Operatoren einsetzen will (..| <> etc.) dann funktioniert der Filter nicht. Muss ich jetzt für jeden möglichen Operator eine IF Bedingung einbauen?

8. September 2006 16:14

Eigentlich sollte es damit keine Probleme geben. Im Feld Tabelle.Code steht ja bereits der komplette Filterbegriff drin. Wie lautet denn die Fehlermeldung?

8. September 2006 16:16

NACHTRAG: Ich könnte mir ja die Opteratoren mit einem COPYSTR holen.
Die MailingGroup Codes sind immer gleich lang (6 Zeichen)

BSP. Eingabe im Feld der Requestform = 00-220..00-230
COPYSTR(MailingGroup.Code,1,6) = 00-220
COPYSTR(MailingGroup.Code,7,8) = Operator (..)
COPYSTR(MailingGroup.Code,1,6) = 00-230

Richtig fies wird es noch weil es ja ein- und zweistellige Operatoren gibt (z. B. | oder <>) Das muss ich dann auch noch prüfen. Müsste eigentlich über die Stringlänge gehen.

Geht das nicht auch unkomplizierter?

8. September 2006 16:19

Zu spät gelesen. Es gibt keine Fehlermeldung, nur wird der Code nicht ausgeführt. Habe im SectionDesigner zwei unterschiedliche Sections hinterlegt. Der Code sieht so aus:

Code:

IF Ruecklaeufer THEN
BEGIN
  recContactMailingGroup.SETFILTER("Contact No.",recContact."No.");
  recContactMailingGroup.SETFILTER("Mailing Group Code",'%1',recMailingGroup.Code);
  IF recContactMailingGroup.FIND ('-') THEN
    CurrReport.SHOWOUTPUT(TRUE)
  ELSE
    CurrReport.SHOWOUTPUT(FALSE);
 END
ELSE
 BEGIN
   CurrReport.SHOWOUTPUT(FALSE);
 END;


Die eine Section wird FETT die andere normal ausgegeben. Entsprechend ist der Code unterschiedlich.

8. September 2006 16:23

Ich bin zu dämlich. Natürlich gibts ne Fehlermeldung.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

8. September 2006 16:25

Ich sollte die Meldung vielleicht auch mal lesen ;-) Ändere gerade die Feldlänge. Sorry, dass ich so nerve.

8. September 2006 16:28

Ah, jetzt ist alles klar. Das war aber auch blöd von mir. Ich habe nicht daran gedacht, dass die Filterkriterien ja die Feldlänge überschreiten können. Im Feld 'recMailingGroup.Code' haben ja nur 10 Zeichen Platz.

Also, versuch mal folgendes:

- definiere eine Variable vom Typ Text, Länge 1024
- Setze diese Variable in die SourceExpr des Textbox
- ClearOnLookup auf No
- ValidateTableRelation auf No

Dann solltest du die Variable im Filter verwenden können
Zuletzt geändert von rotsch am 8. September 2006 16:45, insgesamt 1-mal geändert.