Hallo,
ich versuche per Script aus einer Ansicht einen Wert auszulesen und diesen dann in eine neu geöffnette Ansicht einzutragen.
Option Explicit
Const sView = "Maschinen" '
Dim oProject : Set oProject = cRM.CurrentProject
Dim oView : Set oView = oProject.ActiveViews.ActiveView
Dim oRecordSet : Set oRecordSet = oView.CurrentRecordSet
Dim oRecord : Set oRecord = oRecordSet.CurrentRecord
Dim sValue
sValue = oRecord.GetContentsByName("CustomerNo")
MsgBox "Es wurde folgender Datensatz ausgewählt / The following record was selected:" & vbCrLf & _
"Name: " & sValue & ", "
If oProject.ActiveViews.ItemByName("Maschinen") Is Nothing Then
oProject.OpenNewViewByName("Maschinen")
Else
oProject.OpenActiveViewByName("Maschinen").Activate
End If
MsgBox "Aktive Ansicht / Active view: " & cRM.CurrentProject.ActiveViews.ActiveView.Name, vbInformation, cRM.AppTitle
cRM.CurrentProject.ActiveViews.ActiveView.StartEditNew
Set oActiveViews = oProject.ActiveViews
Set oActiveView = oActiveViews.ActiveView
Set oRecordSet = oActiveView.CurrentRecordSet
Set oRecord = oRecordSet.CurrentRecord
oRecord.SetContentsByName "Lfnr", sValue
Set oRecord = Nothing
Set oRecordSet = Nothing
Set oProject = Nothing
DIe neue Ansicht wird zur Eingabe eines neuen Datensatzes geöffnet, aber der Wert für die Kdnr wird nicht in das entsprechende Feld eingetragen.
Wer kann mir helfen ?
für ein schnelles Erfolgserlebnis ersetzen Sie oRecord.SetContentsByName durch oActiveView.CurrentInputForm(2).SetContentsByName. Das RecordSet und das Record Objekt brauchen Sie nicht.
Hintergrund: Die Ansicht befindet sich im Bearbeiten-Modus eines gerade neu anzulegenden Datensatzes. Er wurde aber noch nie gespeichert. Daher ist ein Zugriff per CurrentRecord wirkungslos, da hierüber auf tatsächlich in der Datenbank vorhandene Datensätze zugriffen wird (nämlich den „aktuellen“, auf den man sich im übergeordneten RecordSet per Move… Methoden positioniert hat). CurrentInputForm hingegen erlaubt den direkten Zugriff auf die Elemente der Eingabemaske. (siehe SDK Doku)
Fertig.
Wenn ich mir noch einen Tipp erlauben darf, damit das Script noch ein wenig „robuster“ wird und Sie lange Freude daran haben, dann würde ich mir direkt ganz am Anfang die Maschinen-Ansicht als Objekt besorgen und dann durchgängig mit diesem Objekt später weiterarbeiten. Gleiches für die ausgehende Ansicht. „ActiveView“ mitten in einem Script kann eventuell etwas heikel sein (Ihre Test-MsgBox zeigt mir, dass Sie hier auch schon ein wenig experimentieren mussten ), man weiß z.B. nie, ob der (ungeduldige) Anwender mal mittenrein auf eine andere Ansicht klickt oder ähnliches, und dann würde das Script plötzlich mit ebendieser Ansicht (und dem dort dargestellten Datensatz!) weiterarbeiten, was vielleicht schlimme Auswirkungen haben könnte.
Ich habe mir daher erlaubt, Ihren Code hinsichtlich der Objekte ein wenig „umzustellen“.
Option Explicit
Dim oProject : Set oProject = cRM.CurrentProject
Dim oKundenRecordSet : Set cRM.CurrentProject.ActiveViews.ActiveView.CurrentRecordSet
Dim oKundenRecord : Set oKundenRecordSet.CurrentRecord
Dim sValue
sValue = oKundenRecord.GetContentsByName("CustomerNo")
MsgBox "Es wurde folgender Datensatz ausgewählt / The following record was selected:" & vbCrLf & _
"Name: " & sValue & ", "
Dim oMaschinenView : Set oMaschinenView = oProject.ActiveViews.ItemByName("Maschinen")
If oMaschinenView Is Nothing Then
oMaschinenView = oProject.OpenNewViewByName("Maschinen")
Else
oMaschinenView.Activate
End If
If oMaschinenView Is Nothing Then
' TODO Fehler - die Ansicht kann nicht geöffnet werden! (Fehlende Benutzerrechte?)
ElseIf oMaschinenView.StartEditNew Then
Dim oMaschinenInputForm : Set oMaschinenInputForm = oMaschinenView.CurrentInputForm(2)
oMaschinenInputForm.SetContentsValueByName "Lfnr", oKundenRecord.GetContentsValueByName("CustomerNo") 'SetContentsValueByName ist besser geeignet, weil die Werte dann unabhg. von der je Client etwaig unterschiedlichen Länderformatierung bei DatumZeit/Zahlen bleiben
Set oMaschinenInputForm = Nothing
Else
' TODO Fehler bei Datensatz Neuanlage! (Fehlende Benutzerrechte?)
End If
Set oKundenRecord = Nothing
Set oKundenRecordSet = Nothing
Set oMaschinenView = Nothing
Set oProject = Nothing
Disclaimer: ich hab das Script nicht ausgeführt, evtl. hat sich noch beim „Hinschludern“ ein Syntaxfehlerchen eingeschlichen, hier bitte ich schon einmal vorsorglich um Entschuldigung - ich denke aber die Intention des Codes wird klar.