[Gelöst] SETFILTER und mehrere Werte

30. Mai 2008 13:57

Hallo,

aufgrund mangelnden Infomaterials zu C/AL Code versuche ich es nun mal auf diese Weise^^

Ich habe einen MenüButton in meiner Request-Form und möchte aus dieser ein Feld per SETFILTER mit zwei verschiedenen Werten Filtern.

Code:
"Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'ASIN');
"Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'EAN');


In dieser Konstellation filtert er erst nach ASIN und anschließend nach EAN, ich möchte aber gerne beides in einem Schritt filtern.

Hintergrund ist:
Ich habe eine Auswahl "BEIDES" womit ich alle Artikel ausgeben möchte, die keine "EAN" hinterlegt haben UND keine "ASIN".
Dementsprechend habe ich auch je eine Auswahl ASIN und EAN, welche auch funktionieren.
Leider ist es auch möglich das ein Artikel zwar eine ASIN hat, aber keine EAN, dieser würde bei der jetzigen Auwahl "BEIDES" halt rausfallen...

Jegliche Versuche den SETFILTER mit & oder | o.ä. anzupassen sind gescheitert :(

Habe auch schon überlegt SETRANGE einzusetzen... Aber was passiert wenn in der Spalte der Tabelle zwischen dem Wert EAN und ASIN nun z.B. CNET oder sonst was vorkommt?

würde mich über ein paar Tipps freuen.
Zuletzt geändert von 3TageWach am 2. Juni 2008 14:36, insgesamt 2-mal geändert.

30. Mai 2008 14:19

Hallo,

anstatt
"Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'ASIN');

versuch doch mal

"Item Cross Reference".SETFILTER("Cross-Reference Type", '%1|%2', "Item Cross Reference"."Cross-Reference Type"::ASIN,
"Item Cross Reference"."Cross-Reference Type"::EAN);

30. Mai 2008 14:35

Schonmal ein guter Ansatz, das mit den :: hatte ich noch nicht probiert^^ Allerdings wirft er mir einen nicht nachvollziehbaren Fehler aus. Hab mal 2 Screens angehängt. EInmal der Fehler beim ausführen des Reports und einmal die Tabelle mit den entsprechenden Werten.

Verstehe das Problem nicht.

// das Problem liegt wohl an der Übersetzung... nun frage ich mich natürlich welche Übersetzung der Wert EAN hat und wo ich die entsprechende Definition finden kann. Bei dem ASIN Wert meckert er ja nicht, also scheint dieser aufbau des SETFILTERS schonmal zu funktionieren :)

// in diesem Fall war es zu erraten das es sich um "Common" handelt.
danke :)

// allerdings scheint das Ergebniss immernoch nicht zu stimmen. Die Ausgabe aller Artikel ohne EAN ergibt mir 34 Seiten, die Ausgabe aller Artikel ohne ASIN ergibt mir 60 Seiten, somit müsste die Ausgabe BEIDES mir ja diese 60+34 Seiten ausschmeißen.
Setze ich nun im SETFILTER erst Common ein und dann ASIN erhalte ich ein völlig anderes Ergebniss wie im ursprünglichen SETFILTER. Daraus schließe ich das deine Variante identisch mit meinen zwei SETFILTERN ist.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von 3TageWach am 30. Mai 2008 14:51, insgesamt 1-mal geändert.

30. Mai 2008 14:48

Hallo,

Dachte ich mir fast......

Ean gibt es nicht - heißt "Bar Code"

30. Mai 2008 14:56

Wieso funktioniert eigentlich dieser SETFILTER:

Code:
"Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'EAN');


Hier steht ja auch EAN und nicht Bar Code. Und das ergebniss ist richtig.

Hab nun mal etwas rumgetestet:

ASIN --> 60 Seiten
EAN --> 34 Seiten
BEIDES --> 55 Seiten

irgendwas stimmt da nicht... müssten doch theoretisch 60+34 Seiten werden?!

// wenn ich nun "Bar Code" und ASIN im SETFILTER für die Auswhal BEIDES austausche erhalte ich wieder 55 Seiten, das ist schonmal positiv. Ich vermute Bar Code bezieht sich nicht auf EAN...

// Im einfachen SETFILTER für EAN kann ich "Bar Code" nicht nutzen, da sagt er dann das es nicht verfügbar ist und listet unter anderem EAN auf... ich bin etwas verwirrt.

Code:
"Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'EAN');


Der SETFILTER bezieht sich auf die exakt selben Daten...
Zuletzt geändert von 3TageWach am 30. Mai 2008 15:16, insgesamt 2-mal geändert.

30. Mai 2008 15:07

EAN scheint die Übersetzung von "Common" zu sein, so sieht zumindest dein erster Screenshot aus.

Der Filter auf 'EAN' funktioniert, weil es ein Text ist und kein Verweis auf die Optionen des Feldes. Die Optionen des Feldes werden bereits beim Kompilieren geprüft, der Text nicht. Du könntest auch 'Hans Wurst' verwenden, dann bekommst du beim Kompilieren auch keinen Fehler, sondern erst zur Laufzeit. 'EAN' liefert auch zur Laufzeit keinen Fehler, da 'EAN' die Übersetzung eines gültigen Optionswertes ist. Die Übersetzungen werden vom Compiler aber offenbar nicht berücksichtigt.

30. Mai 2008 15:15

Code:
"Item Cross Reference".SETFILTER("Cross-Reference Type", '%1|%2', "Item Cross Reference"."Cross-Reference Type"::ASIN,
   "Item Cross Reference"."Cross-Reference Type"::"Common");


damit erzeugt er mir 33 Seiten...
nun muss ich nur noch rausfinden, warum es nur 33 sind, anstatt theoretisch 94 Seiten (60+34).

30. Mai 2008 15:17

Dann poste doch mal etwas mehr Code!

30. Mai 2008 15:25

ok :P

Der Code aus dem DataItem --> Item:

OnAfterGetRecord()
Code:
Item.SETCURRENTKEY("No.");

//Nur einträge des Artikels herausfiltern
"Item Cross Reference".SETFILTER("Item Cross Reference"."Item No.", Item."No.");

//Optionvalue der Typabfrage im Requestform Filtern
IF optCrossRefType = optCrossRefType::EAN THEN
  "Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'EAN');

IF optCrossRefType = optCrossRefType::ASIN THEN
  "Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'ASIN');

IF optCrossRefType = optCrossRefType::BEIDES THEN
   BEGIN
   "Item Cross Reference".SETFILTER("Cross-Reference Type", '%1|%2',       "Item Cross Reference"."Cross-Reference Type"::"Common",
   "Item Cross Reference"."Cross-Reference Type"::ASIN);
   END;

//Soll der Datensatz gedruckt werden
prtShowOutput := FALSE;

//Wenn keine Referenz vom gewünschten Typ vorhanden ist
IF  "Item Cross Reference".ISEMPTY THEN
    prtShowOutput := TRUE;


optCrossRefType ist unter GLOBALS als "option" Variable definiert. Die SourceExpr des MenüButtons ist natürlich optCrossRefType.

30. Mai 2008 15:33

Welche Artikel willst du denn bei BEIDES anzeigen lassen? Diejenigen, die EAN oder ASIN haben, diejenigen die eines von beiden nicht haben oder diejenigen, die weder EAN noch ASIN haben?

So wie du es programmiert hast, werden die Artikel ausgespuckt, die weder EAN noch ASIN haben. Da verwundert es nicht, dass nur noch 33 Seiten rauskommen.

30. Mai 2008 15:42

Genau das ist mein Problem, ich möchte dort natürlich alle Artikel aufgelistet bekommen die keine EAN haben ODER keine ASIN. Wie bereits oben erwähnt die "summe" der ersten beiden Auswahlmöglichkeiten.

bzw. wie im Startbeitrag erwähnt:
Leider ist es auch möglich das ein Artikel zwar eine ASIN hat, aber keine EAN, dieser würde bei der jetzigen Auwahl "BEIDES" halt rausfallen...


so ist es wahrscheinlich momentan.

// so erstmal Feierabend, werde mich ab Montag wieder damit beschäftigen. Danke für die schnelle Hilfestellung :)

Re: SETFILTER und mehrere Werte

30. Mai 2008 16:54

3TageWach hat geschrieben:Ich habe eine Auswahl "BEIDES" womit ich alle Artikel ausgeben möchte, die keine "EAN" hinterlegt haben UND keine "ASIN".
Dementsprechend habe ich auch je eine Auswahl ASIN und EAN, welche auch funktionieren.
Leider ist es auch möglich das ein Artikel zwar eine ASIN hat, aber keine EAN, dieser würde bei der jetzigen Auwahl "BEIDES" halt rausfallen...


Wie ich bereits sagte: Das geht nur manuell durch Durchlaufen jedes Datensatzes und dortige Prüfung.

1. Juni 2008 21:52

Sieh dir diesen Report mal an, ich glaube, der deckt ungefähr das ab, was du brauchst.

Ich habs aber nicht getestet, da ich grad keine Datenbank da habe, die auch Artikel enthält.

PS:
Ich wäre sehr daran interessiert, ob jemand einen leichteren Weg kennt, den OptionString eines Tabellen-Feldes in eine Report-Variable einzubinden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

1. Juni 2008 22:07

FAFL hat geschrieben:PS:
Ich wäre sehr daran interessiert, ob jemand einen leichteren Weg kennt, den OptionString eines Tabellen-Feldes in eine Report-Variable einzubinden.


Ohne mir jetzt den Anhang angesehen zu haben und die Anforderung überhaupt 100%ig verstanden zu haben :-) :?:
OptionString ist vom Typ Text. Dann ist
Code:
OptionString := FORMAT(OptionFeld);


Wenn das mit deiner Frage überhaupt nichts zu tun hatte, dann versuchen wir es halt noch einmal :-)

1. Juni 2008 22:16

Naja, kann sein, dass ich jetzt eine genial einfache Lösung übersehen habe, das wäre mir äußerst peinlich, aber ich glaube deine Variante funktioniert so nicht.

Aber heute ist es mir entschieden zu spät, mich noch damit auseinander zu setzen.

In diesem Sinne, gute Nacht.

2. Juni 2008 13:24

Meine Fragen wurden somit beantwortet, funktioniert nun bestens :)

4. Juni 2008 17:28

Hab nochmal eine kleine Frage, da es grad so gut zum Thread-Titel passt.

Wie erreiche ich es, nur nach mehrfach vorhandenen Datensätzen zu filtern? Ich sach mal: Der Datensatz muss mind. zwei mal vorhanden sein.

Ich möchte z.B. nur doppelt vorhandene EANs ausgeben.

4. Juni 2008 18:08

Direkt als Benutzer, der einen Filter setzen will: Gar nicht.

Per Quelltext schon:
Du legst dir eine temporäre Tabelle an und versuchst, mit der entsprechenden EAN ein INSERT auszuführen.
Geht das nicht, handelt es sich um einen mehrfach vorhandenen Datensatz.
Problem:
Vorssetzung ist, dass die EAN dort Primärschlüssel ist. Gibt es eine solche Tabelle nicht, dann klaust du dir irgend eine andere mit einem Primäschlüsselfeld, wo der Datentyp des Primärschlüsselfeldes der gleiche ist. Und wenn Text oder Code, muss das ganze lang genug sein.
Geht auch das nicht, dann legst du dir halt eine solche Tabelle selber an, sozusagen nur für interne Zwecke.

4. Juni 2008 18:49

Per Quelltext wäre auch schon OK.

Ich habe auch eine Tabelle "Item Cross Reference", in dieser ist das Feld "Item No." der Primärschlüssel und zusätzlich gibt es ja die Felder
"Item Cross Reference-Type" (z.B. EAN, ASIN, ISBN) und "Item Cross Reference-No." (die entsprechende Nummer).

Ich muss jetzt nur sagen das "Item No." mindestens zwei mal vorkommen muss. Anschließend kommt ein SETFILTER auf den Typ EAN. Kannst du mir einen Beispiel Code für die "Item No." zeigen?

4. Juni 2008 19:31

3TageWach hat geschrieben:Kannst du mir einen Beispiel Code für die "Item No." zeigen?

Wie meinst du das?

5. Juni 2008 07:55

Naja, wie ich per code sagen kann, das die Item No. in der "Item Cross Reference" Tabelle mind. zwei mal vorkommen muss.

Mit einem gewöhnlichen SETFILTER klappt das ja anscheinend nicht, da sich dieser ja immer nur auf den Inhalt eines Feldes bezieht und nicht auf die Anzahl der Datensätze.

5. Juni 2008 08:43

Wie gesagt, du machst das nicht über einen Filter sondern über einen temporären Record (weißt du, was ich damit meine?), den du befüllst.
Im Falle deiner gewählten Tabelle sieht das pro untersuchter EAN so aus:

Code:
WITH TempItemCrossRef DO BEGIN
  INIT;
  "Item No." := 'DUMMY'; //Inhalt egal, es muss nur für alle Datensätze der gleiche sein
  "Variant Code" := '';
  "Unit of Measure := '';
  "Cross-Reference Type" := 0;
  "Cross-Reference Type No." := '';
  "Cross-Reference No." = DeineEAN;
 
  IF INSERT THEN BEGIN
    // Diese EAN ist neu.
  END ELSE BEGIN
    // Diese EAN gibt es schon!
  END;
END;

5. Juni 2008 10:10

hmm ja, ich habe TempItemCrossRef unter Globals vom Typ Record mit dem Subtype "Item Cross Reference" definiert. Und müsste somit einen temporären Record erhalten.

Nun verstehe ich noch nicht so ganz was die Variable "DeineEAN" sein soll, habe da jetzt einfach mal "Item Cross Reference"."Cross-Reference No." angegeben.

ich muss wohl noch etwas rumtesten...

5. Juni 2008 10:30

3TageWach hat geschrieben:hmm ja, ich habe TempItemCrossRef unter Globals vom Typ Record mit dem Subtype "Item Cross Reference" definiert. Und müsste somit einen temporären Record erhalten.


Nein, das Entscheidende hast du ausgelassen: Deine Recordvariable muss die Eigenschaft(!) Temporary = Yes haben.
Denn sonst erzeugst du mit INSERT echte Datensätze in deiner Datenbank ....

5. Juni 2008 11:16

Danke für den Tip mit Temporary, man gut das ich keinen DELETE Befehl verwendet habe :P

Theoretisch bräuchte ich mir doch nun nur noch den Code, welcher ausgegeben werden soll, um nur Datensätze mit doppelten Referenztypen (z.B. EAN) aufzuzeigen, unter den ELSE Teil schreiben.

Allerdings wird nur der IF INSERT Teil ausgeführt...

Ich habe in meiner Request-Form 2 Option Buttons (prtType), "vorhanden" und "nicht vorhanden". Weiterhin habe ich ein MenüButton (optCrossRefType) mit der Auswahl von Referenzarten.

nun mal ein wenig Code:
Code:
--> Item Cross Reference - OnPreDataItem()
IF prtType THEN BEGIN
      WITH TempItemCrossRef DO BEGIN
         INIT;
         "Item No." := 'DUMMY'; //Inhalt egal, es muss nur für alle Datensätze der gleiche sein
         "Variant Code" := '';
         "Unit of Measure" := '';
         "Cross-Reference Type" := 0;
         "Cross-Reference Type No." := '';
         "Cross-Reference No." := 'EAN';
 
         IF INSERT THEN BEGIN
            MESSAGE(myMessage);
            CurrReport.QUIT;

         END ELSE BEGIN
 
           //Optionvalue der Typabfrage im Requestform Filtern
           CASE optCrossRefType OF
              optCrossRefType::EAN:
              "Item Cross Reference".SETFILTER("Item Cross Reference"."Cross-Reference Type", 'EAN');
              // hier folgen noch weitere, übersichtshalber testweise gekürzt
           END;

         END;
      END;
END;