Newsgroup: it.comp.lang.delphi
Titolo: Come fare

Ho una routine che riclassifica il valore di un campo di un dataset. Alla 
routine il chiamante passa il nome del campo il cui valore è da modificare e 
il valore.
Vorrei generalizzare la routine consentendo l'aggiornamento di più di un 
campo. Avevo pensato di passare due parametri string per i nomi dei campi e 
i valori in cui nomi e valori sono separati da un separatore. La routine si 
occuperebbe di spacchettarli. Avrei qualche problema con XE ?
Avete da suggerire altre soluzioni ? Grazie 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

Ciao,
-----
Ho una routine che riclassifica il valore di un campo di un dataset. Alla
routine il chiamante passa il nome del campo il cui valore è da modificare e
il valore.
Vorrei generalizzare la routine consentendo l'aggiornamento di più di un
campo. Avevo pensato di passare due parametri string per i nomi dei campi e
i valori in cui nomi e valori sono separati da un separatore. La routine si
occuperebbe di spacchettarli. Avrei qualche problema con XE ?
Avete da suggerire altre soluzioni ? Grazie
-----
 
Onestamente non ho capito molto ...
Comunque visto che stai lavorando con il dataset, non devi fare altro che 
prendere il valore che ti interessa
del record che stai puntando, modificarlo e salvarlo.
Se usi componenti DB hai gia' tutto fatto, se invece usi componenti normali 
devi farlo tu a a mano con, per esempio,
Tabella.FieldByName('NomeCampo').asString:='ciao'
 
Se ho capito male ... scusa!
 
Ciao
 
Daniele 
 

 
"Daniele"  ha scritto nel messaggio news:mt5v3a$83g$1...@speranza.aioe.org...
Onestamente non ho capito molto ...
Daniele
---
Se non hai capito, vuol dire che non mi sono saputo spiegare. Allora ti 
mostro qui di seguito la proc attuale (semplificata):
 
function TBfDM.RiclassificaMovim(dsMov: TTable; unCampo: string; unValore: 
variant): integer;
{  Parametri:
   dsMov :  la TTable  da modificare
   unCampo : il nome del campo di dsMov da riclassificare  ( Es: 'H' )
   unValore: il valore di riclassifica da assegnare a unCampo quando 
ricorrono le condizioni specificate }
var
  i: integer;
begin
  try
     with dsMov do
     begin
       i:= 0;
       while not eof do
       begin
          edit;
          dsMov.FieldValues[unCampo]:= unValore;
          inc(i);
          next;
       end;
     end;
  finally
    SaveRestore.RestoreStatus;
    result := i;
  end;
end;
Ecco, quello che vorrei fare come novità è trasformare i parametri 'unCampo' 
e 'unValore' in parametri che passino alla proc anzichè uncampo e un valore, 
più campi e corrispondentemente più valori. Così ne potrei aggiornare quanti 
ne desidero in una sola scansione. 


 potrei aggiornare quanti ne desidero in una sola scansione.
 
Passi una stringa che contiene i nomi dei vari campi separati da un 
carattere particolare tipo ',' o altro ed all'interno della routine vai 
di TStringList e Delimiter e DelimitedText per avere la lista dei nomi 
dei campi e dei valori.
 
Ma perché cicli tutto la tabella e non usi un più semplice UPDATE?
 
-- 
@WarpTen10


 ne desidero in una sola scansione. 
 
Potrebbe gia' funzionare con la tua procedura cosi' come e'
(dipende da quanto la realta' e' diversa dalla tua versione semplificata :-)
 
Il tipo Variant puo' contenere anche degli interi array (VarArray)
 
Prova questo:
 
var V : Variant;
...
V := MyTable['campo1;campo2;campo3'];
...
MyOtherTable['campoA;campoB;campoC'] := V;
 
Se vuoi costruire un VarArray lo puoi fare con:
 
V := VarArrayOf( [ 'hello', 42, 3.14 ] );
MyOtherTable['campoA;campoB;campoC'] := V;
 
(esistono altre funzioni per creare e manipolare i VarArray)
 
Quindi in sostanza puoi chiamare la tua procedura passando i 
parametri nel modo opportuno:
 
RiclassificaMovim( dsTab, 
    'FieldA;FieldB;FieldC', 
    VarArrayOf[ ValueA, ValueB, ValueC] );
 
 
ciao
Giacomo
 

 
"Giacomo Degli Esposti"  ha scritto nel messaggio
Il tipo Variant puo' contenere anche degli interi array (VarArray)
-----------
I VarArray non li avevo ancora scoperti...  Ora guardo meglio il tuo codice.


"Warp10"  ha scritto nel messaggio news:mt6u7k$o2b$1...@speranza.aioe.org...
Ma perché cicli tutto la tabella e non usi un più semplice UPDATE?
@WarpTen10
---
Ma vuoi dire con un SQL ? 


 ---
 
Sì.
 
UPDATE <TABELLA> SET <CAMPO1> = <VALORE1>, <CAMPO2> = <VALORE2>, 
<CAMPO3> = <VALORE3>...
 
CAMPOx lo prendi dalla TStringList dei nomi dei campi
VALOREx lo prendi dalla TStringList dei valori, ovviamente 
opportunamente modificato per il tipo di campo che vai a modificare 
(stringa, intero, data...)
 
-- 
@WarpTen10


"Warp10"  ha scritto nel messaggio news:mt71k6$hv$1...@speranza.aioe.org...
UPDATE <TABELLA> SET <CAMPO1> = <VALORE1>, <CAMPO2> = <VALORE2>,
<CAMPO3> = <VALORE3>...
 
CAMPOx lo prendi dalla TStringList dei nomi dei campi
VALOREx lo prendi dalla TStringList dei valori, ovviamente
opportunamente modificato per il tipo di campo che vai a modificare
(stringa, intero, data...)
-- 
@WarpTen10
---
Si, mi pare una valida alternativa. Però, scusa, anche UPDATE dovrà scandire 
tutto il dataset, o no?
Comunque, la StringList per i nomi dei campi va bene, ma per i valori non 
basta una StringList. Come faccio a sapere il tipo di campo ?
Adesso non mi interessa, perchè ho dichiarato unValore Variant e il 
chiamante passa il valore come stringa o come integer, per esempio.
Ma se questo parametro diventa una StringList, devo anche sapere dal 
chiamante il tipo di campo, giusto ? 


 chiamante il tipo di campo, giusto ?
 
No.
 
Lo recuperi tramite il nome del campo.
 
Si presenta un problema, un bel problema a dire il vero :) , se hai a 
che fare con Memo o Blob.
 
-- 
@WarpTen10


E tokenize ?


Ciao,

----
 
tieni presente che io sui db sono rimasto all'eta' della pietra .....
Ho letto la discussione, ma credo (sperando di non dire una castronata) che 
si possa
lavorare su un singolo record della tabella.
Quando tu dici "Così ne potrei aggiornare quanti
ne desidero in una sola scansione" intendi piu' campi e piu' valori dello 
stesso record o
piu' record con quei campi che devono avere quei valori?
Nel primo caso (piu' campi e valori) passi (come suggerito) una stringa con 
dei nomi separati da un
separatore e un'analoga stringa con i valori da assegnare e il gioco e' 
fatto.
 
Se invece devi cambiare a TUTTI i record della tabella i campi specificati 
con i valori passati, lo hai gia'
fatto con la tua procedura, non credo si possano fare, per esempio, 
cambiamenti su 20 record in una sola volta
fuori da un ciclo, con sql non lo so perche' ancora non lo sto utilizzando.
 
Ciao
 
Daniele
 
 
 
 
 
 
 

 non lo sto utilizzando.
 
È proprio SQL, o uno dei suoi tanti dialetti, che devi usare per fare 
operazioni di questo genere che deleghi così all'engine del database.
 
-- 
@WarpTen10


 operazioni di questo genere che deleghi così all'engine del database.
 
Causa migrazione a nuovo gestionale che utilizza come db firebird dovro' 
andare a modificare i miei 3 programmi per operare con questo db.
Non ho idea di quali componenti per delphi ci siano in giro, ma credo che il 
passaggio a sql sia doveroso.
Al riguardo qualche tutorial per muovere i primi passi per lavorare con 
delphi + firebird ??
 
Grazie
 
Daniele 
 

 delphi + firebird ?
 
http://goo.gl/Mr832j
 
 
Come scritto nel tutorial non usare TIBTable, ma parti direttamente con 
TIBDataset che è più potente.


Quale versione di delphi?
E comunque, io non sceglierei firebird.
 
A.


 
Hai tempo e voglia di dire perché?
 
Grazie.

> Hai tempo e voglia di dire perché?
 
Lamentele del tipo che se cancelli molti record diventa lento e l'unica è lanciare un backup/restore.
Preciso che non è una MIA esperienza diretta, ma chi mi ha riferito ciò è una persona abbastanza affidabile e che sopratutto usa firebird quotidianamente.
 
Prima di usare qualsiasi cosa (db, ide, componenti, framework etc) è IMPRESCINDIBILE fare dei test preliminari per una valutazione OGGETTIVA del prodotto, evitando di basarsi sui vari "sentito  dire", magari di gente che il prodotto non lo ha mai visto....
 
Ovviamente (ma non per tutti) Lo scopo non è trovare il prodotto "perfetto" ma quello che nel caso specifico offre il miglior compromesso tra pro e contro, sia sul piano tecnico che su quello economico.
 
Nel caso di firebird, a fronte di questa cosa che mi è stata riferita farei dei test in piu.
 
A.
 
 

 riscontrato significativi miglioramenti a livello di velocità.
 
Ma con zeos il componente per le stored procedure FUNZIONA?
 
 
A.

 Nel caso di firebird, a fronte di questa cosa che mi è stata riferita farei dei test in piu.
 
Se non ho capito male Daniele è obbligato ad interfacciarsi con Firebird 
perché scrive "Causa migrazione a nuovo gestionale che utilizza come db 
firebird dovro' andare a modificare i miei 3 programmi per operare con 
questo db."
 



Non so/Non ricordo. :)
 
Comunque ho letto di molta gente usa Zeos senza problemi.
 
Io ho i miei progetti già sviluppati con i componenti IBX dal tempo del 
passaggio all'euro ed ho provato le Zeos giusto per vedere se guadagnavo 
qualcosa come velocità. Accertato, in modo molto empirico per la carità, 
che le stesse operazioni venivano svolte nello stesso tempo le ho 
lasciate perdere.


> Comunque ho letto di molta gente usa Zeos senza problemi.
 
Se vai qua:
http://sourceforge.net/projects/zeoslib/reviews/?sort=created_date&stars=0#reviews-n-ratings
 
e filtri per i post da una stella trovi il mio... :-((
 
 
A.

Pardon. 
Quanto ho scritto non era un invito a cambiare il db ma a VALUTARE BENE prima di scegliere firebird per nuovi lavori.
 
A.


Beh, molta gente usa Zeos senza problemi a giudicare dalle recensioni a 
4 e 5 stelle.
 
Se fossero perfette tutti userebbero solo quelle.  :)


 4 e 5 stelle.
 
 
 
Tutto si basa sul presupposto implicito che le recensioni siano scritte da chi li usa.....
Non tantissimo tempo fa qualcuno qui chiedeva info su zeos.
Poi venne fuori che chi aveva suggerito l'uso di zeos NON USAVA ZEOS....!
 
 
A.


Usate IBX e vivrete tranquilli.
 
Insomma... :)


 Insomma... :)
 
Lol! :-D
 
A.
 

 E comunque, io non sceglierei firebird.
Mi sono trovato questo ....
rispetto alle basi dati cobol e' comunque un passo avanti, per me, almeno ho 
la possibilita' di leggere i dati senza fare mille esportazioni.
 
Ciao
 
Daniele
 
 

 prima di scegliere firebird per nuovi lavori.
Per (s)fortuna devo solo fare operazioni di lettura dei record, credo che in 
sola lettura non dovrebbero esserci problemi (tipo prezzo, iva, descrizione 
ecc..).
 
Per quanto riguarda la base dati dei miei programmi utilizzo da tempo le 
TurboDb della dataweb.
Probabilmente ci sara' in giro qualcosa di meglio, ma queste librerie sono 
affidabili e veloci, ovviamente parlo per mia limitata esperienza e per la 
limitata
quantita' di record su cui lavoro (il db piu' grande ha circa 2.5 milioni di 
record ed e' utilizzato sporadicamente glimaltri girano su poche migliaia di 
record).
 
Ciao
 
Daniele
 

 A.
 
Ho usato delphi7+zeos(7.1.3a-stable)+firebird 2.0 nel mio (unico) progetto e il componente ZStoredProc funziona perfettamente.


Se non ho capito male Alberto, e così anche la sua monostellata 
recensione, si riferiva alla gestione delle stored procedures in MySQL.


 recensione, si riferiva alla gestione delle stored procedures in MySQL.
 
 
No. Io avevo fatto delle prove con Oracle.
L'idea era avere qualcosa da usare con Oracle al posto di ADO (puah!).
 
E se non ricordo male mancavano interi pezzi di codice, come se lo sviluppo fosse stato iniziato e mai completato.
 
Da xe5 hanno introdotto firedac.
Ovviamente (ma non per tutti) per cose oggetto di porting da versioni precedenti di delphi, non si tocca nulla.
Ma per cose nuove, fermo restando dei test preliminari in modo da stare tranquilli, io punterei su firedac, tenendo bene a mente che non è assolutamente detto che se funziona ad esempio su Oracle funzioni bene anche su db2 o mysql...
 
A.

 Hai usato parametri in i/o con tipi di dato diversi ed eterogenei?
 
Ti elenco i tipi utilizzati nelle varie stored procedure
input: integer, varchar, date, time
output: varchar, numeric, integer, smallint