Newsgroup: it.comp.lang.delphi
Titolo: Consiglio programmazione...

Ciao a tutti.
ho un database di un magazzino.
i campi principali sono: nome e grandezza
se uno inserisce un articolo con nome e grandezza di un articolo già
presente devo far apparire una finestra chiedendo "articolo già presente,
continuare? S/N"
come faccio a fare questo controllo? Come mi conviene fare?...
grazie
Daniel

 ha scritto nel messaggio
news:5ZmX6.49682$Uo3.1...@news6.giganews.com...
: Ciao a tutti.

:
puoi fare una query e controllare se ti ritorna un record allora l'articolo
esiste già.
una cose del tipo
inserisci una TQuery collegata al database e imposti la proprietà tquery.sql
a
"select * from NomeTabella where nome = :nome and grandezza = :grandezza"
poi definisci i due paramentri (proprietà parameters) come "input" e ,
credo, "string" o "integer"
nel tuo codice inserisci:
Query1.parambyname('nome').asstring:= quello che serve;
Query1.parambyname('grandezza').asstring:= quello che serve;
Query1.open;
if query1.recordcount<>0 then
begin
  chiedi conferma o fai qualcosa
end
else
begin
 inserisci il record
end;
Query1.close;  //ricordati questo !
ciao
giuliano

Solo 3 precisazioni....
1) Per calcolare la recorcount il db si fa un "giro" su tutti i records restituiti dalla query...
Porprio per questo, in genere, recordcount non si usa.
Nel caso specifico potrebbe anche andar bene, ma se vuoi sapere se una query restituisce o meno dei records meglio usare IsEmpty
IF NOT QUERY1.ISEMPTY THEN 
invece di
query.recordcount > 0
2) Ti basta un solo campo nella select, in questo caso:
SELECT NOME FROM TABELLA WHERE .....
Se scrivi select * from tabella ti leggi un bel po' di roba che in questo caso specifico non ti serve, con conseguente ulteriore rallentamento.
3) Impostare la proprieta Unidirectional della query a True;
Saluti
AS
-- 
Posted from 
ammi.mclink.it
 [195.110.128.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Daniel
.G


Eviterei come la peste la funzione locate se non su un database
controllato da BDE, su un campo indicizzato e con *pochissimi* record.
Locate è la classica funzione ad alto livello in grado di uccidere un
sistema :)
Locate su una tabella non fa altro che effettuare un *table scan*
completo, pensa se i record dovessero essere, che so, due o
trecentomila.
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

Locate su una tabella non fa altro che effettuare un *table scan*
Ed in piu' ogni tanto sbaglia!!!
Ciao Rocco.

 Ciao Rocco.
Ciao
.G

query.recordcount > 0
Non basterebbe allora
SELECT COUNT(*) CNT FROM NomeTabella WHERE nome = :nome AND grandezza
= :grandezza
E poi leggere Query1['CNT'] ?
Ciao
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.it
bpie...@hotmail.com
______________________________________________
"Madame, lei ha tra le gambe uno strumento
che puo' offrire piacere a migliaia di persone,
e tutto quello che sa fare e' grattarlo"
- Sir Thomas Beechan a una violoncellista


Vuoi dire che apri una TQuery con select * su tutti i 300000 record e
poi fai una locate?
Hai veramente una tabella con 300000 record e senza l'indice?
Auguri... :-)
Ciao, Rocco.



Sapessi quante cose non so io!
Semplicemente, tanto tempo fa (in una galassia lontana lontana) ci ho
sbattuto la testa.
Se posso darti un consiglio, se prevedi che la tua tabella continui ad
ingrandirsi, cerca altre soluzioni.
Ciao,
massimo.


 Ciao, Rocco.
Ciao

 massimo.
Ciao
.G



io personalmente "affido" il compito al db creando degli unique index
o chiavi pimarie nei campi in cui non ci dovrebbero essere valori
duplicati, in quel caso non devi fare niente...
eventualmente fornire all'utente un messaggio piu' "umano",
puoi farlo in OnPostError
procedure TDM.qTuaqueryPostError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
var Error:word;
begin
  if (E is EDBEngineError)
  then begin
   Error:=(E as EDBEngineError).Errors[0].Errorcode;
   if Error=9729
    then begin
     ShowMessage('Il tuo messaggio');
     Action:=daAbort;
    end
    else ShowMessage((E as EDBEngineError).Message); 
  end;
end;
Ciao,
Alan Solo

> Auguri... :-)
non uso Oracle personalmente ma so per sentito dire (sul ng di cantu')
che quel furbacchione di Oracle si crea un indice temporaneo anche se
non è stato esplicitamente creato, probabilemnte fa una valutazione
della dimensione della tabella e se è così grande lui si crea un
indice perchè ci mette molto meno a crearsi un indice e puoi cercare
che non cercare direttamente...
è una delle differenza con IB... con IB devi creare esplicitamente gli
indici che ritieni oportuni... se non ci sono non li usa...
Ciao,
Alan Solo

indici che ritieni oportuni... se non ci sono non li usa...
Dopotutto sono differenze profumatamente pagate... :-)


Dopotutto sono differenze profumatamente pagate... :-)
questo č vero ;-)
sia in "soldini" ;) che in installaizioni  / manutenzioni, personale e
tempo...
con Oracle se non hai un DB Administrator non vai da nessuna parte,
IB non ha bisogno di *pochissima* manutenzione (direi nulla se non in
casi particolari), l'installazione la puo' praticamente fare chiunque
ecc...
Ciao,
Alan Solo

 ha scritto nel messaggio
news:psIvOxjf1gxkVb...@4ax.com...


 Alan Solo
Ciao
.G

tabelle usando l'ODBC di Oracle, ho creato una query strutturata così:
sarà un bug del driver allora, piu' che di Oracle, presumo...
o di Access!! ;)
Ciao,
Alan Solo

e a mio avviso è scomodissimo.
beh, ho provato a fare una funzoine LeggiNellaMenteUtente per sapere
cosà *inserirà*! ;-)))
seriamente... non vedo il problema, l'errore viene segnalato al post,
ovvero quando l'utente conferma l'inserimento
Ciao,
Alan Solo

 Alan Solo
Ciao,
.G