Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler: "Ungültiger Varianttyp" - nur unter Windows 2000 (https://www.delphipraxis.net/88752-fehler-ungueltiger-varianttyp-nur-unter-windows-2000-a.html)

uwi1961 20. Mär 2007 14:21


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;

Bernhard Geyer 20. Mär 2007 14:25

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:

uwi1961 20. Mär 2007 14:30

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

shmia 20. Mär 2007 14:59

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.

uwi1961 20. Mär 2007 15:18

Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
 
Hallo shmia,

habs nun so:

Delphi-Quellcode:
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;
Aufruf mit:
Delphi-Quellcode:
     
        try
        PasteCurrent(DM.T_PC_deleted_);
      except
        on E:Exception do
        begin
          E.Message:='Kopierfehler (paste)...'+#13#10+E.Message;
          Raise;
        end;
      end;
Gleiches Ergebnis: unter w2k der genannte Fehler, unter wxp kein Problem...

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

shmia 20. Mär 2007 15:57

Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
 
Zitat:

Zitat von uwi1961
Gleiches Ergebnis: unter w2k der genannte Fehler, unter wxp kein Problem...

Edit1: Hab das ganze mal in ein Testprojekt ausgelagert und komplett identische Tabellen genommen -> Ergebnis bleibt :wall:
P.S. mySQL5 - Zugriff über myDAC

Ein Testprojekt ist schon mal ein gute Idee.
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;

uwi1961 20. Mär 2007 16:04

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

shmia 20. Mär 2007 16:31

Re: Fehler: "Ungültiger Varianttyp" - nur unter Wi
 
Zitat:

Zitat von uwi1961
das Problem tritt immer auf, wenn es sich um den Datentyp Char(..) oder VarChar(..) handelt und das Feld nicht leer ist ...

AHA, das ist doch schon mal was.
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;

uwi1961 20. Mär 2007 19:07

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:
for z:=0 to VarArrayHighBound(aField,1)-1
hat er das letzte Feld vergessen
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;

uwi1961 21. Mär 2007 08:35

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:
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;
Was mach ich hier denn wieder falsch? :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.
Seite 1 von 2  1 2      

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