VBScript Problem

Hallo, habe da ein kleineres Problem mit einem VBScript.

Dim dCurrProj, dActView, dActive, dConf, dRecordSet, dRecord, dString
	
Set openView = cRM.CurrentProject.OpenNewViewByName("Auftrag")

openView.Activate

Set dCurrProj = cRM.CurrentProject()
Set dActView = dCurrProj.ActiveViews()
Set dActive = dActView.ActiveView
Set dConf = dActive.Config
Set dRecordSet = dConf.CreateRecordSet()

dRecord = dRecordSet.MoveFirst()

dString = dRecord.GetContentsByName("id") (*hier der Fehler*)

MsgBox(dString)

Ich bekomme folgende Fehlermeldung: (und kann sie mir nicht wirklich erklären):
Objekt erforderlich: ‚True‘
\ … in Zeile blabla (wurde markiert)
dString = dRecord.GetContentsByName(„id“)

Was mache ich falsch? Habe die Objektreferenz stundenlang gewälzt und die Datentypen aller Objekte sollten stimmen. Das Feld id gibt es in der Ansicht, auf welche ich zuzugreifen versuche. Groß- und Kleinschreibung wurde auch beachtet.

Grüße
André Arnold

Hi Andre,

der Fehler liegt in dieser Zeile:

dRecord =3D dRecordSet.MoveFirst()

Der R=FCckgabewert von MoveFirst ist nicht ein Record-Objekt, sondern=20
True/False (was angibt, ob =FCberhaupt ein Datensatz vorhanden ist oder=20
nicht).

An das Record-Objekt kommt du per

dRecordSet.CurrentRecord bzw. CurrentRecordSynchronized (deutlich=20
performanter!)

Dein Code sieht also so aus:

...
bRecordsAvailable =3D dRecordSet.MoveFirst()
If bRecordsAvailable Then
	dRecord =3D dRecordSet.CurrentRecordSynchronized()
	...

Gru=DF

Alex.

–=20
CRM-Leitsatz: „Das einzige, was wirklich st=F6rt, ist der Kunde!“ :wink:

Das ist ganz einfach:

MoveFirst liefert BOOL und nicht ein Record-Objekt :slight_smile:

Pit

Hallo, habe da ein kleineres Problem mit einem VBScript.

Dim dCurrProj, dActView, dActive, dConf, dRecordSet, dRecord, dString

Set openView = cRM.CurrentProject.OpenNewViewByName(„Auftrag“)

openView.Activate

Set dCurrProj = cRM.CurrentProject()
Set dActView = dCurrProj.ActiveViews()
Set dActive = dActView.ActiveView
Set dConf = dActive.Config
Set dRecordSet = dConf.CreateRecordSet()

dRecord = dRecordSet.MoveFirst()

dString = dRecord.GetContentsByName(„id“) (hier der Fehler)

MsgBox(dString)

Ich bekomme folgende Fehlermeldung: (und kann sie mir nicht wirklich erklären):
Objekt erforderlich: ‚True‘
\ … in Zeile blabla (wurde markiert)
dString = dRecord.GetContentsByName(„id“)

Was mache ich falsch? Habe die Objektreferenz stundenlang gewälzt und die Datentypen aller Objekte sollten stimmen. Das Feld id gibt es in der Ansicht, auf welche ich zuzugreifen versuche. Groß- und Kleinschreibung wurde auch beachtet.

Grüße
André Arnold

Hallo,
da ihr mir beim letzten Problem so gut geholfen habt, hoffe ich das es diesmal wieder klappt.

Ich versuche nun einen neuen Record anzulegen, zu beschreiben und zu speichern. Folgender Code dazu:

    Set dRecordSet = cRM.CurrentProject().ViewConfigs().ItemByName("Auftrag").CreateRecordSet()
Set dRecord = dRecordSet.NewRecord()

'Werte eintragen

dRecord.SetContentsByName("LieferArt", oAngebotLieferArt) 

dRecord.SetContentsByName("LieferTermin",oAngebotLieferTermin)

dRecord.SetContentsByName("ZahlungsArt", oAngebotZahlungsArt)  
	
dRecord.SetContentsByName("Währung", oAngebotWaehrung)

'Änderungen speichern
If dRecordSet.Save() Then
	MsgBox("Datensatz gespeichert!")
Else 
	MsgBox("Datensatz nicht gespeichert!")
End If

Problem: Record wird nicht gespeichert. Wo ist mein Denkfehler???

Du musst vor dem Setzen den Datensatz mit Lock() sperren. Schau Dir mal das Beispiel zum Schreiben eines DS in der OLE Doku an.

Gruss Micha

Hallo,
da ihr mir beim letzten Problem so gut geholfen habt, hoffe ich das es diesmal wieder klappt.

Ich versuche nun einen neuen Record anzulegen, zu beschreiben und zu speichern. Folgender Code dazu:

    Set dRecordSet = cRM.CurrentProject().ViewConfigs().ItemByName("Auftrag").CreateRecordSet()

Set dRecord = dRecordSet.NewRecord()

'Werte eintragen

dRecord.SetContentsByName(„LieferArt“, oAngebotLieferArt)

dRecord.SetContentsByName(„LieferTermin“,oAngebotLieferTermin)

dRecord.SetContentsByName(„ZahlungsArt“, oAngebotZahlungsArt)

dRecord.SetContentsByName(„Währung“, oAngebotWaehrung)

'Änderungen speichern
If dRecordSet.Save() Then
MsgBox(„Datensatz gespeichert!“)
Else
MsgBox(„Datensatz nicht gespeichert!“)
End If

Problem: Record wird nicht gespeichert. Wo ist mein Denkfehler???

P.S. Ansonsten kann es auch sein, dass Du die DS ID per Script setzen muss. Welche Felder alle zum Speichern im DS gesetzt sein muss, kannst Du testen, in dem Du separat in der Ansicht einen neuen DS anlegt und dort die Werte genauso reinschreibst wie per Script, z.B. darf entv. eine zugehörige Feld in dem die Relation drinsteht nicht NULL sein. Das würdest Du dann bei einer manuellen DS Anlage direkt in der Ansicht sehen.

Gruss Micha

Hallo,
da ihr mir beim letzten Problem so gut geholfen habt, hoffe ich das es diesmal wieder klappt.

Ich versuche nun einen neuen Record anzulegen, zu beschreiben und zu speichern. Folgender Code dazu:

    Set dRecordSet = cRM.CurrentProject().ViewConfigs().ItemByName("Auftrag").CreateRecordSet()

Set dRecord = dRecordSet.NewRecord()

'Werte eintragen

dRecord.SetContentsByName(„LieferArt“, oAngebotLieferArt)

dRecord.SetContentsByName(„LieferTermin“,oAngebotLieferTermin)

dRecord.SetContentsByName(„ZahlungsArt“, oAngebotZahlungsArt)

dRecord.SetContentsByName(„Währung“, oAngebotWaehrung)

'Änderungen speichern
If dRecordSet.Save() Then
MsgBox(„Datensatz gespeichert!“)
Else
MsgBox(„Datensatz nicht gespeichert!“)
End If

Problem: Record wird nicht gespeichert. Wo ist mein Denkfehler???

Hallo und Danke für die schnelle Antwort.

Ich hatte eigentlich gedacht, dass NewRecord() im prinzip wie ein Klick auf den Menüknopf neuer Datensatz funktioniert. Bei dem wird ja auch die ID gesetzt. Sollten insolchen Fällen nicht auch richtige cRM seitige Fehlermeldungen kommen? Ich meine wenn ich den primärschlüssel nicht setze sollte das doch bemerkt werden…

P.S. Ansonsten kann es auch sein, dass Du die DS ID per Script setzen muss. Welche Felder alle zum Speichern im DS gesetzt sein muss, kannst Du testen, in dem Du separat in der Ansicht einen neuen DS anlegt und dort die Werte genauso reinschreibst wie per Script, z.B. darf entv. eine zugehörige Feld in dem die Relation drinsteht nicht NULL sein. Das würdest Du dann bei einer manuellen DS Anlage direkt in der Ansicht sehen.

Gruss Micha

Hallo,
da ihr mir beim letzten Problem so gut geholfen habt, hoffe ich das es diesmal wieder klappt.

Ich versuche nun einen neuen Record anzulegen, zu beschreiben und zu speichern. Folgender Code dazu:

    Set dRecordSet = cRM.CurrentProject().ViewConfigs().ItemByName("Auftrag").CreateRecordSet()
Set dRecord = dRecordSet.NewRecord()

'Werte eintragen

dRecord.SetContentsByName("LieferArt", oAngebotLieferArt) 

dRecord.SetContentsByName("LieferTermin",oAngebotLieferTermin)

dRecord.SetContentsByName("ZahlungsArt", oAngebotZahlungsArt)  
  
dRecord.SetContentsByName("Währung", oAngebotWaehrung)

'Änderungen speichern
If dRecordSet.Save() Then
  MsgBox("Datensatz gespeichert!")
Else 
  MsgBox("Datensatz nicht gespeichert!")
End If

Problem: Record wird nicht gespeichert. Wo ist mein Denkfehler???

Ich sollte vielleicht der Vollständigkeit halber noch hinzufügen, dass die Ansicht (bzw Datenbanktabelle) weitaus diffiziler ist als ich beschrieben hatte.
Es kommen Autonummern sowie noch einige andere Sachen dazu, die den Ablauf stören könnten. Ich wollte nur versuchen das Schema zu verdeutlichen nachdem ich vorgehe, da ich eher in der Benutzung der Objekte als in der Semantik einen Fehler vermutet hatte.

Ich habe das mal durchgecheckt, habe eine valide (noch unbenutzte) id als DatensatzID vergeben und trotzdem selbes Problem. Daraufhin habe ich bei(fast) allen Feldern nullwerte erlaubt. Selbes problem…

Hi Andre,

zum einen hat dein (Beispiel?)Code das Problem dass du RecordSET.Save=20
aufrufst. Die Save Methode geh=F6rt aber zum Record-Objekt. Dies ist=20
allerdings bestimmt nur ein Tippfehler in deinem Posting, da dir der=20
VBScript Interpreter hier eine Fehlermeldung um die Ohren hauen w=FCrde.

Zum anderen liegt die Ursache vmtl. in einem Feldinhalt, ggf. einem=20
nicht gesetzten Foreinkey oder einem falschen Datumsformat oder was=20
weiss ich.

Vorschlag: starte vor dem cRM das Debwin2.exe und guck dir dann die=20
Ausgaben an, wenn du das Script startest: da sollten welche auftauchen,=20
falls es einen SQL Fehler gab. Die bringen dich sicherlich auf die=20
richtige Spur.

Gur=DF

Alex

PS: Die Datensatz ID musst du nicht selber setzen, das macht der cRM.

–=20
CRM-Leitsatz: „Das einzige, was wirklich st=F6rt, ist der Kunde!“ :wink: