23. April 2010 08:46
Hallo,
ich habe ein kleines Problem, wo ich eure Hilfe brauche.
Ich habe ein Form, in dem die User nicht immer alle möglichen Datensätze sehen darf. Dazu gibt es Berechtigungen, die zu anderen Tabellen referenzieren. Ich durchsuche diese Tabelle mittels REPEAT/UNTIL und setze mir dann immer entsprechend eine Satzmarke. Anschließend hole ich die erlaubt DS mit markedonly.
Mein Problem dabei ist nun, das ich diesen Filter normal lösen kann. Ich habe es schon mit der Filtergroup versucht, aber diese greift nicht bei Satzenmarken. Mein Gedanke war nun, dass ich diese DS die ich nun haben auf ein rec kopiere. Es sollten dann ja Filter entstehen. Diese könnte ich dann ja wieder in eine Filtergroup setzen. Hat jmd. eine Idee, wie man es lösen könnte, ohne die ganze Logik des Formulars umstellen zu müssen?
Danke!
vg
Rom
Zuletzt geändert von rom am 4. Mai 2010 11:28, insgesamt 1-mal geändert.
23. April 2010 08:52
Kopier doch die satzmarkierten in ein temporäres Record und zeig das an.
23. April 2010 09:13
McClane hat geschrieben:Kopier doch die satzmarkierten in ein temporäres Record und zeig das an.
Danke für deine Antwort.
Kannst du mir dazu mehr Infos geben. Ich habe noch nie mit TempRec gearbeitet. Ich weiß nur wie man sie anlegt.
Muss ich es auch über ein Repeat until machen oder kann ich es direkt machen temprec = rec?
23. April 2010 09:29
Ein temporäres rec behandelst du prinzipiell wie ein normales. Anstatt deine Datensätze zu markieren, wenn sie angezeigt werden sollen, kopierst du sie in das temporäre Rec (zB TempRec.transferfields(EchtRec)->TempRec.insert). Am Ende zeigst du deine Form mit Form.runmodal(DeineForm,DeinTempRec) an.
Ein paar Dinge solltest du tunlichst vermeiden:
Insert(true), Modify(true) und vor allem Delete(true), weil alle drei erheblichen negativen Einfluss auf die Echtdaten nehmen können. Bei Validates musst du ebenso genau aufpassen, was da passiert.
Beim Jonglieren zwischen echten und temporären Daten muss man darauf achten, welches Rec man grad in den Fingern hat. Sonst kann das ganz schnell zu Daten in der DB führen, die man da gar nicht haben wollte (oder noch viel Schlimmeres).
Das reine Zwischenspeichern einiger Datensätze, um sie anzuzeigen (sei es Form oder Report), ist jedoch unbedenklich. Es sei denn, auf der Form können Funktionen aufgerufen werden. Wenn jemand die Form mit dem temporären Record eine Weile geöffnet lässt, kann es ja sein, dass jemand anders in der Zwischenzeit Datensätze in der Echt-DB geändert hat. Diese Änderungen bekommt man dann nicht mit, da das temporäre Record ja ein Schnappschuss zum Zeitpunkt des Aufrufs der Form ist. Je nach Art der Funktionen, die man aufrufen kann, kann es dann auch herrlich krachen.
Also: genau überlegen, was du da machst.
23. April 2010 10:33
Hi,
danke für die Erklärung.
Vg
Rom
3. Mai 2010 14:41
Hallo,
ich bin leider jetzt dazu gekommen, diese Beschreibung auszuprobieren.
Das mit dem TempRec ist soweit kein Problem. Mein Problem ist nun: Ich befülle das TempRec im OnOpenform-Trigger. Wie bekomme nun diese DS in das Formular? Da ich ja das Runmodal ja nicht verwenden kann.
Danke!
VG
3. Mai 2010 14:56
Ich habe nun eine Lösung implemetiert, nur was ich nicht ob diese elegant ist. Anstatt das ich das Formular direkt aufrufe, setzt ich einen Report da vor, welcher mir die entsprechenden DS über TempRec raussucht und diese dann mit runmodal übergibt.
Ich habe dazu noch eine Frage, die DS, die dann im Formular zu sehen sind, sind diese noch Temporär oder werden diese bereits vom echt Rec angezeigt?+
Danke
VG!
3. Mai 2010 14:57
Hm. Das war ja so gemeint, dass du vor dem Öffnen die Datensätze in das temporäre Rec schreibst, die der Anwender sehen darf.
3. Mai 2010 15:01
rom hat geschrieben:Ich habe nun eine Lösung implemetiert, nur was ich nicht ob diese elegant ist.
Nicht so wirklich elegant
. Du verschenkst ein freies Objekt für etwas, was sich sicher mit wenigen Zeilen mehr als im Report per Code erledigen lässt.
rom hat geschrieben:Ich habe dazu noch eine Frage, die DS, die dann im Formular zu sehen sind, sind diese noch Temporär oder werden diese bereits vom echt Rec angezeigt?+
Wenn nix schief gelaufen ist, sind die temporär.
3. Mai 2010 15:04
McClane hat geschrieben: Du verschenkst ein freies Objekt für etwas, was sich sicher mit wenigen Zeilen mehr als im Report per Code erledigen lässt.
Denn stehe ich gerade auf'm Schlauch, wie ich hier diese DS mir anzeigen lassen kann, ohne die Satzmarken zu verwenden
Kannst du mir da ein Tipp geben?
3. Mai 2010 15:13
Bisher bist du doch so vorgegangen, wenn ich das richtig verstanden habe:
es wird eine Form über einen Button oder MenuItem geöffnet, und im OnOpen der Form steuerst du per Satzmarkierungen und markedonly, welche Datensätze dem jeweiligen Anwender angezeigt werden sollen. So weit richtig?
3. Mai 2010 15:15
McClane hat geschrieben:Bisher bist du doch so vorgegangen, wenn ich das richtig verstanden habe:
es wird eine Form über einen Button oder MenuItem geöffnet, und im OnOpen der Form steuerst du per Satzmarkierungen und markedonly, welche Datensätze dem jeweiligen Anwender angezeigt werden sollen. So weit richtig?
Es ist soweit richtig, es wird das Form nur direkt über das Navigationsmenü geöffnet.
3. Mai 2010 15:24
rom hat geschrieben:Es ist soweit richtig, es wird das Form nur direkt über das Navigationsmenü geöffnet.
Warum muss immer alles einen Haken haben
Ok, in dem Fall fällt mein Vorschlag erst mal flach. Also andere Idee:
Du setzt in der Form das Property SourceTableTemporary auf Yes. Dann kannst du das rec, das die Form anzeigt, im OnOpen füllen (in dem Fall handelt es sich dann auch um das "REC" der Form).
3. Mai 2010 15:29
McClane hat geschrieben:
Ok, in dem Fall fällt mein Vorschlag erst mal flach. Also andere Idee:
Du setzt in der Form das Property SourceTableTemporary auf Yes. Dann kannst du das rec, das die Form anzeigt, im OnOpen füllen (in dem Fall handelt es sich dann auch um das "REC" der Form).
Hab ich das so richtig verstange
- Code:
REPEAT
greResource.RESET;
greResource.SETRANGE("No.","Resource No.");
IF greResource.FINDSET(FALSE) THEN BEGIN
IF greResource."Zeiterfassung Import" THEN BEGIN
TRANSFERFIELDS(Rec); // rec ist temporär da SourceTableTemporary = true
INSERT;
END;
END;
UNTIL NEXT = 0;
Nur sehe ich leider keine DS
3. Mai 2010 16:35
Das Repeat-Until muss ja auch über das greResource laufen.
3. Mai 2010 16:44
McClane hat geschrieben:Das Repeat-Until muss ja auch über das greResource laufen.
Nein, eigentlich nicht. Das ist der gleiche Code, den ich auch im Report hatte. Oder funktioniert es mit den TempRec anders?
3. Mai 2010 16:51
Achso. Dann über das Record, das in deinem Report das DataItem ist. So, wie du das gepostet hast, bezieht sich das Repeat-until natürlich auf das rec der Form.
3. Mai 2010 16:56
McClane hat geschrieben:Achso. Dann über das Record, das in deinem Report das DataItem ist. So, wie du das gepostet hast, bezieht sich das Repeat-until natürlich auf das rec der Form.
Ok, ich glaube ich bin verwirt
Im Report war das Dataitem, die gleiche Tabelle, welches auch im Form ist. Diese Tabelle beinhaltet Zeitposten, die Ressourcen, die diese Zeiten erfasste haben, habe Eigenschaften, welche in der Ressourcentabelle hinterlegt sind. Ich gehe nun also die Zeitposten zeilenweise durch, und schaue, ob die Ressource diese bestimmten Eigenschaften hat. Wenn ja, soll es dem Temprec (vorher Satzmarke) zugeordnet werden.
Ist mein Ansatz da falsch?
vg
3. Mai 2010 16:57
Klingt gut
3. Mai 2010 17:02
und passende code war der dazu oben, und wieso sehe ich diese bl... DS nicht
3. Mai 2010 17:10
Nehmen wir als Beispiel die Artikeltabelle mit einer Form wie oben beschrieben:
- Code:
Item2.SetRange( .... );
if Item2.findset(false,false)then
repeat
rec.init; // "rec" hier nur der Deutlichkeit halber, kann man auch weg lassen
rec.TransferFields(Item2);
rec.insert;
until Item2.next=0;
3. Mai 2010 17:22
Ok, so funktionierts... Danke!
Eine Frage noch, kann ich dann diese DS mit folgenden Code verändern?
- Code:
IF CONFIRM(Text001) THEN BEGIN
greWorkTime.COPYFILTERS(Rec);
IF greWorkTime.FINDSET(TRUE) THEN BEGIN
REPEAT
greWorkTime."Document closed" := TRUE;
greWorkTime.VALIDATE("User Status","User Status"::Freigegeben);
greWorkTime."Approval Status Responsible" := greWorkTime."Approval Status Responsible"::Released;
greWorkTime."Approval Date Responsible" := TODAY;
greWorkTime.MODIFY;
UNTIL greWorkTime.NEXT = 0;
END;
END;
3. Mai 2010 21:59
Schau dir doch mal die Filter des temporären Recs an und überleg dir, was passiert, wenn du die auf das echte Rec kopierst und dann mit den Modifies loslegst.
4. Mai 2010 08:31
McClane hat geschrieben:Schau dir doch mal die Filter des temporären Recs an und überleg dir, was passiert, wenn du die auf das echte Rec kopierst und dann mit den Modifies loslegst.
Ich würde sagen, das die Echtdaten verändert werden, aber das Temporär Rec hinterher davon nichts weiß!
4. Mai 2010 08:38
Würdest du denn sagen, dass du per Copyfilters genau die DS in der Tabelle findest, die im Temp-Rec stehen bzw. dort gefiltert sind?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.