[Gelöst] Nummernserie

12. September 2008 09:20

Hallo zusammen,

die Customer-Daten kommen von einem vorgelagerten CRM-System über einen Schnittstellen-Report. Wir haben bei uns die Datev-Schnittstelle eingerichtet.

Nun möchte ich wenn ein neuer Customer angelegt wird, die Datev-Account-No automatisch über die Nummernserie gefüllt wird. Dies funktioniert auch einwandfrei.
Jetzt möchte ich aber das nach dem ziehen der neuen Nummer geprüft wird, ob diese schon exisitert. Wenn ja soll die nächste gezogen werden usw.

hier der Code wie er jetzt steht.

Code:
IF NewCustomer THEN BEGIN
 SalesSetup.GET;
 SeriesCode := SalesSetup."DATEV Debitornummer";
 Customer."Datev Account No." := '';
 NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
 Customer."Datev Account No." := NewNo;
END;


Vielen Dank schonmal für euere Gedanken.

Gruß
Tom
Zuletzt geändert von Brainwolf am 12. September 2008 11:35, insgesamt 1-mal geändert.

Re: Nummernserie

12. September 2008 09:41

Dein Quelltext steht doch bestimmt im Customer.OnInsert, richtig? Warum orientierst du dich dann nicht genau am Standard?
Wenn du dies tust, kann so eine Nummer nicht bereits vergeben sein und eine Prüfung kann entfallen.

Ich hätte es mir so vorgestellt (immer genau am Standard orientieren, achte dabei auch auf das xRec!):
Code:
IF NewCustomer THEN BEGIN // notwendig?
  SalesSetup.GET; // kann evtl. entfallen, wenn bereits zuvor durch die Seriennr.-Vergabe für die Debitorennr. ausgeführt.
  SalesSetup.TESTFIELD("DATEV Debitornummer");
  NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", xRec."DATEV No. Series", TODAY, "Datev Account No." , "DATEV No. Series");
END;

Hierzu ist es notwendig, dass du parallel zu Standardfeld "No. Series" ein neues Feld "DATEV No. Series" (oder so ählich) erstellst.

Re: Nummernserie

12. September 2008 10:19

Nee, der Quelltext steht in einem eigenen import-Report unter OnAfterGetRecord. Deswegen "If NewCustomer". Denn es gibt auch Datensatzaktualisierungen wenn ich ne Adresse o.ä. ändert.

Neues Feld? Ich hätte doch alle Felder die ich benötige. In "Debitor & Verkauf Einrichtung" Nummierierung neues Feld " Datev Debitornummer --> "DATEVNR"- Seriencode

Geht das ganze nicht mit IF newno exist then newno next (oder so *lach* war aus dem Kopf herausgeschrieben.)

Re: Nummernserie

12. September 2008 10:28

Es sind bereits schon Datev-Debitornummern manuell wild vergeben worden. Deswegen die Prüfung. Ich kann also keine Reihenfolge stur nehmen.

Re: Nummernserie

12. September 2008 10:31

Brainwolf hat geschrieben:Neues Feld? Ich hätte doch alle Felder die ich benötige. In "Debitor & Verkauf Einrichtung" Nummierierung neues Feld " Datev Debitornummer --> "DATEVNR"- Seriencode

Um das geht es doch nicht :-) Schau dir mal das Standardfeld "No. Series" in der Tabelle Debitor an - dort steht der Nummsernserien-CODE, nicht der Wert, der sich aus ihr ergeben hat.

Geht das ganze nicht mit IF newno exist then newno next (oder so *lach* war aus dem Kopf herausgeschrieben.)

Ja, ich hätte das dann mit ner REPEAT .. UNTIL-Schleife gelöst, ABER noch einmal: Wenn die Nummernserie richtig gezogen wird (und sie richtig eingerichtet worden ist), dann kann eine Dublette doch gar nicht existieren? Oder setzt ihr in manche Debitoren die manuell rein?

Re: Nummernserie

12. September 2008 10:46

Genau, es geht um die manuell gesetzten nummern.
Ziehen aus der Nummernserie tut er sie schon richtig immer um eines aufsteigend. Aber er muss prüfen, ob die neue gezogene Nummer schon bei einem existierenden Kunden im dem Feld "Datev Account No." existiert.

Re: Nummernserie

12. September 2008 10:53

Dann probier es doch so (mit deinem Originalcode als Basis):

Code:
IF NewCustomer THEN BEGIN
  SalesSetup.GET;
  SeriesCode := SalesSetup."DATEV Debitornummer";
  Customer."Datev Account No." := '';
  REPEAT
    NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
    Customer.SETCURRENTKEY("Datev Account No.");
    Customer.SETRANGE("Datev Account No.", NewNo);
  UNTIL Customer.ISEMPTY;
  Customer."Datev Account No." := NewNo;
END;


(Ggf. im neuen Teil Customer. durch Customer2. ersetzen)

Re: Nummernserie

12. September 2008 11:12

Hmm, sieht zwar nicht schlecht aus, aber der import eines Customer dauert dann ca. 10 min. Vorher 2 sek.

Kann man da an der Performance noch was machen? Ich hab schon nen neuen Key auf die Datev Account no. in Customer gemacht aber da das ein Code-Feld ist denke ich das geht nicht schneller.

Re: Nummernserie

12. September 2008 11:15

Brainwolf hat geschrieben:Hmm, sieht zwar nicht schlecht aus, aber der import eines Customer dauert dann ca. 10 min. Vorher 2 sek.

Kann man da an der Performance noch was machen? Ich hab schon nen neuen Key auf die Datev Account no. in Customer gemacht aber da das ein Code-Feld ist denke ich das geht nicht schneller.


Debugge das mal bitte. Könnte es sein, dass die REPEAT-Schleife ziemlich viele Durchläufe braucht, weil so viele Nummern schon manuell vergeben worden sind?

Re: Nummernserie

12. September 2008 11:26

Es hat bei uns jeder Customer eine manuell vergeben DatevAccountno. ca. 25000!!

Die geht er alle durch!! :(

Re: Nummernserie

12. September 2008 11:30

Dacht ichs mir.
Also Gegenvorschlag:
  1. Du lässt die Prüfung auf doppelte Nummern (also keine REPEAT-Schleife)
  2. Du ermittelst die aktuell höchste gepflegte Nummer und stellst letzten Wert deiner Nummernserie entsprechend hoch ein.
  3. Implementiere für das Feld Customer."Datev Account No."den gleichen Quelltext wie z.B. auf der Tabelle Item, Feld "No." (Trigger "No." - OnValidate) zur manuellen Vergabe von Seriennr. - tausche dabei die Variablen/Feldnamen entsprechend aus.

Re: Nummernserie

12. September 2008 11:35

ok, dacht ichs mir auch.

Dann lassen wir das mit der Prüfung. Ich werde das dann über die Nummernserie-Einrichtung so großzügig gestalten dass es reicht. Wir bekommen ja nur max. 1000 Adressen pro Jahr rein. Das müsste schon so klappen.

Aber trozdem, vielen Dank für deine Hilfe, Natalie.

Gruß
Tom

Re: [Gelöst] Nummernserie

12. September 2008 11:36

Wenn du insbesondere Punkt 3 implementierst (Achtung, hab ihn eben editiert), brauchst du dir um nichts mehr Sorgen zu machen, weil der Standard für dich arbeitet.

Re: [Gelöst] Nummernserie

12. September 2008 13:18

Ich bins nochmal,

ich möchte nun einen Report, der über die bestehenden Customer geht und prüft, ob die Datev-Nr. gefüllt ist wenn nicht, dann ziehe eine neue Nummer aus der Serie.

ich hab das so gelöst, aber es wird nichts in Customer geschrieben. Eine neue Nummer wird aber gezogen.


Code:
Customer.GET("No.");
Customer.SETFILTER("Datev Account No.", '');
IF Customer."Datev Account No." ='' THEN BEGIN
  SalesSetup.GET;
  SeriesCode := SalesSetup."DATEV Debitornummer";
  Customer."Datev Account No." := '';
  REPEAT
   NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
   Customer.SETCURRENTKEY("Datev Account No.");
   Customer.SETRANGE("Datev Account No.", NewNo);
  UNTIL Customer.ISEMPTY;
   Customer."Datev Account No." := NewNo;
 VALIDATE("Datev Account No.");
END;

Re: [Gelöst] Nummernserie

12. September 2008 13:30

Uh, du machst du einiges, aber nicht das, was du vorhattest ;-)
Bitte setz dich mal intensiv mit den Befehlen GET, SETRANGE/SETFILTER und FIND auseinander.
Vergleiche meine mit deiner Version und versuche, die Unterschiede zu verstehen.

Versuchs mal so:

Code:
Customer.RESET;
Customer.SETCURRENTKEY("Datev Account No.");
Customer.SETRANGE("Datev Account No.", '');
If Customer.FIND('-') THEN BEGIN
  SalesSetup.GET;
  SeriesCode := SalesSetup."DATEV Debitornummer";
  REPEAT
    Customer2 := Customer;
    NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, Customer2."Datev Account No.", SeriesCode);
    Customer2.MODIFY;
  UNTIL Customer.NEXT = 0;
END;


PS: Da du ja das in einem Report umsetzen wolltest - mach doch dort nur ein DataItem Customer.
OnPreDataItem
Code:
SalesSetup.GET;
SeriesCode := SalesSetup."DATEV Debitornummer";
SETCURRENTKEY("Datev Account No.");
SETRANGE("Datev Account No.", '');


OnAfterGetRecord
Code:
Customer2 := Customer;
NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, Customer2."Datev Account No.", SeriesCode);
Customer2.MODIFY;


Und bitte schreibe Quelltext so: [code]Dein Quelltext[/code]

Re: [Gelöst] Nummernserie

12. September 2008 13:43

Hmm da hast du recht, da ist noch einiges an Lernbedarf.

Wenn ich den code nun so einfüge und die Varialbe Customer2 - Record - Customer anlege kommt ein Typkonvertierungsproblem Code := Boolean

Versteh nicht warum.

Re: [Gelöst] Nummernserie

12. September 2008 13:51

Hat gefunzt.

Vielen Dank.

Tom

Re: [Gelöst] Nummernserie

12. September 2008 13:55

Hallo Brainwolf,

Natalie hat geschrieben:Und bitte schreibe Quelltext so: [code]Dein Quelltext[/code]

Ich habe das jetzt mal ausnahmsweise für dich gemacht, da der Quelltext nur sehr schwer zu lesen war.
Bitte berücksichtige Natalie's Hinweis zukünftig.

Vielen Dank für dein Verständnis im Voraus.

Re: [Gelöst] Nummernserie

30. Oktober 2008 14:53

Hallo zusammen,

das Problem ist immer noch nicht ganz gelöst. Jetzt muss ich weiter ausholen.

Diese Datevnummer wird in einem Schnittstellen-import-Report gezogen. D.h. es sind ein- oder mehrere Datensätze in der Tabelle vorhanden.
Mit dem u.a. code wird zwar eine Datev-Nr. gezogen aber bei allen in der Schnittstellen-Tabelle wird nun die gleiche Datevnummer vergeben.
Ich möchte dass bei jedem Datensatz eine neue Nummer genommen wird.
Ich habs schon mit nem Repeat versucht aber dann rennt er mit über die ganze Customer-Tabelle.

Code:
IF NewCustomer THEN BEGIN
  SalesSetup.GET;
 SeriesCode := SalesSetup."DATEV Debitornummer";
 Customer."Datev Account No." := '';
 NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
 Customer."Datev Account No." := NewNo;
END;

Re: [Gelöst] Nummernserie

30. Oktober 2008 14:57

In welchem Trigger steht dein Quelltext?

Re: [Gelöst] Nummernserie

30. Oktober 2008 14:59

OnAfterGetRecord

Re: [Gelöst] Nummernserie

30. Oktober 2008 15:13

(Trigger OK)

Schau mal, ob das hier hilft:

Code:
IF NewCustomer THEN BEGIN
  SalesSetup.GET;
  SeriesCode := SalesSetup."DATEV Debitornummer";
  Customer."Datev Account No." := '';
  NewNo := ''; // NEU
  NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
  Customer."Datev Account No." := NewNo;
END;

Re: [Gelöst] Nummernserie

30. Oktober 2008 15:13

(Trigger OK)

Schau mal, ob das hier hilft:

Code:
IF NewCustomer THEN BEGIN
  SalesSetup.GET;
  SeriesCode := SalesSetup."DATEV Debitornummer";
  Customer."Datev Account No." := '';
  NewNo := ''; // NEU
  NoSeriesMgt.InitSeries(SalesSetup."DATEV Debitornummer", SalesSetup."DATEV Debitornummer", TODAY, NewNo, SeriesCode);
  Customer."Datev Account No." := NewNo;
END;

Re: [Gelöst] Nummernserie

30. Oktober 2008 15:22

Jaaaaa, super. Danke.

Kannst du mir vielleicht erleutern warum?

Re: [Gelöst] Nummernserie

30. Oktober 2008 16:06

Brainwolf hat geschrieben:Jaaaaa, super. Danke.

Kannst du mir vielleicht erleutern warum?


InitSeries setzt die Variable für die neue Nummer (hier NewNo) nur dann, wenn sie zum Zeitpunkt der Übergabe leer ist (war mir bis eben auch nicht bewusst).
War sie schon gefüllt, bleibt der Wert darin stehen.