[Gelöst] Problem mit einige Tables und Forms

26. Januar 2007 15:15

Hallo,

Kann man eine Subform in einer Form über eine andere Subform Updaten?

Wäre über eine Antwort erfreut...
Zuletzt geändert von Steev am 1. Februar 2007 17:07, insgesamt 2-mal geändert.

26. Januar 2007 16:02

[Beitrag aus dem Problemforum nach Dynamics NAV 4.xx verschoben, da es ein produktbezogenes Problem ist (und nichts mit diesem Board zu tun hat).]

Gruß, Kai
MSDynamics.de-Team

26. Januar 2007 17:13

Kannst du bitte ein Beispiel dafür geben?

26. Januar 2007 17:45

Hi,

kann es sein, daß dies weiterhilft: http://www.msdynamics.de/viewtopic.php?t=2237&highlight=subform

30. Januar 2007 14:20

Sorry das ich erst jetzt antworte....

An jm: Nein, hat mir leider nicht geholfen.

An Alle: Scheint wohl doch ein anderes Problem zu sein und hat weniger mit Subforms zu tun. Ich habe eine Funktion, die in einer Tabelle Felder mit Werten aus dem EK-Bereich füllt.

Nun habe die EK-Bestellung angepasst und eine andere Subform hineingepackt. In dieser anderen Subform werden die Felder der besagten Tabelle angezeigt.
Wenn ich jetzt einen relevanten Wert in der EK-Tabelle in der Standart-Subform verändere, möchte ich erreichen, dass die andere Subform die aktuellen Werte anzeigt.
Zu diesem Zweck habe ich eine Funktion, die die Werte direckt in die Tabelle von meiner Subform schreibt, geschrieben und diese in der Subform mit der EK-Tabelle auf die Felder in einen onValidate-Trigger hinein gepackt.
Das Resultat ist ein ERROR mit folgendem Inhalt:
Sie können keine Änderungen an der Datenbank vorhnehmen, ehe eine Transaktion gestartet wurde.
Was soll das?!

30. Januar 2007 14:35

Verstehe ich das richtig:
Diese Felder (in den Subforms) sind keine FlowFields (Lookup), sondern die schreibst du fest in die Tabelle rein?

Wenn dem so ist:
Vor deiner Funktion sollte der aktuelle Datensatz mit MODIFY gespeichert sein.
Dann Validieren, zuletzt ggf. ein CurrForm.UPDATE ...

30. Januar 2007 14:47

richtig, die Felder sind keine FlowFields,... das andere war eigendlich in der Funktion schon drin, ich vermute dass gerade das der Grund ist, dass es nicht funktioniert, warum, dies entzieht sich meiner Kenntniss....
Zuletzt geändert von Steev am 30. Januar 2007 15:09, insgesamt 1-mal geändert.

30. Januar 2007 14:53

Beachte bei einen CurrForm.UPDATE ob du ein SaveRecord ausführen willst oder nicht.
Ich bin damit auch oft auf die "Nase" gefallen.

C/SIDE Hilfe hat geschrieben:UPDATE
Use this function to save the current record and then update the controls in the form. If you set the SaveRecord parameter to FALSE, this function will not save the record before the system updates the form.

CurrForm.UPDATE[(SaveRecord)]

SaveRecord

Data type: boolean

You have these options:

If you want the system to... Set SaveRecord to...
Save the current record TRUE
Update without saving the current record FALSE

Gruß Mikka

30. Januar 2007 15:13

Habe soeben fest gestellt, dass auch in der EK-Bestellung die Funktion nur in dem Trigger onOpenForm funktioniert, und bei allen anderen Triggern die selbe Fehlermeldung hervor ruft...

30. Januar 2007 15:17

Wie lautet denn deine Funktion (Code, bitte), die nur im onOpenForm-Trigger funktioniert?
Möchte wissen, ob ich das nicht auch schonmal (mit vielleicht einer anderen Funktion) hatte. Mir kommt das Phänomen bekannt vor.

30. Januar 2007 15:28

So in etwa sieht sie aus...
Code:
// Filter den Rec Stundenlang...
IF meineRecordVar.FIND('-') THEN ;
meineRecordVar.meineFunktionInDerTabelle(USERID);
// USERID für das durchlaufen der Datensätze...
meineRecordVar.MODIFY;
// das dürfte reichen...

30. Januar 2007 15:32

Hier wäre vor allem deine Funktion in der Tabelle interessant ;-)

30. Januar 2007 15:43

OK, das wäre jetzt sinnloß weiter zu verheimlichen...

Es handelt sich um ein EK-Budget. Die Funktion calcMonthBudget wird in der EKBestellung aufgerufen.

Hier die Funktionen:

function calcMonthBudget:
Code:
EVALUATE(lYear,(STRSUBSTNO('20%1',COPYSTR(STRSUBSTNO('%1',TODAY),7,STRLEN(STRSUBSTNO('%1',TODAY))-1))));
EVALUATE(lMonth,COPYSTR(STRSUBSTNO('%1',TODAY),4,2));
EVALUATE(Beginn,
STRSUBSTNO('01.%1.%2',lMonth,lYear)
);
EVALUATE(lMonthI,lMonth);
tmpDays:=MonthReturnNumberOfDays(lMonthI);
EVALUATE(Ende,
STRSUBSTNO('%1.%2.%3',tmpDays,lMonth,lYear)
);

EVALUATE(lMonthI,lMonth);

IF (lYear=Jahr)AND((lMonthI-1)=Monat) THEN
BEGIN
  "Budget-Verbraucht":=calc_BudgetVerbrauch(Beginn,Ende,User);
  "Budget-Überschritten":="Budget-Verbraucht"-"Budget-Gesamt";
  IF NOT ("Budget-Überschritten">0) THEN
    "Budget-Überschritten":=0;
END;


function MonthReturnNumberOfDays:
Code:
EVALUATE(lYear,(STRSUBSTNO('20%1',COPYSTR(STRSUBSTNO('%1',TODAY),7,STRLEN(STRSUBSTNO('%1',TODAY))-1))));
EVALUATE(lMonth,COPYSTR(STRSUBSTNO('%1',TODAY),4,2));
EVALUATE(lBeginn,
STRSUBSTNO('01.%1.%2',lMonth,lYear)
);

Date.SETRANGE(Date."Period Type",Date."Period Type"::Monat);
Date.SETRANGE(Date."Period No.",Month);
Date.SETRANGE(Date."Period Start",lBeginn);
IF (Date.FIND('-')) THEN
  EVALUATE(
    Days,(
      STRSUBSTNO('%1',(COPYSTR(STRSUBSTNO('%1',Date."Period End"),2,3)))
         )
  );


function calc_BudgetVerbrauch:
Code:

// EK-Kopf + EK-Zeile
Einkaufskopf.RESET;
Einkaufskopf.SETRANGE(Einkaufskopf."Purchaser Code",Benutzer);
Einkaufskopf.SETRANGE(Einkaufskopf."Document Date",DatumVon, DatumBis);
Einkaufskopf.SETRANGE(Einkaufskopf."Document Type",Einkaufskopf."Document Type"::Order);
IF Einkaufskopf.FIND('-') THEN
  REPEAT
  BEGIN
    Einkaufszeile.RESET;
    Einkaufszeile.SETCURRENTKEY("Document Type","Document No.","Line No.");
    Einkaufszeile.SETRANGE(Einkaufszeile."Document No.",Einkaufskopf."No.");
    IF Einkaufszeile.FIND('-') THEN
      REPEAT
        SummeEK_Zeile += Einkaufszeile."Line Amount"-(Einkaufszeile."Qty. Invoiced (Base)"*Einkaufszeile."Direct Unit Cost");  // ?
      UNTIL Einkaufszeile.NEXT <> 1;
    END;
  UNTIL Einkaufskopf.NEXT <> 1;

// Einkaufsrechnungskopf + Einkaufsrechnungszeile
Einkaufsrechnungskopf.RESET;
Einkaufsrechnungskopf.SETRANGE(Einkaufsrechnungskopf."Purchaser Code",Benutzer);
Einkaufsrechnungskopf.SETRANGE(Einkaufsrechnungskopf."Document Date",DatumVon, DatumBis);
IF Einkaufsrechnungskopf.FIND('-') THEN
  REPEAT
  BEGIN
    Einkaufsrechnungszeile.RESET;
    Einkaufsrechnungszeile.SETCURRENTKEY("Document No.","Line No.");
    Einkaufsrechnungszeile.SETRANGE(Einkaufsrechnungszeile."Document No.",Einkaufsrechnungskopf."No.");
    IF Einkaufsrechnungszeile.FIND('-') THEN
      REPEAT
        SummeEK_Rechnungzeile += Einkaufsrechnungszeile.Amount;
      UNTIL Einkaufsrechnungszeile.NEXT <> 1;
    END;
  UNTIL Einkaufsrechnungskopf.NEXT <> 1;

// Einkaufsgutschriftenkopf + Einkaufsgutschriftszeile
Einkaufsgutschriftenkopf.RESET;
Einkaufsgutschriftenkopf.SETRANGE(Einkaufsgutschriftenkopf."Purchaser Code",Benutzer);
Einkaufsgutschriftenkopf.SETRANGE(Einkaufsgutschriftenkopf."Document Date",DatumVon, DatumBis);
IF Einkaufsgutschriftenkopf.FIND('-') THEN
  REPEAT
  BEGIN
    Einkaufsgutschriftszeile.RESET;
    Einkaufsgutschriftszeile.SETCURRENTKEY("Document No.","Line No.");
    Einkaufsgutschriftszeile.SETRANGE(Einkaufsgutschriftszeile."Document No.",Einkaufsgutschriftenkopf."No.");
    IF Einkaufsgutschriftszeile.FIND('-') THEN
      REPEAT
        SummeEK_Gutschriftszeile += Einkaufsgutschriftszeile.Amount;
      UNTIL Einkaufsgutschriftszeile.NEXT <> 1;
    END;
  UNTIL Einkaufsgutschriftenkopf.NEXT <> 1;

BetragInsgesamt := (SummeEK_Rechnungzeile+SummeEK_Zeile)-SummeEK_Gutschriftszeile;
Zuletzt geändert von Steev am 1. Februar 2007 12:36, insgesamt 2-mal geändert.

30. Januar 2007 15:52

Sagt dir der Debugger, an welcher Stelle genau es hakt?

Und jetzt bitte nochmal für ganz Dumme:
Du hast eine Form.
Diese Form ist die Standard Bestell-Form mit einer zusätzlichen Subform, oder wie ist die aufgebaut?
Und wenn du etwas im Standard-Bereich änderst, soll es sich auf der zusätzlichen Subform mitändern?

30. Januar 2007 15:58

Und jetzt bitte nochmal für ganz Dumme:
Du hast eine Form.
Diese Form ist die Standard Bestell-Form mit einer zusätzlichen Subform, oder wie ist die aufgebaut?
Und wenn du etwas im Standard-Bereich änderst, soll es sich auf der zusätzlichen Subform mitändern?


Das ist korrekt, doch was der Debugger sagt kommt nach...

30. Januar 2007 16:02

So, der Debugger geht bis zum Ende durch die Funktionen in der EKBudgets-Table und sagt "break on Error", also unsere Fehlermeldung, sobald er auf das "meineRecordVar.MODIFY;" am Ende der Funktion in der Form stößt. Seltsam nicht?

30. Januar 2007 16:39

Ziel sollte es sein, das MODIFY so früh wie möglich einzusetzen.
ich würde es in Etappen probieren; z.B. ans Ende deiner 1. Funktion.

30. Januar 2007 16:46

Das MODIFY steht ja am Ende der Funktion, welche in der Form enthalten ist. MODIFY in der Tabelle einzusetzten wäre doch sinnloß...

30. Januar 2007 16:49

Ich meinte an Ende von calcMonthBudget

30. Januar 2007 16:58

Diese Funktion ist auch in der Tabelle und wird von der Funktion in der Form aufgerufen. Alle drei Funktionen die ich eben gepostet habe, sind in der Tabelle und arbeiten demnach direckt mit den Feldern der Tabelle.

31. Januar 2007 15:48

ok, wo genau rufst du die Funktionen auf? im OnValidate des Feldes auf der Subform?
Wenn ja, versuch es mal im OnAfterValidate.....

1. Februar 2007 09:03

Sorry, späte Antwort...

OK ich werde es mal versuchen.

1. Februar 2007 12:43

Toll, jetzt bekomme ich zwar keinen Error mehr, aber der Funktionsaufruf findet ja in der Subform statt, das bedeutet, dass ich aus der Subform heraus die andere Subform, welche die EK-Budgets anzeigt updaten müsste. Wie soll das gehen?

1. Februar 2007 13:24

Da bleibt dir dann wohl nur noch ein Timer-Event auf der Mainform, der die eine Subform ständig auf änderungen prüft und wenn er fündig wird, die andere aktualisiert.

1. Februar 2007 13:52

Hab ich probiert.... RESULT == Na, Ja

Ist ein bisschen dumm, weil dann permanent die Funktionen ausgeführt werden, und dies sehr Zeitaufwendig werden kann, bzw. wird

2007-02-02
Gelößt, wenn ich in der Subform etwas eingebe werden die Werte im Budget mit geändert.
Zuletzt geändert von Steev am 2. Februar 2007 11:42, insgesamt 1-mal geändert.