[gelöst] processing report extended

4. April 2011 18:31

Hallo zusammen,

mitlerweile habe ich gelernt, wie ich mit einem processing report mehrere Datensätze in einer Tabelle ändern kann.
Nun kommt die Steigerung, bei der ich noch keine Idee habe.

Es geht um folgendes.
Es gibt eine Tabelle mit Merkmalen:
Artikelnummer; Merkmalcode
1000; Tennisbälle
1000; hochwertig
1000; profi equipment
1001; Fußbälle
1002; Tischtennisschläger
1003; Tennisbälle
1003; medium quality

Nun möchte ich allen Artilenummern die das Merkmal Tennisbälle haben, ein zusätzliches Merkmal Ball geben.

In der Tabelle sollte das dann so aussehen:
Artikelnummer; Merkmalcode
1000; Tennisbälle
1000; Ball
1000; hochwertig
1000; profi equipment
1001; Fußbälle
1002; Tischtennisschläger
1003; Tennisbälle
1003; Ball
1003; medium quality

Wie zu sehen ist, sollte der Filter quasi auf ein Merkmal gesetzt werden. Es soll nur kein Datensatz geändert werden sondern ein neuer eingefügt werden. Und zwar bei jedem Artikel der das Filtermerkmal hat.

Artikelnummer und Merkmalcode sind beides Code Felder und als keys hinterlegt.

Die Merkmalecodes werden in einer anderen Tabelle verwaltet...

Bin um jeden Tipp froh :)

Viele Grüße
Dennis
Zuletzt geändert von x-designs am 19. April 2011 11:26, insgesamt 1-mal geändert.

Re: processing report extended

5. April 2011 11:04

Zuerst suchst Du nach Tennisbälle, dann prüfst Du ob ein "Ball" schon vorhanden ist, und wenn nicht erzeugst Du einen neuen Datensatz.

Du könntest eine zweite Variable aufmachen, den Tennisball record per COPY in die neue Variable kopieren, den Wert von Tennisball auf Ball ändern (damit der Primärschlüssel unterschiedlich ist) und dann ein INSERT machen. Du sollteste aber "Ball" per validate einfügen, damit evtl. Änderungen zB beim Beschreibungstext der record variable durchgeführt werden.

Falls es ein Insert-Fehler gibt, hast du was falsch gemacht.

Re: processing report extended

6. April 2011 15:08

Hi Jan,

ich muss zugeben ich bin nicht der Programmierkönig.
Ich kann Code recht gut entziffern, aber mit dem schreiben haperts halt noch etwas.

Ich geh mal davon aus, dass ich die ganze Aktion in dem in after get record () trigger verarbeiten muss.

Hab das jetzt mal so versucht (bitte nicht lachen, bin "noch" kein profi)

Code:
IF HASFILTER THEN BEGIN

   ArtNR := Artikelmerkmale."Artikelnr.";
   //Artikelmerkmale.INIT;
   Artikelmerkmale."Artikelnr." := ArtNR;
   Artikelmerkmale.Code := 'Ball';
   Artikelmerkmale.INSERT;
END;


Der Gedanke ist, dass ich den Filter ja bereits im Report mitgebe. Und der dann anhand des gesetzten Filters die Artikelnummer ausließt, eine neue Zeile mit der selben Artikelnummer generiert, jedoch den Code "Ball" setzt...

Im Prinzip so wie du das gesagt hast... Nur irgendwas stimmt noch nicht ganz.

Grüße
Dennis

Re: processing report extended

6. April 2011 21:19

Hi,

einfacher ist es mit einem SETFILTER zu arbeiten.
Du kannst folgendes machen:


Code:
clear(recItem);
recItem.SETFILTER(MERKMAL,%1,'Tennis*');
if recItem.FINDSET(TRUE,TRUE) THEN BEGIN
 repeat
   recItem2.INIT;
   recItem2.TRANSFERFIELDS(recItem);
   recItem2.MERKMAL := recItem.MERKMAL + MERKMALZUSATZ;
   recItem2.INSERT;
 until recItem.NEXT =0;
END;


Wenn du viele Datensätze hast, dann solltest du zunächst die Items in ein temporäres Item kopieren. Danach alle Änderungen im temporären Item durchführen und dann nur die betroffenen Datensätze in die Artikel einfügen. Grund: Tabellensperren werden so erstmal umgangen und nur betroffene Datensätze werden gelockt.

Gruß
Martin

Re: processing report extended

19. April 2011 11:25

So,

anbei die Lösung des Problems...

Code:
Artikelmerkmale - OnPreDataItem()
  newMerkmal := 'BALL';
  newMerkmalDescr := 'alle Bälle';
  IF Merkmale.GET(newMerkmal) THEN BEGIN
     newMerkmalDescr := Merkmale.Beschreibung;
  END;

Artikelmerkmale - OnAfterGetRecord()
IF HASFILTER THEN BEGIN
   ArtNR := Artikelmerkmale."Artikelnr.";
   IF NOT Artikelmerkmale.GET(ArtNR, newMerkmal) THEN BEGIN
     CLEAR(tmpArtMerk);
     tmpArtMerk.INIT;
      tmpArtMerk."Artikelnr." := ArtNR;
      EVALUATE(tmpArtMerk.Code, newMerkmal);
      tmpArtMerk.Beschreibung := newMerkmalDescr;
      tmpArtMerk.INSERT;
   END;
END;


Kirtik, Anregungen, Verbesserungen sind wie immer gerne gesehen und tragen zur community bei.

Grüße
Dennis

PS: THX @ DADA