Newsgroup: it.comp.lang.delphi
Titolo: D2007 ClientDataSet con Query JOIN errore su Post

eseguendo l'ApplyUpdates, evento AfterPost del ClientDataSet, mi restituisce
errore
"column unknow NOMENAZ at Line1 col 20"
DataBase Firebid
componenti TClientDataSet, TSQLDataSet, TDataSetProvider
frm_Dati = nome del datamodule che contiene il TClientDataSet
questa Query estrae e visualizza i campi (componenti DBEdit) correttamente
SELECT C.*,N.NAZIONE AS NOMENAZ,N.SIGLA AS SIGLANAZ
 FROM (TB_CITTA C INNER JOIN TB_NAZIONI N
ON C.ID_NAZIONE=
N.ID
);
  frm_Dati.CDS_Citta.FieldByName('ID_NAZIONE').AsInteger := 111;
  frm_Dati.CDS_Citta.FieldByName('SIGLANAZ').AsString := 'X';
  frm_Dati.CDS_Citta.FieldByName('NOMENAZ').AsString := 'PROVA';
 
frm_Dati.Cds_Citta.Post
;
[...]
procedure Tfrm_Dati.CDS_CittaAfterPost(DataSet: TDataSet);
begin
  Cds_Citta.ApplyUpdates(0);
end;
prima del Post i campi risultano valorizzati;
nel ClientDataSet proprieta' FieldDelfs i campi risultano con gli stessi
nomi della Query e
utilizzati nel FieldByName
se invece di usare i DBEdit uso i TLabeledEdit, e una Query di Update, non
si verificano errori.
sSQL:='UPDATE TB_CITTA ' +
            'SET
ID=:Codice,CITTA=:Citta,CAP=:Cap,PROVINCIA=:Provincia,ID_NAZIONE=:IdNazione
'+
             'WHERE ID='+QuotedStr(Trim(EdIDCitta.Text));
Vorrei capire dove sbaglio, l'operazione sembra banale essendo i campi
valorizzati prima del Post , ed il
Cds da aggiornare e' quello della Tabella TB_CITTA anche se in Join con
TB_NAZIONI.
Maurizio

Una volta ebbi un problema simile e scoprii che era legato al modo in
cui vengono passati i nomi dei campi.
Se non ricordo male la mia select era scritta tutta in minuscolo ma
lui passava i nomi in maiuscolo e racchiusi tra apici
Questo di fatto rendeva i nomi  case sensitive e quindi non trovava un
tubazzo...
Nel tuo caso, pero', la 1a cosa che farei è rimuovere l'alias sul
campo..
Guarda caso si incazza prp sull'unico campo al quale hai appioppoato
un alias.
Almeno per capire se dipende da questo.
Pax vobiscum
A.

Almeno per capire se dipende da questo.
ho cambiato la query, senza alias
SELECT TB_CITTA.*,
             TB_NAZIONI.NAZIONE ,TB_NAZIONI.SIGLA
 FROM (TB_CITTA INNER JOIN TB_NAZIONI
ON TB_CITTA.ID_NAZIONE = 
TB_NAZIONI.ID
);
si comporta come prima non trova il campo NAZIONE che non esiste
nella Tabella TB_CITTA ma solo nella TB_NAZIONI.
nel CdsCitta ho 2 campi derivati dalla Join (NAZIONE e SIGLA), e secondo
me e' proprio questo che non gli piace.
Maurizio

>>>>>>>  or multi-table join).   <<<<<<<<<<<<<<<<<<<<
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
A.
Client datasets and provider components generate events that let you
handle these situations. See Intervening as updates
are applied for details.

 
Dalla query che fai mi sembra che i campi nazione e sigla sono delle 
viste, dunque se crei i fields a runtime (o design time) e setti le 
proprietà providerflag dei 2 campi (TB_NAZIONI.NAZIONE 
,TB_NAZIONI.SIGLA) tutte a false,quando chiami ApplyUpdates dovrebbe 
funzionare.
^_Goblin_^

> ^_Goblin_^
si, aggiungendo i campi persistenti al TSqlDataSet ed impostando il 
provederflag
dei campi NAZIONE e SIGLA a false, non solleva eccezione e salva.
Maurizio