Newsgroup: it.comp.lang.delphi
Titolo: Ancora interbase in rete

Ciao a tutti.
Risolti i problemi che avevo riscontrato con l'utilizzo delle transazioni,
mi sto cimentando ora in un passo di sviluppo successivo.
Dopo aver letto un po' di articoli, infatti, sono giunto alla conclusione
che alcune operazioni di gestione dati (generazioni chiave primaria,
inserimento, update e delete) andrebbero gestite a livello del server.
Vi pongo allora le seguenti domande:
1) Il mio ragionamento č corretto?
2) Se cosě fosse, č meglio utilizzare stored procedures per tutte queste
operazioni o (almeno nel caso della generazione della chiave primaria) č
meglio utilizzare dei generators?
Grazie, e buon lavoro.
A.

 A.
Ciao
Gabriele

 form tabella... lato client.
Perchč orrendo (con i dovuti indici impostati sulla tabella) ???
Se lo utilizzassi lato client con una bella stored procedure ?
Sarebbe meno orrendo, no ?
Ciao,
Riccardo
---

 Riccardo
CIao
Gabriele

 meglio utilizzare dei generators?
le due cose non sono alternative.
Una stored procedure potrebbe essere usata per calcolare un id tramite 
un generator.
AS

 Gabriele
Ciao,
Riccardo
P.S.
Visto che lavori con Interbase, non è che sapresti rispondere
anche al mio post del 31/08 "Lunghezza di una stringa in Firebird" ?

 incrementato comunque e dunque non ci sono rischi di key violation.
E' un metodo interessante ma rischioso: se l'utente annulla l'inserimento,
il codice viene perduto... se tu dovessi numerare le fatture, non sarebbe
bello :-((
Ops, però se esegui tutto in una routine questo problema non ce l'hai:
raccogli i dati dall'utente, poi in un colpo solo generi la chiave ed
effettui l'inserimento, restituendo all'operatore il codice appena
utilizzato. Non male :-))
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

 info @ 
marcobortolani.it
Ciao,
Riccardo
---

 Sarebbe meno orrendo, no ?
Non credo ottimizzi più di tanto: una query di quel genere restituisce 
al massimo un record, quindi la maggior parte della ottimizzazione che 
ottieni delegando al server, ovvero, la riduzione del traffico di rete 
dovuto all'invio dei dati di un cursore dal server al client, te la perdi.
AS

 bello :-((
Usando un select max credo lo avresti comunque.
Già in passato si è parlato di questo argomento.
Per casi assimilabili a quello delle fatture io protendo per una tabella 
di contatori il cui accesso è incapsulato in una stored procedure alla 
quale si passano come parametri dei valori che saranno usati come chiave 
per un SELECT... FOR UPDATE.
Poi, lato app, si richiama questa stored procedure non sulla 
OnNewRecord, comoda se ne freghi che nella numerazione vi siano buchi, 
ma nella beforeupdate, vincolandola ad un check sullo stato del dataset 
che deve ovviamente essere dsInsert.
AS

 dovuto all'invio dei dati di un cursore dal server al client, te la perdi.
E' molto interessante quello che dici...
Vista la tua esperienza (senz'altro maggiore della mia)
potresti spiegarmi meglio quest'ultimo passaggio ?
Grazie

 potresti spiegarmi meglio quest'ultimo passaggio ?
In pratica: premetto un'ovvietà, cioè che, nella programmazione di
un'applicazione database in client/server, le operazioni sui dati le
possono fare il client o il server. Se le operazioni le effettua il client,
sulla rete viaggiano tutti i dati relativi all'operazione da effettuare; se
la stessa operazione viene delegata al server DBMS, sulla rete viaggiano
solamente i risultati dell'elaborazione.
Per farti un esempio: se volessi fare una routine che scorre tutti i record
di una tabella per valutare quello con chiave maggiore (senza utilizzare la
select max), lo potresti fare con una query lato client oppure con una
stored procedure, che viene eseguita lato server e ritorna solamente il
risultato:
LATO CLIENT:
	Query1.Text := 'select * from TABELLA';
	Query1.Open;
	Query1.First;
	dato := -MAXINT;
	while not Query1.Eof do
	begin
		if Query1.FieldByName('DATO').AsInteger > dato then
			dato := Query1.FieldByName('DATO').AsInteger;
		Query1.Next
	end;
LATO SERVER (db Interbase)
	create procedure SPMAXDATO 
	returns (
		datomax integer)
	as
	declare datotemp integer;
	begin
		datomax = -1000;
		for select DATO from TABELLA into :datotemp do
		begin
			if (datotemp > datomax) then
				datomax = datotemp;
		end;
		suspend;
	end;
	e lato client
	Query1.Text := 'select datomax from SPMAXDATO';
	Query1.Open;
Questi sono due modi di fare la stessa cosa: il primo però carica di lavoro
il client, il secondo il server: la singola operazione nel secondo caso
risulta quindi effettuata più velocemente, a discapito però delle
prestazioni del sistema globale che risente della maggiore occupazione del
server database, il quale durante l'elaborazione non può "servire" gli
altri client.
Da usare quindi con criterio.


 solamente i risultati dell'elaborazione.
Certo, questo è molto chiaro.... come dici tu una "ovvietà".

Beh, sono tutti concetti molto chiari... solo che prima non avevo capito
bene
il senso della tuo concetto riportato in alto, che però adesso mi risulta
più chiaro.
Ciao,
Riccardo
---
P.S.
Ti ho scritto anche in privato... penso avrai già letto la mia email.