Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 10:24

Hallo,

ich habe hier eine interessante Sache. Wir haben ein Suchformular, bei dem aus der Ergebnisliste bestimmte oder alle Datensätze markieren kann und diese dann an bestimmte Funktionen übergibt. Beim Ausführen einer bestimmten Funktion friert komischerweise immer die Anwendung ein. Und zwar dann, wenn ich aus der Ergebnisliste Datensätze mit unterschiedlich langen Kontaktnummer an diese Funktion übergebe. Wähle ich jeweils gleich lange Kontaktnummer, dann funktioniert das alles einwandfrei. Wir verwenden übrigens NAV 5.0 auf einem SQL 2005 Server. Hat jemand eine Idee? Anbei der Code der die Auswahl an die Funktion übergibt:

Code:
Code
  IF ContriStructMulti.RUNMODAL = ACTION::OK THEN
  BEGIN
    RecContact.RESET;
    CurrForm.SETSELECTIONFILTER(RecContact);
    IF NOT RecContact.MARKEDONLY THEN
    BEGIN
      RecContact.GET("No.");
      ContriStructMulti.SetContrStrucRights(RecContact);
    END ELSE
    BEGIN
      CurrForm.SETSELECTIONFILTER(Rec);
      IF FIND('-') THEN
      BEGIN
        REPEAT
          RecContact.GET("No.");
          ContriStructMulti.SetContrStrucRights(RecContact);
        UNTIL NEXT = 0;
      END;
      MARKEDONLY(FALSE);
      CLEARMARKS;
    END;
  END;

Re: Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 10:49

Hallo navi246,

was passiert denn weiter mit den übergebenen RecContact? In diesen Stück Code passiert nichts besonderes. Wenn die Anwendung einfriert, kann sein, dass eine endlose Schleife dran Schuld hat...
Wie wird die RecContact weiterverarbeitet?

Gruß
prisma

Re: Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 11:22

Hi Prisma,

sorry, war eben in einer Besprechung. Also wie Du schon gesehen hast, wird der Record "RecContact" an die Funktion "SetContrStrucRights" übergeben. Hier der Code der Funktion:

Code:

IF CustStructure.GET(p_recContact.GetCustomer, codeStructure) THEN
BEGIN
  IF useContribution THEN
    IF CustStructure.Contributionposting <> Contributionposting THEN
    BEGIN
      CustStructure.Contributionposting := Contributionposting;
      CustStructure.MODIFY(FALSE);
    END;

  IF useDonation THEN
    IF CustStructure.Donationposting <> Donationposting THEN
    BEGIN
      CustStructure.Donationposting := Donationposting;
      CustStructure.MODIFY(FALSE);
    END;

  IF useEmpty THEN
    IF CustStructure.Emptyposting <> Emptyposting THEN
    BEGIN
      CustStructure.Emptyposting := Emptyposting;
      CustStructure.MODIFY(FALSE);
    END;
END ELSE
BEGIN
  CustStructure.INIT;
  CustStructure."Customer No." := p_recContact.GetCustomer;
  CustStructure."Structure No." := codeStructure;

  IF useContribution THEN
    CustStructure.Contributionposting := Contributionposting
  ELSE
    CustStructure.Contributionposting := FALSE;

  IF useDonation THEN
    CustStructure.Donationposting := Donationposting
  ELSE
    CustStructure.Donationposting := FALSE;

  IF useEmpty THEN
    CustStructure.Emptyposting := Emptyposting
  ELSE
    CustStructure.Emptyposting := FALSE;

  CustStructure.INSERT(TRUE);
END;

IF CustStructure.GET(p_recContact.GetCustomer+'k', codeStructure) THEN
BEGIN
  IF useContribution THEN
    IF CustStructure.Contributionposting <> Contributionposting THEN
    BEGIN
      CustStructure.Contributionposting := Contributionposting;
      CustStructure.MODIFY(FALSE);
    END;

  IF useDonation THEN
    IF CustStructure.Donationposting <> Donationposting THEN
    BEGIN
      CustStructure.Donationposting := Donationposting;
      CustStructure.MODIFY(FALSE);
    END;

  IF useEmpty THEN
    IF CustStructure.Emptyposting <> Emptyposting THEN
    BEGIN
      CustStructure.Emptyposting := Emptyposting;
      CustStructure.MODIFY(FALSE);
    END;
END ELSE
BEGIN
  CustStructure.INIT;
  CustStructure."Customer No." := p_recContact.GetCustomer+'k';
  CustStructure."Structure No." := codeStructure;

  IF useContribution THEN
    CustStructure.Contributionposting := Contributionposting
  ELSE
    CustStructure.Contributionposting := FALSE;

  IF useDonation THEN
    CustStructure.Donationposting := Donationposting
  ELSE
    CustStructure.Donationposting := FALSE;

  IF useEmpty THEN
    CustStructure.Emptyposting := Emptyposting
  ELSE
    CustStructure.Emptyposting := FALSE;

  CustStructure.INSERT(TRUE);
END;



Was mich jedoch etwas stutzig macht ist, dass die Anwendung einfriert, wenn die Auswahl aus unterschiedlich langen Kontaktnummer besteht. Bsp.:

Zeile Nr. Kontaktnummern:
1 12345
2 24680
3 1234567
4 2468012

Wähle ich nur Zeile 1 + 2 oder 3 + 4, dann funktioniert die Funktion. Wähle ich die Zeilen 2 + 3, dann friert die Anwendung ein. Grundsätzlich hätte ich auch gedacht, dass die Anwendung in einer Endlosschleife verhungert. Aber wieso funktioniert das wenn man gleich lange Kontaktnummern in der Auswahl hat?

Gruß

Navi246

Re: Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 11:47

Wenn es was mit Kontaktnr. zu tun ist, dann vermute ich kann die Schleife in der Function GetCustomer (p_recContact.GetCustomer) sein.
Oder was noch möglich wäre: OnInsert in der Tabelle CustStructure... (CustStructure.INSERT(TRUE)).

Gruß
prisma

Re: Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 12:06

Erstmal: Hallo "prisma" :-) Schön dich/euch hier zu treffen! :wink:

Was "spricht" denn der Debugger? Läuft tatsächlich eine Endlosschleife? Oder hört das "hängen" nach einer Zeit von alleine auf?
Welchen SQL Datentyp hat "No." ("Code" = "varchar", oder "variant" oder "int")?

Wenn das "Hängen" nach einiger Zeit aufhört, dann liegt es u.U. an langwierigen Index Scans. Das könnte man via SQL Profiler verifizieren ...

Gruß,
Jörg

Re: Unterschiedliche Nr. - Länge lässt Anwendung einfrieren

13. August 2009 12:22

Hi Jörg,

also das Feld No. gehört zu der Contact - Tabelle und ist in der Navision Anwendung vom Type Code. Dementsprechend müsste es also ein VARCHAR Feld sein. Wie schon gesagt, friert der Navision Client komplett ein und ich kann leider nicht sehen, an welcher Stelle der Debugger stehen bleibt.

@Prisma: Ich werde mir gleich noch einmal die Funktion GetCustomer und den INSERT Trigger der Tabelle Customer Structure anschauen.

Gruß

Navi246