der Aufruf im "onLoad" des Entitäsformulars eig. ist ganz simple:
if (crmForm.all.new_issaved.value == null)
{
crmForm.Save();
}
Hat man im Formular Pflichtfelder definiert kriegt man ein Problem, da er diese Felder beim Speichern im onLoad anmeckern würde. Ich habe die Pflichtfelder als "Eingabe empfohlen" gekennzeichnet, so erscheint zumindest anstelle des roten Sternchens. Die logische Prüfung erfolgt, ebenso wie die Prüfung auf das Kennzeichen "issaved", sowie die Befüllung der Link-Feldes mit der ObjectId im "onSave". In meinem Fall ist das betreff Feld ein Pflichtfeld:
if (crmForm.all.new_issaved.value == null)
{
//null beim ersten aufruf, false beim ersten pseudo save, true beim korrekten save
crmForm.all.new_issaved.value = false;
}
else
{
if (crmForm.all.new_betreff.value == "")
{
alert("Betreff muss gefüllt sein!");
event.returnValue = false;
}
else
{
crmForm.all.new_issaved.value = true;
crmForm.all.new_link.value = "Link zum Kunden";
}
}
Erklärung: Setzt man den Html-Tag direkt in der Workflow-E-Mail funktioniert es leider nicht. Erst wenn der komplette Html-String im new_link Feld gespeichert wird ist der Link in der E-Mail auch wirklich anklickbar. der Backslash vor der Hochkommas dient der korrekten Html schreibweise und wird von Javascript ignoriert.
Von Hinten durch die Brust ins Auge, da muss man erstmal draufkommen ;-)
Dort widerum steht: "Die globalen Vorlageninformationen sind veraltet. Generieren Sie die Vorlagen erneut, indem Sie "VSTA.exe /installvstemplates" ausführen oder die Anwendung erneut installieren. Hinweis: Für die Korrekturmaßnahme sind Administratorrechte erforderlich."
vermeindliche Lösung (lt.Microsoft):
CMD öffnen
cd "C:\Programme\microsoft visual studio 9.0\common7\ide\"
VSTA.exe /installvstemplates
devenv.exe /installvstemplates
wenn das nichts hilft:
vsta.exe /hostid SSIS_ScriptTask
vsta.exe /hostid SSIS_ScriptComponent
aberauch das hat bei mir nichts gebracht.
Nach einer Neuinstallation des SP1 bekam ich wenigstens einen vernünftige "FilenotFoundexception" während des Debuggens des SSIS Pakets.
nach der Aufnahme der DLL in den GAC funktionierte es dann!
Code-Snippet des Inserts:
Using db As New Entities
Dim errE As New errorlog
errE.benutzer = usrBenutzer.Login
errE.domain = usrBenutzer.Domain
errE.computer = usrBenutzer.Computer
errE.datum = Now
errE.fehlertext = err.Message
errE.quelle = err.Source
errE.stacktrace= err.StackTrace
db.AddToerrorlog(errE)
db.SaveChanges()
End Using
Nachtrag: abgesehen davon, dass die Sache an sich ein absolutes Unding ist gibt es eine vermutlich bessere Lösung, ohne das autom. generierte EntityModel (evtl jedesmal) anzupassen.
Im View den Feldern die Funktion NULLIF voranstellen, damit anstelle Leerstrings ein NULL übergeben wird, was anscheinend dieses Mysterium verursacht. (Vorsicht ISNULL verursacht natürlich genau das Gegenteil!)
http://stackoverflow.com/questions/1013333/entity-framework-and-sql-server-view-question ; Public Function Clone(Of t As EntityObject)(entity As t, ctx As oraEntities, Optional copyKeys As Boolean = True) As t Try Dim cloneE As t = ctx.CreateObject(Of t)() Dim pis As PropertyInfo() = entity.GetType.GetProperties() For Each pi As PropertyInfo In pis Dim attrs As EdmScalarPropertyAttribute() = DirectCast(pi.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) For Each attr As EdmScalarPropertyAttribute In attrs If Not copyKeys AndAlso attr.EntityKeyProperty Then Continue For End If 'Strung und NULL abfangen, wird trotz Standardwert im SQL Server nicht imgesetzt Dim objVal As Object If pi.PropertyType = GetType(String) And pi.GetValue(entity, Nothing) Is Nothing Then objVal = "" Else objVal = pi.GetValue(entity, Nothing) End If pi.SetValue(cloneE, objVal, Nothing) Next Next Return cloneE Catch ex As Exception Throw ex End Try End Function und zu vergleichen; Public Function Compare(Of t As EntityObject)(entityOriginal As t, entityCopy As t) As Boolean Try 'Um Änderungen einer Entität festzustellen (t.equals funktioniert aufgrund der Abhängigkeiten mit anderen Tabellen nicht) Dim pisOrig As PropertyInfo() = entityOriginal.GetType.GetProperties() For Each piOrig As PropertyInfo In pisOrig Dim attrs As EdmScalarPropertyAttribute() = DirectCast(piOrig.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) If attrs.Count > 0 Then 'Fremdschlüsseltabellen ausschliessen Dim objOrig As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing)) Dim objCopy As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing)) If Not objOrig.Equals(objCopy) Then Return False End If End If Next Return True Catch ex As Exception Throw ex End Try End Function Verknüfte Tabellen werden dabei allerdings nicht übernommen!
oder auf Englisch: New transaction is not allowed because there are other threads running in the session. Szenario: In einer Schleife werden Objekte einer Tabelle verarbeitet und nach erfolreicher verarbeitung als "verarbeitet" markiert. Dabei schlägt der context.savechanges des Enityty Frameworks fehl. der Grund ist sowohl simple als auch, zumindest für mich, anfänglich nicht ganz verständlich, da ich eben an dieser Stelle speichern möchte. Die verwendete EF Connection behält die Änderungen des Objects bei und setzt diese auf "modified", so dass ein einmaliges savechanges genügt um alle Objekte zu speichern. Das Kuriose ist, dass es EF das nicht einmal zulässt, selbst wenn man die schlechtere Performance in Kauf nehmen wollte. Schuld ist die Schleife, die Objekte zur Laufzeit aus dem Context liest und so eine Änderung nicht zulässt...
Using db as new EF_Context Dim jobs = From w In db.jobs Where Not w.verarbeitet.HasValue For Each job In jobs 'Verarbeitung If verarbeite_job(job) = true then 'abhaken job.verarbeitet = now 'db.savechanges 'SCHLÄGT FEHL!!! else 'loggen endif Next db.SaveChanges 'HIER ISSES RICHTIG End Using