AnlageFeld kopieren

Moderator: ModerationP

AnlageFeld kopieren

Beitragvon r.obert » 15. Okt 2019, 18:23

Hallo Forum,

im hier angefügten Verzeichnis
Zeichenvorrat.rar

sind eine kleine Testdatenbank und ein paar JPG-Bilder von Zeichenformen handschriftlicher Buchstaben abgelegt.

Die Datenbank öffnet zwei Formulare. Aus dem frmGKZeichenVarianten soll z. B. der Inhalt des rot markierten Feldes "VarBild" (= nur 1 Anlage: das Zeichen "B") in das entsprechende Feld "VarBild" eines Datensatzes des anderen Formulars Befunde bzw. GK kopiert werden.

Im Modul "Anlagen" hab ich die Routine "ZeichenÜbenehmenInGK" hingeschrieben, wie ich mir denke, dass es funktionieren sollte. Aber oops - es passiert überhaupt nichts.

Ich hab keine Ahnung, wie ich's sonst schreiben soll. Wie macht man das? Gibt es vielleicht ein Beispiel, an dem ich mich orientieren könnte? Oder vielleicht ist es ja auch nur eine kleine Änderung meines Codes?

Wäre super, wenn mir jemand helfen könnte. Anderenfalls bin ich ziemlich aufgeschmissen :roll:

Vielen Dank im voraus!!!
Gruß,
r.obert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
r.obert
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29
Registriert: 24. Mär 2016, 15:51

Re: AnlageFeld kopieren

Beitragvon Bitsqueezer » 16. Okt 2019, 09:44

Hallo,

wenn Du Code schreibst und nicht weißt, was er macht, dann solltest Du einfach mal das Lokal-Fenster in VBA öffnen und schauen, was in den Variablen drinsteht.

Du hast alle view rcs-Variablen als Recordset deklariert - korrekt.

Du öffnest ein Recordset mit einer Zeile aus dem aktuellen Formulareintrag - soweit korrekt, wenn hier auch fehlt, daß Du nicht vorher prüfst, ob das Formular überhaupt geöffnet ist und der Datensatzzeiger auch auf einem Eintrag steht und nicht z.B. auf einer neuen Zeile oder das Recordset gar keinen Inhalt hat. Fehleranfällig.

Dann kommt diese Zeile, die den Leser erst mal überraschen müßte:
Code: Alles auswählen
Set rcsGKVar = rcsGKBef.Fields("VarBild").Value


Bei jedem anderen Feldtyp müßte die Zeile zu einer Fehlermeldung führen, man kann nicht einem Recordset-Objekt den Wert eines Feldes zuweisen. Funktioniert aber hier, weil es ein Anlagenfeld ist. Da Du aber den Code vermutlich irgendwo übernommen hast, ohne ihn zu verstehen, kommst Du zu dem Schluß, Du könntest das einfach einem anderen Feld wieder zuweisen und das Anlagenfeld wird kopiert - falsch.

Der Code funktioniert deswegen, weil hinter dem Anlagenfeld ein eigenes Recordset steht, das aus mehreren Feldern besteht. In rcsGKVar steht also im Anschluß kein einzelner Wert, sondern ein ganzes Recordset, das aus 6 Feldern besteht (siehe Lokalfenster):
FileFlags
FileName
FileTimeStamp
FileType
FileURL
FileData

Hinter "FileData" steht das eigentliche Bild, das als Variant-Byte-Array zurückgegeben wird (verrät einem alles das Lokalfenster).

Du öffnest jetzt das andere Recordset mit einem anderen Anlagenfeld und versuchst, den Wert des ersten Anlagefeldes diesem zuzuweisen:
Code: Alles auswählen
rcsGKBef.Fields("VarBild").Value = rcsZei.Fields("VarBild").Value


Wie Du aber hier gesehen hast, ist der Rückgabewert ein Recordset. In "rcsGKBef" steht das Recordset der Zeile aus dem anderen Formular, und in dem genannten Field steht kein Recordset, weil hier noch nie ein Bild eingefügt wurde. Du versuchst den Objektzeiger des anderen Recordsets nun dem neuen Recordset zuzuweisen - das kann natürlich nicht gehen (zumal mindestens "Set" benötigt werden würde für Objekte). Du müßtest also erst einen neuen Eintrag in das Recordset schreiben (AddNew), um dann die einzelnen Feldwerte der 6 Felder an die des anderen Recordsets zu übertragen - von denen sind allerdings nicht alle beschreibbar.

Wenn Du Dir Deine eigene Abfrage "aGK" anschaust, siehst Du 3 dieser Felder, "FileData", "FileName" und "FileType", die dort als Unterfelder des Anlagefelds angezeigt werden. Es genügt, FileData und FileName zu beschreiben.

Im Ergebnis lautet der Code zum Kopieren dann so:

Code: Alles auswählen
    rcsGKBef.Edit
        With rcsGKVar
            .AddNew
            .Fields("FileData").Value = rcsVar.Fields("FileData").Value
            .Fields("FileName").Value = rcsVar.Fields("FileName").Value
            .Update
        End With
    rcsGKBef.Update


Weitere Punkte zu Deiner DB:
  • Keine Sonderzeichen in Objektnamen verwenden, ":" ist keine gute Wahl. Das einzig erlaubte ist "_", ansonsten mußt Du ständig eckicge Klammern verwenden. Umlaute sollte man sich auch klemmen, am besten alle Objektnamen immer englisch definieren, ein Prefix für den Objekttyp ist immer sinnvoll.
  • Der Datentyp "Anlage" existiert nur in Access. Es ist zu empfehlen, stattdessen ein einfaches Linkfeld zu verwenden, das auf einen Ordner/Dateinamen verweist, in dem die Anlagedatei enthalten ist. Das hält die Datenbank klein und man muß keine wilden Operationen mit von Access versteckten internen Tabellen durchführen.
  • Deine Sys-Tabelle vereint Daten unterschiedlichster Art, die nicht zusammen in eine Tabelle gehören. Es sollte eine Tabelle für das Projekt, eine für Kundendaten und eine für die Systemeinstellungen existieren und entsprechend mit IDs verlinkt sein.
  • Wenn es schon unbedingt ein Anlagenfeld sein muß, sollte eine eigene Anlagen-Tabelle existieren, auf deren ID die anderen Tabellen verweisen. Dann kannst Du einfach die ID zwischen beiden Tabellen austauschen und mußt keine Kopien der gleichen Anlage vorhalten, was die Datenbank nur weiter aufbläht.
  • Wenn Du am Ende Deines Codes schon aufräumst, indem Du die Objektvariablen auf Nothing setzt, sollte davor das Recordset auch mit Close geschlossen werden. Ansonsten muß Access das selbst machen, was die Garbage-Collection nur bremst, dann kann man sich auch das Nothing sparen.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7210
Registriert: 21. Jun 2007, 12:17

Re: AnlageFeld kopieren

Beitragvon r.obert » 16. Okt 2019, 17:37

Boah, Christian!

meingott, das ist supernett, dass Du Dir diese Mühe gemacht hast, das Problem derart ausführlich zu beschreiben. Ich danke Dir!

Ich werde am Wochenende mal drangehen und zumzusetzen versuchen, was Du vorschlägst. Zu den "Stilfehlern" und den Rationalisierungsfehlern, die Du erwähnst, bleibt mir nur zuzugeben, dass ich eigentlich blutiger Anfänger bin, was Access anbelangt. Die oben angefügte Datenbank ist allerdings auch nicht für kommerzielle Zwecke gedacht, so dass ich mir erlauben kann, auf Feinheiten zu verzichten, die ansonsten unverzeihlich wären. Im nächsten Leben mache ich dann mal einen Anfängerkurs für Programmierer. :P

Ganz herzlichen Dank!
Gruß,
r.obert
r.obert
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 29
Registriert: 24. Mär 2016, 15:51

Re: AnlageFeld kopieren

Beitragvon Bitsqueezer » 16. Okt 2019, 21:41

Hallo,

immer gern.

Aber der Code oben funktioniert natürlich nur, wenn es nicht bereits ein Anlagenfeld gibt, ansonsten mußt Du das noch anpassen, wenn Du eine vorhandene Anlage überschreiben willst. Ansonsten fügst Du noch eine Anlage dazu, jedesmal.

Wie wär's mit diesem Leben? Einfach mal ein Buch dazu lesen hilft schon enorm.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7210
Registriert: 21. Jun 2007, 12:17


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste