From marcello a vezz.it Wed Jan 3 10:41:29 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 10:52:48 2007 Subject: [Db] contatore server side Message-ID: <459B7A49.3020404@vezz.it> Ciao a tutti, mi trovo ad affrontare il "classico" problema della numerazione fatture per anno. Ho due bei campi int, numfatt e anno, che formano la chiave primaria. Ho già utilizzato con altri db (interbase, firebird) un contatore server side per gestire la numerazione automatica e gli accessi concorrenti. Ora sto usando mysql... c'è sicuramente una procedura analoga, qualche consiglio da qualcuno con più esperienza? L'implementazione non è in php ma utilizza le api mysql. Saluti Marcello From michel a ziobudda.net Wed Jan 3 10:41:10 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Wed Jan 3 10:55:54 2007 Subject: [Db] contatore server side In-Reply-To: <459B7A49.3020404@vezz.it> References: <459B7A49.3020404@vezz.it> Message-ID: <459B7A36.7010907@ziobudda.net> Marcello Vezzelli ha scritto: > Ciao a tutti, > mi trovo ad affrontare il "classico" problema della numerazione > fatture per anno. > Ho due bei campi int, numfatt e anno, che formano la chiave primaria. > > Ho già utilizzato con altri db (interbase, firebird) un contatore > server side per gestire la numerazione automatica e gli accessi > concorrenti. devi settare il campo "int" come intero con opzione auto_increment. In questo modo per ogni inserimento si occupa mysql di mettere il numero giusto dentro a "int" (quindi la concorrenza). Per ritornarnare questo valore subito dopo il nuovo inserimento devi utilizzare |mysql_insert_id() [http://209.85.129.104/search?q=cache:bgJwemmEl2QJ:dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html+mysql+last+id&hl=it&gl=it&ct=clnk&cd=1&client=firefox-a] Ciao M. | -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it -------------- parte successiva -------------- Un allegato HTML è stato rimosso... URL: http://lists.ziobudda.net/pipermail/db/attachments/20070103/dde23035/attachment.htm From marcello a vezz.it Wed Jan 3 10:49:05 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 11:00:16 2007 Subject: [Db] contatore server side In-Reply-To: <459B7A36.7010907@ziobudda.net> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> Message-ID: <459B7C11.3050909@vezz.it> Davide Michel 'ZioBudda' Morelli wrote: > Marcello Vezzelli ha scritto: >> >> mi trovo ad affrontare il "classico" problema della numerazione >> fatture per anno. >> Ho due bei campi int, numfatt e anno, che formano la chiave primaria. > devi settare il campo "int" come intero con opzione auto_increment. In > questo modo per ogni inserimento si occupa mysql di mettere il numero > giusto dentro a "int" (quindi la concorrenza). > Per ritornarnare questo valore subito dopo il nuovo inserimento devi > utilizzare |mysql_insert_id()| Ma va bene un autoincrementante in questo caso, visto che il numero di fattura deve ricominciare da 1 ogni anno? Pensavo di dover gestire l'incremento e l'unicità del campo server side con una stored procedure o un trigger. Siccome con mysql non l'ho mai fatto, chiedevo lumi... Ciao Marcello From michel a ziobudda.net Wed Jan 3 10:48:54 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Wed Jan 3 11:03:38 2007 Subject: [Db] contatore server side In-Reply-To: <459B7C11.3050909@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> Message-ID: <459B7C06.404@ziobudda.net> Marcello Vezzelli ha scritto: > Davide Michel 'ZioBudda' Morelli wrote: >> Marcello Vezzelli ha scritto: >>> >>> mi trovo ad affrontare il "classico" problema della numerazione >>> fatture per anno. >>> Ho due bei campi int, numfatt e anno, che formano la chiave primaria. > >> devi settare il campo "int" come intero con opzione auto_increment. >> In questo modo per ogni inserimento si occupa mysql di mettere il >> numero giusto dentro a "int" (quindi la concorrenza). >> Per ritornarnare questo valore subito dopo il nuovo inserimento devi >> utilizzare |mysql_insert_id()| > > Ma va bene un autoincrementante in questo caso, visto che il numero di > fattura deve ricominciare da 1 ogni anno? Uh, cannato completamente risposta :) Capito fischi per fiaschi. > Pensavo di dover gestire l'incremento e l'unicità del campo server > side con una stored procedure o un trigger. > Siccome con mysql non l'ho mai fatto, chiedevo lumi... Si, mi sa' che è l'unico modo. Ma trigger e S.P. ci sono solo da mysql 5. Ciao e scusa ancora per la risposta senza senso di prima. M. -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From domenico.lorusso a pleiade.it Wed Jan 3 11:32:05 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 11:44:07 2007 Subject: [Db] contatore server side In-Reply-To: <459B7C11.3050909@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> Message-ID: <459B8625.5090501@pleiade.it> Marcello Vezzelli ha scritto: > Davide Michel 'ZioBudda' Morelli wrote: >> Marcello Vezzelli ha scritto: >>> >>> mi trovo ad affrontare il "classico" problema della numerazione >>> fatture per anno. >>> Ho due bei campi int, numfatt e anno, che formano la chiave primaria. > >> devi settare il campo "int" come intero con opzione auto_increment. >> In questo modo per ogni inserimento si occupa mysql di mettere il >> numero giusto dentro a "int" (quindi la concorrenza). >> Per ritornarnare questo valore subito dopo il nuovo inserimento devi >> utilizzare |mysql_insert_id()| > > Ma va bene un autoincrementante in questo caso, visto che il numero di > fattura deve ricominciare da 1 ogni anno? uhm... uhm.... una stored procedure può essere... in Oracle ti parlerei di sequence e di job schedulati... in mysql ti tico come emulare il concetto: ti crei una tabella chiamata fat_seq: con un unico attributo numerico quando devi fare un nuovo inserimento devi iniziare una transazione fare update fat_seq set id=id+1; [peccato che non c'è la clausola returning] estrai il nuovo id fai l'insert chiudi la transazione Dovresti riuscire a gestire schedulando in qualche modo che a inizio anno venga riazzerata la tabella. Se il problema è che i numeri devono essere consecutivi l'approccio è un po' più complesso... occorre effettuare un'insert con un codice fittizio, se va tutto a buon fine si può finalmente mettere il codice corretto... Gestire questa cosa tramite trigger o precedure è possibile ma occorre ragionarci bene... -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 11:46:08 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 11:57:19 2007 Subject: [Db] contatore server side In-Reply-To: <459B8625.5090501@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> Message-ID: <459B8970.2050407@vezz.it> Domenico L. wrote: > > Se il problema è che i numeri devono essere consecutivi l'approccio è > un po' più complesso... occorre effettuare un'insert con un codice > fittizio, se va tutto a buon fine si può finalmente mettere il codice > corretto... > > Gestire questa cosa tramite trigger o precedure è possibile ma occorre > ragionarci bene... Con Interbase/Firebird la logica era questa: apro la transazione e appendo un record alla tabella senza salvarlo. Faccio inserire i dati e in generale aspetto che l'utente decida di confermare il salvataggio... non so il numero di fattura. Quando l'utente conferma la scrittura, appena prima di POSTare il record, chiamo una stored procedure che mi incrementa un trigger server side di uno e me lo ritorna. Assegno il valore al campo numfatt, poi faccio la POST. In caso di POST concomitanti su sessioni diverse, è garantita l'unicità del trigger e quindi del campo numfatt. Poco importa se l'append della fattura 234 è precedente a quello della fattura 233, l'importante è che siano distinte. E cmq la chiave primaria mi garantisce l'ordinamento. Tu mi dici in pratica di "simulare" lo stesso comportamento con una tabella di appoggio.. Pero' dovrei avere una tabella per anno, perché può succedere di inserire fatture nel 2006 e nel 2007 contemporaneamente. Ogni tabella dovrebbe avere un autoincrementante indipendente. Che brutto però... Siccome uso Mysql 5 ho le stored procedure, ma non le ho mai usate su mysql... qualcuno con esperienza in merito? Giusto per evitare di imbroccare una strada senza uscita. Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 12:07:23 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 12:19:24 2007 Subject: [Db] contatore server side In-Reply-To: <459B8970.2050407@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> Message-ID: <459B8E6B.9010001@pleiade.it> Marcello Vezzelli ha scritto: > Domenico L. wrote: >> >> Se il problema è che i numeri devono essere consecutivi l'approccio è >> un po' più complesso... occorre effettuare un'insert con un codice >> fittizio, se va tutto a buon fine si può finalmente mettere il codice >> corretto... > >> >> Gestire questa cosa tramite trigger o precedure è possibile ma >> occorre ragionarci bene... > > In caso di POST concomitanti su sessioni diverse, è garantita > l'unicità del trigger e quindi del campo numfatt. Poco importa se > l'append della fattura 234 è precedente a quello della fattura 233, > l'importante è che siano distinte. E cmq la chiave primaria mi > garantisce l'ordinamento. > > Tu mi dici in pratica di "simulare" lo stesso comportamento con una > tabella di appoggio.. > Pero' dovrei avere una tabella per anno, perché può succedere di > inserire fatture nel 2006 e nel 2007 contemporaneamente. > Ogni tabella dovrebbe avere un autoincrementante indipendente. > > Che brutto però... Allora le stored procedure sono molto utili ma secondo me non fanno propriamente al caso tuo... (se non devi richiamare una procedura passando ogni campo della tabella), meglio invece un trigger after insert. Insisto sull'after perché se hai bisogno di non avere buchi di numerazione, puoi mettere il numero solo dopo che il record è stato inserito (metti che ti sei dimenticato un controllo o che ti salta un constraint). Un trigger afeter insert non ha il problema di accedere alla tabella che stai modificando, ma cmq è abbastanza pesante fare una select max.... meglio usare una tabella di appoggio con più record (tanto hai anche l'anno) il trigger non farà altro che leggere il valore corrente, aggiungerci uno, salvare (se il record non c'è fa una insert, si dovrebbe poter fare tutto con un'operazione), e quindi finalmente modificare il codice con il progressivo corretto. Problema: che codice ci metto prima? un timestamp, un random, un numero negativo o qualcosa di simile. Quindi la soluzione è chiedi i dati all'utente -> posta a mysql. Se poi puoi permetterti di avere qualche buco, puoi usare un triggere before insert così non hai il problema del codice dummy ciauz -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 12:11:56 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 12:23:07 2007 Subject: [Db] contatore server side In-Reply-To: <459B8970.2050407@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> Message-ID: <459B8F7C.9050508@vezz.it> Marcello Vezzelli wrote: > > Siccome uso Mysql 5 ho le stored procedure, ma non le ho mai usate su > mysql... qualcuno con esperienza in merito? > Giusto per evitare di imbroccare una strada senza uscita. Dunque allora vediamo un po'. Credo che creare un trigger in BEFORE INSERT risolva la questione. CREATE TRIGGER numero_fatt BEFORE INSERT ON fatture numero = prendi l'ultimo numero di fattura e aumentalo di 1, se non ci sono fatture usa 1 SET NEW.numfatt = numero; Vedo di elaborare la sintassi della seconda riga. Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 12:16:36 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 12:28:36 2007 Subject: [Db] contatore server side In-Reply-To: <459B8F7C.9050508@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8F7C.9050508@vezz.it> Message-ID: <459B9094.1010007@pleiade.it> Marcello Vezzelli ha scritto: > Marcello Vezzelli wrote: >> >> Siccome uso Mysql 5 ho le stored procedure, ma non le ho mai usate su >> mysql... qualcuno con esperienza in merito? >> Giusto per evitare di imbroccare una strada senza uscita. > > Dunque allora vediamo un po'. > > Credo che creare un trigger in BEFORE INSERT risolva la questione. Dipende ti serve la certezza che non ci siano buchi o no? -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 12:19:47 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 12:30:55 2007 Subject: [Db] contatore server side In-Reply-To: <459B8E6B.9010001@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> Message-ID: <459B9153.1000504@vezz.it> Domenico L. wrote: > Allora le stored procedure sono molto utili ma secondo me non fanno > propriamente al caso tuo... (se non devi richiamare una procedura > passando ogni campo della tabella), meglio invece un trigger after > insert. After insert dici... quindi devo usare come chiave primaria qualcos'altro. > > Insisto sull'after perché se hai bisogno di non avere buchi di > numerazione, puoi mettere il numero solo dopo che il record è stato > inserito (metti che ti sei dimenticato un controllo o che ti salta un > constraint). Beh in tal caso al trigger before post non ci arriva... o si? Cioè mi vuoi dire che i constraint vengono valutati dopo l'esecuzione del trigger? Paura... > Un trigger afeter insert non ha il problema di accedere alla tabella > che stai modificando, ma cmq è abbastanza pesante fare una select max.... > meglio usare una tabella di appoggio con più record (tanto hai anche > l'anno) il trigger non farà altro che leggere il valore corrente, > aggiungerci uno, salvare (se il record non c'è fa una insert, si > dovrebbe poter fare tutto con un'operazione), e quindi finalmente > modificare il codice con il progressivo corretto. Quindi suggerisci una modifica "a posteriori". > > Se poi puoi permetterti di avere qualche buco, puoi usare un triggere > before insert così non hai il problema del codice dummy Ovviamente buchi non ce ne devono essere. Diciamo si gestisce lato applicazione: le fatture non si possono cancellare (ma solo modificare, il numero di fattura rimane comunque assegnato), a meno che non si voglia cancellare l'ultima inserita... in tal caso è possibile farlo. Qui bisogna capire cosa succede se "contemporaneamente" cancello l'ultima e ne inserisco una nuova... non è che una transazione vede ancora la fattura mentre l'altra l'ha già cancellata? Come si gestiscono queste situazioni imbarazzanti? Ma fare una lock table in questi casi serve a qualcosa o è una bestialità? Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 12:25:27 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 12:37:26 2007 Subject: [Db] contatore server side In-Reply-To: <459B9153.1000504@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> Message-ID: <459B92A7.5040301@pleiade.it> Marcello Vezzelli ha scritto: >> Insisto sull'after perché se hai bisogno di non avere buchi di >> numerazione, puoi mettere il numero solo dopo che il record è stato >> inserito (metti che ti sei dimenticato un controllo o che ti salta un >> constraint). > > Beh in tal caso al trigger before post non ci arriva... o si? > Cioè mi vuoi dire che i constraint vengono valutati dopo l'esecuzione > del trigger? Paura... naturalmente sì se è un trigger before > > Ovviamente buchi non ce ne devono essere. Diciamo si gestisce lato > applicazione: le fatture non si possono cancellare (ma solo > modificare, il numero di fattura rimane comunque assegnato), a meno > che non si voglia cancellare l'ultima inserita... in tal caso è > possibile farlo. > Qui bisogna capire cosa succede se "contemporaneamente" cancello > l'ultima e ne inserisco una nuova... non è che una transazione vede > ancora la fattura mentre l'altra l'ha già cancellata? Come si > gestiscono queste situazioni imbarazzanti? > Ma fare una lock table in questi casi serve a qualcosa o è una > bestialità? No mysql 5 ha il lock a livello di riga quindi tutto bene. Mi lascia un po' da pensare il concetto che è possibile cancellare l'ultima, in un ambiente concorrente il concetto di ultima è una cosa che non ci si può permettere di avere. Anche perché potrebbe diventare l'ultima di un utente... ma qui stiamo di fatto introducendo una soluzione (peraltro già vista in software di fatturazione) che le fatture vengono inserite e successivamente (dopo x giorni o manualemente) convalidate, quindi gli si assegna il numero. Ora se loro vogliono questo, ferma tutto, perché l'approccio è ben diverso, altrimenti dopo proseguo ;-) -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 12:36:59 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 12:48:08 2007 Subject: [Db] contatore server side In-Reply-To: <459B92A7.5040301@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> Message-ID: <459B955B.6090302@vezz.it> Domenico L. wrote: > >> Ma fare una lock table in questi casi serve a qualcosa o è una >> bestialità? > No mysql 5 ha il lock a livello di riga quindi tutto bene. > > Mi lascia un po' da pensare il concetto che è possibile cancellare > l'ultima, in un ambiente concorrente il concetto di ultima è una cosa > che non ci si può permettere di avere. Supponiamo che la transazione che si occupa di cancellare l'ultima fattura faccia una lock table... consideriamo la cancellazione dell'ultima fattura un evento raro e va bene gestirlo in questo modo. Se qualcuno posta durante la cancellazione, si becca un errore del tipo "table locked" e fa il rollback. Corretto? Gestendo la cosa lato applicativo, si aspetta un attimino e si riprova. Parliamo veramente di centesimi di secondo, ma la questione è concettuale quindi vale la pena discuterne... supponiamo che la cancellazione di un record duri un tempo lungo a sufficienza. Finita la transazione della cancellazione, il nuovo post otterrà correttamente il valore numfatt facendo una select dell'ultimo numero di fattura in tabella incrementato di uno. Domandone: da quanto ho letto, l'esecuzione del trigger BEFORE INSERT è atomica su ogni tabella, corretto? Ovvero il trigger gira fuori da qualsiasi transazione, quindi sono tutti sequenziali. > > Anche perché potrebbe diventare l'ultima di un utente... ma qui stiamo > di fatto introducendo una soluzione (peraltro già vista in software di > fatturazione) che le fatture vengono inserite e successivamente (dopo > x giorni o manualemente) convalidate, quindi gli si assegna il numero. > > Ora se loro vogliono questo, ferma tutto, perché l'approccio è ben > diverso, altrimenti dopo proseguo ;-) Ma non si sposta il problema e basta? Se dopo che l'ho convalidata la voglio cancellare siamo da capo... E' come dire che la vita sulla Terra veniva da Marte. E quella su Marte? :D Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 13:05:15 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 13:17:16 2007 Subject: [Db] contatore server side In-Reply-To: <459B955B.6090302@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> Message-ID: <459B9BFB.5020808@pleiade.it> Marcello Vezzelli ha scritto: > Domenico L. wrote: >> >>> Ma fare una lock table in questi casi serve a qualcosa o è una >>> bestialità? >> No mysql 5 ha il lock a livello di riga quindi tutto bene. > > >> >> Mi lascia un po' da pensare il concetto che è possibile cancellare >> l'ultima, in un ambiente concorrente il concetto di ultima è una cosa >> che non ci si può permettere di avere. > > Supponiamo che la transazione che si occupa di cancellare l'ultima > fattura faccia una lock table... consideriamo la cancellazione > dell'ultima fattura un evento raro e va bene gestirlo in questo modo. > > Se qualcuno posta durante la cancellazione, si becca un errore del > tipo "table locked" e fa il rollback. Corretto? > Gestendo la cosa lato applicativo, si aspetta un attimino e si > riprova. Parliamo veramente di centesimi di secondo, ma la questione è > concettuale quindi vale la pena discuterne... supponiamo che la > cancellazione di un record duri un tempo lungo a sufficienza. > Finita la transazione della cancellazione, il nuovo post otterrà > correttamente il valore numfatt facendo una select dell'ultimo numero > di fattura in tabella incrementato di uno. > Domandone: da quanto ho letto, l'esecuzione del trigger BEFORE INSERT > è atomica su ogni tabella, corretto? Ovvero il trigger gira fuori da > qualsiasi transazione, quindi sono tutti sequenziali. uhm.... credo tu abbia capito ma hai scritto il contrario.... allora il dml come tu ben sai deve essere atomico (ACID) Ora fare una insert (o update o delete) produce l'esecuzione atomica di: before update (con vincoli sull'accesso alla tabella) inserimento validazione constraints (salvo differimento) after update Da questa osservazione possiamo iniziare a delineare un soluzione: tabella Sequenza (id autorincremet ciclico) unica per tutto il db Before INSERT: insert into Sequenza return_isertd_id into id; set new:numfat=id; insert After Insert: delete from Sequenza where id=new.numfat; begin select id+1 into xId from fat_seq where anno=new.anno for update; #se esiste update fat_seq set id = xId where anno=new.anno; exception when no_data_found then insert into fat_Seq values(new.anno, 1); xId = 1; when others then raise; end; update fattura set numfat=xId where anno=new.anno and numfat=new.numfatt and .... ; Più o meno il codice purtroppo non sono sicuro sia corretto, però la logica dovrebbe esserci :-) ciauz -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 15:01:35 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 15:12:46 2007 Subject: [Db] contatore server side In-Reply-To: <459B9BFB.5020808@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> Message-ID: <459BB73F.5040207@vezz.it> Domenico L. wrote: > uhm.... credo tu abbia capito ma hai scritto il contrario.... ehm si non mi sono spiegato molto bene... > Da questa osservazione possiamo iniziare a delineare un soluzione: > > tabella Sequenza (id autorincremet ciclico) unica per tutto il db > > Before INSERT: > insert into Sequenza return_isertd_id into id; > set new:numfat=id; > > > insert > > > After Insert: > delete from Sequenza where id=new.numfat; > begin > select id+1 into xId > from fat_seq > where anno=new.anno for update; #se esiste > update fat_seq > set id = xId > where anno=new.anno; > exception > when no_data_found then > insert into fat_Seq values(new.anno, 1); > xId = 1; > when others then raise; > end; > > update fattura > set numfat=xId > where anno=new.anno and numfat=new.numfatt > and .... > ; > > Più o meno il codice purtroppo non sono sicuro sia corretto, però la > logica dovrebbe esserci :-) Ho capito la logica, però ci dev'essere un altro modo più pulito di fare questa cosa. Mi sembra strano che per fare una cosa relativamente semplice sia necessario ricorrere a una tabella di supporto con un campo autoincrementante. Stavo leggendo questo... http://www.onlamp.com/pub/a/onlamp/2005/02/03/triggers.html Se anziché SET @x = @x + 1 questo valore di x me lo ricavo dalla tabella con una select, non ho costruito un autoincrementante fatto col trigger? Ciao Marcello From marcello a vezz.it Wed Jan 3 15:04:50 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 15:15:59 2007 Subject: [Db] contatore server side In-Reply-To: <459BB73F.5040207@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> Message-ID: <459BB802.9060302@vezz.it> Marcello Vezzelli wrote: > > Stavo leggendo questo... > http://www.onlamp.com/pub/a/onlamp/2005/02/03/triggers.html > > Se anziché SET @x = @x + 1 questo valore di x me lo ricavo dalla > tabella con una select, non ho costruito un autoincrementante fatto > col trigger? / REMINDER:/ MySQL functions have severe limitations. For example, they can't |SELECT| from a table. Trigger activations are like function calls and are subject to the same limitations. La risposta è no. Ma che pacco è sta cosa! In questi momenti mi vien voglia di buttare tutto e ritornare a firebird. Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 15:15:23 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 15:27:26 2007 Subject: [Db] contatore server side In-Reply-To: <459BB73F.5040207@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> Message-ID: <459BBA7B.1010304@pleiade.it> Marcello Vezzelli ha scritto: > Domenico L. wrote: >> Più o meno il codice purtroppo non sono sicuro sia corretto, però >> la logica dovrebbe esserci :-) > > Ho capito la logica, però ci dev'essere un altro modo più pulito di > fare questa cosa. Beh questo modo non mi sembra molto sporco, tieni conto che stai ottenendo: - Un'unica chiamata lato applicativo - Supporto pieno delle concorrenza - Totale compatibilità con inserimento di più anni - Certezza di una numerazione consecutiva "senza buchi" (che è il grave problema) - Estrema velocità (si lavora su 2 tabelle minuscole) > Se anziché SET @x = @x + 1 questo valore di x me lo ricavo dalla > tabella con una select, non ho costruito un autoincrementante fatto > col trigger? mumble... dall'articolo si direbbe di sì, purtroppo non conosco tutte le specifiche del dialetto di mysql, ti ho proposto una soluzione "portabile" Tuttavia temo che per ogni transazine tu debba inizializzare @x... che non so se è una miglioria.. Ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From domenico.lorusso a pleiade.it Wed Jan 3 15:19:21 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 15:31:22 2007 Subject: [Db] contatore server side In-Reply-To: <459BB802.9060302@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BB802.9060302@vezz.it> Message-ID: <459BBB69.8000106@pleiade.it> Marcello Vezzelli ha scritto: > Marcello Vezzelli wrote: >> >> Stavo leggendo questo... >> http://www.onlamp.com/pub/a/onlamp/2005/02/03/triggers.html >> >> Se anziché SET @x = @x + 1 questo valore di x me lo ricavo dalla >> tabella con una select, non ho costruito un autoincrementante fatto >> col trigger? > / > REMINDER:/ MySQL functions have severe limitations. For example, they > can't |SELECT| from a table. Trigger activations are like function > calls and are subject to the same limitations. > ecco speravo non ci fosse una cavolata del genere... per ora mysql è buono solo per giocarci... speravo che con il 5 le cose fossero migliorate ma siamo ancora piuttosto lontani da soluzioni apprezzabili... c'è tanto zucchero e poca sostanza Non so se dirti di provare a guardare i limiti delle procedure... -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Wed Jan 3 15:26:56 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Wed Jan 3 15:38:05 2007 Subject: [Db] contatore server side In-Reply-To: <459BBA7B.1010304@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BBA7B.1010304@pleiade.it> Message-ID: <459BBD30.2040505@vezz.it> Domenico L. wrote: > >> Ho capito la logica, però ci dev'essere un altro modo più pulito di >> fare questa cosa. > Beh questo modo non mi sembra molto sporco, tieni conto che stai > ottenendo: Scusa non volevo dire "pulito", volevo dire semplice, compatto. >> Se anziché SET @x = @x + 1 questo valore di x me lo ricavo dalla >> tabella con una select, non ho costruito un autoincrementante fatto >> col trigger? > mumble... dall'articolo si direbbe di sì, purtroppo non conosco tutte > le specifiche del dialetto di mysql, ti ho proposto una soluzione > "portabile" > > Tuttavia temo che per ogni transazine tu debba inizializzare @x... che > non so se è una miglioria.. E alla fine non si può fare perché le select nei trigger non funzionano. Mi sembra surreale che nessuno abbia sviscerato una problematica così frequente... non sono riuscito a trovare uno straccio di howto. Ma la gente con mysql ci fa solo i forum e i log oppure anche qualche applicazione seria? Mi stan venendo dei dubbi. Ciao Marcello From domenico.lorusso a pleiade.it Wed Jan 3 15:50:04 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 3 16:02:03 2007 Subject: [Db] contatore server side In-Reply-To: <459BBD30.2040505@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BBA7B.1010304@pleiade.it> <459BBD30.2040505@vezz.it> Message-ID: <459BC29C.90003@pleiade.it> Marcello Vezzelli ha scritto: > > Ma la gente con mysql ci fa solo i forum e i log oppure anche qualche > applicazione seria? Mi stan venendo dei dubbi. Se può consolarti anche oracle fino alla versione 8 (mi sembra) non supportava il dlm nelle funzioni... detto questo la versione 8i ha ormai quasi 10 anni... se poi pensi che altri dbms gratuiti danno questo supporto... -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From domenico.lorusso a pleiade.it Thu Jan 4 17:41:03 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Thu Jan 4 17:53:16 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date Message-ID: <459D2E1F.7050903@pleiade.it> Ciao ragazzi, sto usando mysql :-( e sto usando la 4.0 :-(:'( Devo calcolare se una data memorizzata nel db è più vecchia di x minuti dall'istante della query... Ora data_diff l'hanno aggiunto nella 4.1, che mi suggerite? -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From matteo.giacomazzi a gmail.com Thu Jan 4 17:49:24 2007 From: matteo.giacomazzi a gmail.com (Matteo Giacomazzi) Date: Thu Jan 4 18:04:28 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date In-Reply-To: <459D2E1F.7050903@pleiade.it> References: <459D2E1F.7050903@pleiade.it> Message-ID: 2007/1/4, Domenico L. : > Ciao ragazzi, > sto usando mysql :-( e sto usando la 4.0 :-(:'( > > Devo calcolare se una data memorizzata nel db è più vecchia di x minuti > dall'istante della query... > > Ora data_diff l'hanno aggiunto nella 4.1, che mi suggerite? Usa NOW() e UNIX_TIMESTAMP(), dovrebbero restituire la data nello stesso formato espresso in secondi dal 1 gennaio 1970. -- Matteo From cristiano a verondini.it Sun Jan 7 15:34:03 2007 From: cristiano a verondini.it (Cristiano Verondini) Date: Sun Jan 7 15:49:43 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date In-Reply-To: <459D2E1F.7050903@pleiade.it> References: <459D2E1F.7050903@pleiade.it> Message-ID: <0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> On 04/gen/07, at 17:41, Domenico L. wrote: > sto usando mysql :-( e sto usando la 4.0 :-(:'( > > Devo calcolare se una data memorizzata nel db è più vecchia di x > minuti dall'istante della query... > Ora data_diff l'hanno aggiunto nella 4.1, che mi suggerite? Io userei le funzioni di conversione delle date in timestamp e farei una differenza con NOW() ottenendo un valore in secondi ... Cris -- Cristiano Verondini http://www.verondini.it --- [ICQ 114 190] From dierre a dierrelabs.org Sun Jan 7 15:42:49 2007 From: dierre a dierrelabs.org (DierRe) Date: Sun Jan 7 15:58:25 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date In-Reply-To: <0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> References: <459D2E1F.7050903@pleiade.it> <0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> Message-ID: <2f5f89560701070642j2f5d8110k8c96d41d78ac9366@mail.gmail.com> Il 07/01/07, Cristiano Verondini ha scritto: > > > On 04/gen/07, at 17:41, Domenico L. wrote: > > > sto usando mysql :-( e sto usando la 4.0 :-(:'( > > > > Devo calcolare se una data memorizzata nel db è più vecchia di x > > minuti dall'istante della query... > > Ora data_diff l'hanno aggiunto nella 4.1, che mi suggerite? > > Io userei le funzioni di conversione delle date in timestamp e > farei > una differenza con NOW() ottenendo un valore in secondi ... > > Cris > > -- > Cristiano Verondini > http://www.verondini.it --- [ICQ 114 190] > > > > > > _______________________________________________ > Db mailing list > Db@lists.ziobudda.net > http://lists.ziobudda.net/mailman/listinfo/db > questa è una quesry che ho usato un pò di tempo fa: SELECT * FROM table WHERE to_days(NOW())-to_days(date)<=7 ORDER BY date -- www . dierrelabs . org -------------- parte successiva -------------- Un allegato HTML è stato rimosso... URL: http://lists.ziobudda.net/pipermail/db/attachments/20070107/dd8bef42/attachment.htm From domenico.lorusso a pleiade.it Mon Jan 8 09:42:36 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Mon Jan 8 09:55:23 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date In-Reply-To: <0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> References: <459D2E1F.7050903@pleiade.it> <0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> Message-ID: <45A203FC.9020902@pleiade.it> Cristiano Verondini ha scritto: > > Io userei le funzioni di conversione delle date in timestamp e > farei una differenza con NOW() ottenendo un valore in secondi ... > scusa tipo? io ho provato a fare select now()-mydate from mytab ma il risultato non è che sia molto chiaro... -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From cristiano a verondini.it Mon Jan 8 15:05:04 2007 From: cristiano a verondini.it (Cristiano Verondini) Date: Mon Jan 8 15:21:24 2007 Subject: [Db] [MySql4.0] Calcolare differenza di due date References: <459D2E1F.7050903@pleiade.it><0BB2E17F-3DCE-4894-B7DF-651168D2BCAC@verondini.it> <45A203FC.9020902@pleiade.it> Message-ID: <005a01c7332e$028373f0$6301a8c0@IdeaFutura.local> >> Io userei le funzioni di conversione delle date in timestamp e >> farei una differenza con NOW() ottenendo un valore in secondi ... > scusa tipo? io ho provato a fare > select now()-mydate from mytab UNIX_TIMESTAMP() - UNIX_TIMESTAMP(mydate) Ottieni un valore in secondi pari alla differenza fra l'istante in cui esegui l'istruzione ed il valore contenuto nella colonna 'mydate'. -- Cristiano Verondini http://www.verondini.it --- [ICQ: 114 190] From michel a ziobudda.net Thu Jan 11 17:48:00 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Thu Jan 11 18:07:14 2007 Subject: [Db] Mysql e calcoli in virgola mobile Message-ID: <45A66A40.8070502@ziobudda.net> Ciao all. Ho una tabella utenti con un campo U cosi' definito: `U` float NOT NULL default '0', Ora guardate cosa seccede: mysql> update Utenti set U = 0; Query OK, 1 row affected (0.00 sec) Rows matched: 29 Changed: 1 Warnings: 0 mysql> update Utenti set U = 0.01 where id_u = 141; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select U from Utenti where id_u = 141; +------+ | U | +------+ | 0.01 | +------+ 1 row in set (0.00 sec) mysql> select MAX(U) from Utenti; +--------------------+ | MAX(U) | +--------------------+ | 0.0099999997764826 | +--------------------+ 1 row in set (0.00 sec) Che qualcuno mi spieghi cosa combina MySQL. Anche perche' mi sballa tutti i conti cosi' facendo. M. -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From michel a ziobudda.net Thu Jan 11 17:51:50 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Thu Jan 11 18:08:05 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66A40.8070502@ziobudda.net> References: <45A66A40.8070502@ziobudda.net> Message-ID: <45A66B26.6010805@ziobudda.net> Davide Michel 'ZioBudda' Morelli ha scritto: > Ciao all. Ho una tabella utenti con un campo U cosi' definito: > > `U` float NOT NULL default '0', > Solo una aggiunta. Modificando U da float a decimal(10,2) i risultati sono corretti. M. -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From marcello a vezz.it Thu Jan 11 17:53:21 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Thu Jan 11 18:09:49 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66A40.8070502@ziobudda.net> References: <45A66A40.8070502@ziobudda.net> Message-ID: <45A66B81.502@vezz.it> Davide Michel 'ZioBudda' Morelli wrote: > Ciao all. Ho una tabella utenti con un campo U cosi' definito: > > `U` float NOT NULL default '0', Usa double oppure decimal, che hanno precisione maggiore. Gli arrotondamenti sono dovuti alla rappresentazione interna dei numeri in virgola mobile. Ciao Marcello From matteo a xelefant.com Thu Jan 11 17:53:28 2007 From: matteo a xelefant.com (Tinazzi Matteo) Date: Thu Jan 11 18:10:14 2007 Subject: [Db] Mysql e calcoli in virgola mobile References: <45A66A40.8070502@ziobudda.net> Message-ID: <012901c735a1$05861ab0$7500a8c0@Matteo> Davide Michel 'ZioBudda' Morelli wrote: >> Ciao all. Ho una tabella utenti con un campo U cosi' definito: >> >> `U` float NOT NULL default '0', >> >> Ora guardate cosa seccede: >> >> mysql> update Utenti set U = 0; >> Query OK, 1 row affected (0.00 sec) >> Rows matched: 29 Changed: 1 Warnings: 0 >> >> mysql> update Utenti set U = 0.01 where id_u = 141; >> Query OK, 1 row affected (0.00 sec) >> Rows matched: 1 Changed: 1 Warnings: 0 >> >> mysql> select U from Utenti where id_u = 141; >> +------+ >>> U | >> +------+ >>> 0.01 | >> +------+ >> 1 row in set (0.00 sec) >> >> mysql> select MAX(U) from Utenti; >> +--------------------+ >>> MAX(U) | >> +--------------------+ >>> 0.0099999997764826 | >> +--------------------+ >> 1 row in set (0.00 sec) >> >> >> Che qualcuno mi spieghi cosa combina MySQL. Anche perche' mi sballa >> tutti i conti cosi' facendo. >> >> M. >> la spiegazione precisa non la ricordo ma si tratta di problemi di arrotondamenti, piuttosto che il tipo float usa il decimal che salva il valore come stringa >> -- >> Michel 'ZioBudda' Morelli michel@ziobudda.net >> Consulenza sistemistica in ambito OpenSource. >> Sviluppo applicazioni web dinamiche (LAMP+Ajax) >> Telefono: +39-0240706096 -- Fax: +39-0291390660 >> Cellulare: +39-3939890025 >> >> http://www.ziobudda.net ICQ: 58351764 >> http://www.ziobuddalabs.it Skype: zio_budda >> http://www.ajaxblog.it >> >> > > > > _______________________________________________ > Db mailing list > Db@lists.ziobudda.net > http://lists.ziobudda.net/mailman/listinfo/db ------------------------------------ Tinazzi Matteo X-Elefant Software s.r.l. Via Treviso 61/13 31057 Silea (Treviso) ICQ# 71-883-066 ------------------------------------ From michel a ziobudda.net Thu Jan 11 17:58:44 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Thu Jan 11 18:15:11 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66B81.502@vezz.it> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> Message-ID: <45A66CC4.9040803@ziobudda.net> Marcello Vezzelli ha scritto: > > Usa double oppure decimal, che hanno precisione maggiore. Devo iniziare a ricredermi su mysql ? > Gli arrotondamenti sono dovuti alla rappresentazione interna dei > numeri in virgola mobile. Se sballa per cosi' poco non oso immaginare per numeri piu' complessi. M. -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From marcello a vezz.it Thu Jan 11 18:03:15 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Thu Jan 11 18:19:40 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66CC4.9040803@ziobudda.net> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> Message-ID: <45A66DD3.7080101@vezz.it> Davide Michel 'ZioBudda' Morelli wrote: > Marcello Vezzelli ha scritto: >> >> Usa double oppure decimal, che hanno precisione maggiore. > > Devo iniziare a ricredermi su mysql ? Mah, in meglio o in peggio? :) > >> Gli arrotondamenti sono dovuti alla rappresentazione interna dei >> numeri in virgola mobile. > > Se sballa per cosi' poco non oso immaginare per numeri piu' complessi. Il "così poco" è un concetto che non esiste nella rappresentazione dei numeri in virgola mobile con esponente e mantissa... la differenza tra due numeri "consecutivi" dipende esclusivamente dalla precisione. Se ci sono alcune conversioni double->float e viceversa nei vari passaggi che fa mysql, si possono introdurre errori di rappresentazione come quello che hai visto tu. La cosa migliore da fare è usare la miglior precisione disponibile (qualora non ci siano controindicazioni) e comunque utilizzare sempre numeri arrotondati alla n-esima cifra significativa. Questo riduce di molto gli errori di rappresentazione. Quello 0.0099999997764826 che ti trovi, se lo tratti come round(0.0099999997764826 * 1000) /1000 ti dà un bel 0.01 come ti aspetti. Non è un problema di mysql ma è un problema dei numeri floating point. Saluti Marcello From michel a ziobudda.net Thu Jan 11 18:05:40 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Thu Jan 11 18:21:55 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66DD3.7080101@vezz.it> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> <45A66DD3.7080101@vezz.it> Message-ID: <45A66E64.50402@ziobudda.net> Marcello Vezzelli ha scritto: > Il "così poco" è un concetto che non esiste nella rappresentazione dei > numeri in virgola mobile con esponente e mantissa... la differenza tra > due numeri "consecutivi" dipende esclusivamente dalla precisione. Si scusa, hai ragione. M. -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-0240706096 -- Fax: +39-0291390660 Cellulare: +39-3939890025 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From matteo.giacomazzi a gmail.com Thu Jan 11 18:29:15 2007 From: matteo.giacomazzi a gmail.com (Matteo Giacomazzi) Date: Thu Jan 11 18:45:38 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66DD3.7080101@vezz.it> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> <45A66DD3.7080101@vezz.it> Message-ID: 2007/1/11, Marcello Vezzelli : > > Se sballa per cosi' poco non oso immaginare per numeri piu' complessi. > > Il "così poco" è un concetto che non esiste nella rappresentazione dei > numeri in virgola mobile con esponente e mantissa... Non vorrei sbagliarmi ma, pure un numero che potrebbe apparire "semplice" (con tutte le virgolette del caso) quale 0.1 non è rappresentabile con un numero finito di cifre in binario (tuttavia forse presenta periodo, ma non ricordo...). -- Matteo From st.jonathan a gmail.com Thu Jan 11 22:29:55 2007 From: st.jonathan a gmail.com (Jonathan Stoppani) Date: Thu Jan 11 22:46:23 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A66CC4.9040803@ziobudda.net> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> Message-ID: On Jan 11, 2007, at 5:58 , Davide Michel 'ZioBudda' Morelli wrote: >> Gli arrotondamenti sono dovuti alla rappresentazione interna dei >> numeri in virgola mobile. > > Se sballa per cosi' poco non oso immaginare per numeri piu' complessi. > > M. http://www.ds-o.com/archives/61-81.4-is-evil.html ;) Best Regards, Jonathan Stoppani --------------------------------- ICQ: 322754291 AIM: garetjax@mac.com MSN+GTalk: st.jonathan@gmail.com From domenico.lorusso a pleiade.it Fri Jan 12 09:49:54 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Fri Jan 12 10:03:19 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> <45A66DD3.7080101@vezz.it> Message-ID: <45A74BB2.5070704@pleiade.it> Matteo Giacomazzi ha scritto: > 2007/1/11, Marcello Vezzelli : >> > Se sballa per cosi' poco non oso immaginare per numeri piu' complessi. >> >> Il "così poco" è un concetto che non esiste nella rappresentazione dei >> numeri in virgola mobile con esponente e mantissa... > > Nel sistema decimale se il dividendo è composto dal prodotto di esponenti di 2 e 5 il risultato è finito In tutti gli altri casì è periodico. Più in generale in un sistema N-ario sono finito i risultati che hanno come divisore un numero composto da esponenti dei suoi componenti primi. Cioè in un sistema ternario 1/3 =0.1 in un sistema a base 30 1/90 è un un numero finito Per tornare al topic solitamente usare float in una base di dati non ha molto senso... meglio avere i decimal con una precisione definita (al più superiore alle aspetative) Ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From matteo.giacomazzi a gmail.com Fri Jan 12 10:19:37 2007 From: matteo.giacomazzi a gmail.com (Matteo Giacomazzi) Date: Fri Jan 12 10:36:09 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: <45A74BB2.5070704@pleiade.it> References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> <45A66DD3.7080101@vezz.it> <45A74BB2.5070704@pleiade.it> Message-ID: > Per tornare al topic solitamente usare float in una base di dati non ha > molto senso... meglio avere i decimal con una precisione definita (al > più superiore alle aspetative) Io credo si tratti, come spesso accade, di un compromesso: se non devi far fare (troppi) calcoli al DB, il decimal può andare. Ma in caso contrario meglio lavorare di approssimazioni - se consentite - piuttosto che inchiodare il db. -- Matteo From michel a ziobudda.net Fri Jan 12 10:25:43 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Fri Jan 12 10:42:04 2007 Subject: [Db] Mysql e calcoli in virgola mobile In-Reply-To: References: <45A66A40.8070502@ziobudda.net> <45A66B81.502@vezz.it> <45A66CC4.9040803@ziobudda.net> <45A66DD3.7080101@vezz.it> <45A74BB2.5070704@pleiade.it> Message-ID: <45A75417.9040205@ziobudda.net> Matteo Giacomazzi ha scritto: > Io credo si tratti, come spesso accade, di un compromesso: se non devi > far fare (troppi) calcoli al DB, il decimal può andare. Ma in caso > contrario meglio lavorare di approssimazioni - se consentite - > piuttosto che inchiodare il db. Il decimal va piu' che bene. :) -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-3939890025 -- Fax: +39-0291390660 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From marcello a vezz.it Fri Jan 12 10:38:24 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Fri Jan 12 10:54:59 2007 Subject: [Db] query con sostituzione testo Message-ID: <45A75710.6060805@vezz.it> Ciao a tutti, ho un campo che contiene un elenco di flag (A,B,C...) sottoforma di varchar. E' possibile fare una query che elimina un determinato flag per un gruppo di record? E se volessi aggiungere un flag a un gruppo di record? Il database è mysql 5.0, tabelle innodb. Saluti Marcello From graz a easynavy.com Fri Jan 12 10:52:44 2007 From: graz a easynavy.com (graz) Date: Fri Jan 12 11:09:11 2007 Subject: [Db] Domandina semplice In-Reply-To: <45A75710.6060805@vezz.it> Message-ID: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it) Ciao alla lista, Ho una domandina che per voi dovrebbe essere semplice semplice. Solo a tempo perso sviluppo scriptini personali ed ora non riesco a trovare la risposta alla seguente domanda: Su Mysql 4 quale comando devo usare per estrarre e visualizzare il numero di tutti i records di una tabella a condizione che si crei un presupposto, ovvero dovrei estrarre solo il numero di records segnalati in un campo chiamato appunto segnalato. Se il valore di quel campo è 1 deve calcolarlo altrimenti se è 0 no. $result= mysql_query("SELECT * FROM tabella WHERE segnalato ORDER BY nome ASC limit $start,$rec_pagina"); Poi per calcolare il numero ho usato: $num_segnalati= mysql_num_fields($result); Ma non li calcola tutti. Ho provato anche altri modi ed anche con WHERE segnalato=1 ma sempre senza successo. Mi serve solo per scrivere il numero dei prodotti segnalati presenti in quella tabella. Grazie a tutti per eventuali aiuti e buon lavoro. Graz From marcello a vezz.it Fri Jan 12 10:55:46 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Fri Jan 12 11:12:24 2007 Subject: [Db] Domandina semplice In-Reply-To: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it) References: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it) Message-ID: <45A75B22.3010107@vezz.it> graz wrote: > $result= mysql_query("SELECT * FROM tabella WHERE segnalato ORDER BY nome > ASC limit $start,$rec_pagina"); > Poi per calcolare il numero ho usato: > > > $num_segnalati= mysql_num_fields($result); > Devi usare mysql_num_rows per una select. Dal manuale php: int *mysql_num_rows* ( resource result ) Retrieves the number of rows from a result set. This command is only valid for statements like SELECT or SHOW that return an actual result set. To retrieve the number of rows affected by a INSERT, UPDATE, or DELETE query, use *mysql_affected_rows()* . Ciao Marcello From graz a easynavy.com Fri Jan 12 11:22:24 2007 From: graz a easynavy.com (graz) Date: Fri Jan 12 11:38:59 2007 Subject: R: [Db] Domandina semplice In-Reply-To: <45A75B22.3010107@vezz.it> Message-ID: <458A7C08001FFECF@mail-relay-3.tiscali.it> (added by postmaster@mail-relay-3.tiscali.it) >>Devi usare mysql_num_rows per una select. Ciao Marcello, grazie per la risposta. Hai ragione ovviamente ed in effetti inizialmente ho provato proprio con quello, ma tuttavia mi dava un numero completamente sballato e nettamente inferiore, pertanto ho provato altre strade..a casaccio. Mi fa un numero molto inferiore ovvero 4 al posto di 48 presenti con tale condizione. $num_segnalato = mysql_num_rows($result); Qualcuno riesce a capire il perché? Boh farò ancora qualche prova Grazie ancora Ciao graz From d.bovolenta a multimedia-novara.it Fri Jan 12 11:26:59 2007 From: d.bovolenta a multimedia-novara.it (Davide Enrico Bovolenta) Date: Fri Jan 12 11:45:47 2007 Subject: [Db] Domandina semplice In-Reply-To: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it> Message-ID: > Da: graz > Risposta: "DB è la Mailing List dedicata a tutto quello che riguarda i > DataBase." > Data: Fri, 12 Jan 2007 10:52:44 +0100 > A: "'DB è la Mailing List dedicata a tutto quello che riguarda i DataBase.'" > > Oggetto: [Db] Domandina semplice > > Ciao alla lista, > > Ho una domandina che per voi dovrebbe essere semplice semplice. > Solo a tempo perso sviluppo scriptini personali ed ora non riesco a trovare > la risposta alla seguente domanda: > > Su Mysql 4 quale comando devo usare per estrarre e visualizzare il numero di > tutti i records di una tabella a condizione che si crei un presupposto, > ovvero dovrei estrarre solo il numero di records segnalati in un campo > chiamato appunto segnalato. > Se il valore di quel campo è 1 deve calcolarlo altrimenti se è 0 no. > > $result= mysql_query("SELECT * FROM tabella WHERE segnalato ORDER BY nome > ASC limit $start,$rec_pagina"); > Poi per calcolare il numero ho usato: Prova con: select count(*) as NUMERO_CHE_TI_SERVE from tabella WHERE la_o_le_condizioni_che_ti_interessano > > $num_segnalati= mysql_num_fields($result); > Ma non li calcola tutti. > Ho provato anche altri modi ed anche con WHERE segnalato=1 ma sempre senza > successo. > > Mi serve solo per scrivere il numero dei prodotti segnalati presenti in > quella tabella. > > Grazie a tutti per eventuali aiuti e buon lavoro. > > Graz > > _______________________________________________ > Db mailing list > Db@lists.ziobudda.net > http://lists.ziobudda.net/mailman/listinfo/db > From cristiano a verondini.it Fri Jan 12 11:32:05 2007 From: cristiano a verondini.it (Cristiano Verondini) Date: Fri Jan 12 11:48:31 2007 Subject: [Db] Domandina semplice In-Reply-To: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it) References: <459E6CCE000B8345@mail-relay-2.tiscali.it> (added by postmaster@mail-relay-2.tiscali.it) Message-ID: <3BE91AB4-A297-498D-BB50-DAA8E6999C09@verondini.it> On 12/gen/07, at 10:52, graz wrote: > Su Mysql 4 quale comando devo usare per estrarre e visualizzare il > numero di > tutti i records di una tabella a condizione che si crei un > presupposto, > ovvero dovrei estrarre solo il numero di records segnalati in un campo > chiamato appunto segnalato. > Se il valore di quel campo è 1 deve calcolarlo altrimenti se è 0 no. > > $result= mysql_query("SELECT * FROM tabella WHERE segnalato ORDER > BY nome > ASC limit $start,$rec_pagina"); Puoi usare direttamente il DB per avere la soluzione: SELECT COUNT(*) FROM tabella WHERE segnalato = 1 -- qui ci va una condizione logica, meglio non fare affidamento sulle conversioni implicite Ovviamente da PHP dovrai recuperare il risultato con le opportune funzioni mysql. Cris -- Cristiano Verondini http://www.verondini.it --- [ICQ 114 190] From matteo.giacomazzi a gmail.com Fri Jan 12 11:36:51 2007 From: matteo.giacomazzi a gmail.com (Matteo Giacomazzi) Date: Fri Jan 12 11:53:22 2007 Subject: [Db] Domandina semplice In-Reply-To: <3BE91AB4-A297-498D-BB50-DAA8E6999C09@verondini.it> References: <459E6CCE000B8345@mail-relay-2.tiscali.it> <3BE91AB4-A297-498D-BB50-DAA8E6999C09@verondini.it> Message-ID: Il 12/01/07, Cristiano Verondini ha scritto: > > Se il valore di quel campo è 1 deve calcolarlo altrimenti se è 0 no. > Puoi usare direttamente il DB per avere la soluzione: > > SELECT COUNT(*) > FROM tabella > WHERE segnalato = 1 -- qui ci va una condizione logica, meglio > non fare affidamento sulle conversioni implicite > > Ovviamente da PHP dovrai recuperare il risultato con le opportune > funzioni mysql. Viste le premesse: SELECT SUM(segnalato) FROM tabella dovrebbe andare! :-) -- Matteo From d.bovolenta a multimedia-novara.it Fri Jan 12 11:40:33 2007 From: d.bovolenta a multimedia-novara.it (Davide Enrico Bovolenta) Date: Fri Jan 12 11:59:22 2007 Subject: [Db] Domandina semplice In-Reply-To: <3BE91AB4-A297-498D-BB50-DAA8E6999C09@verondini.it> Message-ID: > Da: Cristiano Verondini > Risposta: "DB è la Mailing List dedicata a tutto quello che riguarda i > DataBase." > Data: Fri, 12 Jan 2007 11:32:05 +0100 > A: "DB è la Mailing List dedicata a tutto quello che riguarda i DataBase." > > Oggetto: Re: [Db] Domandina semplice > > > On 12/gen/07, at 10:52, graz wrote: > >> Su Mysql 4 quale comando devo usare per estrarre e visualizzare il >> numero di >> tutti i records di una tabella a condizione che si crei un >> presupposto, >> ovvero dovrei estrarre solo il numero di records segnalati in un campo >> chiamato appunto segnalato. >> Se il valore di quel campo è 1 deve calcolarlo altrimenti se è 0 no. >> >> $result= mysql_query("SELECT * FROM tabella WHERE segnalato ORDER >> BY nome >> ASC limit $start,$rec_pagina"); > > Puoi usare direttamente il DB per avere la soluzione: > > SELECT COUNT(*) > FROM tabella > WHERE segnalato = 1 -- qui ci va una condizione logica, meglio > non fare affidamento sulle conversioni implicite Appunto come ho suggerito. A me funziona. :) > > Ovviamente da PHP dovrai recuperare il risultato con le opportune > funzioni mysql. > > Cris > > -- > Cristiano Verondini > http://www.verondini.it --- [ICQ 114 190] > > > > > > _______________________________________________ > Db mailing list > Db@lists.ziobudda.net > http://lists.ziobudda.net/mailman/listinfo/db > From aldobertoldini a gmail.com Fri Jan 12 11:48:02 2007 From: aldobertoldini a gmail.com (aldo bertoldini) Date: Fri Jan 12 12:04:34 2007 Subject: [Db] query con sostituzione testo In-Reply-To: <45A75710.6060805@vezz.it> References: <45A75710.6060805@vezz.it> Message-ID: <90b890c90701120248t44f034a2h478489505d971f31@mail.gmail.com> Il 12/01/07, Marcello Vezzelli ha scritto: > Ciao a tutti, > ho un campo che contiene un elenco di flag (A,B,C...) sottoforma di varchar. > E' possibile fare una query che elimina un determinato flag per un > gruppo di record? > E se volessi aggiungere un flag a un gruppo di record? http://dev.mysql.com/doc/refman/5.0/en/string-functions.html replace From domenico.lorusso a pleiade.it Fri Jan 19 17:49:08 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Fri Jan 19 18:14:18 2007 Subject: [Db] Ottimizzare query Message-ID: <45B0F684.2060107@pleiade.it> Ciao ragazzi, ho una query un po' particolare. - La struttura (è così e me la devo tenere) prevede che ci siano dei giochi ad ogni gioco è assegnato un idGioco. - Ad ogni gioco partecipa una squadra (idSquadra) - Ogni squadra è composta da 1 a n giocatori (idPartecipante), e da qualche spettatore che però non ha diritto a fare nulla (posizione=membro). - Per ogni gioco vengono fatte delle richieste (idRichiesta) cui deve rispondere la squadra nel suo insieme (inviocongiusto='si'), nella figura del capo, oppure singolarmente ogni partecipante (inviocongiusto='si') - Ad ogni richiesta deve corrispondere una risposta, per ogni partecipante (se inviocongiunto=no) o solo per il capogruppo (se inviocongiunto=si) Allora questa query dovrebbe estrarmi tutte le richieste con le corrispondenti risposte e, se questa non c'è, avrò un idRisposte a null select [elenco campi] from ( richieste r inner join partecipanti t on (r.idGioco=t.idGioco) ) left join risposte s on ( r.idrichieste = s.idrichieste and t.idPartecipante = s.idPartecipante and s.completo >= '0' and t.squadra=s.t.squadra ) where t.squadra = 30 and r.idGioco = 108 and (t.capogruppo=1 or (r.inviocongiunto='no' and t.posizione='membro' ) ) and [condizioni filtro richiesta] Ho fatto un po' di test e sembra funzionare, ma quello su cui mi interrogo è se non sarebbe più opportuno (e possibile) spostare and (t.capogruppo=1 or (r.inviocongiunto='no' and t.posizione='membro' ) ) all'interno del join: left join risposte s on ( r.idrichieste = s.idrichieste and t.idPartecipante = s.idPartecipante and s.completo >= '0' and t.squadra=s.t.squadra and (t.capogruppo=1 or (r.inviocongiunto='no' and t.posizione='membro' ) ) ) Cosa ne pensate? Ciao! -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From gianiaz a gianiaz.net Fri Jan 19 18:28:33 2007 From: gianiaz a gianiaz.net (Giovanni Battista Lenoci) Date: Fri Jan 19 18:55:57 2007 Subject: [Db] Test Message-ID: <45B0FFC1.1030007@gianiaz.net> Faccio un test, vorrei capire se la ML di php è giù o se sono io.... -- gianiaz.net di Giovanni Battista Lenoci P.le Bertacchi 66 23100 Sondrio cell. +39.392.7096936 From michel a ziobudda.net Fri Jan 19 19:13:49 2007 From: michel a ziobudda.net (Davide Michel 'ZioBudda' Morelli) Date: Fri Jan 19 19:41:09 2007 Subject: [Db] Test In-Reply-To: <45B0FFC1.1030007@gianiaz.net> References: <45B0FFC1.1030007@gianiaz.net> Message-ID: <45B10A5D.8040105@ziobudda.net> Giovanni Battista Lenoci ha scritto: > Faccio un test, vorrei capire se la ML di php è giù o se sono io.... veramente hai scritto alla ML del DB :) E comunque la ML del php funziona. Almeno, l'ultimo messaggio è delle 14.42 M -- Michel 'ZioBudda' Morelli michel@ziobudda.net Consulenza sistemistica in ambito OpenSource. Sviluppo applicazioni web dinamiche (LAMP+Ajax) Telefono: +39-3939890025 -- Fax: +39-0291390660 http://www.ziobudda.net ICQ: 58351764 http://www.ziobuddalabs.it Skype: zio_budda http://www.ajaxblog.it From marcello a vezz.it Tue Jan 23 12:35:04 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 23 12:53:43 2007 Subject: [Db] passare da mysql a sql server 2000 Message-ID: <45B5F2E8.1060603@vezz.it> Ciao a tutti, per ridere mi hanno chiesto di convertire un portale custom sviluppato in php (con tante belle mysql_query) per farlo funzionare con sql server come database. Qualcuno ha già affrontato una problematica simile? Qualche consiglio? Non vorrei usare pear... Com'è la compatibilità sql tra mysql e mssql? Mi dovrò anche riscrivere metà delle query? Saluti Marcello From domenico.lorusso a pleiade.it Tue Jan 23 12:44:29 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Tue Jan 23 12:59:39 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B5F2E8.1060603@vezz.it> References: <45B5F2E8.1060603@vezz.it> Message-ID: <45B5F51D.8080701@pleiade.it> Marcello Vezzelli ha scritto: > > Com'è la compatibilità sql tra mysql e mssql? Mi dovrò anche > riscrivere metà delle query? > solo se hai usato sintassi proprietarie, per esempio (meno banale di quello che può sembrare) select mioCampo from miatabella where .... fetch associativo echo $record['mioCampo']; non è standard, mssql potrebbe convertire il campo tutto in minuscolo... (non ricordo come lo converte :-( ) se avessi fatto: select mioCampo "mioCampo" from miatabella where .... la cosa funzionerebbe cmq Questo è solo un esempio per farti capire la portata del problema -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Tue Jan 23 12:45:19 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 23 13:04:04 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B5F51D.8080701@pleiade.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> Message-ID: <45B5F54F.4000407@vezz.it> Domenico L. wrote: > Marcello Vezzelli ha scritto: >> >> Com'è la compatibilità sql tra mysql e mssql? Mi dovrò anche >> riscrivere metà delle query? >> > non è standard, mssql potrebbe convertire il campo tutto in > minuscolo... (non ricordo come lo converte :-( ) tutte le tabelle e i campi sono alfanumerici in minuscolo, come unico carattere aggiuntivo l'underscore. Questo problema dovrei schivarmelo.. sai di altre rogne? Grazie ciao Marcello From domenico.lorusso a pleiade.it Tue Jan 23 13:16:06 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Tue Jan 23 13:31:13 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B5F54F.4000407@vezz.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> <45B5F54F.4000407@vezz.it> Message-ID: <45B5FC86.2040701@pleiade.it> Marcello Vezzelli ha scritto: > Domenico L. wrote: >> Marcello Vezzelli ha scritto: >>> >>> Com'è la compatibilità sql tra mysql e mssql? Mi dovrò anche >>> riscrivere metà delle query? >>> >> non è standard, mssql potrebbe convertire il campo tutto in >> minuscolo... (non ricordo come lo converte :-( ) > > tutte le tabelle e i campi sono alfanumerici in minuscolo, come unico > carattere aggiuntivo l'underscore. > Questo problema dovrei schivarmelo.. E sqlserver trasformasse tutto in maiuscolo (come fa Oracle)? > > sai di altre rogne? hai usato funzioni mysql? conversione delle date, concatenamento delle stringhe... la limit che mi sembra sia specifica di mysql... per il resto mssql è più evoluto di mysql quindi non dovresti avere problemi.... occhio alle insert condizionali (se c'è il record fai un update altrimenti una insert) queste sono credo le cose più grosse. Qualcosa devi cambiare di sicuro, ma a parte questo.. ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From marcello a vezz.it Tue Jan 23 14:00:45 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 23 14:19:27 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B5FC86.2040701@pleiade.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> <45B5F54F.4000407@vezz.it> <45B5FC86.2040701@pleiade.it> Message-ID: <45B606FD.4070100@vezz.it> Domenico L. wrote: > >> tutte le tabelle e i campi sono alfanumerici in minuscolo, come unico >> carattere aggiuntivo l'underscore. >> Questo problema dovrei schivarmelo.. > E sqlserver trasformasse tutto in maiuscolo (come fa Oracle)? Paura! Devo fare un po' di prove. > usato funzioni mysql? conversione delle date, concatenamento delle > stringhe... non in questo progetto... > la limit che mi sembra sia specifica di mysql... per il resto mssql è > più evoluto di mysql quindi non dovresti avere problemi.... limit ce ne sono varie, ma ho visto che c'è l'equivalente mssql... > occhio alle insert condizionali (se c'è il record fai un update > altrimenti una insert) fatte "a mano" lato php separando le query di insert da quelle di update. > > queste sono credo le cose più grosse. Qualcosa devi cambiare di > sicuro, ma a parte questo.. Il funzionamento degli autoincrementati dovrebbe essere lo stesso... però non vedo la mssql_insert_id()... nè qualcosa che le assomigli! Ho letto un po' in giro e sembra che l'oggetto result abbia una proprietà insert_ID() che contiene l'ultimo id autoincrementante... Ti torna? Grazie mille delle dritte. Saluti Marcello From marcello a vezz.it Tue Jan 23 14:39:06 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 23 14:57:43 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B606FD.4070100@vezz.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> <45B5F54F.4000407@vezz.it> <45B5FC86.2040701@pleiade.it> <45B606FD.4070100@vezz.it> Message-ID: <45B60FFA.7020100@vezz.it> Marcello Vezzelli wrote: > > Ho letto un po' in giro e sembra che l'oggetto result abbia una > proprietà insert_ID() che contiene l'ultimo id autoincrementante... Ho scritto una scemata, tra i vari help che stavo guardando ce n'era uno relativo a ADODB ed è quell'oggetto result che ha la proprietà. http://phplens.com/phpeverywhere/adodb_italian L'ipotesi di portare tutto sotto adodb per essere (quasi) indipendenti dall'engine db come la vedi? Si paga molto in performance? Saluti Marcello From domenico.lorusso a pleiade.it Tue Jan 23 14:48:37 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Tue Jan 23 15:03:58 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B606FD.4070100@vezz.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> <45B5F54F.4000407@vezz.it> <45B5FC86.2040701@pleiade.it> <45B606FD.4070100@vezz.it> Message-ID: <45B61235.6040304@pleiade.it> Marcello Vezzelli ha scritto: > > > Ho letto un po' in giro e sembra che l'oggetto result abbia una > proprietà insert_ID() che contiene l'ultimo id autoincrementante... non saprei. come ti dicevo non ho una conoscenza approfondita delle api mssql, cercavo di evidenziare i principali problemi ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From domenico.lorusso a pleiade.it Tue Jan 23 15:29:33 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Tue Jan 23 15:44:50 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B60FFA.7020100@vezz.it> References: <45B5F2E8.1060603@vezz.it> <45B5F51D.8080701@pleiade.it> <45B5F54F.4000407@vezz.it> <45B5FC86.2040701@pleiade.it> <45B606FD.4070100@vezz.it> <45B60FFA.7020100@vezz.it> Message-ID: <45B61BCD.1080407@pleiade.it> Marcello Vezzelli ha scritto: > > L'ipotesi di portare tutto sotto adodb per essere (quasi) indipendenti > dall'engine db come la vedi? Ti dirò ci stavo pensando perché cmq è fatto piuttosto bene e tende a riportare le soluzioni specifiche di ogni piattaforma. Il problema vero cmq è un altro. Penso ad Oracle dove non hai gli autoincrement ma hai le sequence (fanno lo stesso lavoro) ma si usano in maniera diversa, perso alle clausole returning, al sub querying avanzato, o alla scelta di scriversi stored procedure Alla fine la compatibilità te la da la sintassi sql92 (pian piano arriveremo anche alla 99) ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From cesare a ngi.it Tue Jan 23 17:05:24 2007 From: cesare a ngi.it (Cesare D'Amico) Date: Tue Jan 23 17:20:23 2007 Subject: [Db] passare da mysql a sql server 2000 In-Reply-To: <45B606FD.4070100@vezz.it> References: <45B5F2E8.1060603@vezz.it> <45B5FC86.2040701@pleiade.it> <45B606FD.4070100@vezz.it> Message-ID: <200701231705.24496.cesare@ngi.it> Alle 14:00, martedì 23 gennaio 2007, Marcello Vezzelli ha scritto: > limit ce ne sono varie, ma ho visto che c'è l'equivalente mssql... Ho lavorato un po' col 2000, e mi pare che là ci fosse solo la TOP... per emulare la LIMIT dovevo fare 2 top concatenate :( -- Cesare D'Amico | Gruppo Volta Area tecnica | Web & Mkt Solutions Tel: 045 21 000 84 | Via Leida 8 - Verona Fax: 045 21 000 85 | http://www.gruppovolta.it From marcello a vezz.it Fri Jan 26 01:59:23 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Fri Jan 26 02:18:51 2007 Subject: [Db] prima nota e triggers Message-ID: <45B9526B.70508@vezz.it> Ciao a tutti, come prima o poi succede a tutti mi trovo ad implementare una prima nota.. un po' atipica se vogliamo. Ogni giorno ci sono 15 entrate fisse, positive o negative... ho strutturato così la tabella: DATA date // data di riferimento, PK T1 double // saldo giorno precedente D1 double // importo 1 D2 double // importo 2 D3 double // importo 3 [..] D4 double // importo 14 D5 double // importo 15 T2 double // saldo attuale Un bel trigger sul BEFORE INSERT e sul BEFORE UPDATE calcola T2, facendo T1+D2+D3+D3+..+D14+D15. Ora... come faccio a propagare a cascata le modifiche quando ho dei giorni successivi? Ovvero... in DATA+1, T1 deve valere T2 di DATA, e il T2 di DATA+1 deve essere ricalcolato. Essendoci il trigger, dovrebbe essere sufficiente aggiornare T1 del record successivo per forzare il ricalcolo... c'è un modo per gestire a catena questo aggiornamento, fino alla fine della tabella? E' conveniente usare un altro approccio? Saluti Marcello From cesare a ngi.it Fri Jan 26 09:15:49 2007 From: cesare a ngi.it (Cesare D'Amico) Date: Fri Jan 26 09:31:14 2007 Subject: [Db] prima nota e triggers In-Reply-To: <45B9526B.70508@vezz.it> References: <45B9526B.70508@vezz.it> Message-ID: <200701260915.49361.cesare@ngi.it> Alle 01:59, venerdì 26 gennaio 2007, Marcello Vezzelli ha scritto: > E' conveniente usare un altro approccio? Non risponde alla tua domanda, ma perché non ti fai una tabella dei saldi e tieni conto solo di quelli a fine giornata? In questo modo eviti di duplicare i saldi. -- Cesare D'Amico | Gruppo Volta Area tecnica | Web & Mkt Solutions Tel: 045 21 000 84 | Via Leida 8 - Verona Fax: 045 21 000 85 | http://www.gruppovolta.it From marcello a vezz.it Fri Jan 26 09:18:51 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Fri Jan 26 09:38:08 2007 Subject: [Db] prima nota e triggers In-Reply-To: <200701260915.49361.cesare@ngi.it> References: <45B9526B.70508@vezz.it> <200701260915.49361.cesare@ngi.it> Message-ID: <45B9B96B.5070803@vezz.it> Cesare D'Amico wrote: > Alle 01:59, venerdì 26 gennaio 2007, Marcello Vezzelli ha scritto: > >> E' conveniente usare un altro approccio? >> > > Non risponde alla tua domanda, ma perché non ti fai una tabella dei > saldi e tieni conto solo di quelli a fine giornata? In questo modo > eviti di duplicare i saldi. > Ci avevo pensato, ma credo che questo complichi la procedura di aggiornamento automatico che avevo in mente... E cmq mi faceva comodo avere in un unico record tutte le informazioni di un giorno, senza dover fare join o conti ogni volta. Ciao Marcello From domenico.lorusso a pleiade.it Fri Jan 26 09:37:23 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Fri Jan 26 09:52:58 2007 Subject: [Db] prima nota e triggers In-Reply-To: <45B9526B.70508@vezz.it> References: <45B9526B.70508@vezz.it> Message-ID: <45B9BDC3.4030002@pleiade.it> Marcello Vezzelli ha scritto: > Ciao a tutti, > come prima o poi succede a tutti mi trovo ad implementare una prima > nota.. un po' atipica se vogliamo. > > Ogni giorno ci sono 15 entrate fisse, positive o negative... ho > strutturato così la tabella: > > DATA date // data di riferimento, PK > T1 double // saldo giorno precedente > D1 double // importo 1 > D2 double // importo 2 > D3 double // importo 3 > [..] > D4 double // importo 14 > D5 double // importo 15 > T2 double // saldo attuale > > Un bel trigger sul BEFORE INSERT e sul BEFORE UPDATE calcola T2, > facendo T1+D2+D3+D3+..+D14+D15. [..] mah.... mi sembra di ricordare questo problema... cmq... mi sembra anche di ricordare che nei trigger non puoi utilizzare dml (se stiamo parlando di Mysql) Cmq per la struttura dei record effettivamente dovresti scatenare dei nuovi trigger... però non possono essere sulla stessa tabella. Questo con nessun dbms puoi farlo. In un trigger su una tabella non puoi modificare la stessa tabella. poi perché il trigger è before? scusa tu prima fai in modo che il dato venga inserito poi ricalcoli i saldi che per altro è piuttosto banale, perché nei triggere hai old e update update tab set saldo=saldo-:old.value+:new.old where data >= :new.data ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From Riccardo.Vettore a evolutiontravel.it Fri Jan 26 13:02:21 2007 From: Riccardo.Vettore a evolutiontravel.it (Riccardo.Vettore@evolutiontravel.it) Date: Fri Jan 26 13:20:13 2007 Subject: [Db] query su timestamp (mysql) Message-ID: Ciao, ho un campo timestamp(14) in un DB mysql, vorrei estrarre i dati riferiti ad un mese o di un giorno specifico o eseguire un GROUP BY per mese. Ho provato in molti modi ma non mi riesce, è possibile farlo tramite query o devo per forza fare tutto via codice? Graziefin da ora, Riccardo Vettore From domenico.lorusso a pleiade.it Fri Jan 26 13:07:51 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Fri Jan 26 13:23:35 2007 Subject: [Db] query su timestamp (mysql) In-Reply-To: References: Message-ID: <45B9EF17.4050903@pleiade.it> Riccardo.Vettore@evolutiontravel.it ha scritto: > Ciao, > ho un campo timestamp(14) in un DB mysql, vorrei estrarre i dati riferiti > ad un mese o di un giorno specifico o eseguire un GROUP BY per mese. > Ho provato in molti modi ma non mi riesce, è possibile farlo tramite query > o devo per forza fare tutto via codice? > group by format_date(campo, formato) dovrebbe andare ciao p.s. forse è date_format non ricordo -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.] From Riccardo.Vettore a evolutiontravel.it Fri Jan 26 15:00:24 2007 From: Riccardo.Vettore a evolutiontravel.it (Riccardo.Vettore@evolutiontravel.it) Date: Fri Jan 26 15:18:17 2007 Subject: [Db] query su timestamp (mysql) In-Reply-To: <45B9EF17.4050903@pleiade.it> Message-ID: > > ho un campo timestamp(14) in un DB mysql, vorrei estrarre i dati riferiti > > ad un mese o di un giorno specifico o eseguire un GROUP BY per mese. > > Ho provato in molti modi ma non mi riesce, è possibile farlo tramite query > > o devo per forza fare tutto via codice? > > > group by format_date(campo, formato) > Ciao Domenico, grazie per l'indicazione, avevo provato DATE e non andava bene, quello corretto è come hai detto DATE_FORMAT(campo,'criteri') Greazie! Riccardo From marcello a vezz.it Tue Jan 30 13:12:10 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 30 13:32:04 2007 Subject: [Db] contatore server side In-Reply-To: <459BC29C.90003@pleiade.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BBA7B.1010304@pleiade.it> <459BBD30.2040505@vezz.it> <459BC29C.90003@pleiade.it> Message-ID: <45BF361A.50305@vezz.it> Ciao a tutti, scusate se riapro un thread non nuovissimo ma volevo postare l'implementazione che alla fine ho deciso di fare... penso che possa servire come spunto. Creo una semplice tabella fatture: CREATE TABLE fatture ( id INT NOT NULL DEFAULT 0, anno INT NOT NULL DEFAULT 0, descr VARCHAR( 50 ) NOT NULL DEFAULT '', PRIMARY KEY ( id , anno ) ) ENGINE = innodb; Creo un trigger in before insert che chiama la procedura get_counter, passando l'anno di riferimento: CREATE TRIGGER new_fattura BEFORE INSERT on fatture for each row set NEW.id = get_counter(NEW.anno); La procedura get_counter appende un record in una tabella di supporto e ne ritorna il valore autoincrementante. delimiter // DROP FUNCTION IF EXISTS get_counter // CREATE FUNCTION get_counter( myanno INT ) RETURNS INT BEGIN CASE myanno WHEN 2006 THEN BEGIN INSERT INTO conta2006 VALUES (0); RETURN (LAST_INSERT_ID()); END; WHEN 2007 THEN BEGIN INSERT INTO conta2007 VALUES (0); RETURN (LAST_INSERT_ID()); END; WHEN 2008 THEN BEGIN INSERT INTO conta2008 VALUES (0); RETURN (LAST_INSERT_ID()); END; ELSE RETURN (0); END CASE; end // delimiter ; Le tabelle di supporto le devo creare così: CREATE TABLE IF NOT EXISTS conta2006 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE = innodb; CREATE TABLE IF NOT EXISTS conta2007 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE = innodb; CREATE TABLE IF NOT EXISTS conta2008 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE = innodb; Alcune osservazioni... Avevo messo la create table dentro alla procedura get_counter, ma mysql mi dice picche (non si possono creare tabelle in un trigger). Il CASE myanno è ridicolo... ma pare non si possa usare una variabile come nome tabella. Con questa query: INSERT INTO fatture (anno,descr) VALUES (2006,'prima fattura'); INSERT INTO fatture (anno,descr) VALUES (2006,'seconda fattura'); INSERT INTO fatture (anno,descr) VALUES (2007,'prima fattura'); Le fatture vengono create correttamente come 1/2006,2/2006,1/2007. Peccato che non sono riuscito ad ottenere l'id della fattura appena inserita... in questo caso last_insert_id() non funziona (la tabella fatture non contiene autoincrementanti). Bisogna quindi estrarre il valore id con una query, l'isolamento della transazione garantisce che è proprio quella che abbiamo inserito noi. A voi la palla. Saluti Marcello From marcello a vezz.it Tue Jan 30 15:32:47 2007 From: marcello a vezz.it (Marcello Vezzelli) Date: Tue Jan 30 15:52:43 2007 Subject: [Db] contatore server side In-Reply-To: <45BF361A.50305@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BBA7B.1010304@pleiade.it> <459BBD30.2040505@vezz.it> <459BC29C.90003@pleiade.it> <45BF361A.50305@vezz.it> Message-ID: <45BF570F.4090305@vezz.it> Marcello Vezzelli wrote: > Le tabelle di supporto le devo creare così: > > CREATE TABLE IF NOT EXISTS conta2006 (id INT NOT NULL AUTO_INCREMENT > PRIMARY KEY) ENGINE = innodb; > CREATE TABLE IF NOT EXISTS conta2007 (id INT NOT NULL AUTO_INCREMENT > PRIMARY KEY) ENGINE = innodb; > CREATE TABLE IF NOT EXISTS conta2008 (id INT NOT NULL AUTO_INCREMENT > PRIMARY KEY) ENGINE = innodb; > > Alcune osservazioni... > > Avevo messo la create table dentro alla procedura get_counter, ma > mysql mi dice picche (non si possono creare tabelle in un trigger). Domanda che mi ero fatto a suo tempo quando è partito il thread... ma c'è modo di evitare tabelle di appoggio per l'id autoincrementante? La soluzione sarebbe modificare l'implementazione della get_counter() in questo modo: delimiter // DROP FUNCTION IF EXISTS get_counter // CREATE FUNCTION get_counter( myanno INT ) RETURNS INT BEGIN SET @myid = 0; SELECT @myid:=fatture.id FROM fatture WHERE anno=@myanno ORDER BY id DESC LIMIT 1; IF @myid = NULL THEN SET @myid=1; ELSE SET @myid=@myid+1; END IF; RETURN (@myid); END // delimiter ; Ovvero quando faccio l'inserimento, faccio una select dell'ultimo id per quell'anno, lo incremento, e lo uso come id del nuovo record. Tutto molto bello, peccato che mysql dica: ERROR 1415 (0A000): Not allowed to return a result set from a function Se eseguo il codice fuori dal trigger, tutto funziona... quindi deduco che dentro a un trigger non si possono eseguire delle SELECT. Bella fregatura! Aggiungo anche che è una sofferenza per me cercare informazioni sull'help in linea di mysql. Spesso i comandi sono descritti malissimo e si capisce veramente qualcosa solo guardando gli esempi degli utenti... che di solito scrivono "dopo averci perso due ore ecco come fare per..." C'è qualcosa che non va. :| Alcuni articoli interessanti a proposito di trigger: http://www.stardata.it/articoli_it/triggers_on_select_articoli_it.html http://database.html.it/articoli/stampa/1973/trigger-in-mysql-5/ Saluti Marcello From domenico.lorusso a pleiade.it Wed Jan 31 14:42:19 2007 From: domenico.lorusso a pleiade.it (Domenico L.) Date: Wed Jan 31 14:58:50 2007 Subject: [Db] contatore server side In-Reply-To: <45BF570F.4090305@vezz.it> References: <459B7A49.3020404@vezz.it> <459B7A36.7010907@ziobudda.net> <459B7C11.3050909@vezz.it> <459B8625.5090501@pleiade.it> <459B8970.2050407@vezz.it> <459B8E6B.9010001@pleiade.it> <459B9153.1000504@vezz.it> <459B92A7.5040301@pleiade.it> <459B955B.6090302@vezz.it> <459B9BFB.5020808@pleiade.it> <459BB73F.5040207@vezz.it> <459BBA7B.1010304@pleiade.it> <459BBD30.2040505@vezz.it> <459BC29C.90003@pleiade.it> <45BF361A.50305@vezz.it> <45BF570F.4090305@vezz.it> Message-ID: <45C09CBB.6010505@pleiade.it> Marcello Vezzelli ha scritto: > > Ovvero quando faccio l'inserimento, faccio una select dell'ultimo id > per quell'anno, lo incremento, e lo uso come id del nuovo record. > Tutto molto bello, peccato che mysql dica: > > ERROR 1415 (0A000): Not allowed to return a result set from a function > > Se eseguo il codice fuori dal trigger, tutto funziona... > quindi deduco che dentro a un trigger non si possono eseguire delle > SELECT. uhm.... forse dico una muccata ma result set mi fa pensare ad un record.... tradotto @myid non è un intero (che forse potresti tornare) ma un record con un unico campo che contiene un intero... in particolare quella @ mi puzza un po', però non ne so di più è solo un suggerimento a naso > > Bella fregatura! > > Aggiungo anche che è una sofferenza per me cercare informazioni > sull'help in linea di mysql. ma scusa andare sull'help on line no;-)? http://it.mysql.com/doc/refman/5.0/en/triggers.html o in linea voleva dire on line? :-) è abbastanza singolare che cmq in una procedura tu possa usare del dml e non in una funzione/trigger non trovi? ciao -- Domenico L. icq: 645 44 861 per stupire mezz'ora basta un libro di storia, io cercai di imparare la Treccani a memoria... [F.d.A.]