Newsgroup: it.comp.lang.delphi
Titolo: Errore su ADOQuery.Open dopo creazione Field a runtime

Ciao a tutti,
ho un'errore che sinceramente non riesco a capire da cosa dipenda.
In pratica utilizzo una sola ADOQuery che si collega a diverse tabelle
in base ad alcuni parametri quindi ho dovuto creare i vari field a
runtime. Per fare questo ho creato una funzione apposita che dovrò
modificare ulteriormente in seguito:
function TFramePreparazioneTestAccelerazione.CreaField(Nome: string;
FieldType: TFieldType; FieldSize: Integer): string;
begin
  with TStringField.Create(AdoQueryPreparazioneTest) do begin
    FieldName := Nome;
    FieldKind:= fkData;
    DataSet := AdoQueryPreparazioneTest;
    Name := Dataset.Name + FieldName;
    KeyFields:= Nome;
    DataSourcePreparazioneTest.DataSet:= AdoQueryPreparazioneTest;
    AdoQueryPreparazioneTest.FieldDefs.Add(FieldName, FieldType,
FieldSize, false);
    Result := Nome;
  end;
end;
Ho la necessità di creare un field di tipo AutoInc per poi fare la
query e infatti richiamo la funzione in questo modo:
AdoQueryPreparazioneTest.Active := false;
CreaField('IDTest',ftAutoInc,0);
AdoQueryPreparazioneTest.SQL.Clear;
AdoQueryPreparazioneTest.SQL.Add('SELECT IDTest FROM t_test WHERE Test
= ''Test Accelerazione''');
AdoQueryPreparazioneTest.Open;
Dove specifico chiaramente il tipo come ftAutoInc, ma quando viene
eseguita la Open mi da questo errore:
Type mismatch for field IDTest, expecting: string Actual: autoinc
Domanda: come è possibile che si aspetta una string se io gli passo
AutoInc????
Sbaglio qualcosa?
Grazie mille dell'aiuto

 AutoInc????
Ma di che tipo è il campo che definisci come "AutoInc" *sul database*?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)


Ho fatto in quel modo perchè quando richiamo una select particolare
devo popolare il DataField di una DBSearchComboBox. Esiste un'altro
modo per fare questo?
Il campo che definisco come AutoInc nel DB Access è un contatore.

 wrote:

Mannaggia alla miseria, mi sono perso in un bicchiere d'acqua. Bastava
inserire il nome del campo come semplice stringa in questo modo:
ComboTestModifica.DataField:= 'Nome';
Come non detto..lasciamo perdere va.
Grazie comunque per la pulce nell'orecchio.

nel tuo caso, non serve creare i campi persistenti a runtime,.
A.

 A.
si infatti non era il caso, ma potresti farmi un esempio nel caso in
cui dovesse servire? Solo per curiosità.
Grazie

 cui dovesse servire? Solo per curiosità.
A prescindere se i campi persistenti vengano creati a designtime o
runtime, ci sono 2 cose di base
che senza di loro non puoi fare:
1) Aggiungere al dataset campi calcolati. Vedi evento OnCalcFields
2) Usare gli eventi della classe TField
Ovviamente, il fatto che uno POSSA usare queste 2 cose non vuol dire
che DEBBA usare queste 2 cose....
OnCalcFields, ad esempio, viene usato da alcuni "furbi" per lanciare
query per recuperare dati da altre tabelle....
Questa gente dovrebbe essere costretta a frequentare un corso sulle
basi di sql, sopratutto per cio che riguarda le join,
e dopo costretta ad usare l' applicazione che hanno sviluppato mentre
un kapo incazzato gli sta col fiato sul collo per avere dei risultati
in tempi rapidi.....
Pax vosbiscum.
A.

 Il campo che definisco come AutoInc nel DB Access è un contatore.
Se è un "contatore" di Accesso, prova a definirlo in generale come campo 
di tipo "intero" lato Delphi (anche se, come detto sopra e nei messaggi 
precedenti, non è ben chiara l'esigenza di creare campi a runtime, a 
meno che non si debba ovviamente modificare qualche proprietà rispetto 
al default, ma questo implica che il tuo programma non sarà dinamico e 
adattabile a qualsiasi DataSet, ma farà delle eccezioni).
