[Gelöst] Code (Modify?) löscht ungewollt Daten...

5. Oktober 2007 13:43

Ich bin Heute leicht am verzweifeln. Kaum ist ein Fehler weg, taucht der nächste auf. Und ich find einfach nicht die Lösung.

Ich hab nun das Problem das mein Code mir anscheinend das erste Feld im ersten Datensatz "auffrisst". Bei der Tabelle Customer ist dies das Feld "Name". Mein Code sieht wie folgt aus:

Code:
IF ISCLEAR(PWD) THEN
CREATE(PWD);

IF ISCLEAR(Catalog) THEN
CREATE(Catalog);

Pos := STRPOS(Customer.Name,' ');
Vorname := COPYSTR(Customer.Name,1,Pos-1);
Name := COPYSTR(Customer.Name,Pos+1);

GUI := Customer."Kundennr. Shop";
password := Customer.Passwort;

REPEAT

CLEAR(GUI);
CLEAR(password);

password := PWD.CreatePassword(Customer.Passwort);

GUI := Catalog.CreateUserProfileUserObject('C:\Dokumente und Einstellungen\alle\Desktop\Pending\',
GUI,password,'',Customer."E-Mail",'','',Customer."Fax No.",Customer."Phone No.",Vorname,Name,'');

Catalog.CreateUserProfileAddress('C:\Dokumente und Einstellungen\alle\Desktop\Pending\',
GUI,Customer."Phone No.",Vorname,Name,Customer.Address,Customer."Country Code",Customer."Post Code",
Customer.City,Customer.Geburtsdatum,'');

WITH Customer DO BEGIN
    VALIDATE("Kundennr. Shop",GUI);
    VALIDATE(Passwort,password);
    MODIFY;
END;

UNTIL Customer.NEXT = 0;


Mir ist aufgefallen das es nur passiert wenn ich MODIFY im Code habe. Bei zum Beispiel MODIFYALL passiert es nicht.
Ich sehe da einen Zusammenhang mit meinem COPYSTR Code da er die Daten nur Stückchen für Stückchen löscht.

Der Datensatz heisst komplett:

Bayer Health Care

durchlaufe ich den Report das erste mal, steht dann nur noch:

Health Care

und in meinen XML Dateien die erstellt werden ist überall Bayer als Vorname angegeben.

Beim zweiten mal das selbe in Grün nur das in der Tabelle nur noch Care steht und in den XML Dateien dann Health als Vorname. Ein drittes mal kann ich das ganze dann nicht durchlaufen weil ja der Nachnahme sogesehen fehlt.

Jemand ne Idee wo mein Fehler sein könnte?

Nachtrag:

Code steht in einem Report im OnAfterGetRecord Trigger

Catalog = Automation
PWD = Automation
Pos = Integer
Vorname = Text (100)
Name ) Text (100)
GUI = Text (250)
password = Text (250)
Zuletzt geändert von Heike Bennerscheid am 5. Oktober 2007 16:48, insgesamt 4-mal geändert.

5. Oktober 2007 14:50

Hallo Heike,

müsste der folgende Code nicht innerhalb der REPEAT-UNITL-Schleife:

Code:
Pos := STRPOS(Customer.Name,' ');
Vorname := COPYSTR(Customer.Name,1,Pos-1);
Name := COPYSTR(Customer.Name,Pos+1);

GUI := Customer."Kundennr. Shop";
password := Customer.Passwort;

Gruß, Marc

5. Oktober 2007 14:52

Das hatte ich mir auch schon gedacht, und habe das ausprobiert. Aber dann schneidet er von jedem Datensatz den Vornamen ab :(

5. Oktober 2007 14:54

Ach ja, und ich sehe da noch das Problem, das du WITH ohne BEGIN/END benutzt. Somit wirkt sich das MODIFY nicht auf CUSTOMER aus (da es nicht direkt nach dem WITH folgt, sondern erst in der zweiten Zeile steht).

Besser wäre:

Code:
WITH Customer DO BEGIN
    VALIDATE("Kundennr. Shop",GUI);
    VALIDATE(Customer.Passwort,password);
    MODIFY;
END;

Gruß, Marc

5. Oktober 2007 14:56

OK. Ich probiere das mal aus. Danke

Nachtrag:

Leider immer noch das selbe Ergebnis :-(

5. Oktober 2007 15:04

Wo genau steht der Code denn? In einer Tabelle, in einer Codeunit?

5. Oktober 2007 15:14

In einem Report im OnAfterGetRecord Trigger

Catalog und PWD sind 2 DLLs die ich aufrufe (falls das eventuell noch interessant ist)

Pos = Integer
Vorname = Text (100)
Name ) Text (100)
GUI = Text (250)
password = Text (250)

5. Oktober 2007 15:44

Mal ne Frage, warum schreibst du das MODIFY nicht so:

Code:
WITH Customer DO
    VALIDATE("Kundennr. Shop",GUI);
    VALIDATE(Customer.Passwort,password)
    MODIFY;


und warum ist das eigentlich beim 2. Validate Customer.Customer.Passwort??

5. Oktober 2007 15:47

Den Code hab ich so schon geändert. War mir kurz nach Erstellen des Threads aufgefallen das ich das auch zusammenführen kann.

Was meinst du mit Customer.Customer.Passwort? Bei mir steht da nur einmal Customer.

(Ich änder das mal im Beitrag oben.. das irritiert anscheinend nur ;) )

Nachtrag:

Ach jetzt weiß ich was du meinst :idea:

5. Oktober 2007 15:56

Hat das jetzt schon was entscheidendes gebracht??
Oder säbelt er immer noch fröhlich drauflos

5. Oktober 2007 16:10

Er säbelt leider immer noch. Im Moment sind wir dabei das Splitten des Namens in der DLL zu programmieren. Da Säbeln wir bestimmt nirgendswo dann rumm.

Nachtrag:

Jetzt bin ich langsam total überfordert und die Ideen gehn mir aus -.- Ich zitiere mich selber:

Da Säbeln wir bestimmt nirgendswo dann rumm.


Pustekuchen sag ich da nur. Jetzt säbelt er noch viel lustiger. Nach einmal ausführen des Reports sieht das ganze nun so aus:

Tabelle Vorher: Bayer Health Care
Tabelle Nachher: Health

Und in der XML Datei steht überall Bayer im Vorname (wo zum Teufel ist das Care hin?)

5. Oktober 2007 16:37

En was kommt mir an deiner Prozedur noch spanisch vor.
Du gehst doch nehme ich mal an durch eine Tabelle.
Mit der Schleife arbeitest du doch die ganze Tabelle ab, oder??

Im "OnAfterGetRecord Trigger" geht der Report doch durch jeden Datensatz des Records der Tabelle durch, also doch eigentlich auch durch deine schon bearbeiteten, oder??
Da würde er doch dann auch immer wieder am Namen "rumsäbeln" ;-), oder.

Kann auch sein das ich jetz nen Denkfehler hab.

5. Oktober 2007 16:47

Ich weiß auch im Moment nicht genau warum Navision da säbelt.. aber wir haben das jetzt umgangen.

Der Code sieht jetzt so aus:

Code:
IF ISCLEAR(PWD) THEN
CREATE(PWD);

IF ISCLEAR(Catalog) THEN
CREATE(Catalog);
 
GUI := Customer."Kundennr. Shop";
password := Customer.Passwort;

REPEAT

Name := Customer.Name;
Vorname := Catalog.SplitName(Name,0);
Nachname := Catalog.SplitName(Name,1);

CLEAR(GUI);
CLEAR(password);

password := PWD.CreatePassword(Customer.Passwort);

GUI := Catalog.CreateUserProfileUserObject('C:\Dokumente und Einstellungen\alle\Desktop\Pending\',
GUI,password,'',Customer."E-Mail",'','',Customer."Fax No.",Customer."Phone No.",Vorname,Nachname,'');

Catalog.CreateUserProfileAddress('C:\Dokumente und Einstellungen\alle\Desktop\Pending\',
GUI,Customer."Phone No.",Vorname,Nachname,Customer.Address,Customer."Country Code",Customer."Post Code",
Customer.City,Customer.Geburtsdatum,'');

WITH Customer DO BEGIN
    VALIDATE("Kundennr. Shop",GUI);
    VALIDATE(Passwort,password);
    MODIFY;
END;

UNTIL Customer.NEXT = 0;