![]() |
Fehler: "Ungültiger Varianttyp" - nur unter Window
Beim Nutzen der Procedure PasteCurrent() (nach vorherigem Aufruf von CopyCurrent)
kommt unter Windows 2000 die Fehlermeldung "Ungültiger Varianttyp", unter Windows XP funktioniert die Funktion... Was ist falsch :gruebel:
Delphi-Quellcode:
var
aField : Variant; Feldzahl : Integer; implementation procedure CopyCurrent(); var z : Integer; begin DM.T_PC_copy_.Edit; Feldzahl := DM.T_PC_copy_.FieldCount; aField:= VarArrayCreate([0,Feldzahl-1],VarVariant); for z:=0 to (Feldzahl-1) do aField[z]:=DM.T_PC_copy_.fields[z].Value; end; procedure PasteCurrent(); var z : Integer; begin DM.T_PC_deleted_.Append; for z:=0 to (Feldzahl-1) do begin // Feldinhalte einfügen // DM.T_PC_deleted_.fields[z].Value:=aField[z]; end; DM.T_PC_deleted_.Post; end; |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Und wir sollen uns jetzt zusammenreimen was DM, T_PC_copy_, usw alles für Datentypen sind.
Bitte etwas mehr infos was die Funktion machen soll, was die (globalen) Variablen bedeuten usw. :warn: |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
:oops:
Also: DM ist das Datenmodul... DM.T_PC_Copy soll die Datenbank sein, von der ein Datensatz kopiert werden soll CopyCurrent() soll den Feldinhalt des aktuellen Datensatzes der Quelle in das VarArray kopieren, mit PasteCurrent() soll das ganze dann in die Tabelle PC_deleted (Als Sicherungskopie nach dem Löschen) Gruß Uwe |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Deine Funktionen sind leider nicht generell einsetzbar, was auch das Testen erschwert bzw. unmöglich macht.
Das Dataset sollte auf jeden Fall als Parameter übergeben werden. |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Hallo shmia,
habs nun so:
Delphi-Quellcode:
Aufruf mit:
procedure PasteCurrent(DS: TDataset);
var z : Integer; begin DS.Append; for z:=0 to (Feldzahl-1) do begin DS.fields[z].Value:=aField[z]; end; DS.Post; end;
Delphi-Quellcode:
Gleiches Ergebnis: unter w2k der genannte Fehler, unter wxp kein Problem...try PasteCurrent(DM.T_PC_deleted_); except on E:Exception do begin E.Message:='Kopierfehler (paste)...'+#13#10+E.Message; Raise; end; end; Edit1: Hab das ganze mal in ein Testprojekt ausgelagert und komplett identische Tabellen genommen -> Ergebnis bleibt :wall: P.S. mySQL5 - Zugriff über myDAC Gruß Uwe |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Zitat:
Ich würde nun die Anzahl der Felder und besonders die Anzahl der Feldtypen reduzieren, um das Problemfeld aufzuspüren. Ich würde die Funktion noch so optimieren:
Delphi-Quellcode:
procedure PasteCurrent(DS: TDataset);
var z : Integer; begin DS.Append; for z:=0 to VarArrayHighBound(aField, 1)-1 do begin // folgene Case-Anweisung soll beim Debuggen helfen case z of 8, 10, 11: ; // diese Felder werden nicht kopiert; sie bleiben NULL else DS.fields[z].Value:=aField[z]; end; end; DS.Post; end; |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Hallo Shmia,
das Problem tritt immer auf, wenn es sich um den Datentyp Char(..) oder VarChar(..) handelt und das Feld nicht leer ist ... :gruebel: Was tun? Gruß Uwe |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
Zitat:
Der Varianttyp varString (= $0100) ist ja nur innerhalb von Delphi zulässig. Ausserhalb von Delphi, also müssen alle Strings innerhalb eines Variants den Typ varOleStr (= $0008) haben. Das ist der kleine Unterschied zwischen Variant und OleVariant. Versuch mal das:
Delphi-Quellcode:
procedure PasteCurrent(DS: TDataset);
var z : Integer; begin DS.Append; for z:=0 to VarArrayHighBound(aField, 1)-1 do begin case DS.fields[z].DataType of ftString, ftFixedChar, ftWideString: DS.fields[z].AsString := aField[z]; else DS.fields[z].Value:=aField[z]; end; DS.Post; end; |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
:) Hallo Shmia,
habe die Procedur leicht abgewandelt... so funktioniert es jetzt auch unter Windows 2000. bei:
Delphi-Quellcode:
hat er das letzte Feld vergessen
for z:=0 to VarArrayHighBound(aField,1)-1
einmal "end" hat gefehlt... Nochmals vielen Dank und liebe Grüße Uwe
Delphi-Quellcode:
procedure PasteCurrent(DS: TDataset);
var z : Integer; begin DS.Append; for z:=0 to VarArrayHighBound(aField,1) do begin case DS.fields[z].DataType of ftString, ftFixedChar, ftWideString: DS.fields[z].AsString := aField[z]; else DS.fields[z].Value:=aField[z]; end; end; DS.Post; end; |
Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
:gruebel: Das wars doch noch nicht ganz...
Wenn in einem String-Feld noch nie was drin stand (NULL), dann kommt "Variante des Typs (NULL) konnte nicht in Typ (String) konvertiert werden."
Delphi-Quellcode:
Was mach ich hier denn wieder falsch? :oops:
procedure PasteCurrent(DS: TDataset);
var z : Integer; begin DS.Append; for z:=0 to VarArrayHighBound(aField,1) do begin case DS.Fields[z].DataType of ftString, ftFixedChar, ftWideString: if DS.Fields[z].Value=NULL then DS.Fields[z].Value:='' <-- dann alle Stringfelder leer ! DS.Fields[z].AsString := aField[z]; else // kein Stringfeld DS.Fields[z].Value:=aField[z]; end; //case end; // Schleife DS.Post; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz