[gelöst]Mehrere Records an Report übergeben

16. Juli 2009 10:13

Moin moin,

wir haben eine Möglichkeit von verschieden Artikeln die Stückliste aufzurufen und so Einzelinformationen der verbauten Materialien zu erhalten.
Dafür existiert eine Tabelle „Stückliste“ in der für jeden Artikel einzelne Rohartikel hinterlegt sind. Nun kann man noch einen Report generieren, der aus einer anderen Tabelle noch den jeweiligen Kreditor des Rohartikels sucht und Alles schön säuberlich auflistet.

Nun zum Problem/Frage, wir hätten gerne eine Lösung, dass man diesen Report auch direkt aus einer Rechnung oder Ähnlichem aufrufen kann und für alle darin enthaltenen Artikel alle Infos holt.
Das Problem ist jedoch, dass normalerweise nur ein Artikel aufgerufen wird, es wird einfach ein SETRANGE auf die Tabelle Stückliste in einen Record geschrieben und damit wird der Report aufgerufen.
Wenn man jetzt jedoch mehrere Artikel hat, ist ein SETRANGE nicht mehr möglich, da sich natürlich dazwischen auch andere Artikel befinden.

Und irgendwie sehe ich da jetzt erstmal keine Möglichkeit, als einen neuen Report mit einer anderen Syntax zu erstellen.
Seht ihr da eine Möglichkeit, wie man trotzdem, den sonst guten Report, so aufrufen könnte, dass er auch für mehrere Artikel zu gebrauchen ist?

Gruß
Steffen
Zuletzt geändert von Steffen am 17. Juli 2009 09:47, insgesamt 1-mal geändert.

Re: Mehrere Records an Report übergeben

16. Juli 2009 10:37

Nur so ´ne Idee, habs nicht getestet!
Vor dem Aufruf des Reports eine zusätzliche Recordvariable mit mit MARK / MARKEDONLY makieren (hierzu mit einem weiteren RechnungszeilenRec alle Rechnungzeilen der aktuellen Ansicht durchgehen) und diese per SETTABLEVIEW an den Report über geben.

Re: Mehrere Records an Report übergeben

16. Juli 2009 10:45

Man könnte den report auch x-mal hintereinander für x Artikel aufrufen ...

Re: Mehrere Records an Report übergeben

16. Juli 2009 14:17

So, ich habe das jetzt versucht, was mikka vorgeschlagen hat.

Jedoch klappt das leider nicht,

Nr. 1, sobald dann der Report läuft, ist er leer. Also scheine wohl keine Daten übergeben zu sein.
Nr. 2, kleine Verständnissfrage zu dem Mark, werden diese Marks lokal gesetzt? Da es natürlich unschön wäre, wenn zwei Leute gleichzeitig drucken und jeweils die Gemarkten des Anderen mit drin haben...
Nr. 3, wie starte ich den Report ohne, dass er mir vorher noch mal die Parameterauswahl zeigt?

Hier ist schonmal mein Code, vielleicht sieht da ja jemand auf Anhieb, wo mein Problem ist,
ich suche einfach mal weiter:
Code:
{Variablen
Name           DataType   Subtype           Length
SL               Record       Stückliste   
Verkaufszeile   Record       Verkaufszeile   
SLR               Report       Stückliste
}
      
Verkaufszeile.RESET;
Verkaufszeile.SETFILTER(Verkaufszeile.Belegart,'Rechnung');
Verkaufszeile.SETFILTER(Verkaufszeile."Belegnr.","Nr.");
IF Verkaufszeile.FINDSET THEN BEGIN
    SL.RESET;
    SL.SETCURRENTKEY(Artikel);

    REPEAT
        IF Verkaufszeile."Nr."<>'' THEN BEGIN             
            SL.Artikel:=Verkaufszeile."Nr.";

            //IF
             SL.FIND('=');
            //THEN MESSAGE('Artikel: %1 gefunden',SL.Artikel);
            SL.MARK(TRUE);
        END;
    UNTIL Verkaufszeile.NEXT=0;
END;
 
SL.MARKEDONLY(TRUE);
SLR.SETTABLEVIEW(SL);
SLR.RUN;


@McClane, bei einer Rechnung mit mehreren Artikeln, kann ich doch niemandem zumuten, dass er sich noch für jeden Artikel ein Blatt bzw. einen Report dazu holt, das wird zu viel.

Re: Mehrere Records an Report übergeben

16. Juli 2009 14:29

Ich hatte es so verstanden, dass du einen Report hast, der die Artikeltabelle als Basis hast.
Du stehst in einem Belegkopf (Sales Header) und willst den Report für alle Artikel aufrufen, die in den Belegzeilen vorkommen.
Dann musst du die Artikeltabelle markieren.

So hätte ich mir das vorgestellt:

Code:
// Rec = Sales Header
// Item = Record, Subtype Item

Verkaufszeile.RESET;
// Filtere auf alle VK-Zeilen des Beleges mit gefüllter Artikelnummer
Verkaufszeile.SETTRANGE("Document Type",Rec."Document Type");
Verkaufszeile.SETRANGE("Document No.",Rec."No.");
Verkaufszeile.SETRANGE(Type, Verkaufszeile.Type::Item);
Verkaufszeile.SETFILTER("No.", '<>%1', '');
IF Verkaufszeile.FINDSET THEN BEGIN
  REPEAT
    Item.GET(Verkaufszeile."No."); // hole Artikel
    Item.MARK(TRUE);                   // markiere Artikel
  UNTIL Verkaufszeile.NEXT=0;
END;

Item.MARKEDONLY(TRUE); // filtere auf markierte Artikel
SLR.SETTABLEVIEW(Item);
SLR.RUN;


Und nein, keine Sorge. Diese Markierungen finden nur auf dem Record (in deinem Client statt) und nicht global für alle, die zum gleichen Zeitpunkt (und anderer Codestelle) auf diese Tabelle zugreifen.
Denn für alle Filterungen (Markierung ist auch eine Art Filterung) gilt: Es wird nur eine Auswahlanforderung an die Datenbank geschickt, es werden keine Datensätze geändert!

Re: Mehrere Records an Report übergeben

16. Juli 2009 14:35

Steffen hat geschrieben:@McClane, bei einer Rechnung mit mehreren Artikeln, kann ich doch niemandem zumuten, dass er sich noch für jeden Artikel ein Blatt bzw. einen Report dazu holt, das wird zu viel.

das war schon als automatischer Mehrfachaufruf gedacht :wink:
Aber Natalies Lösung sieht eh besser aus.
Zuletzt geändert von McClane am 16. Juli 2009 14:59, insgesamt 1-mal geändert.

Re: Mehrere Records an Report übergeben

16. Juli 2009 14:39

McClane hat geschrieben:Aber Natalies Lösung ist eh besser.

Wenn MARKEDONLY + SETTABLEVIEW überhaupt funktionieren sollte. Geht vielleicht genauso wenig wie zusammen mit Temporären Records ...

Re: Mehrere Records an Report übergeben

16. Juli 2009 15:00

Natalie hat geschrieben:Wenn MARKEDONLY + SETTABLEVIEW überhaupt funktionieren sollte. Geht vielleicht genauso wenig wie zusammen mit Temporären Records ...

Ganz wie du meinst, ich habe meinen Beitrag korrigiert :wink:

Re: Mehrere Records an Report übergeben

16. Juli 2009 15:10

da bin ich wieder,

erstmal um eventuellen Verwirrungen vorzubeugen, ich war in den falschen Tabellen unterwegs, ich brauche das nicht schon beim Rechnung schreibenm, sondern nur bei den gebuchten, aber das spielt ja im Prinzip bis auf einen Filter weniger keine Rolle.

also noch als Ergänzung, der holt nicht pro Verkaufszeile 1 sondern mehrere Artikel, sagen wir '3033-035-77-10' ist der bestellte Artikel, dieser unterteilt sich aber noch in diverse Rohartikel, diese brauche ich.
Das heißt in ITEM steht der Artikel z.B. vier mal drin, jeweils mit einer Zeilennr. um einen Primärschlüssel zu schaffen.

Meine Anpassung habe ich mit zwei Fragen kommentiert, evtl. ist das ja auch das Problem der Sache.

Code:
SL.RESET; //hat der nicht sonst noch die Marks einer vorigen Abfrage drin?
Verkaufsrechnungszeile.RESET;
Verkaufsrechnungszeile.SETRANGE(Verkaufsrechnungszeile."Belegnr.","Nr.");
//Verkaufsrechnungszeile.SETRANGE(Type, Verkaufsrechnungszeile.Type::SL); //was soll der hier machen?
Verkaufsrechnungszeile.SETFILTER("Nr.",'<>%1','');
IF Verkaufsrechnungszeile.FINDSET THEN BEGIN
   
    REPEAT
            SL.GET(Verkaufsrechnungszeile."Nr.")
            SL.MARK(TRUE);
            //SL.SETCURRENTKEY(Artikel);
            //SL.Artikel:=Verkaufsrechnungszeile."Nr.";
            //SL.FIND('=');
            //SL.MARK(TRUE);
       
    UNTIL Verkaufsrechnungszeile.NEXT=0;
END;

SL.MARKEDONLY(TRUE);
SLR.SETTABLEVIEW(SL);
SLR.RUN;


Fehlermeldung daraufhin:
---------------------------
Microsoft Business Solutions-Navision
---------------------------
Die Stuckliste existiert nicht.

Identifizierende Felder und Werte:

Artikel='3033-035-77-10',Zeilennr.='0'



---------------------------
OK
---------------------------

Re: Mehrere Records an Report übergeben

16. Juli 2009 15:20

Mit Re-Kommentierung und Re-Korrekturen ;-)
OK, SL soll also wirklich Record Item sein ...
Vorweg: Warum sind bei dir die ganzen Feldnamen deutsch? Geht es nicht um die Standardtabellen 36 und 37? Habs wieder zurück gesetzt ... Sonst funktionieren schon die OptionNames nicht mehr ...

Code:
SL.RESET; //hat der nicht sonst noch die Marks einer vorigen Abfrage drin? -> wenn SL global angelegt ist: könnte theoretisch vorkommen! Würd ich sowieso lokal anlegen
Verkaufsrechnungszeile.RESET;
Verkaufsrechnungszeile.SETRANGE("Document No.","No.");
Verkaufsrechnungszeile.SETRANGE(Type, Verkaufsrechnungszeile.Type::Item); //was soll der hier machen? -> auf Zeilen der Art Artikel filtern - Item hat hier nichts mit dem RECORD Item zu tun, es ist ein sog. OptionName!
Verkaufsrechnungszeile.SETFILTER("No.",'<>%1','');
IF Verkaufsrechnungszeile.FINDSET THEN BEGIN
   
    REPEAT
            SL.GET(Verkaufsrechnungszeile."Nr.")
            SL.MARK(TRUE);
            // Benutze nun eine Tabelle/Feld, in der du die Verknüpfung Artikel -> Rohartikel ablesen kannst
            // Da ich diese Verknüpfung nicht kenne, setze ich "Rohartikelnr" als gegeben an:
            IF Rohartikelvorhanden THEN BEGIN
              SL.GET(Rohartikelnr);
              SL.MARK(TRUE);       
            END;
    UNTIL Verkaufsrechnungszeile.NEXT=0;
END;

SL.MARKEDONLY(TRUE);
SLR.SETTABLEVIEW(SL);
SLR.RUN;

Re: Mehrere Records an Report übergeben

16. Juli 2009 16:00

Ja, Anfangs sprach ich auch von der 36 und der 37, habe ich ja mittlerweilen geändert, da es da keinen Sinn macht, auf deutsch ist torzdem alles ;-)

hier wieder meine Version mit der wahrscheinlichen wichtigen Info:

Code:
Verkaufsrechnungszeile.RESET;
Verkaufsrechnungszeile.SETRANGE("Belegnr.","Nr.");
Verkaufsrechnungszeile.SETRANGE(Art, Verkaufsrechnungszeile.Art::Artikel);
Verkaufsrechnungszeile.SETFILTER("No.",'<>%1','');
IF Verkaufsrechnungszeile.FINDSET THEN BEGIN
   
    REPEAT
            SL.GET(Verkaufsrechnungszeile."Nr.")  //das klappt nicht, vermutlich weil er eine Artikelnummer und zusätzlich die Zeilennummer haben möchte
            SL.MARK(TRUE);
            // Benutze nun eine Tabelle/Feld, in der du die Verknüpfung Artikel -> Rohartikel ablesen kannst

            //das ist ja die Tabelle SL, in dieser sind die Rohartikel, diese kennzeichnen sich durch die erste
            //Spalte (der Artikel) und einer fortlaufenden Zeilennummer in der zweiten Spalte, die Rohartikel
            //haben eine eigene Artikelnr., diese hat aber nichts mit dem primary Key zu tun.
            //als Beispiel hat der Artikel 3033-035-77-10
            //den  Rohartikel 3033-035-77-10 Zeilennr. 45223 und  3033-035-77-10 Zeilennr. 45224, 
            //diese haben dann verschiedene Eigenschaften

            // Da ich diese Verknüpfung nicht kenne, setze ich "Rohartikelnr" als gegeben an:
            IF Rohartikelvorhanden THEN BEGIN
              SL.GET(Rohartikelnr);
              SL.MARK(TRUE);       
            END;
    UNTIL Verkaufsrechnungszeile.NEXT=0;
END;

SL.MARKEDONLY(TRUE);
SLR.SETTABLEVIEW(SL);
SLR.RUN;

Re: Mehrere Records an Report übergeben

16. Juli 2009 20:23

Und dieser Report SLR - auf welcher Tabelle basiert er nun? Item? Rohartikel?

Re: Mehrere Records an Report übergeben

17. Juli 2009 08:24

Moin,

also entweder ich habe echt ein Verständnissproblem oder wir reden aneinader vorbei :-(

Es gibt nur eine Tabelle, die eine Rolle spielt, das ist die Tabelle "Stückliste" - SL, die normale Artikeltabelle wird für den Zweck glaube ich gar nicht gebraucht, da alle notwendigen Infos in den Verkaufskopf/zeile Tabellen stehen.
Auf dieser basiert auch der Report.

Diese Tabelle Stückliste besteht aus zig tausend Zeilen in der für jeden Artikel diverse Rohartikel stehen, die sich prinzipiell auch ständig wiederholen, aber auf Grund der Syntax trotzdem immer neu kommen.

Der Artikel 3033-035-77-10 wird dort zum Beispiel mit den Rohartikeln
3033-035-77-10 Zeilennr. 45223 und 3033-035-77-10 Zeilennr. 45224 geführt.
Also in der ersten Spalte steht die Artikelnr. und in der Zweiten steht eine fortlaufende Zeilennr. gemeinsam ergibt das den Primarykey.

Daher habe ich immer versucht mittels
Code:
 
            SL.SETCURRENTKEY(Artikel);
            SL.Artikel:=Verkaufsrechnungszeile."Nr.";
            SL.FIND('=');
            SL.MARK(TRUE);

die zweite Spalte zu ignorieren und alle Roarhtikel mit der Artikelnr. in der ersten Spalte zu markieren.
Wenn ich das aber mache passiert gar nichts.
Wenn ich das über den Weg mit dem Get mache, erwartet er jedoch immer eine Zeilennr.

Ich hoffe, das gibt dir die Antwort, die Du brauchst.

Re: Mehrere Records an Report übergeben

17. Juli 2009 08:41

Steffen hat geschrieben:Also in der ersten Spalte steht die Artikelnr. und in der Zweiten steht eine fortlaufende Zeilennr. gemeinsam ergibt das den Primarykey.

Du meinst nicht zufällig die Tabelle Fert.-Stücklistenzeile?¿ In dem Fall müsstest du noch die Versionsnummer beachten (falls ihr mit Versionen arbeitet).

Re: Mehrere Records an Report übergeben

17. Juli 2009 08:49

Nein, die Tabelle heißt einfach Stückliste und hat die Nummer 60006, ist also keine Standardtabelle.

Re: Mehrere Records an Report übergeben

17. Juli 2009 08:53

Viel zu umständlich :-)
Wenn du in deinem Zielreport in den Designmodus schaltest (Strg+F2) - welches DataItem steht in der 1. Zeile? Was ist der Inhalt der linken Spalte (=wirklicher Tabellenname)?
Oder noch besser: Wie lautet die Report-ID?

Re: Mehrere Records an Report übergeben

17. Juli 2009 08:53

Achso.
dann evtl so:
Code:
// Anstatt
{SL.SETCURRENTKEY(Artikel);
SL.Artikel:=Verkaufsrechnungszeile."Nr.";
SL.FIND('=');
SL.MARK(TRUE);}

// so
SL.SETCURRENTKEY(Artikel);
SL.SetRange(Artikel,Verkaufsrechnungszeile."Nr.");
if SL.FIND('-')then
  repeat
     SL.MARK(TRUE);
  until SL.next=0;

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:00

@Natalie DataItem Stückliste ;-) Report ID 50006
@McClane probier ich mal, sehe grade, das war auch der letzte Versuch von mir gestern Abend, da lande ich wieder bei
---------------------------
Microsoft Business Solutions-Navision
---------------------------
Die Stuckliste existiert nicht.

Identifizierende Felder und Werte:

Artikel='3033-035-77-10',Zeilennr.='0'



---------------------------
OK
---------------------------

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:05

Natalie hat geschrieben:Oder noch besser: Wie lautet die Report-ID?

Ob das nun wirklich besser war .... :wink:

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:06

Steffen hat geschrieben:Die Stuckliste existiert nicht.

Identifizierende Felder und Werte:

Artikel='3033-035-77-10',Zeilennr.='0'

Das liegt aber nicht an meinem Code-Schnipsel ...

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:08

McClane hat geschrieben:
Natalie hat geschrieben:Oder noch besser: Wie lautet die Report-ID?

Ob das nun wirklich besser war .... :wink:

Ich habs befürchtet ... Und was ist nun das erste DataItem dieses Reports? Ist "Rohartikel" etwa auch eine selbst gebastelte Tabelle? Das lässt sich doch alles über den Standard abbilden :shock:

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:11

Hier einfach norchmal der aktuelle Code, warum der trotzdem die Zeilennummer haben will, verstehe ich nicht
Code:
Verkaufsrechnungszeile.RESET;
Verkaufsrechnungszeile.SETRANGE("Belegnr.","Nr.");
Verkaufsrechnungszeile.SETRANGE(Art, Verkaufsrechnungszeile.Art::Artikel);
Verkaufsrechnungszeile.SETFILTER("Nr.",'<>%1','');
IF Verkaufsrechnungszeile.FINDSET THEN BEGIN
   
    REPEAT
            SL.SETCURRENTKEY(Artikel);
            SL.GET(Verkaufsrechnungszeile."Nr.");  // Hier ist der Break on Error
            IF SL.FIND('-') THEN BEGIN
                REPEAT
                    SL.MARK(TRUE);
                UNTIL SL.NEXT=0;
            END;
    UNTIL Verkaufsrechnungszeile.NEXT=0;
END;

SL.MARKEDONLY(TRUE);
SLR.SETTABLEVIEW(SL);
SLR.RUN;


@Natalie, das DataItem ist Stückliste (die Rohartikeltabelle)

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:19

McClane, übernimm du mal bitte weiter ....

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:20

das nich:
Code:
SL.GET(Verkaufsrechnungszeile."Nr.");

Sondern:
Code:
SL.SETRANGE(Artikel,Verkaufsrechnungszeile."Nr.");

Re: Mehrere Records an Report übergeben

17. Juli 2009 09:23

HAllo Steffen,

schau Dir den Code von McLane an und vergleiche mit Deinem.
Der markante Unterschied ist:
McLane: SL.SetRange(Artikel,Verkaufsrechnungszeile."Nr.");
bei Dir: SL.GET(Verkaufsrechnungszeile."Nr."); // Hier ist der Break on Error

Versuch's doch auch mal mit "SETRANGE"...

OK, zu langsam ...