[rtc] SourceTableTemporary

18. Oktober 2012 16:27

Hallo,

ich habe heute meine erste Page mit SourceTableTemporary erstellt und ich habe folgendes Problem.
Wenn ich die Page (bzw. die Temp-Rec dahinter) mit einem ExcelBuffer füttere, dann funktioniert das wunderbar. Nur wenn ich die Page schließe (X oder Close), reagiert der RTC 1-2 minuten gar nicht mehr.
Anzahl Datensätze in der Page sind ca. 800-2000 Stück, also nicht so viele.
Build ist 33750

Hat wer schonmal ähnliche Erfahrung gemacht und kann mir bei diesem Problem helfen?

Vielen Dank

Re: [rtc] SourceTableTemporary

18. Oktober 2012 16:38

Ich nehme an, du fütterst im OnOpenPage-Trigger? Kannst du uns den mal zeigen?

Re: [rtc] SourceTableTemporary

19. Oktober 2012 08:45

Guten Morgen,

füttern tue ich über eine Action bei der ich einen Dateinamen angeben muss. Der Excel Import ist irgendwo aus dem Standard her:
Die Routine für CopyToRec habe ich aus einem funktionierenden Report mehr oder weniger kopiert.

Code:
<Action1000001584> - OnAction()
ReadExcelSheet(TextV001);

Code:
ReadExcelSheet(SheetName : Text[100])
UploadedFileName := '';
IF ISSERVICETIER THEN
  IF UploadedFileName = '' THEN
    UploadFile
  ELSE
    FileName := UploadedFileName;

ExcelBuffer.RESET;
ExcelBuffer.DELETEALL;

ExcelBuffer.OpenBook(FileName,SheetName);
ExcelBuffer.ReadSheet;

CopyExcelBufferToRec;

Code:
UploadFile()
UploadedFileName := CommonDialogMgt.OpenFile(TextV002,'',2,'',0);
FileName := UploadedFileName;

Code:
CopyExcelBufferToRec()
xlCounter := 0;

NoCountry := TRUE;
CountryCode := 'DE';

ExcelBuffer.RESET;
ExcelBuffer.SETRANGE("Row No.", 1);
ExcelBuffer.DELETEALL;

ExcelBuffer.RESET;
IF ExcelBuffer.FINDFIRST THEN
  REPEAT
    xlCounter += 1;

    CASE ExcelBuffer.xlColID OF
      'D':
        BEGIN
          INIT;
          "No." := DELCHR(ExcelBuffer."Cell Value as Text", '=');
        END;
      'H':
        "Long Description" :=
                    COPYSTR(ExcelBuffer."Cell Value as Text",1, MAXSTRLEN("Long Description"));
      'I':
        VALIDATE(Name, COPYSTR(ExcelBuffer."Cell Value as Text",1, MAXSTRLEN(Name)));
      'N':
        BEGIN
          IF (STRPOS(ExcelBuffer."Cell Value as Text",'BS') <> 0) THEN
            "Income/Balance" := "Income/Balance"::"Balance Sheet"
          ELSE
            IF (STRPOS(ExcelBuffer."Cell Value as Text",'P/L') <> 0) THEN
              "Income/Balance" := "Income/Balance"::"Income Statement";
        END;
      'AB':
        IF NOT NoCountry THEN
          IF (STRPOS(ExcelBuffer."Cell Value as Text", CountryCode) <> 0) AND ("No." <> '') THEN
            IF NOT INSERT(TRUE) THEN
              MODIFY(TRUE);
      'AC':
        IF (STRPOS(ExcelBuffer."Cell Value as Text", 'NAV Core') <> 0) AND ("No." <> '') THEN
          IF NOT INSERT(TRUE) THEN
            MODIFY(TRUE);
    END;
  UNTIL ExcelBuffer.NEXT = 0;

ExcelBuffer.RESET;
ExcelBuffer.DELETEALL;


Excel Buffer Tabelle ist nicht modifiziert.

Re: [rtc] SourceTableTemporary

19. Oktober 2012 09:53

Das führst du doch auf dem Page-Rec aus, richtig?
Code:
          IF NOT INSERT(TRUE) THEN
            MODIFY(TRUE);


Auf temporären Records nie, nie, niemals Trigger verwenden, siehe auch hier: viewtopic.php?p=74150#Umgang

Ich weiß nicht, in welche (temp.) Tabelle du die Daten einliest, aber je nachdem, was in den jeweiligen Triggern ausprogrammiert ist, kannst du eine kleine Daten-Katastrophe herbeischwören.

Ich wüsste jetzt nicht, was das mit deinem Page-Problem zu tun hat, aber bitte nimm zuerst die Trigger heraus und teste noch einmal.

Re: [rtc] SourceTableTemporary

19. Oktober 2012 10:01

Ich dachte, das wäre dort kein Problem:

http://dynamicsuser.net/blogs/mark_brum ... perty.aspx
(unten in den Kommentaren steht etwas, dass es dort gehen würde)

Ich werde es aber trotzdem mal ändern, da es keinen Sinn ergibt.

Hab es getestet: Meine Original-Daten wurden nicht geändert. Daher scheint der Kommentar beim Link korrekt zu sein.

Re: [rtc] SourceTableTemporary

19. Oktober 2012 10:16

JanGD hat geschrieben:(unten in den Kommentaren steht etwas, dass es dort gehen würde)

Und wie genau soll das gehen? Habs nicht gefunden.

Re: [rtc] SourceTableTemporary

19. Oktober 2012 11:48

Wenn Du in einer Page SourceTableTemporary setzt, werden die Trigger auf diese virtuelle Tabelle angewandt.
Wieso ich dies so schnell bestätigen konnte, war recht einfach. Durch das Insert/Modify(TRUE) werden bei der Tabelle immer die Felder für letzte aktualisierung gesetzt. Diese sind in den Originaldaten aber nicht auf das gestrige/heutige Datum gesetzt, wonach man ausgehen kann, dass durch das Property SourceTableTemporary die Trigger nicht auf Echt-Daten ausgeführt wird. Wenn man aber im Trigger Code hat, der auf andere Tabellen zugreift oder dort modifikationen vornimmt, werden diese (denke ich) schon auf echt-Daten vorgenommen.
Das werde ich aber dann bei Zeiten mal testen.

Das löst aber leider noch nicht mein Problem ;-)

Re: [rtc] SourceTableTemporary

19. Oktober 2012 12:24

JanGD hat geschrieben:Durch das Insert/Modify(TRUE) werden bei der Tabelle immer die Felder für letzte aktualisierung gesetzt.

Das ist richtig, wenn (nur) der aktuelle (temp.) Rec angesprochen wird, dann schadet es dir nicht. ABER: Keiner garantiert, dass nicht du oder euer Partner irgendwann später an gleicher Stelle eine neue Funktion programmiert, die sehr wohl andere Tabellen anspricht. Und dann haben wir den Salat. Darum: bei temp. Records erst gar nicht Trigger angewöhnen.

JanGD hat geschrieben:Das löst aber leider noch nicht mein Problem

Wie angenommen. Bin leider aus Zeitgründen raus :-(

Re: [rtc] SourceTableTemporary

19. Oktober 2012 12:46

Natalie hat geschrieben:
JanGD hat geschrieben:Das löst aber leider noch nicht mein Problem

Wie angenommen. Bin leider aus Zeitgründen raus :-(


Bei dem bombastischen Oktoberwetter ist das absolut verständlich! :-D

Re: [rtc] SourceTableTemporary

22. Oktober 2012 14:54

So, habe nun im OnQueryClose trigger mal deleteall ausprobieren, aber das hilft leider auch nicht.

Hat sonst jemand evtl. eine Idee?