Invalid Type Variant Conversion

di il
6 risposte

Invalid Type Variant Conversion

Buonasera al Forum,
nuovo del forum, programmatore 'molto' dilettante, ambiente delphi ( attualmente il 5).

Posto questo spezzone di codice che mi restituisce un errore e che non so come risolvere:
In pratica passo un intera riga da una tabella access ad un'altra e, poichè le due tabelle potrebbero avere campi differenti, procedo leggendo il nome del campo sorgente che confronto con quello trovato in destinazione e se sono uguali scrivo il valore del campo all'interno.

Tutto funziona bene finché si tratta di campi di testo; appena incontro il campo "numerico" ecco che mi rilascia un errore riportato in oggetto e subito dopo il codice. Chiaramente io non posso sapere a priori se il campo sarà numerico o di testo o altro.

C'è un modo per ovviare a ciò?
Grazie infinite anche solo per aver letto.
Aviohax

   for x:=0 to campitot do
     begin
       campo:= Db2.Qitrav1.Fields[x].DisplayLabel;
          if campo=searchitem then
            begin
                showmessage('campo: '+campo+' - '+' searchitem: '+searchitem);
                Db2.Qitrav1.Fields[x].Value := Db2.Qvkeep.Fields[x].Value;
                break;
            end;
           next;
     end;
ERRORE:
---------------
'Invalid Type Variant Conversion'

6 Risposte

  • Re: Invalid Type Variant Conversion

    Vediamo se ho capito bene:
    Tu hai 2 tabelle e devi copiare la tabella1 nella tabella2, ma non conosci a priori se i campi destinazione (tabella2) hanno stesso nome e tipo dei campi presenti nella tabella sorgente (Tabella1).
    Secondo me non ti basta cercare se il nome del campo esiste nella tabella destinazione, ma devi cercare anche il tipo (intero, stringa, numerico ecc..ecc), il giochino diventa un po' più complicato, ma non impossibile devi solo trovare il tipo di conversione adatta dal campo sorgente al campo destinazione, qualcosa del tipo:
    
      for x := 0 to Tabella1.FieldCount - 1 do  // per tutti i campi della tabella sorgente
      begin
        oField := Tabella1.Fields[x]; // solo per appoggio
        oFieldDest := Tabella2.FindField(oField.FieldName);
        if Assigned(oFieldDest) then  // trovato il field in destinazine
        begin
          case oFieldDest.DataType of  // vediamo il tipo del campo destinazione
              ftInteger, ftAutoInc, ftSmallint, ftShortint,ftLargeint, ftBytes:
              begin
                // devo testare se sono uguali altrimenti converto
                if oField.DataType in [ftInteger, ftAutoInc, ftSmallint, ftShortint,ftLargeint, ftBytes] then
                  oFieldDest.AsInteger := oField.AsInteger
                else if oField.DataType in [ftString, ftWideString, ftMemo, ftWideMemo] then
                  // attenzione possibile perdita di informazioni prendere provvedimenti
                  oFieldDest.AsInteger := StrToIntDef(oField.AsString, 0)
                else if oField.DataType in [ftSingle, ftFloat, ftCurrency, ftFMTBcd] then
                  // attenzione possibile perdita di informazioni prendere provvedimenti            
                  oFieldDest.AsInteger := Round(oField.AsFloat)
                else
                begin
                  // Campo sorgente non copiabile in destinazione
                  oFieldDest.AsInteger := 0;
                end;
              end;
            // qui devo testare nel caso in cui il campo detinazione sia stringa o numerico ect ect ect  
        end;
      end;
    
    NB: Codice scritto al volo e non testato.

    Ovviamente se la tabella sorgente contiene pochi record e/o la conversione deve essere fatta solo una volta
    allora questo giochino si può fare ma se i record diventano "importanti" e la conversione avviene molto di frequente sarebbe
    opportuno pensare a qualcosa di diverso, come ad esempio mappare in anticipo i campi delle 2 tabelle ed avere già pronta la
    funzione di conversione

    Un Saluto
  • Re: Invalid Type Variant Conversion

    Wolfen, grazie mille per la dritta.
    In realtà le due tabelle al momento sono povere di dati ma cmq i campi ne sono più di 170 e forse, come suggerisci, dovrò pensare ad un'alternativa.
    Buona domenica
  • Re: Invalid Type Variant Conversion

    [quote="Wolfen"]
    oField := Tabella1.Fields[x]; // solo per appoggio
    oFieldDest := Tabella2.FindField(oField.FieldName);
    [/code]

    Wolfen, adesso faccio una domanda stupida , ma oField e oFieldDest dove e come vanno dichiarati?
    Dovrebbero essere dichiarati com TField?
    Grazie
  • Re: Invalid Type Variant Conversion

    Si scusa, ho omesso le dichiarazioni delle variabili ... sorry
  • Re: Invalid Type Variant Conversion

    [quote="Wolfen"]Si scusa, ho omesso le dichiarazioni delle variabili ... sorry[/quote

    Succede...
    Solo che non me la riconosce... di sicuro sbaglio a dichiararla.
    Ho aggiunto oField : TField in var
    E' questo l'errore? Ho cercato anche nei manuali di delphi ma senza esito

    Grazie
  • Re: Invalid Type Variant Conversion

    Devi includere nella sezione Uses dell'implementation la unit di dichiarazione della classe TField, in Delphi5 se non ricordo male dovrebbe chiamarsi "db" o "data.db"
Devi accedere o registrarti per scrivere nel forum
6 risposte