PDA

Vollständige Version anzeigen : Sendkey


akki
11.07.2006, 17:11
Moin moin

ich möchte das mit

SendKeys "{ESC}", True

die Eingabe rückgängig gemacht wird (per Klick auf einen Button)

Wenn ich die Taste ESC drücke, funktioniert es.

Wenn ich

Private Sub Grundeinstellung_Click()
SendKeys "{ESC}", True
End Sub

das in die Ereignisprozedur eingebe und dann den Button anklicke passiert nichts.

Da ich mich nicht so in VB auskenne und ich hier immer die richtigen Lösungen bekommen, wende ich mich an Euch.


Mit freundlichen Grüßen
Henry

Worf1001
11.07.2006, 17:28
Hallo,

also wenn Du etwas Rückgängig machen willst, so scheint mir die Verwendung von SendKeys ziemlich unglücklich.

Was willst Du genau machen?

akki
11.07.2006, 17:40
Hallo Roger,

Das FRM kann nur mit
Private Sub cmdDatensatzaendern_Click()
AllowEdits = True
aendern = True

End Sub

zum ändern geöffnet werden.

Wenn nun aber der User sieht das er was fasch gemacht hat, dann sollen die Eingaben zurückgesetzt werden.

Ich nehme deshalb SendKeys weil ich schon andere Befehle in
Private Sub Form_BeforeUpdate(Cancel As Integer)
habe und ich nicht weiß wie man weitere Befehle integrieren kann die nur ein ein bestimmtes Ereignis reagieren.

Deshalb kamm mir die Idee mir ESC

Gruß
Henry

Worf1001
11.07.2006, 19:58
Trotzdem halte ich in dieser Verbindung SendKeys für ziemlich unsicher und die falsche Variante.

Wie lautet der Code im Form?

Knacki
11.07.2006, 20:17
Hi probier es doch mal undo ist vielleicht die bessere Methode.

Anne Berg
11.07.2006, 21:12
Me.Undo oder DoCmd.RunCommand acCmdUndo sollte hier die Lösung sein.

akki
12.07.2006, 05:54
Hallo Roger,

Hier der Code:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me!LHW_entsorgungspflichtig Then
If IsNull(Me!Amt) Then
MsgBox "Bitte die Felder mit ** nicht vergessen einzugeben!", vbInformation
Cancel = False
End If
End If
End Sub

Gruß
Henry

akki
12.07.2006, 05:55
Hallo Knacki,

Mit Me.undo funktioniert auch nicht.

Gruß
Henry

akki
12.07.2006, 05:56
Hallo Anne,

Ich werde mal

DoCmd.RunCommand acCmdUndo

test.


Anne:
Knacki:
Roger:
Vielen Dank für die schnelle Antwort

Gruß
Henry

SWR
12.07.2006, 07:21
Cancel = False???? Wenn das Update-Ereignis abgebrochen werden soll?

akki
12.07.2006, 16:40
Me.Undo oder DoCmd.RunCommand acCmdUndo sollte hier die Lösung sein.
Hallo Anne,
Dei Tipp war Gold wert.
Die Undo Funktion funktioniert jetzt genauso wie ich es haben wollte.

Danke an Alle die mir geholfen haben.

Mit freundlichen Grüßen Henry

akki
12.07.2006, 16:40
Hallo SWR,
Dein Tipp hat leider nicht funktioniert

Danke

Gruß
Henry

SWR
12.07.2006, 17:35
Dein Tipp hat leider nicht funktioniertDa bin ich grundsätzlich nicht so sicher . . . - das war kein Tipp, wie man eine Eingabe rückgängig macht (undo), sondern wie man dann zusätzlich auch noch den Speichervorgang abbricht, wenn irgendwas nicht durch eine Prüfung gelaufen ist. Ich dachte, Du wolltest halt auch explizit das Speichern unterbinden, dann wäre Cancel = True richtig. Bei "undo" und "Cancel = False" macht er halt als erstes Deine letzte Aktivität rückgängig, "speichert" aber dennoch den Datensatz und geht z. B. beim Weiterblättern zum nächsten - und das ist eigentlich selten gewollt, wenn an der Eingabe etwas "faul" war. Manchmal denk' ich viel zu sehr an Probleme, die die Leute (noch) gar nicht haben . . . :grins:

akki
12.07.2006, 19:01
Hallo SWR,
Es ist schön das Du dich nochmal meldest.
Ich habe folgenden Code eingegeben.
SendKeys "{ESC}", True
Me.Undo
Cancel = True

und es brachte nicht das Ergebnis.

Es sollte nur das Datenfeld wiederhergestellt werden.

Das habe ich mit

Private Sub Grundeinstellung_Click()
DoCmd.RunCommand acCmdUndo
Cancel = True
End Sub

erreicht.

Ich habe gedacht, damit wird der Urzustand wieder hergestellt.
In VB kenn ich mich nicht aus.

Jetzt habe ich noch festgestellt, das
Private Sub Ablagerungsortfilter_Click()
On Error GoTo Ablagerungsortfilter_Click_Err

auch nicht funktioniert. Erst wenn ich den DS öffne.
Gibt es eine Möglichkeit das Ändern zu unterbinden aber den Filter offen zu lassen. Hast Du eine Idee ??

Nochmals Vielen Dank für Dein Intresse

Gruß
Henry

Anne Berg
12.07.2006, 19:40
Jetzt verstehe ich aber gar nichts mehr - Du hast doch in Beitrag #11 noch geschrieben, dass alles wie gewünscht läuft! :confused:

Wo ist denn jetzt das Problem? (und bitte, verabschiede dich von Sendkeys!)

Nachtrag:
Ich muss da doch noch mal was loswerden...Ich habe folgenden Code eingegeben.
...

und es brachte nicht das Ergebnis. Hier wäre jetzt wichtig gewesen zu erwähnen, wo dieser Code überhaupt steht. (bei welchem Ereignis) Private Sub Grundeinstellung_Click()
DoCmd.RunCommand acCmdUndo
<s>Cancel = True</s>
End SubHier ist das Canceln völlig fehl am Platz und müsste eigentlich (mit Option Explicit) zu einem Kompilierfehler führen. Jetzt habe ich noch festgestellt, das
Private Sub Ablagerungsortfilter_Click()
On Error GoTo Ablagerungsortfilter_Click_Err

auch nicht funktioniert. Wer soll denn das jetzt wohl verstehen? Von diesem Ereignis bzw. der Schaltfläche war bislang noch nicht die Rede... :rolleyes:

akki
13.07.2006, 06:32
Hallo Anne,
Ich gebe Dir Recht.
Es ist alles verwirrend was ich schreibe.
Aber wenn ich eine Lösung finde dann muß ich ihn sofort mitteilen.
Entschuldigung.
Ich habe mich von Sendkey verabschiedet.

Da ich ja lernen will habe ich mich hingesetzt und diese Forum durchforstet und habe den Code bei
http://www.ms-office-forum.net/forum/showthread.php?t=146524&highlight=Bearbeiten+zulassen
gefunden

Private Sub but_Sperre_Click()
If Me!but_Sperre.Caption = "Sperren" Then
Me.AllowEdits = False
Me!but_Sperre.Caption = "Entsperren"
Else
Me.AllowEdits = True
Me!but_Sperre.Caption = "Sperren"
End If
End Sub

Im Prinzip ist es das was ich suche (wobei ich deine Lösung nicht auschlagen will). Durch meine dumme Formulierung muß es zu Irritationen kommen.
Bei der Kontrolle der DB habe ich festgestellt, das mein Filter (aus Nordwind) auch deaktiviert ist.
Da Du mir mit DoCmd.RunCommand acCmdUndo dir richtige Lösung genannt hast, kam mir die Idee vielleicht hast Du auch einen Lösungsansatz für den Filter (er sollte immer offen sein).

Das ganze hat folgenden Hintergrund:

Die DB läuft im Intranet. Rechte sind nicht vergeben. Ich bin noch auf der suche nach einem Login, denn bei Rechtevergabe mittels MDW muß ich jedem Benutzer einen Link schicken der auf die MDW der DB Datei weist. Ich habe das chon einmal gemacht und finde es etwas umständlich (ist aber sicher).
Nun denn, da jeder Benuter die DB öffen kann, sollte es nicht sofort möglich sein den DS zu ändern. Der Benutzer muß aktiv eingreifen d.h. er muß erst den DS öffen damit er schreiben kann. Der Benutzer der den DS angelegt hat wir automatisch aus der Windows Anmeldung ausgelseen und eingetragen.Es fehlt mir noch der Hinweis wer den DS geändert hat, aber das kommt auch noch.
Ich weiß auch das mein DB keine Relationale DB, aber ich bin lernfähig.

Ich hoffe ich konnte einige Frage beantworten.


Mit freundlichen Grüßen

Henry

Anne Berg
13.07.2006, 07:11
Erkläre doch bitte noch etwas genauer, was es mit dem Filter auf sich hat. Was meinst du mit "er sollte immer offen sein"?

akki
13.07.2006, 08:07
Hallo Anne,

Ich habe das FRM auf

Bearbeitung zulassen
auf nein gestellt.

Der User muß erst den DS öffen um ihn zu bearbeiten.

Erst dann funktioniert das ändern.

Wenn aber ein User nur lesen will, muß er trotzdem den DS erst öffen damit der Filter funktioniert.

Der filter sollte aber immer zu bediene sein, auch wenn der DS gesperrt ist.

Gruß
henry

Anne Berg
13.07.2006, 10:46
Wenn du mit "Filter" ein Kombifeld meinst, über das du Datensätze auswählen möchtest, so musst du dir etwas anderes zum Sperren der Datenfelder einfallen lassen. Eine bewährte Methode ist da das Setzen eines Kennzeichens in die Eigenschaft "Marke" all jener Felder, die betroffen sind, dann kannst du das (Ent-)Sperren mit einer kleinen Funktion vornehmen:

Function FelderSperren(bSPKZ as Boolean)
dim ctl
for Each ctl in Me.Controls
if ctl.ControlType = acTextBox Then ' gilt nur für Textfelder, bei Bedarf erweitern
if ctl.Tag = "X" Then
ctl.enabled = Not bSPKZ
ctl.locked = bSPKZ
End If
End IF
next ctl
End Function
Wenn du auch noch den Formularnamen als Parameter übergibst, kannst du die Funktion auch in ein allgemeines Modul für mehrfachen, variablen Einsatz schreiben. (--> Me.Controls --> Forms(frmname).Controls)

akki
13.07.2006, 19:24
Hallo Anne,
Ich könnt heulen vor Zorn.
Jetzt habe ich eine Hilfe und kann sie nicht umsetzen (heul)

Ich habe die die einzelen Umschaltflächen innerhalb der Optiongruppe (Filter) alle einen Tag "Filter" gegeben( natürlich ohne")
Dann habe ich versucht den Code "Beim Klicken" einzufügen.
Du ahnst es, die DB muß erst entsperrt werden.

Dann als Modul wieder über den Ausdruckgenerator
Eintrag: = FelderSperren («bSPKZ»)
Ergebnis: Das Objekt enthält nicht den Automatisierungobjekt «bSPKZ» (GRGRGRGR)

Dein Modul sieht so aus:
Option Compare Database
Option Explicit

Function FelderSperren(bSPKZ As Boolean)
Dim ctl
For Each ctl In Me.Controls
If ctl.ControlType = acTextBox Then ' gilt nur für Textfelder, bei Bedarf erweitern
If ctl.Tag = "Filter" Then
ctl.Enabled = Not bSPKZ
ctl.Locked = bSPKZ
End If
End If
Next ctl
End Function

Geschaltet haben wollte ich es über eine Umschaltfläche.

Das Ergebnis kennst Du ja.

Na gut denke ich mir dann ändere ich eben den Code für das entsperren.
Das hat auch nicht funktioniert.

Mit einem Kontrollkästchen hat es funktioniert (aber nur wenn die DB offen ist). Dort kann ich die Datenfelder an und Aus schalten.

Bevor ich Dir noch länger zur Last Falle.
Kannst Du mir eine Lektüre empfehlen damit ich VB lernen und wie man eine ECHTE Relationale DB aufbauen kann.
Aber bitte für Anfänger.

Danke für Dein Verständnis

Mit freundlichen Grüßen
Henry

SWR
13.07.2006, 20:51
Die Frage von mir wäre, ob es sich um datenschutzrechtlich sensible Daten in Deiner Datenbank handelt (scheint ja öffentlicher Dienst zu sein . . .). Wenn nicht, biete ich Dir an, mir die DB mal zuzumailen. Wenn ja, kannst Du die DB auch datenmäßig "entrümpeln" (Kopie machen, Zeilen löschen) - bis auf 2-3 Testdatensätze in jeder Tabelle - und mir die DB dann ebenfalls mailen (Adresse siehe mein Profil). Ich habe das Gefühl, daß das Ganze beim jetzigen Stand der Dinge mehr als verzettelt ist (Anne kämpft ja schon bis zum Umfallen) - und bis Du mit irgendwelcher VBA-Lektüre durch bist (welche noch nicht mal so etwas konkret ansprechen würde, ist's mindestens Weihnachten 2007, was Dich dennoch nicht abhalten soll, zu lesen und zu "experimentieren"). Die Sichtweise auf diese Dinge ensteht im Laufe der Zeit mehr oder weniger von alleine - wenn man da täglich drinne steckt und täglich Nüsse knacken muß. Und wer steckt da schon täglich mittendrin, wenn er eigentlich einen ganz anderen (Alltags-) Job hat. Ich mache über Jahre Access- / und allgemein datenbank-orientierte Seminare für die Mitarbeiter einer Stadtverwaltung (meine alte Heimat, hessische Großstadt, hat Bankentürme und liegt an einem bekannten Fluß . . . ;) ) - da war halt auch immer das Dilemma der Wissensschulung einerseits, andererseits ist man Verwaltungsbeamter und kein Entwickler - und plötzlich steht man schneller dazwischen, als einem lieb ist.

Also das Angebot steht, sonst läuft der "SendKeys" Thread (hat damit schon lange nichts mehr zu tun) noch ewig. Und das Ganze hat sich wirklich nur unglücklich verzettelt . . .

Überleg's Dir - würde das Ergebnis dann hier kurz posten, um die Sache "öffentlich" abzuschließen für die, die es interessiert und Dir die fertige Lösung als DB zurückmailen.

Gruß
Stephan

akki
14.07.2006, 05:47
Hallo Stephan,
Vielen Dank für Dein Angebot. Ich werde es dankbar annehmen.

Da die DB noch nicht so groß ist habe ich erstmal alles entrümpelt.
Aber ich warne Dich die DB entspricht NICHT den DB Richtlinien.
Ich habe alles in eine Tabelle gepackt.
Es mußte schnell aus dem Boden gestampft werden.
Wenn nochmal sowas kommt, dann muß ich mir mehr Zeit nehmen.
Mir geht es noch um 2 Dinge
1. Ein Login mit Benutzerverwaltung (Das werde ich noch finden und einbauen)
2. Öffnen des DS zum ändern mit gleichzeitigem speichern wer den DS geändert hat.

Mit freundlichen Grüßen
Henry

PS: In meiner Arbeitsheimat finden Springreiten statt.

SWR
15.07.2006, 12:55
Abgesehen von so einigen "unrunden" Ereignis-Prozeduren (wo die eine nicht so recht wußte, was die andere macht . . . = schlechtes Zusammenspiel von Ereignissen, was ich oben schon als "Verzettelung" mutmaßte), war ein Knackpunkt wohl das erneute Sperren, nachdem man zur Bearbeitung eines Datensatzes die Sperre per Button aufgehoben hatte. Na ja, das jetzt alles im Detail zu erwähnen, ist wohl nicht nötig.

Aus irgendeinem Grund kann ich die DB nicht hochladen, habe sie Dir per Mail geschickt.

Das heißt aber nun nicht, daß die DB fertig ist, bei Weitem nicht! - da gäbe es noch ordentlich zu tun.

Gruß
Stephan