[gelöst]Tempopäre Tabelle erstellen

2. Juli 2010 10:28

Hallo Zusammen.

Ich habe mal wieder eine Frage. Ich habe jetzt meinen Report fertig und der sieht auch ganz gut aus. Was ich jetzt machen will ist folgendes. Anhand des Reportberichts soll ich für die Arikel mit Fehlbestand Aufträge automatisch generieren.
Ich habe mir jetzt gedacht, es wäre vielleicht am einfachsten eine Temporäre Tabelle zu erstellen wo die Daten meines Reports stehen und ich mir dan die Lagerorte mit den entsprechenden Daten ziehe und dann mit einem schon vorhandenen Codunit die Aufträge generiere.

So jetzt zu meiner eigentlichen Frage.

1. Wie erstellt man eine Teporäre Tabelle?
und
2. Ist es denn möglich den Bericht eines Reports in eine Teporäre Tabelle zu setzen?

Gruß

Chiwi
Zuletzt geändert von Chiwi am 7. Juli 2010 08:39, insgesamt 1-mal geändert.

Re: Tempopäre Tabelle erstellen

2. Juli 2010 10:41

Chiwi hat geschrieben:1. Wie erstellt man eine Teporäre Tabelle?

Du deklarierst wie gewohnt eine Recordvariable, setzt aber für diese zusätzlich die Eigenschaft Temporary = Ja. Ganz wichtig!
Danach befüllst oder änderst du diesen Record, als würdest du eine ganz normale Tabelle befüllen. Mit einer Ausnahme: Verwende möglichst keine Trigger, also nicht
Code:
DeinTempRecord.VALIDATE(DeinFeld, neuerWert);
DeinTempRecord.INSERT(TRUE);

sondern
Code:
DeinTempRecord.DeinFeld := neuerWert;
DeinTempRecord.INSERT;

Hintergrund: In den Triggern könnte Code sein, der nach Datensätzen sucht und diese modifziert. Hierbei wird jedoch wieder auf echte Tabellen zugegriffen, nicht mehr auf temporäre.

2. Ist es denn möglich den Bericht eines Reports in eine Teporäre Tabelle zu setzen?

Ja, siehe Report 111. In DataItem Debitor wird der temporäre Record "DebBetrag" befüllt.
In DataItem Ganzzahl wird er dann gedruckt.

Re: Tempopäre Tabelle erstellen

2. Juli 2010 10:57

Ist es denn Egal was für Subtyp ich für die Temp Tabelle benutze?

Oder muss ich jetzt eine Tabelle erstellen die die gleichen Felder hat wie die Ausgabe meines Reports?

Re: Tempopäre Tabelle erstellen

2. Juli 2010 11:14

Mit dem Subtype bestimmst du die Struktur der temporären Tabelle.

Du musst dir das so vorstellen. Du holst dir die Definition der Tabelle ohne irgendwelche Datensätze und befüllst sie lokal temporär mit deinen Daten (alles in deinem RAM; nichts davon auf der DB).

Den Subtype musst du also je nach Datenstruktur wählen.

Re: Tempopäre Tabelle erstellen

2. Juli 2010 11:59

Danke für die schnelle Antwort.

Habe jetzt mal wie Natalie folgendes gemacht:

Code:
Lagerhaltungsdatentemp."Kundennr." := Lagerhaltungsdaten."Kundennr.";
Lagerhaltungsdatentemp.Lagerortcode := Lagerhaltungsdaten.Lagerortcode;
Lagerhaltungsdatentemp."Artikelnr." := Lagerhaltungsdaten."Artikelnr.";
Lagerhaltungsdatentemp.Minimalbestand := Lagerhaltungsdaten.Minimalbestand;
Lagerhaltungsdatentemp.Bestellmenge := fehlbestand;
Lagerhaltungsdatentemp.Lagerfachbestand := Lagerhaltungsdaten.Lagerfachbestand;
Lagerhaltungsdatentemp.Lagerbestand := zugänge;
Lagerhaltungsdatentemp.LagerBestandIBM := Lagerhaltungsdaten.Lagerfachbestand + zugänge;
Lagerhaltungsdatentemp.INSERT;


Jetzt wollte ich fragen, ist es den möglich zu sehen ob die Daten die Brauche auch wirklich in der Temp Tabelle drin sind?

Re: Tempopäre Tabelle erstellen

2. Juli 2010 12:09

Code:
IF Lagerhaltungsdatentemp.FINDSET(false, false) THEN
  REPEAT
    MESSAGE(FORMAT(Lagerhaltunsdatentemp));
  UNTIL Lagerhaltungsdatentemp.NEXT = 0;


Aber mach das blos nicht wenn da tausend Datensätze drinnen sind :-P

Andere Möglichkeit: Datenflussorientierte Strukturtests (neudeutsch: Debugging).

Gruß,
Sebastian

Re: Tempopäre Tabelle erstellen

2. Juli 2010 12:22

Nein es sollte eigentlich nur ein paar hunderd sein. Sorry kleiner Scherz.
Also wenn wirklich nur die Daten aus meinem Report drinne sind, dann sollten es höchstens so 50-60 Datensätze sein.

Das mit dem Debbugen verstehe ich eh nicht. Ist mir zu hoch.

Hahaha die Tabelle war gefüllt, nur mit allen anderen Daten. Das waren dann doch paar Tausend Daten

Natalie hat mir ja den Report 111 ans Herz gelegt. Kann ich denn Code so einfach rauskopieren, dann an meine Tabellenfelder anpassen und er würde laufen?
Ich weiß es sind viele Fragen und es tut mir auch leid.

Re: Tempopäre Tabelle erstellen

2. Juli 2010 12:47

Chiwi hat geschrieben:Natalie hat mir ja den Report 111 ans Herz gelegt. Kann ich denn Code so einfach rauskopieren, dann an meine Tabellenfelder anpassen und er würde laufen?
Ich weiß es sind viele Fragen und es tut mir auch leid.

Probiers doch aus? Wenn du nur daran denkst, die Variable als temporär zu deklarieren und keine Trigger zu benutzen, kannst du so viel nicht kaputt machen - höchstens dazu lernen :mrgreen:

Re: Tempopäre Tabelle erstellen

2. Juli 2010 12:54

Benutze eh eine Testdatenbank, also kann ich mich richtig austoben. Ich werde es mal versuchen.

Andere Frage. Ich habe ja im OnAfterGetRecord folgenden Code

Code:
zugänge := 0;
Verkaufskopf.SETRANGE(Belegart,Verkaufskopf.Belegart::Auftrag);
Verkaufskopf.SETRANGE(Verkaufskopf."Lief. an Code",Lagerhaltungsdaten.Lagerortcode);
IF Verkaufskopf.FIND('-') THEN REPEAT
   Verkaufszeile.SETRANGE(Belegart,Verkaufskopf.Belegart);
   Verkaufszeile.SETRANGE("Belegnr.",Verkaufskopf."Nr.");
   Verkaufszeile.SETRANGE(Art,Verkaufszeile.Art::Artikel);
   Verkaufszeile.SETRANGE("Nr.",Lagerhaltungsdaten.Nr);
   IF Verkaufszeile.FIND('-') THEN REPEAT
     zugänge := zugänge + Verkaufszeile.Restauftragsmenge;
   UNTIL Verkaufszeile.NEXT = 0;
UNTIL Verkaufskopf.NEXT = 0;

fehlbestand := (Lagerhaltungsdaten.Lagerfachbestand + zugänge - Lagerhaltungsdaten.Minimalbestand);


Damit filter ich ja eigentlich alles was ich dann im Report auch habe. Besteht denn nicht die Möglichkeit direkt in diesem Code die Daten dann an meine Temp Tabelle zu schicken?

Kleines Update:

Ich habe jetzt folgendes geschrieben
Code:
Lagerhaltungsdatentemp.INIT;

Lagerhaltungsdatentemp.Nr := Lagerhaltungsdaten.Nr;
Lagerhaltungsdatentemp."Kundennr." := Lagerhaltungsdaten."Kundennr.";
Lagerhaltungsdatentemp.Lagerortcode := Lagerhaltungsdaten.Lagerortcode;
Lagerhaltungsdatentemp."Artikelnr." := Lagerhaltungsdaten."Artikelnr.";
Lagerhaltungsdatentemp.Minimalbestand := Lagerhaltungsdaten.Minimalbestand;
Lagerhaltungsdatentemp.Lagerfachbestand := Lagerhaltungsdaten.Lagerfachbestand;

Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp."Kundennr.",'6010');
Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp.Nr,filter);
Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp.Minimalbestand,'>0');


zugänge := 0;
Verkaufskopf.SETRANGE(Belegart,Verkaufskopf.Belegart::Auftrag);
Verkaufskopf.SETRANGE(Verkaufskopf."Lief. an Code",Lagerhaltungsdatentemp.Lagerortcode);
IF Verkaufskopf.FIND('-') THEN REPEAT
   Verkaufszeile.SETRANGE(Belegart,Verkaufskopf.Belegart);
   Verkaufszeile.SETRANGE("Belegnr.",Verkaufskopf."Nr.");
   Verkaufszeile.SETRANGE(Art,Verkaufszeile.Art::Artikel);
   Verkaufszeile.SETRANGE("Nr.",Lagerhaltungsdatentemp.Nr);
   IF Verkaufszeile.FIND('-') THEN REPEAT
     zugänge := zugänge + Verkaufszeile.Restauftragsmenge;
   UNTIL Verkaufszeile.NEXT = 0;
UNTIL Verkaufskopf.NEXT = 0;

Lagerhaltungsdatentemp.Lagerbestand := zugänge;

fehlbestand := (Lagerhaltungsdatentemp.Lagerfachbestand + zugänge - Lagerhaltungsdatentemp.Minimalbestand);
Lagerhaltungsdatentemp.Bestellmenge := fehlbestand;
Lagerhaltungsdatentemp.LagerBestandIBM := Lagerhaltungsdatentemp.Lagerfachbestand + zugänge;

Lagerhaltungsdatentemp.INSERT;


aber bei mir kommt immer folgende Meldung
Die Lagerhaltungsdaten exestiert bereits
Identifizierte Felder und Werte
Nr. =",Kundennr.=",Lagerort=",Lagerfachcode"


Hat jemand vielleicht nee Idee was ich falsch mache?

Re: Tempopäre Tabelle erstellen

4. Juli 2010 18:22

Habe folgenden Code in meinen OnPostDataItem geschrieben und die Tabelle wir auch gefüllt, allerdings nur mit dem letzten Datensatz .

Code:
IF generieren = TRUE THEN BEGIN

Lagerhaltungsdatentemp.INIT;

Lagerhaltungsdatentemp.Nr := Lagerhaltungsdaten.Nr;
Lagerhaltungsdatentemp."Kundennr." := Lagerhaltungsdaten."Kundennr.";
Lagerhaltungsdatentemp.Lagerortcode := Lagerhaltungsdaten.Lagerortcode;
Lagerhaltungsdatentemp."Artikelnr." := Lagerhaltungsdaten."Artikelnr.";
Lagerhaltungsdatentemp.Minimalbestand := Lagerhaltungsdaten.Minimalbestand;
Lagerhaltungsdatentemp.Lagerfachbestand := Lagerhaltungsdaten.Lagerfachbestand;
Lagerhaltungsdatentemp.CALCFIELDS(Lagerhaltungsdatentemp.Lagerfachbestand);

Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp."Kundennr.",'6010');
Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp.Nr,filter);
Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp.Minimalbestand,'>0');


zugänge := 0;
Verkaufskopf.SETRANGE(Belegart,Verkaufskopf.Belegart::Auftrag);
Verkaufskopf.SETRANGE(Verkaufskopf."Lief. an Code",Lagerhaltungsdatentemp.Lagerortcode);
IF Verkaufskopf.FIND('-') THEN REPEAT
   Verkaufszeile.SETRANGE(Belegart,Verkaufskopf.Belegart);
   Verkaufszeile.SETRANGE("Belegnr.",Verkaufskopf."Nr.");
   Verkaufszeile.SETRANGE(Art,Verkaufszeile.Art::Artikel);
   Verkaufszeile.SETRANGE("Nr.",Lagerhaltungsdatentemp.Nr);
   IF Verkaufszeile.FIND('-') THEN REPEAT
     zugänge := zugänge + Verkaufszeile.Restauftragsmenge;
   UNTIL Verkaufszeile.NEXT = 0;
UNTIL Verkaufskopf.NEXT = 0;

Lagerhaltungsdatentemp.Lagerbestand := zugänge;

fehlbestand := (Lagerhaltungsdatentemp.Lagerfachbestand + zugänge - Lagerhaltungsdatentemp.Minimalbestand);
Lagerhaltungsdatentemp.Bestellmenge := fehlbestand;
Lagerhaltungsdatentemp.SETFILTER(Lagerhaltungsdatentemp.Bestellmenge,'<0');
Lagerhaltungsdatentemp.LagerBestandIBM := Lagerhaltungsdatentemp.Lagerfachbestand + zugänge;

Lagerhaltungsdatentemp.INSERT;

IF Lagerhaltungsdatentemp.FINDSET(FALSE, FALSE) THEN
  REPEAT
    MESSAGE(FORMAT(Lagerhaltungsdatentemp));
  UNTIL Lagerhaltungsdatentemp.NEXT = 0;

END;


Was könnte ich falsch gemacht haben?

Gruß

Re: Tempopäre Tabelle erstellen

4. Juli 2010 18:56

Chiwi hat geschrieben:Habe folgenden Code in meinen OnPostDataItem geschrieben und die Tabelle wir auch gefüllt, allerdings nur mit dem letzten Datensatz .
Was könnte ich falsch gemacht haben?

Naja, ausgerechnet die Zeile mit dem INSERT steht in keiner REPEAT-UNTIL-Schleife. Wie soll da mehr als ein Datensatz angelegt werden ...?

Außerdem verstehe - zumindest ich - den Aufbau nicht.
Mal ganz abstrakt, so wird ein temp. Record typischerweise gefüllt:
Code:
IrgendeinRec.SETRANGE(...); // oder SETFILTER o.ä.
IF IrgendeinRec.FINDSET THEN BEGIN
  REPEAT
    TempRec.INIT;
    TempRec.Feld1 := IrgendeinRec.Feld1;
    ...
    TempRec.INSERT;
  UNTIL IrgendeinRec.NEXT = 0;
END;

Hier wurde IrgendeinRec dazu verwendet, TempRec zu füllen. In diesem konkreten Beispiel werden exakt so viele TempRecs angelegt, wie IrgendeinRecs gefunden worden sind.

[gelöst]Re: Tempopäre Tabelle erstellen

5. Juli 2010 10:31

Danke für die Antwort.

Habe jetzt aber einen anderen Weg gefunden wie ich weitermachen soll.

Das einzige was ich nicht ganz genau weiß ist, wie ich in der Tabelle Verkaufskopf die erste freie Zeile anziehe um dann dort meine Daten einzulesen.
Hat jemand nee Idee?




Gruß Chiwi