Dynamics User Group - Archived Forums

The forums in this section of DUG are no longer accepting new post, but you can still get lots of value from the old posts here.
Please visit the active forums to comment/post new questions (choose which product you are interested in):


Verstehe COPYFILTERS nicht ...

Liebe Mitglieder

es ist ganz schrecklich: Ich kann zum wiederholten mal eine Pendenz nicht machen, weil ich offenbar COPYFILTERS nicht verstehe oder etwas völlig falsches von dieser Funktion erwarte. Ich hoffe ich kann mein Dilemma schildern:

 

Wenn ich von einem DataItem in meiner festen Report Struktur mit COPYFILTERS versuche die Filter auf eine Record-Variable zu setzen und dann über die Records iteriere erhalte ich nicht die erwarteten Records. Wenn ich hingegen jeden einzelnen Feldfilter mit SETFILTER(GETFILTER()) setze funktioniert alles wie erwartet.

Nochmals anders ausgedrückt:

1.

rTabelleX.COPYFILTERS(TabelleX);

Iteration über rTabelleX - bringt nicht die Records die ich erwarte (oft zu wenig als ob zu viele Filter gesetzt würden)

Funktioniert nicht Sad

-----------------------------------------------------------------------------------------------------------------------------------------------------------

2.

rTabelleX.SETFILTER(Feld1, TabelleX.GETFILTER(Feld1))

rTabelleX.SETFILTER(Feld2, TabelleX.GETFILTER(Feld2))

usw. für jedes Feld der Tabelle ...

Iteration über rTabelleX - bringt genau die Records die ich erwarte. Diese Lösung ist zwar unpraktisch, da ich jeden Filter für jedes Feld einzeln setzen muss, funktioniert aber !!!

 

Versteht mich jemand und kann mir helfen?

Herzlichen Dank (bin am Verzweifeln ...)

Gruss

Thomas

 

  • Übrigens:

    Wenn ich nach dem Setzen der Filter mit COPYFILTERS die Filter mit rTabelleX.GETFILTERS in einer MessageBox drucke, sehe ich nicht, dass Filter falsch gesetzt würden ... aber irgendetwas stimmt trotzdem nicht ...

  • In reply to ThomasIngold:

    Guten Tag

    sorry für meine späte Rückmeldung respektive für meinen Monolog ...

    Ich habe festgestellt, dass mein Problem nicht COPYFILTERS ist. Es geht später etwas schief.

    1. Ich setze mit COPYFILTERS die Filter auf meine Recordvariable - es ist ein Feld auf das gefiltert werden soll: Der Filter wird korrekt gesetzt (Debugger).
    2. Jetzt setze ich mit SETRANGE einen zusätzlichen Filter auf ein anderes Feld. Jetzt setzt Navision den Filter auf das gleiche Feld wie oben !?!?!?!

    Ich kann COPYFILTERS auch weglassen und beide Filter mit SETRANGE setzen.

    Konkret:

    rKlientDienst.SETRANGE(Sanität, 'BAS');
    rKlientDienst.SETRANGE(Klient,ZeileSchluesseldienst."Sell-to Customer No.");

    Beim zweiten SETRANGE wird der Wert von "Sell-to Customer No." ebenfalls auf das Feld Sanität gesetzt ... anstelle auf das Feld Klient.

    Wieso geht das derart schief?

    Thomas

  • In reply to ThomasIngold:

    hallo thomas,

     

    entschuldige bitte die verspätete antwort.

     

    machst du vor dem filtern ein RESET, oder filterst du einfach?

     

    im grunde sollte es fast schon egal sein, aber trotzdem mal n RESET versuchen.

  • In reply to s_weikelt:

    Kein Problem & vielen Dank!

    Ja, ich mache zuerst:

    CLEAR(rKlientDienst);

    Das zweite(!!) Problem mit dem überschreiben der Filter hat sich erledigt - ich weiss aber nicht wieso!

    Ich habe immer noch das Problem wie in der ersten Post beschrieben:

    • COPYFILTERS setzt mir die richtigen Filter
    • anschliessend setze ich einen zusätzlichen Filter

    Danach sind auf rKlientDienst die korrekten Filter gesetzt, aber ich ich finde die entsprechenden Records trotzdem nicht. (Hingegen klappt es wenn ich die Filter für jedes Feld einzeln kopiere ... das ist aber keine Lösung)

    Ich habe beim Googlen ca. 3 Posts von Leuten gefunden, die genau dasselbe Problem haben. (Aber leider keine für mich verständliche Lösung). COPYFILTERS scheint noch irgendetwas anderes zu machen, was sich mir nicht erschliesst ...

    Vielen Dank!

    Thomas

  • In reply to ThomasIngold:

    Kannst Du den Code posten? Vielleicht hilft das zur Lösungsfindung.

  • In reply to pduck:

    Hallo PDuck

    vielen Dank für's Interesse!

    Das ganze handelt in einer OnPreSection() eines GroupFooters (spielt wohl an sich keine Rolle) ...

    vPrint := FALSE;

    // Klient Dienst ...
    CLEAR(rKlientDienst2);
    rKlientDienst2.SETCURRENTKEY(Klient, Dienst);

    ////////////////////////////////////////////////////////////////////////////
    // 1. Das wäre die richtige/schöne Lösung !!!
    //IF(DienstArtikel.GETFILTERS <> '') THEN BEGIN
    //  rKlientDienst2.COPYFILTERS(DienstArtikel);
    //END;

    ////////////////////////////////////////////////////////////////////////////
    // 2. Das ist die ***-Lösung, die aber funktioniert !!!
    rKlientDienst2.SETRANGE(Sanität, DienstArtikel.GETFILTER(Sanität));
    // andere Felder der Tabelle müssten auch wie einzeln kopiert werden ...
    // das ist nicht schön !
    ////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////
    // Zusammenfassung meines Problems:
    // COPYFILTERS funktioniert zwar, d.h. die Filter werden laut Debugger UND
    // MessageBox richtig gesetzt, aber es wird dann kein Record gefunden !!!
    // Warum nicht ??? Was macht COPYFILTERS ???
    ////////////////////////////////////////////////////////////////////////////

    // Setzen des zusätzlichen Filters ...
    rKlientDienst2.SETRANGE(rKlientDienst2.Klient, ZeileSchluesseldienst."Sell-to Customer No.");

    IF rKlientDienst2.FINDFIRST THEN BEGIN
      // mit 1. Lösung nie erreichbar, obwohl Record vorhanden !!!
      REPEAT
        IF(rKlientDienst2.Schlüsseldienst = TRUE) THEN BEGIN
          vPrint := TRUE;
        END;
      UNTIL rKlientDienst2.NEXT = 0;
    END;

    Das ist Alles ...

    Vielen Dank!

    Thomas

  • In reply to ThomasIngold:

    Referenzieren die Variablen  "rKlientDienst2" und "DienstArtikel" die gleiche Tabelle?

    Wenn ja, dann probier das hier mal:

    rKlientDienst2 := DienstArtikel;
    rKlientDienst2.SETRANGE(rKlientDienst2.Klient, ZeileSchluesseldienst."Sell-to Customer No.");
    rKlientDienst2.SETRANGE(Schlüsseldienst , TRUE);
    vPrint := NOT rKlientDienst2.ISEMPTY;

     

    Das ist in diesem Falle sogar die gesamte Section !!!

  • In reply to Thomas Brodkorb:

    Ähnliches hätte ich es jetzt auch vorgeschlagen, allerdings anstatt der Zuweisung mit COPY(). Damit dürften dann auch evt. Satzmarkierungen mitkommen.

  • In reply to pduck:

    Lieber Thomas & lieber PDuck

    vielen Dank für Eure Hilfe! Klappt leider auch nicht ... Kann euch (noch) nicht sagen wieso ...

    Thomas

  • In reply to ThomasIngold:

    >Referenzieren die Variablen  "rKlientDienst2" und "DienstArtikel" die gleiche Tabelle?

    Ja!

  • In reply to ThomasIngold:

    Jetzt wird es komisch.

    Sind das Variablen oder DataItems? Global oder Local? Werden in dem Report Daten verändert? Macht es einen Unterschied anstatt dem CLEAR() ein RESET() zu verwenden?

  • In reply to pduck:

    DienstArtikel ist ein DataItem. rKlientDienst ist eine globale Variable (die ich allerdings nur in dieser Section verwende, lokal wäre wohl besser, aber wie gesagt: ich mache sonst nirgends etwas damit ..)

    RESET an Stelle von CLEAR habe ich nicht ausprobiert. Mach ich dann gleich noch.

    Danke!

  • In reply to ThomasIngold:

    >Werden in dem Report Daten verändert?

    Nein!

  • In reply to ThomasIngold:

    Funktioniert auch mit RESET nicht ...

    Das Problem ist Folgendes: Ich setze auf das Feld "Sanität" des DataItems DienstArtikel den Filter 'BAS' aber durch die Zeile


    rKlientDienst2 := DienstArtikel;

    wird dieser Filter nicht übernommen ... die anderen beiden Filter Schlüsseldienst und "Sell-to Customer No." werden (natürlich) korrekt gesetzt ...

    Also:

    rKlientDienst2.RESET;
    rKlientDienst2 := DienstArtikel;
    rKlientDienst2.SETRANGE(Schlüsseldienst, TRUE);
    rKlientDienst2.SETRANGE(rKlientDienst2.Klient, ZeileSchluesseldienst."Sell-to Customer No.");

    IF rKlientDienst2.FINDFIRST THEN BEGIN
      vPrint := TRUE;
    END;

     

    Vielen Dank nochmal, bin am Ende (schon lange)

  • In reply to ThomasIngold:

    also willst du mit

    rKlientDienst2 := DienstArtikel;

     

    die filter von rKlientDienst2 auf Dienstartikel übernehmen?

    also mit CopyFilters sollte es eigentlich gehen.

     

Related