[Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 12:30

Guten Tag die Damen und Herren =)
---------Berichtigung---------
Die Datentypen für die Variablen sind Records auf die "Sales Comment Line"
--------/Berichtigung---------

@first:
Code:
CLEAR(SalesCommentLineVar);
SalesCommentLine.SETRANGE("Document Type",SalesHeader."Document Type");
SalesCommentLine.SETRANGE("No.",DocNo);

IF SalesCommentLine.FINDFIRST THEN BEGIN
  REPEAT
    SalesCommentLineVar.TRANSFERFIELDS(SalesCommentLine, TRUE);
  UNTIL SalesCommentLine.NEXT = 0;
END;

SalesCommentLineVar.SETRANGE("Document Type",SalesHeader."Document Type");
SalesCommentLineVar.SETRANGE("No.",DocNo);

IF SalesCommentLineVar.FINDFIRST THEN BEGIN
  REPEAT
    SalesCommentLineVar."No." := SalesHeader."No.";
    MESSAGE(SalesCommentLineVar."No.");
  UNTIL SalesCommentLineVar.NEXT = 0;
END;


So nun zur Sache... Soweit geht der Code, laut Debugger funzt einwandfrei bis auf die letzte Schleife... Dort macht er nur einen Durchlauf und bricht dann ab, obwohl er in der vorrangehenden Schleife viel mehr Datensätze kopiert hat. Kann mir einer sagen wieso?!

Ich bin Newby in C/Side hab aber schon Erfahrung im Php und c++ also habt erbarmen :)

mfg Martin
Zuletzt geändert von Cr4cks am 25. September 2009 14:16, insgesamt 1-mal geändert.

Re: Datensatz übertragung nicht vollständig...

25. September 2009 12:48

Da fehlt schätzungsweise ein SalesCommentLineVar.insert in der ersten Schleife.

Re: Datensatz übertragung nicht vollständig...

25. September 2009 12:52

Naja das Insert kommt erst nach dem ganzen gerassel:

Code:
IF NOT SalesCommentLine.GET(SalesCommentLineVar."No.") THEN BEGIN
  IF SalesCommentLine.INSERT(TRUE) THEN
    MESSAGE('Hat gefunzt!');
END;


Da ich ja die SalesCommentLine."No." ändern muss kann ich in die Tabelle "Sales Comment Line" erst nach dem ändern der Nr. die geänderten Datensätze einfügen... Oder versteh ich da was falsch?!

Re: Datensatz übertragung nicht vollständig...

25. September 2009 12:55

Beschreib doch mal genauer, was das leisten soll. Willst du die Kommentare eines Belegs zu einem anderen kopieren?

Re: Datensatz übertragung nicht vollständig...

25. September 2009 12:57

Richtig erraten...

Um genauer zu werden, die Kommentare eines Speziellen Belegs sollen in einen Rahmenauftrag eingefügt werden...

Re: Datensatz übertragung nicht vollständig...

25. September 2009 13:01

Dafür sollte das hier reichen:
Code:
CLEAR(SalesCommentLineVar);
SalesCommentLine.SETRANGE("Document Type",SalesHeader."Document Type");
SalesCommentLine.SETRANGE("No.",DocNo);

IF SalesCommentLine.FINDSET THEN
  REPEAT
    SalesCommentLineVar.INIT;
    SalesCommentLineVar.TRANSFERFIELDS(SalesCommentLine, TRUE);
    SalesCommentLineVar."No.":=NewDocNo;
    SalesCommentLineVar.INSERT;
  UNTIL SalesCommentLine.NEXT = 0;

Für Erklärungen bin ich grad zu faul, also wenn etwas unklar ist, frag noch mal nach :wink:

Edit: das mit dem Rahmenauftrag habe ich eben erst gesehen. Dafür musst du auch noch das Feld "Document Type" ändern ("Blanket Order", glaubich).
Zuletzt geändert von McClane am 4. Oktober 2009 01:39, insgesamt 1-mal geändert.

Re: Datensatz übertragung nicht vollständig...

25. September 2009 14:03

Vielen Dank für die Hilfreiche Antwort, ich probier das mal schnell...

Re: Datensatz übertragung nicht vollständig...

25. September 2009 14:15

So ich habs hinbekommen. Nochmal vielen Dank und als vervollständigung nochmal den Quelltext der funktioniert:

Code:
CLEAR(SalesCommentLine);
CLEAR(SalesCommentLineVar);
SalesCommentLine.SETRANGE("Document Type",FromSalesHeader."Document Type");
SalesCommentLine.SETRANGE("No.",DocNo);

IF SalesCommentLine.FINDFIRST THEN BEGIN
  REPEAT
    SalesCommentLineVar.TRANSFERFIELDS(SalesCommentLine, TRUE);
    SalesCommentLineVar."No." := SalesHeader."No.";
    SalesCommentLineVar."Document Type" := SalesHeader."Document Type";
    SalesCommentLineVar.INSERT;
  UNTIL SalesCommentLine.NEXT = 0;
END;

Re: [Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 14:40

Trotzdem: Bitte kein FINDFIRST zusammen mit REPEAT - steht auch so in der Onlinehilfe.
McClane hat in seiner Lösung nicht umsonst FINDSET verwendet ;-)

Re: [Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 15:09

Natalie hat geschrieben:Trotzdem: Bitte kein FINDFIRST zusammen mit REPEAT - steht auch so in der Onlinehilfe.
McClane hat in seiner Lösung nicht umsonst FINDSET verwendet ;-)



Oh glatt überlesen ^^ Wird ntl sofort geändert...

Aber so richtig konnte ich aus der Hilfe nicht viel nehmen ausser das was schon auf Navision24.de steht...
Warum sollte ich lieber FINDSET nehmen und nicht FINDFIRST?! Ich will doch am Anfang mit der Schleife anfangen und nicht irgendwo in der Mitte!?

Re: [Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 15:13

Cr4cks hat geschrieben:Warum sollte ich lieber FINDSET nehmen und nicht FINDFIRST?! Ich will doch am Anfang mit der Schleife anfangen und nicht irgendwo in der Mitte!?

Genau das tut FINDSET auch, keine Sorge ;-)

Re: [Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 16:01

Natalie hat geschrieben:
Cr4cks hat geschrieben:Warum sollte ich lieber FINDSET nehmen und nicht FINDFIRST?! Ich will doch am Anfang mit der Schleife anfangen und nicht irgendwo in der Mitte!?

Genau das tut FINDSET auch, keine Sorge ;-)



:lol: ich hab totalen Kauderwelsch geschrieben xD Ich meinte das der Schleifendurchlauf am Anfang der Datensätze anfängt zu ersetzen etc...(und nicht mitten in der Schleife)...

naja gut, ich nehms einfach mal so hin... und vielen Dank =) komm jetzt bestimmt öfters mit Fragen...

Re: [Gelöst]Datensatz übertragung nicht vollständig...

25. September 2009 16:26

Cr4cks hat geschrieben:Aber so richtig konnte ich aus der Hilfe nicht viel nehmen ausser das was schon auf Navision24.de steht...
Warum sollte ich lieber FINDSET nehmen und nicht FINDFIRST?! Ich will doch am Anfang mit der Schleife anfangen und nicht irgendwo in der Mitte!?


Weil ein FINDFIRST ohne CURSOR** arbeitet, wenn keine weitere Schleife kommt. (Es ist schnell und der Server wird wenig belastet)

FINDFIRST mit REPEAT..UNTIL, ist das gleiche wie FIND('-')REPEAT..UNTIL. Es arbeitet mit Cursor´n, die Verarbeitung wird weniger Performand sein und die Serverkosten sind hoch.


**Cursor
= Vereinfacht ausgedrückt, ein temporärer Satz von Datensätzen. Diese Datensätze müssen zunächst in den SQL-Cache (und dieses Kostet Serverleistung).
(Im Zusammenhang mit dem Server spricht "man" von Prozessorkosten und Festplatten I/O Kosten, die es gilt durch eine gute Programmierung niedrig zu halten.) Sollte ich etwas falsches ode unvollständiges geschieben haben, dürft Ihr mich gerne Korrigieren (SQL-Server ist für mich auch noch relatives "Neuland")

Wenn dich das Interessiert, kann ich dir den Blog von Waldo ans Herz legen: What impact does my C/AL have on SQL? (und weitere seiner Themen)
Alternativ, gibt es ein Buch von Jörg Stryk, "The NAV/SQL Performance Field Guide", es behandelt Probleme mit Nav und SQL Server sowie deren Problemlösung. Ich lese es gerade, um Programmierfehler zu vermeiden und vorhandene Performanceprobleme zu beseitigen.
Und natürlich nicht zu vergessen, hierim Forum gibt es auch reichlich Themen bzgl. Befehle und Ihre Optimierung :-)

Re: [Gelöst]Datensatz übertragung nicht vollständig...

28. September 2009 12:05

Danke Mikka für die ausführliche Antwort.

Was die Hilfestellungen via Buch von Jörg Stryk angeht, das kommt in geraumer Zeit einmal, aber zZ. hab ich wirklich Probleme die Zusammenhänge des Navisions zu verstehen... da bringt es mir nichts Probleme vorzubeugen die ich noch garnicht machen kann ^^ Dieser C/Al Code ist ne sache für sich... absolut kein vergleich zu PHP oder C++...

Ntl werde ich dein guten Rat annehmen und hier im Forum fleißig nachfragen... (@ first aber suchen ;-) )