[gelöst] Filterbedingungen

5. Dezember 2011 10:29

Guten morgen liebes Forum,

mal wieder muss ein neuer Report erstellt werden, der für eine QM Auswertung genutzt wird. In diesem Rahman hatte ich letzte Woche bereits ein Thema aufgemacht, was dann geschlossen wurde. Nun wurde der Bericht vorgestellt und es tauchten nun andere Anforderungen auf.

Das Ziel:
1) Es sollen nur die Artikel ausgegeben werden, die bereits einmal beschafft wurden.
2) Die Anzahl der eingetragenen Lieferanten aus der Tabelle Einkaufspreis soll bestimmt werden und pro Artikel ausgegeben werden.
3) Pro Gruppe (nach Artikelkategorie) soll eine Summe ausgegeben werden mit der % Anzahl der Artikel mit mind. 2 Lieferanten
4) Am Ende soll eine Gesamtauswertung den % Anteil von Artikeln mit mind. 2 Lieferanten ausgeben.

Im Vergleich zu dem vorherigen Bericht, dort hatte ich nur 2 Tabellen, hier sind es drei.

Ich denke der Aufbau ergibt sich damit zu:
1 Ebene: Item
2 Ebene: Item Ledger Entry
3 Ebene: Purchase Price

zu meinen Zielen:
1) wahrscheinlich gibt es hierfür einen Befehl. Wie und wo schreibt man eine Abfrage Codetechnisch, die besagt den Artikel nur ausgeben, wenn ein Optionwert mind. 1x schon vorgekommen ist, mein Ansatz:
Code:
if findfirst ("Item Ledger Entry"."Entry Type", 'Einkauf') then
(CurrReport.SHOWOUTPUT;

2) mein Problem: es gibt dort mehrere doppelte Kreditorennummern mit verschiedenen Start- und Enddatum. Wie setzte ich den filter programmiertechnisch, damit ich mir nachher die Anzahl der Lieferanten zu dem Artikel bilden kann?
3) + 4) sollte sich dann so ergeben

Vielen Dank mal wieder fürs mithelfen.

Hier mein Probleme in einer besseren Darstellung:
Ich denke es wäre besser nur mit 2 Tabellen zu arbeiten und die Daten aus der Item Ledger Entry über Record zu holen, oder?

Dann wäre der Code mit Frage im OnPre der Tabelle Einkaufspreis:
Code:
//nur ausführen, falls der Artikel bereits gekauft wurde also mind. 1x Postenart Einkauf hat aus Item Ledger Entry
IF AnzahlLieferanten >= 2 THEN BEGIN
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

IF AnzahlLieferanten >= 1 THEN BEGIN
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;

IF LastItemCategoryCode <> Item."Item Category Code" THEN BEGIN
  CLEAR(AnzahlArtikel);
  CLEAR(AnzahlMultiLieferantenArtikel);
  LastItemCategoryCode := Item."Item Category Code";
END;

AnzahlArtikel +=1;
AnzahlArtikelGesamt +=1;


und im OnAfter:
Code:
AnzahlLieferanten += 1;

//hier muss die Bedingung rein, dass nur um 1 erweitert wird, falls sich die Einträge unterscheiden
//Beispiel: 11111,11111,11111,22222 => ergeben nur 2 Lieferanten, ohne Filterbed. erhält man 4 Einträge

Ich hoffe das ist so verständlicher.
Zuletzt geändert von misterelektro1981 am 7. Dezember 2011 16:46, insgesamt 3-mal geändert.

Re: Filterbedingungen

5. Dezember 2011 12:11

Wozu und wie ist denn die Verknüpfung von den Artikelposten zu den EK-Preisen?

Re: Filterbedingungen

5. Dezember 2011 12:18

Hallo McClane und vielen Dank für deine Hilfe.

Die Verknüpfung ist bei uns so. Wurde ein Artikel bereits einmal gekauft (Postenart=Einkauf) in der Item Ledger Entry, dann ist der Einkauf gehalten für diese Artikel mind. 2 Lieferanten in der Tabelle Einkaufspreis zu hinterlegen.
Das soll nun durch diesen Report abgeprüft werden.

Durch den zuvor angehängten unteren Code klappt es soweit, bis auf die Stellen wo // davor steht, also oben und unten. In der jetzigen Ausgaben wird die gesamte Anzahl an Zeilen der tabelle Einkauspreise ausgegeben, d.h. ist ein Lieferant 5 ma enthalten fließt es 5 mal in die Berechnung mit ein und es fehlt zudem die Bedingung, dass der Artikel zuvor besorgt werden musste.

Ist das so Verständlich was ich vorhabe?

Re: Filterbedingungen

5. Dezember 2011 12:45

Schau dir mal den Schlüssel der EK-Preise an, der ist Artikelnummer, Lieferantennummer, ...
die kämen also in deinem Beispiel so:
Code:
Artikelnummer,11111, ...
Artikelnummer,11111, ...
Artikelnummer,11111, ...
Artikelnummer,22222, ...

Ich hoffe, dir fallen Gemeinsamkeiten mit deinem letzten Beitrag und dem Gruppenwechsel auf.

Wenn du, wie ich vermute, von den Artikelposten zu den EK-Preisen über die Artikelnummer verlinkst, solltest du darauf achten, nur einmal in die EK-Preise zu schauen, da sonst nach jedem EK-Posten die Lieferanten gezählt werden.

Alternativ könntest du die EK-Preise nach Lieferant gruppieren und nur die Groupfooter andrucken.

Re: Filterbedingungen

5. Dezember 2011 14:21

Danke McClane für den Tip mit dem alten Beitrag zum Gruppenwechsel. Das klappt nun.
Was ich noch nicht ganz verstanden habe, wie ich das mit der Item Ledger in den Griff bekommen soll.

Kann ich folgenden Aufbau lassen:
1. Ebene: Item
2. Ebene: Purchase Price
3. Ebene: Item Ledger Entry

oder lasse ich die Item Ledger Entry als DataItem weg, zieh sie mir als Record und baue dann meine Bedingung in die Purchase Price ein???

Wie schreibe ich denn folgendes richtig als Code (PnPre DataItem der Purchase Price):
Code:
if findfirst value 'Einkauf' in "Item Ledger Entry".Postenart then                                       //falls mind. 1x der Wert Einkauf in dem Feld Postenart gefunden wird dann
IF AnzahlLieferanten >= 2 BEGIN
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

if findfirst value 'Einkauf' in "Item Ledger Entry".Postenart then                                       //falls mind. 1x der Wert Einkauf in dem Feld Postenart gefunden wird dann
IF AnzahlLieferanten >= 1 BEGIN
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;

AnzahlArtikel +=1;
AnzahlArtikelGesamt +=1;


Oder muss diese Bedingung ganz woanders hin?

Re: Filterbedingungen

5. Dezember 2011 14:29

misterelektro1981 hat geschrieben:oder lasse ich die Item Ledger Entry als DataItem weg, zieh sie mir als Record und baue dann meine Bedingung in die Purchase Price ein???

So kommen wir voran. Wo kein Einkaufsposten, da muss auch nichts gemacht werden. Das solltest du allerdings direkt beim Artikel abfragen.

Und auf die Artikelposten filterst du mit SetRange/SetFilter auf Artikelnummer und Postenart.

Re: Filterbedingungen

5. Dezember 2011 14:43

Mühsam mühsam, aber wir kommen weiter :-)

Ich dachte hiermit ziehe ich mir die Daten aus der Item Ledger Entry:
AbfrageObGekauft.GET("Item Ledger Entry."Item No."); => wieso klappt das nicht?

Reicht das für meine Verwendung dann so aus Im OnPreDataItem von Item:
CurrReport.SHOWOUTPUT("Item Ledger Entry"."Entry Type", 'Einkauf');

Re: Filterbedingungen

5. Dezember 2011 15:07

Hmpf. Und ich hatte schon Hoffnung :roll:
Code:
ItemLedgerEntry.SetRange("Entry Type",ItemLedgerEntry."Entry Type"::Purchase);
ItemLedgerEntry.SetRange("Item No.","No.");
if ItemLedgerEntry.isempty then
  CurrReport.Skip;

Und das Ganze im OnAferGetRecord vom Artikel. Denn Artikel ohne Ek-Posten können übersprungen werden.

Re: Filterbedingungen

5. Dezember 2011 16:48

Jetzt habe ich es ausreichend geprüft. Es scheint, als würde dein Code funktionieren, was für ein Wunder :-)

Zwei seltsame Sachen konnte ich beobachten:
1) Ist nun 1 Lieferant vorhanden (egal ob nur 1mal oder 10 mal der gleiche) und die Einkaufsbedingung ist erfüllt, so wird die Anzahl an Lieferanten mit 0 ausgegeben.
Kann das eventuell hiermit zusammenhängen?
Code:
IF LieferantenCode <> "Purchase Price"."Vendor No." THEN BEGIN
AnzahlLieferanten += 1;
LieferantenCode := "Purchase Price"."Vendor No.";
END;

2) Vielleicht hängt das auch mit dem Code oben zusammen. Seltsamerweise taucht wenn ein Artikel zwar die Einkaufsbedingung erfüllt, aber keinen Lieferanten in der tabelle Einkauspreise hat der Group Footer (der für die Anzeige der Anzahl der Lieferanten genutzt wird) nicht auf? was muss denn hier überarbeitet werden, kann es sein, dass das wieder mit nem Else zu tun hat???

Nebenbei: Die übrigen Werte scheinen alle zu stimmen.

Re: Filterbedingungen

5. Dezember 2011 23:58

misterelektro1981 hat geschrieben:Ist nun 1 Lieferant vorhanden (egal ob nur 1mal oder 10 mal der gleiche) und die Einkaufsbedingung ist erfüllt, so wird die Anzahl an Lieferanten mit 0 ausgegeben.

Ist denn sicher gestellt, dass Lieferantencode vorher leer ist? Sonst tritt der Ungleich-Fall möglicherweise nicht ein.

Re: Filterbedingungen

6. Dezember 2011 10:37

Guten morgen.
Ich musste noch etwas an dem Report arbeiten, hatte einiges an Code an der falschen Stelle stehen.

Nach deinem Denkanstoss bezüglich CLEAR funktioniert der Bericht.
Code:
CLEAR(LieferantenCode);

IF AnzahlLieferanten >= 2 THEN BEGIN
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

IF AnzahlLieferanten >= 1 THEN BEGIN
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;


MIt diesem Code werden einige Zähler hochgezählt. Was schreibt man denn für die Anzeige von 0 Lieferanten? Hat nun nämlich ein Artikel keinen Lieferanten taucht einfach der ganze Footer der tabelle Purchase Price nicht auf. Kann der Code oben irgendwie ergänzt werden?
Zuletzt geändert von Timo Lässer am 6. Dezember 2011 10:55, insgesamt 1-mal geändert.
Grund: Programmcode an die richtige Stelle im Beitrag verschoben ;-)

Re: Filterbedingungen

6. Dezember 2011 11:29

Ich dachte:
misterelektro1981 hat geschrieben:1) Es sollen nur die Artikel ausgegeben werden, die bereits einmal beschafft wurden.

Willst du die nun doch anzeigen?

Re: Filterbedingungen

6. Dezember 2011 12:27

Hatte ich das vorher mal nicht gesagt. Natürlich sollen auch die angezeigt werden, damit man ja sehen kann welche Artikel nachgepflegt werden müssen.

EDIT: Und wenn ich ehrlich bin, habe ich meinen obigen Code selber nicht ganz verstanden.

Re: Filterbedingungen

6. Dezember 2011 14:21

Ich möchte dir nicht alles umstoßen, aber wie wäre es mit nur einem DataItem, nämlich Artikel, nach deinen Wünschen gruppiert? Fertigungsartikel filterst du evtl. sofort raus. Im OnAfterGetRecord schaust du zuerst, ob es einen EK-Posten gibt. Falls ja, schaust du mit Hilfe einer weiteren Recordvariable in die EK-Preise und zählst die Lieferanten und summierst, was du brauchst. Somit hast du einen Header, eine Section für Artikel, einen Gruppen- und einen Gesamtfooter.

Re: Filterbedingungen

6. Dezember 2011 14:28

Wenn das so ist umständlich ist, denke ich es kann so bleiben. Der Bericht läuft ja zu 99% rund, nur wie das halt manchmal so ist, man will ja immer aller richtig machen.

Trotzdem vielen Dank für dein Bemühen.

Re: [t. gelöst] Filterbedingungen

6. Dezember 2011 14:33

Ist doch nicht umständlicher als das Bisherige. Und für meinen Geschmack um Einiges übersichtlicher, wenn der ganze Code an einem Stück steht.

Re: [t. gelöst] Filterbedingungen

6. Dezember 2011 14:50

Ich werde es noch mal probieren und gib dann mal bescheid, jedoch weiß ich immer noch nicht genau, ob mir dann auch die Artikel (Groupfooter) mit 0 Lieferanten angezeigt werden.-

Re: [t. gelöst] Filterbedingungen

6. Dezember 2011 15:51

Nun mal die Übersicht. Leider klappt es nun nicht mehr, kannst du mir vielleicht mal wieder einen Tip geben oder nen sehr guten Lösungsansatz?

Code:

Item - OnPreDataItem()
RhePic.GET;
RhePic.CALCFIELDS(Picture);

Item.SETFILTER("Replenishment System",'Einkauf');
Item.SETFILTER("Item Category Code",'GK|HP|SB|KL|MR');
IF "Item Category Code" = 'KL|MR' THEN
Item.SETFILTER("Product Group Code",'KL01|MR03..MR06');


CLEAR(AnzahlLieferanten);
CLEAR(AnzahlMultiLieferantenArtikel);
CLEAR(AnzahlArtikelmind1Lieferant);
CLEAR(AnzahlArtikel);
CLEAR(AnzahlMultiLieferantenArtikelG);
CLEAR(GesamtArtikel);
CLEAR(AnzahlArtikelOhne);

Item - OnAfterGetRecord()
CLEAR(LieferantenCode);

ItemLedgerEntry.SETRANGE("Entry Type",ItemLedgerEntry."Entry Type"::Purchase);
ItemLedgerEntry.SETRANGE("Item No.","No.");
IF ItemLedgerEntry.ISEMPTY THEN
  CurrReport.SKIP;


IF AnzahlLieferanten >= 2 THEN BEGIN
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

IF AnzahlLieferanten >= 1 THEN BEGIN
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;

IF ItemCode <> Item."Item Category Code" THEN BEGIN
CLEAR(AnzahlArtikel);
CLEAR(AnzahlMultiLieferantenArtikel);
ItemCode := Item."Item Category Code";
END;

GesamtArtikel += 1;
AnzahlArtikel += 1;

Item - OnPostDataItem()
IF LieferantenCode <> PurchasePrice."Vendor No." THEN BEGIN
AnzahlLieferanten += 1;
LieferantenCode := PurchasePrice."Vendor No.";
END;

 

Re: Filterbedingungen

6. Dezember 2011 16:22

Ist etwas schwer zu sagen, ohne zu wissen, was nicht läuft und woher zB der Wert von AnzahlLieferanten kommt. Und ich bin mir nicht sicher, ob dir die Trigger OnPreDataItem, OnAfterGetRecord und OnPostDataItem richtig geläufig sind. OnPreDataItem wird genau einmal vor allen Artikeln durchlaufen, OnAfterGetRecord nach jedem Artikel und OnPostDataItem genau einmal nach allen Artikeln. Es scheint, als wäre dein Code anders gedacht.

Re: Filterbedingungen

6. Dezember 2011 17:53

Mein Code ist wie folgt gedacht, ich hoffe das kann helfen es zu verstehen und mir hoffentlich einen Tip zu geben. Nebenbei: Beim starten des Reports werden nun die Integer Variablen gelert.
Hier der restliche Code mit Beschreibung.
Code:

Item - OnPreDataItem()
RhePic.GET;
RhePic.CALCFIELDS(Picture);

Item.SETFILTER("Replenishment System",'Einkauf');                      //diverse Filter
Item.SETFILTER("Item Category Code",'GK|HP|SB|KL|MR');
IF "Item Category Code" = 'KL|MR' THEN
Item.SETFILTER("Product Group Code",'KL01|MR03..MR06');
 
IF ItemCode <> Item."Item Category Code" THEN BEGIN               //Gruppenbezogen bzw. beim Gruppenwechsel sollen diese Variablen geleert werden;
CLEAR(AnzahlArtikel);
CLEAR(AnzahlMultiLieferantenArtikel);
ItemCode := Item."Item Category Code";
END;

Item - OnAfterGetRecord()
ItemLedgerEntry.SETRANGE("Entry Type",ItemLedgerEntry."Entry Type"::Purchase);  //das ist die Abprüfung, ob ein Posteneintrag Einkauf vorhanden ist, sonst wird eine weiter Verarbeitung unterbunden
ItemLedgerEntry.SETRANGE("Item No.","No.");
IF ItemLedgerEntry.ISEMPTY THEN
  CurrReport.SKIP;

CLEAR(LieferantenCode);                                      //wird geleert, damit die Anzahl von Lieferanten angezeigt ist

IF LieferantenCode <> PurchasePrice."Vendor No." THEN BEGIN       //bei unterschiedlichen Lieferantencodes wird der Zähler um 1 erhöht, oder?
AnzahlLieferanten += 1;
LieferantenCode := PurchasePrice."Vendor No.";
END;

IF AnzahlLieferanten >= 2 THEN BEGIN   //für eine spätere Verwendung in den Sections
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

IF AnzahlLieferanten >= 1 THEN BEGIN  //für eine spätere Verwendung in den Sections
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;

GesamtArtikel += 1;
AnzahlArtikel += 1;


Kannst du mir hiermit einen Tip geben?

Re: Filterbedingungen

6. Dezember 2011 18:13

Du musst die Einkaufspreise in einer Schleife durchlaufen, gefiltert auf die Artikelnummer.

Sonst noch:
Code:
Item - OnPreDataItem()
RhePic.GET;
RhePic.CALCFIELDS(Picture);

Item.SETFILTER("Replenishment System",'Einkauf');                      //diverse Filter
Item.SETFILTER("Item Category Code",'GK|HP|SB|KL|MR');
IF "Item Category Code" = 'KL|MR' THEN  <--- bringt hier nichts, da noch kein Artikel gefunden wurde. Soll das eine Oder-Abfrage sein?
Item.SETFILTER("Product Group Code",'KL01|MR03..MR06');

IF ItemCode <> Item."Item Category Code" THEN BEGIN <--- ebenfalls: noch kein Artikel gefunden
CLEAR(AnzahlArtikel);
CLEAR(AnzahlMultiLieferantenArtikel);
ItemCode := Item."Item Category Code";  <--- ebenfalls: noch kein Artikel gefunden

END;


Einen Gruppenwechsel bemerkst du nur im OnAfterGetRecord. Sind die Artikel eigentlich nach dem Artikelkategoriencode sortiert? Ich sehe kein SetCurrentKey, aber möglicherweise hast du das ja in den Properties eingestellt.

Re: Filterbedingungen

7. Dezember 2011 08:44

Eine Schleife habe ich noch nie geschrieben. Wie stellt man denn so etwas an und wo baut man dann diese Schleife an?

Bezüglich der Filterbedingungen, seltsamerweise funktioniert das so, wie ich das haben wollte, unabhängig davon ob ich den Teil den du kommentiert hast in OnPre oder im OnAfter.. Trigger stehen habe. Dennoch habe ich den Code nun etwas verschoben. Ist die Position des Code so ok? Dann bleibt ja nur noch die Sache mit der Schleife übrig.

Code:

Item - OnPreDataItem()
RhePic.GET;
RhePic.CALCFIELDS(Picture);

Item.SETFILTER("Replenishment System",'Einkauf');
Item.SETFILTER("Item Category Code",'GK|HP|SB|KL|MR');

Item - OnAfterGetRecord()
IF "Item Category Code" = 'KL|MR' THEN
Item.SETFILTER("Product Group Code",'KL01|MR03..MR06');

IF ItemCode <> Item."Item Category Code" THEN BEGIN
CLEAR(AnzahlArtikel);
CLEAR(AnzahlMultiLieferantenArtikel);
ItemCode := Item."Item Category Code";
END;

ItemLedgerEntry.SETRANGE("Entry Type",ItemLedgerEntry."Entry Type"::Purchase);
ItemLedgerEntry.SETRANGE("Item No.","No.");
IF ItemLedgerEntry.ISEMPTY THEN
  CurrReport.SKIP;

CLEAR(LieferantenCode);

IF LieferantenCode <> PurchasePrice."Vendor No." THEN BEGIN
AnzahlLieferanten += 1;
LieferantenCode := PurchasePrice."Vendor No.";
END;

IF AnzahlLieferanten >= 2 THEN BEGIN
  AnzahlMultiLieferantenArtikel +=1;
  AnzahlMultiLieferantenArtikelG +=1;
  END;

IF AnzahlLieferanten >= 1 THEN BEGIN
  AnzahlArtikelmind1Lieferant +=1;
  AnzahlLieferanten := 0;
END;

GesamtArtikel += 1;
AnzahlArtikel += 1;


EDIT: In Abhängigkeit wo man die Filterbedingung hinschreibt, erscheint doch etwas anderes. Wo schreibt man denn die Filterbedingung richtigerweise hin, die Filter auf Artikelkategorie greifen, die auf Produktgruppe nicht, egal wo (OnPre, OnAfter, OnPost) sie stehen.

Re: Filterbedingungen

7. Dezember 2011 11:41

Was genau soll das hier
Code:
[quote="misterelektro1981"]IF "Item Category Code" = 'KL|MR' THEN[/quote]

bewirken?

Die Abfrage prüft auf den Artikelkategoriencode 'KL|MR', und zwar auf wortwörtlich diese 5 Zeichen. Es ist keine Oder-Abfrage.

Und eine Schleife hast du noch nie gemacht? Das fällt mir aber schwer zu glauben :wink:

Sowas wie
Code:
SetRange(Feld, ...)
if findset then repeat
.
.
until next=0;

kennst du doch?

Re: Filterbedingungen

7. Dezember 2011 11:48

Ich muss es leider immer wieder erwähnen, ich hatte nie eine richtige Schulung und muss sehr sehr selten etwas programmieren.

IF "Item Category Code" = 'KL|MR' bedeutete für mich: falls Artikelkategorie KL oder MR, dann... wie schreibt man das denn sonst?

MIt der Schleife... ich weiß wirklich nicht, ob ich sowas schon mal gemacht habe, vielleicht so ählich aber wie gesagt, mache das halt sehr sehr seltem. Ich werde das mit der Schleife dann mal irgenwie testen und bescheid geben.

Re: Filterbedingungen

7. Dezember 2011 12:00

Es ist eigentlich nicht so schön, auf ein eingelesenes DataItem im OnAfterGetRecord nochmals zu filtern. Ich weiß grad gar nicht, was genau passiert, wenn man sich dann ein eben eingelesenes Record wieder raus filtert, aber man sollte es umgehen. Lieber eine Abfrage auf eine Record-Variable und davon abhängig ein Skip oder nicht.

deine Oder-Abfrage machst du mit einem OR :wink: Also

Code:
If "Item Category Code"='XY' OR "Item Category Code"='XYZ' then ...