[Gelöst] Wie krieg ich so eine zusammengesetzte Nr. hin?

5. Mai 2008 14:59

Hallo,

ich hab mal wieder ein Problem.

Ich muss in Navision auf eine externe Tabelle zugreifen, diese hat eine eigenartige Struktur des SChlüssels.

Es wird das Feld "T_NR" und das feld "SPRACHE" zusammengesetzt und raus kommt dann der Wert für den Primärschlüssel inkl führender Nullen!

TNRSPRA ist vom Typ her ein "Text 14"
T_NR ist Integer
SPRACHE ist Text4

Ich bin ehrlich gesagt total unfähig da ich sowas noch nie gebraucht habe. Weiss jemand wie man das lösen kann? Ich will eben beim Einfügen eines neuen Satzes (beim INsert) das er dann eben den Primärschlüssel bildet.

Hier ist mal die TAbelle mit gefüllten DAten:


Code:
TNRSPRA   T_NR   SPRACHE
0000000001D   1   D
0000000002D   2   D
0000000003D   3   D
0000000004D   4   D
0000000005D   5   D
0000000001F   1   F
0000000006D   6   D
0000000006F   6   F
0000000007D   7   D
0000000008D   8   D
0000000008F   8   F
0000000009D   9   D
0000000009F   9   F
0000000010D   10   D
0000000010F   10   F
0000000011D   11   D
0000000011F   11   F
0000000012D   12   D
0000000012F   12   F
0000000013D   13   D
0000000013F   13   F
0000000014D   14   D
0000000014F   14   F
0000000015D   15   D
0000000015F   15   F
0000000016D   16   D
0000000016F   16   F
0000000017D   17   D
0000000017F   17   F
0000000018D   18   D
0000000018F   18   F
0000000019D   19   D
0000000019F   19   F
0000000020D   20   D
0000000020F   20   F
0000000021D   21   D
0000000021F   21   F
0000000022D   22   D
0000000022F   22   F
0000000023D   23   D
0000000023F   23   F
0000000024D   24   D
0000000024F   24   F
0000000025D   25   D
0000000025F   25   F
0000000026D   26   D
0000000026F   26   F
0000000027D   27   D
0000000027F   27   F
0000000028D   28   D
0000000028F   28   F
0000000029D   29   D
0000000029F   29   F
0000000030D   30   D
0000000030F   30   F
0000000031D   31   D
0000000031F   31   F
0000000032D   32   D
0000000032F   32   F
0000000033D   33   D
0000000033F   33   F
0000000034D   34   D
0000000034F   34   F
0000000035D   35   D
0000000035F   35   F
0000000036D   36   D
0000000036F   36   F
0000000037D   37   D
0000000037F   37   F
0000000038D   38   D
0000000038F   38   F
0000000040D   40   D
0000000007F   7   F
0000000040F   40   F
Zuletzt geändert von tesarolle am 6. Mai 2008 15:30, insgesamt 2-mal geändert.

5. Mai 2008 15:16

Du schreibst, dass TNRSPRA eine Länge von 14 hat, in deinem Beispile sind es allerdings nur 11 Stelle. Je nach Anzahl der Stellen muss du die Werte addieren und dann entsprechnede Nullen voran stellen.
Code:

Name        DataType    Subtype    Length
Variable    Text                   14

Variable := '';
Variable := FORMAT(T_NR) + SPRACHE;

CASE STRLEN(Variable) OF
   1: TNRSPRA := '0000000000000'+Variable;
   2: TNRSPRA := '000000000000'+Variable;
   3: TNRSPRA := '00000000000'+Variable;
   4: TNRSPRA := '0000000000'+Variable;
   5: TNRSPRA := '000000000'+Variable;
   6: TNRSPRA := '00000000'+Variable;
   7: TNRSPRA := '0000000'+Variable;
   8: TNRSPRA := '000000+Variable;
   9: TNRSPRA := '00000'+Variable;
  10: TNRSPRA := '0000'+Variable;
  11: TNRSPRA := '000'+Variable;
  12: TNRSPRA := '00'+Variable;
  13: TNRSPRA := '0'+Variable;
END;

5. Mai 2008 15:39

Ja Du hast recht es sind 11 Stellen.

DAs Problem ist das ich zunächst mal die letzte verwendete Nummer ermittel muss, das würde ich hinkriegen wenn TNRSPRA ein Zahlenfeld wäre:

Code:
IF rec_PRODUKTLINIEN.FINDLAST THEN
   T_NR :=  rec_PRODUKTLINIEN.T_NR + 1;


1. Ich muss aber erstmal alle Felder temporär so erzeugen das ich die nächste Nummer ziehen kann für meinen aktuellen Satz den ich einfügen möchte.

2. und dann beim Einfügen soll er mir eben dieses Feld zusammenbasteln. Mit deinem Bsp. geht das nicht weil ich eben sehr unglückliche Datentypen habe.


TNRSPRA = "Text 11"
T_NR = Integer
SPRACHE = Text4

Das ist bestimmt nicht so einfach, vor allem für mich als nicht profi umso mehr, aber trotzdem danke.

5. Mai 2008 16:04

Das einfachste wäre, wenn du einen zusätzliche Schlüssel (Sprache,T_NR) in die Tabelle einbauen könntest:
Code:
rec_PRODUKTLINIEN.SETCURRENTKEY(Sprache,T_NR);
IF rec_PRODUKTLINIEN.FINDLAST THEN
   T_NR :=  rec_PRODUKTLINIEN.T_NR + 1;


Alternativ:
Du kannst alle Daten aus deiner Tabelle in eine temporäre Tabelle (z.B. ITEM) einfügen.
Code:
rec_PRODUKTLINIEN.FIND('-');
If NOT Rec_item_tmp.GET(FORMAT(rec_PRODUKTLINIEN.T_NR)) Then Begin
   Rec_item_tmp."No." := FORMAT(rec_PRODUKTLINIEN.T_NR);
   Rec_item_tmp."Unit Price" := rec_PRODUKTLINIEN.T_NR;
   Rec_item_tmp.INSERT;
END;

// Möglichkeit 1
Rec_item_tmp.RESET;
IF Rec_item_tmp.FINDLAST Then Begin
   IF EVALUATE(T_NR,Rec_item_tmp."No.") Then;
   T_NR := T_NR + 1;
END;

// Möglichkeit 2
Rec_item_tmp.RESET;
IF Rec_item_tmp.FINDLAST Then
   T_NR := Rec_item_tmp."Unit Price" + 1;

Danach wendest du den Code an, den ich bereits oben beschrieben habe.

mfg
Michael

6. Mai 2008 15:29

DU BIST GENIAL! 1000 DANK! Das funktioniert... SUPER!

So sieht der Code jetzt aus komplett:

Code:
IF rec_PRODUKTLINIEN.FINDLAST THEN
   T_NR :=  rec_PRODUKTLINIEN.T_NR + 1;


Variable := '';
Variable := FORMAT(T_NR) + SPRACHE;

CASE STRLEN(Variable) OF
   1: TNRSPRA := '0000000000000'+Variable;
   2: TNRSPRA := '000000000000'+Variable;
   3: TNRSPRA := '00000000000'+Variable;
   4: TNRSPRA := '0000000000'+Variable;
   5: TNRSPRA := '000000000'+Variable;
   6: TNRSPRA := '00000000'+Variable;
   7: TNRSPRA := '0000000'+Variable;
   8: TNRSPRA := '000000+Variable;
   9: TNRSPRA := '00000'+Variable;
  10: TNRSPRA := '0000'+Variable;
  11: TNRSPRA := '000'+Variable;
  12: TNRSPRA := '00'+Variable;
  13: TNRSPRA := '0'+Variable;
END;

7. Mai 2008 08:30

Eine Alternative (für Schreibfaule): :wink:

Code:
TNRSPRA := PADSTR('',20-strlen(Variable),'0') + Variable