Newsgroup: it.comp.lang.delphi
Titolo: [D6] cambiare tipo a TField

Ho creato una vista in MSSQL. Questa vista in realtà è una union di altre
tre viste già memorizzate nel database, ordinate per [data registrazione].
Fin qui niente di strano.
Trattandosi di ordinamento per [data registrazione], il primo record
potrebbe appartenere ad una qualsiasi delle suddette viste. Inizialmente la
vista unione aveva appunto un problema, in quanto per uno campo specifico,
in relazione al primo record estratto che, in relazione alla vista
sottostante di appartenenza, poteva venirmi restituito NULL o stringa.
Senza accorgermi del problema, ho utilizzato un TADOQuery per effettuare la
selezione:
"select *
from dbo.vw_rmov_movimenti
where rmovt_dt_registrazione >= :pDtRegistrazioneDal
and rmovt_dt_registrazione <= :pDtRegistrazioneAl
order by rmovt_dt_registrazione"
successivamente ho creato i relativi TField persistenti, e tutto ok.
Mi sono però accorto che uno di questi TField è stato autogenerato come 
TIntegerField invece di TStringField.
Il problema stava in effetti in una delle tre viste sottostanti. Risolto il 
problema, corretta la vista principale, elimino il TField corrispondente, ma 
lo ricrea continuamente come TIntegerField.
Ho provato a crearlo manualmente, ma quanto tento di aprire la Query, mi da 
come errore che si aspetta un TIntegerField.
Tra le varie prove, ho anche inserito un nuovo componente, ma niente, 
continua a prendermi questo campo come TIntegerField.
Non riesco a trovare un modo per far riconoscere al componente il 
cambiamento di campo.
Uniche due soluzioni che mi vengono in mente:
1. rinuncio all'uso dei TField persistenti e aprendo la query mi limito a 
sperare che venga riconosciuto il tipo giusto (ma non mi piace e devo 
riscrivere un bel pezzo di codice);
2. trasformo la vista in una Stored Procedure che riversa il contenuto delle 
tre viste in una tabella temporanea e mi restituisce una select su 
quest'ultima (che non è male, ma mi sembra un carico di lavoro inutile).
L'ideale quindi sarebbe trovare il modo di variare il tipo campo...
Ciao a tutti,
Gianluca.


[cut]
dbo.vw_rmov_movimenti è una view giusto?
mi vengono in mente 2 cose: 
1) Hai per caso modificato qualche tabella referenziata nella view
(tolto aggiunto campi)? Le view mssql hanno la brutta abitudine di non
accorgersi del cambio campi, presumo si creino una specie di
mappatura. Prova a droppare le view e a ricrearle.
2) quel select * non mi piace. Prova a fare una select esplicita.
Questo per la stessa ragione del punto 1
La situazione classica è questa 
tabella con campi A, B, C 
view : select * from tabella
modifico la tabella i A, B, D, C
La view non vede D se non facendo un alter view.
Ciao.
-- 
Ore 18.30: premo invio.

 wrote:
dimenticavo: il succo di tutto ciň č che spesso comporta un'errata
identificazione dei campi e quindi, una sorta di "type mismatch"


"Massimo Pini" ha scritto nel messaggio
[cut]
seguendo i consigli, ho apportato alcune modifiche, che alla fine mi hanno 
portato alla soluzione.
In prima battutta ho modificato le view sottostanti. Trattandosi di un 
registro che è semplicemente l'unione di piu' viste (derivanti dalle 
specifiche tabelle di carico, produzione, scarico) avevo scritto tre view 
specifiche e ne facevo l'unione in quella che poi utilizzavo da Delphi. 
Visto che comunque ogni tabella originale ha campi specifici e nessun campo 
in comune, avevo fatto, ad esempio:
"
vista1:
select
stc_dt_registrazione as rmovt_dt_registrazione,
'stc' as rmovt_origine,
stc_art_codice as rmovt_art_codice,
stc_qta as rmovt_qta,
null as rmovt_lotto_prod,
null as rmovt_formula
from dbo.tb_storico_carico ...
vista2:
select
pal_dt_registrazione as rmovt_dt_registrazione,
'pal' as rmovt_origine,
null as rmovt_art_codice,
null as rmovt_qta,
pal_lotto_prod as rmovt_lotto_prod,
pal_for_codice as rmovt_for_codice
from dbo.tb_produzione_articoli_lotti ...
"
quindi generato anche dati non necessari, in modo da creare nelle singole 
viste la struttura della vista primaria, nella quale poi facevo:
"
select * from nome_vista1
union
select * from nome_vista2
union
select * from nome_vista3
"
Ora ho fatto in modo che le singole viste riportino solo i campi delle 
rispettive tabelle, quindi non aggiungo i campi non immediatamente 
necessari, mentre nella vista principale, per ognuna delle sottostanti 
esplicito tutti i campi necessari ed eventualmente aggiungo quelli necessari 
alla "normalizzazione" per ottenere a tutti gli effetti il mio registro:
"
vista1:
select
stc_dt_registrazione, stc_art_codice, stc_qta as rmovt_qta,
from dbo.tb_storico_carico ...
vista2:
select
pal_dt_registrazione pal_lotto_prod, pal_for_codice
from dbo.tb_produzione_articoli_lotti ...
"
e nella vista unione:
"
select
stc_dt_registrazione as rmovt_dt_registrazione,
'stc' as rmovt_origine,
stc_art_codice as rmovt_art_codice,
stc_qta as rmovt_qta,
null as rmovt_lotto_prod,
null as rmovt_formula
from dbo.nome_vista1 ...
union
select
pal_dt_registrazione as rmovt_dt_registrazione,
'pal' as rmovt_origine,
null as rmovt_art_codice,
null as rmovt_qta,
pal_lotto_prod as rmovt_lotto_prod,
pal_for_codice as rmovt_for_codice
from dbo.nome_vista2
union ...
"
in seconda istanza, ho agito sulla TADOQuery.SQL immettendo l'intero elenco 
dei campi in luogo di *
Trattandosi di una selezione dinamica, ho visto che il problema in effetti è 
a livello di SQL Server, ovvero, se per uno specifico campo (ordinando per 
data di registrazione, quindi "mescolando" le unioni) il primo record ad 
esempio contiene "123", questo viene immediatamente interpretato come 
numerico, se poi effettivamente qualche record successivo contiene anche 
caratteri alfabetici è già SQL Server a generare un'eccezione. Quindi il 
problema, molto probabilmente, è legato all'effettivo contenuto dei dati 
che, nel momento in cui genero i TField in Delphi, potrebbe variare.
Anche qui ho risolto convertendo esplicitamente in stringa le informazioni 
direttamente nelle clausole SQL.
Ora, funziona tutto alla perfezione!
Ciao,
Gianluca. 

Ora, funziona tutto alla perfezione!
Bene.
Complimenti per l'esauriente spiegazione: l'ho capita anche io che uso access.
:-)
Ciao
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/