Datensätze hinzufügen...

25. Juli 2008 14:27

mal wieder eine dumme Frage, aber ich komm irgendwie grad nich drauf.

Ich habe eine Tabelle mit Datensätzen worin Artikeln bestimmte Regalplätze zugeordnet sind. Nun möchte ich nachträglich prüfen welche Artikel einen bestimmten Regalplatz noch nicht haben und diesen Datensatz dann erzeugen.

Besonderheit dabei ist, das jeder Artikel in der Tabelle existiert, da es keine Artikel ohne Regalplätze gibt... Ein Artikel kann somit auch beliebig oft mit unterschiedlichen Regalplätzen auftauchen.

Sprich:
Wenn Regalplatz XY für Artikel Nr. XY nicht existiert, erzeuge mir diesen Datensatz.

Würde mich über ein paar Tips freuen :)

25. Juli 2008 14:43

Code:
Item.SetRange("No.", XY);
Item.Setrange(Regalplatz, XY);


IF NOT Item.FIND('-') THEN BEGIN
  Item.Init;
  Item.Insert;
END;


wenn ich das richtig verstehe, sollte das so ca. Funktionieren ;)

25. Juli 2008 14:58

Wenn ich das richtig verstehe, sollen Regalplätze und nicht Artikel angelegt werden.:wink::?:

Wenn Artikelnr. und Regalcode die beiden Primärschlüsselfelder sind :
Code:
IF NOT Regalplatz.GET("Artikelnr.",Regalcode) THEN BEGIN
 Regalplatz.INIT;
 Regalplatz.Artikelnr. := "Artikelnr."
 Regalplatz.Code := Regalcode;
 Regalplatz.INSERT;
END;


Bei mehreren Lagerorten mit gleichen Regalcodes müsste der Lagerortcode mit in den Primärschlüssel.

28. Juli 2008 08:33

so ähnlich hatte ich es bisher auch schon, aber er es kommt immer eine Fehlermeldung das der Regalplatz bereits existiert. Obwohl das nicht der Fall ist. Im Debugger füllt er die Variable richtig mit den ensprechenden werten, verstehe nur noch nich warum er beim INSERT nich mehr will...

Die Primärschlüssel in der Regalplatz Tabelle sind OK.

Hier ma bisschen Code:

Code:
recShelfPlace.SETFILTER(recShelfPlace."Artikel Nr.", Regalplatz."Artikel Nr.");
recShelfPlace.SETFILTER(recShelfPlace."Lagerort Code", 'REPO');

IF NOT recShelfPlace.GET("Artikel Nr.","Lagerort Code") THEN BEGIN

  recNewShelfPlace.INIT;
  recNewShelfPlace."Artikel Nr." := Regalplatz."Artikel Nr.";
  recNewShelfPlace."Lagerort Code" := 'REPO';
  recNewShelfPlace."Lagerplatz Code" := 'LADEN';
  recNewShelfPlace."letzte Änderung von" := USERID;
  recNewShelfPlace."letzte Änderung am" := TODAY;
  recNewShelfPlace."Lagerplatz Beschreibung" := 'Laden';
  recNewShelfPlace.INSERT(TRUE);

END ELSE
  ERROR('Nichts zu tun!');


Ist die Record variable "recNewShelfPlace" evtl. überflüssig?

28. Juli 2008 08:42

Ist denn der Primärschlüssel des Regals wirklich Artikelnr. + Lagerortcode??
Ich vermisse da etwas wie wie eine Regalplatzcode.
Den Code würd ich so schreiben:

Code:
// SETFILTER oder SETRANGE vor GET unnötig!

IF NOT recShelfPlace.GET(Regalplatz."Artikel Nr.", 'REPO', 'LADEN') THEN BEGIN

  recNewShelfPlace.INIT;
  recNewShelfPlace."Artikel Nr." := Regalplatz."Artikel Nr.";
  recNewShelfPlace."Lagerort Code" := 'REPO';
  recNewShelfPlace."Lagerplatz Code" := 'LADEN';
  recNewShelfPlace."letzte Änderung von" := USERID;
  recNewShelfPlace."letzte Änderung am" := TODAY;
  recNewShelfPlace."Lagerplatz Beschreibung" := 'Laden';
  recNewShelfPlace.INSERT(TRUE);

END ELSE
  ERROR('Nichts zu tun!');

28. Juli 2008 09:00

Also wenn ich mir die Regalplatz Tabelle im Designer anschaue, seh ich folgendes:

Code:
Enabled   Field No.   Field Name   Data Type   Length   Description
Yes   1   Artikel Nr.   Code   20   
Yes   2   Lagerort Code   Code   10   
Yes   3   Lagerplatz Code   Code   20   
Yes   4   Standard Lagerplatz   Boolean   


müsste dann doch mit den Primärschlüsseln stimmen.

Ich glaub fast das mir da ne Funktion aus der Regalplatz Tabelle dazwischen funkt, jedenfalls sah das im Debugger merkwürdig aus...
ich glaube es wird im Hintergrund auf "Standard Lagerplatz" geprüft. Habe diesen nun auch beim INIT Vorgang mit TRUE definirt, hat aber leider auch nix gebracht.
Aber im Grunde müsste es ja so funktionieren wie es bisher ist

28. Juli 2008 09:02

Den Primärschlüssel findest du als ersten Eintrag unter Ansicht -> Keys.

Hast du meinen Quelltext denn schon ausprobiert?

28. Juli 2008 09:17

Achja, keys^^ Sry is ja noch so früh am morgen :P

Code:
Enabled   Key   SumIndexFields
Yes   Artikel Nr.,Lagerort Code,Lagerplatz Code   
Yes   Artikel Nr.,Standard Lagerplatz   
Yes   Lagerort Code,Lagerplatz Code,Artikel Nr.   


Deinen Code hab ich auch schon probiert, aber dann springt er gar nicht erst in den INIT Bereich. Denke ma Da muss ich hinter dem GET die Artikel Nr. weg lassen, denn die muss er ja finden. Und dann bekomme ich wieder die selbe meldung das der regalplatz bereits existiert.

28. Juli 2008 09:20

3TageWach hat geschrieben:Deinen Code hab ich auch schon probiert, aber dann springt er gar nicht erst in den INIT Bereich.

Ja, weil es den Datensatz dann schon gibt!

Denke ma Da muss ich hinter dem GET die Artikel Nr. weg lassen, denn die muss er ja finden.

Nein, so funktionert GET nicht. Mache dich mal mit der genauen Funktionsweise von GET, FIND, SETRANGE und SETFILTER vertraut.

Und dann bekomme ich wieder die selbe meldung das der regalplatz bereits existiert.

Ja, weil du GET so nicht verwenden kannst.

28. Juli 2008 09:31

mhmm...

IF NOT recShelfPlace.GET(Regalplatz."Artikel Nr.", 'REPO', 'LADEN') THEN BEGIN
:= Wenn "Artikel Nr.", 'REPO' und 'LADEN' nicht gefunden wird, dann fang an

Wenn er nun aber anhand eines vorhandenen Datensatzes in der Tabelle prüfen soll, ob ein bestimmter Lagerort ('REPO') dazu nicht vorhanden ist, dann ist meiner Meinung nach "Artikel Nr." dort fehl platziert, da er die Artikel Nr. doch immer bekommt?!

// anbei mal die Fehlermeldung
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

28. Juli 2008 10:53

Gehe nicht von den Regalplätzen aus, sondern von einem Artikel.
Durchlaufe hierfür die Artikeltabelle.

Code:
IF Item.FIND('-') THEN BEGIN
  REPEAT
    IF NOT recShelfPlace.GET(Item."No.", 'REPO', 'LADEN') THEN BEGIN
      recNewShelfPlace.INIT;
      recNewShelfPlace."Artikel Nr." := Item."No.";
      recNewShelfPlace."Lagerort Code" := 'REPO';
      recNewShelfPlace."Lagerplatz Code" := 'LADEN';
      recNewShelfPlace."letzte Änderung von" := USERID;
      recNewShelfPlace."letzte Änderung am" := TODAY;
      recNewShelfPlace."Lagerplatz Beschreibung" := 'Laden';
      recNewShelfPlace.INSERT(TRUE);
    END;
  UNTIL Item.NEXT = 0;
END;


Item ist eine Recordavariable vom Typ Item.

28. Juli 2008 11:31

So springt er wieder nicht in den INIT Bereich und macht nix.
Trotzdem danke für die Hilfe, vielleicht krich es ja doch noch irgendwie hin ;)

// wenn ich beim GET das 'LADEN' weg lasse springt er aufjedenfall in den INIT Bereich, allerdings kommt dann wieder die Meldung das der Regalplatz bereits existiert. Hier füllt er nun aber nicht die gewünscht Artikel Nummer aus, sondern nimmt den Template Artikel...#

// im Grunde funktioniert alles, auch ohne ein Item Record... allerdings nur wenn ich beim INIT den Lagerort Code 'REPO' auskommentiere^^ So erzeugt er mir zwar endlich einen Datensatz, nur halt ohne 'REPO' -.-