Newsgroup: it.comp.lang.visual-basic
Titolo: ADO - VB6 Inserire record tra due record

Salve,
ho un problema con un mio programma. Con ADO e VB6.
Ho una tabella (Prodotti) con Tre campi: Quantità - Descrizione - Costo
Dim RS as Ned ADODB.Recordset
'senza nessun ordine, ovvero con l'ordine di inserimento
RS.Source = "Select * From Prodotti"
       with RS
	.AddNew
	  !Quantità = QTA
	  !Descrizione = DSCR
	  !Costo = CST
	.Update
       End With
A questo punto se ho inserito 4 Prodotti, e li voglio mettere su una 
listBox con ciclo Do......Loop ottengo che i prodotti verranno inseriti 
secondo l'odine di inserimento nel database.
Ad Es. se ho inserito (dal primo all'ultimo)
	QTA	Descrizione	Costo
	1	Birra		2,50
	1	Coca		2,50
	1	Fanta		2,50
	1	Caffè		1,00
Adesso tra Coca e Fanta vorrei inserire ad es. il Chinotto in modo da 
ottenere una lista composta così:
	QTA	Descrizione	Costo
	1	Birra		2,50
	1	Coca		2,50
	1	Chinotto	2,00
	1	Fanta		2,50
	1	Caffè		1,00
Se richiamo la routine di cui sopra, ovvero con .AddNew il chinotto 
(inserito dopo tutti gli altri) mi viene si inserito ma all'ultimo in 
questo modo:
	QTA	Descrizione	Costo
	1	Birra		2,50
	1	Coca		2,50
	1	Fanta		2,50
	1	Caffè		1,00
	1	Chinotto	2,00
Ma io voglio cioè inserire il chinotto tra la Coca e la Fanta.
Ci può essere qualche metodo per ottenere questo risultato?
Ringraziamenti anticipati a chi mi potrà fornire qualche soluzione.
Grazie
Robin

 ha scritto nel messaggio 
news:46d0aaad$0$21210$5fc...@news.tiscali.it...

Non puoi mai fidarti dell'ordine di inserimento di un record.
Devi aggiungere alla tabella un campo Ordine di tipo intero, valorizzare 
quello e farci la select:
RS.Source = "Select * From Prodotti ORDER BY Ordine"
o magari, tanto per scrupolo nel caso di campo Ordine non valorizzato o con 
lo stesso valore
RS.Source = "Select * From Prodotti ORDER BY Ordine, Descrizione"
Così finiscono in ordine alfabetico (che comunque sarebbe più semplice 
trovare un prodotto nel listino :) )
Ciao 

 Ciao 
Intanto grazie per l'interessamento.
Vedi il fatto è che la lista dei prodotti non deve essere ordina con un 
Order By di qualsiasi genere.
Mi spiego meglio. Si tratta in realtà di un cameriere che sta prendendo 
una comanda ad un tavolo di un ristorante.
In questo caso le ordinazioni sono casuali e non possono seguire un 
ordine ben definito. Ad esempio il cameriere registra l'antipasti, i 
primi e i secondi mettiamo così:
	antipasto n. tre
	antipasto n. due
	antipasto n. uno
	primo n. uno
	primo n. tre
	primo n. due
	secondo n. due
	secondo n. uno
	secondo n. tre
A questo punto la lista (una listBox che viene riempita con un Do While 
..... Loop) è casualmente formata come sopra perchè le pietanze vengono 
inserite nell'ordine che il cameriere le aveva inserite una dopo l'altra.
La comanda deve rimenere così com'è perchè questo è l'ordine con cui 
bisogna che in cucina preparino le cose. (Comunque assumi che l'esigenza 
è riempire la lista con l'ordine di inserimento voluto dal cameriere)
A questo punto sorge l'esigenza tra i clienti di avere un quarto 
antipasto. Se io faccio .AddNew la comanda diventa così:
	antipasto n. tre
	antipasto n. due
	antipasto n. uno
	primo n. uno
	primo n. tre
	primo n. due
	secondo n. due
	secondo n. uno
	secondo n. tre
	Antipasto n. quattro
E così non va bene perchè il tempo di preparazione dell'antipasto 
sarebbe sfasato a quello voluto dal cameriere.
Dovrebbe essere cos' invece:
	antipasto n. tre
	antipasto n. due
	antipasto n. uno
	antipasto n. quattro
	primo n. uno
	primo n. tre
	primo n. due
	secondo n. due
	secondo n. uno
	secondo n. tre
Ovvero devo inserire quel record tra gli antipasti e i primi. E' questo 
che mi serve. Ripeto l'esigenza è questa.
Grazie per la pazienza.
Ciao Robin

 Grazie per la pazienza.
E io ti ripeto che quando inserisci il record per ricordardi la sua 
posizione devi valorizzare il campo che indica l'ordine di inserimento.
Potrà essere ad es. un semplice MAX(Ordine) + 1 per il nuovo record.
Non vedo il problema e altre vie sicure (e semplici) non ce ne sono.
Quando va in cucina fa la order by e cucinano nell'ordine giusto.
Ciao 

bygv ha detto questo domenica :

Ti hanno già spiegato che senza un Order By esplicitamente indicato, 
l'ordine con cui ti ritornano i record NON E' l'ordine di inserimento. 
Lo è spesso, *non sempre*, e non è neppure detto che sia uguale in due 
select successive. Il db ha il diritto di scegliere l'ordine con cui 
ottiene i record più rapidamente, se tu non gli imponi di utilizzare un 
ordine specifico.
Quindi, l'unica soluzione corretta è quella di inserire una colonna di 
ordinamento, che può essere l'ordine di inserimento, ma che se hai 
bisogno puoi modificare 'a mano' con un Update.
Ciao
Alberto
-- 
Alessandro Bergonzoni: Il tempo vola e noi no. Strano sarebbe se noi 
volassimo e il tempo no, il cielo sarebbe pieno di uomini con 
l'orologio fermo.

 ha scritto nel messaggio 
news:46d1412e$0$16025$5fc...@news.tiscali.it...


 Impostare MyRecordset.Sort no?
Sort su che cosa?
Ciao 

Fabio ha scritto:

Bè ho risolto. nsomma è una soluzione un pò laboriosa, ma ho ottenuto 
quello che volevo. Grazie a tutti per l'interessamento.
Ciao a tutti
Ahhhh.. giusto la mia soluzione?
Bè intanto ho impostato un ID unique, per cui ogni record può essere 
ricercato univocamente. Inoltre, a dispetto di una mancabìnza di order 
by, l'ordine di inserimento viene rispettato sempre.
Cmq, la soluzione.
Ho creato una tabella che mi serve da contenitore temporaneo in cui 
sposto i record che mi interessano.
Intanto li cancello, temporaneamente, dalla tabella originale.
Quindi dalla tabella temp li ricopio nella tabella originale. 
Preventivamente ho memorizzato in una variabile lID del record prima del 
quale voglio inserire il nuovo record, quindi gli altri li aggiungo 
semplicemente cancellandoli dalla tabella temp.
Non so se sono stato chiaro, un pò complicato e laborioso, ma ho 
ottenuto lo scopo.
Ciao e Grazie a tutti
Robin

 lo scopo.
Sě, insomma, soluzione macchinosa e inaffidabile.
Ottimo :)
Ciao 

bygv scriveva il 27/08/2007 :

Una vera porcheria.
Assolutamente inaffidabile, destinato prima o poi a fallire.
Soprattutto dopo che ti era stato spiegato che serviva un progressivo, 
ostinarsi a mettere pezze e a fare cose che stanno in piedi perchè 
tirano quattro venti, è quasi diabolico.
Comunque, va bene finchè si sviluppano cose per proprio sfizio 
personale. L'importante è che certe cose non vengano per nessun motivo 
vendute a clienti paganti, perchè allora rientriamo nel solito discorso 
dello sputtanamento globale, che alla fine ricade anche nei confronti 
di chi fa le cose con criterio.
Ciao
Alberto
-- 
Ho spiegato a mio nipote cos'è il compromesso: se per le vacanze tua 
madre vuole andare al mare e tuo padre invece in montagna, il 
compromesso è che si va al mare, ma il papà può portarsi gli sci.

 Cmq, la soluzione.
Beh sempre fino a quando non sarŕ piů cosě. Soprattutto con
cancellazioni/reinserimenti.
Ma gli ordini vengono scritti su carta o su palmarino?
Il cameriere l'antipasto 4 lo scrive in coda al foglio/palmare?
Comunque forse ti serve un ordinamento di "consegna". Cioč se di 4 persone,
3 predono antipasto e pizza, uno prende primo e pizza.
Il cameriere deve indicare di portare insieme 3 antipasti e un primo. E poi
le 4 pizze.
Quindi ti servirebbe un "Numero di raggruppamento", non per singolo piatto,
ma per ordine di portare in tavola.
1 Ant1
1 Ant2
1 Ant3
2 Piz1
2 Piz2
2 Piz3
2 Piz4
1 Primo1
In cucina sanno che devono mettere prima la pasta, e poi mentre bolle
preparano gli altri antipasti, per portare tutto insieme.
In cucina glielo fai vedere ordinato per la prima colonna.
Oppure se l'ordine da cartaceo viene ritrascritto lo puoi gestire piů o
meno alla stessa maniera.

 tirano quattro venti, è quasi diabolico.
Quoto in toto quello che hai scritto, specialmente la seconda parte.
Aggiungerei che -a meno che non abbia capito male l'idea escogitata da 
bygv- il fallimento è assolutamente certo al secondo o terzo ordine che 
viene preso.
Infatti l'unico modo in cui potrebbe aver la fortuna di funzionare 
sarebbe quella in cui ci fosse un solo cameriere e che una volta preso 
l'ordine corra subito in cucina senza fermarsi a prendere un secondo 
ordine dal cliente del tavolo a fianco.
Nel primo caso (più camerieri) ogni cameriere toglierebbe agli altri uno 
o più prodotti,
il cameriere A prende l'ordine:
	"Spaghetti allo scoglio"
	"vino bianco"
Il cameriere B prende l'ordine:
	"cozze"
	... opppss il vino bianco me l'ha già preso l'altro cameriere mi 	spiace!!!
Nella seconda ipotesi invece ...
Il cameriere prende l'ordine dal tavolo A ma non può fermarsi al tavolo 
B perchè deve prima scaricare l'ordine appena ricevuto ... un pochino 
inefficiente come metodologia di lavoro.
Forse ho compreso male l'idea di bygv, ma temo che dietro il suo 
progetto manchi un minimo di analisi.
ciao
stefano

 meno alla stessa maniera.
Allora, provato e riprovato, intanto funziona. Il programma funziona 
almeno da 6 anni e chi lo ha è talmente felice di averlo che nn lo 
cambierebbe con nessun altro al mondo. a DISPETTO del professionista che 
ammonisce sui programmatori da strapazzo. Ma passiamo avanti e abbasso 
le polemiche del cavolo.
Il discorso è complicato.
1) Vero, c'era una impostazione non del tutto corretta alla base per 
cui, purtroppo ho dovuto mettere una "Pezza a colore". (Chi programma sa 
bene che un programma non è mai finito è sempre in progress) e 
soprattutto quando un utente ti fa nuove richieste a volte devi 
sconvolgere un database per soddisfarle, altre volte si trovano pezze a 
colori.
2) Un nuovo inserimento tra due record è una cosa eccezionale ed avviene 
solo di tanto in tanto.
3) Adesso vi spiego la situazione. tenete presente che però l'ordine di 
inserimento è importante in quanto il cameriere si costruisce l'ordine 
in cui deve portare i piatti.
Quando il, o i camerieri prendono le comande col palmare, intanto si 
fermano ognuno ad un tavolo. Mi pare che con l'aiuto del palmare un 
cameriere basti per un tavolo o no? Il programma quindi inserisce le 
pietanze in base al numero di tavolo. Normalmente. Un semplice addnew. 
Ci vedete qulche cosa di male con un addnew?
Adesso viene la parte complicata e mettiamo di avere questa situazione 
con i record belli inseriti, tutto tranquillo, senza nessun conflitto (a 
proposito di quell'intelligentone che pensa che gli altri siano stupidi, 
dopo l'inserimento di ogni piatto è previsto un refreesh della comanda 
per cui c'è un aggiornamento continuo)
Allora abbiamo quest asituazione:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	Antipasto 4
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
Ecco fatto. Qui però sorge il problema. Un commensale chiede un 
ulteriore antipasto. L'antipasto 5. Questo lo devo inserire tra il 5 il 
primo 1 ma se faccio AddNew avrò questa situazione:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	Antipasto 4
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
	Antipasto 5
e non va bene perchè il risultato che si doveva ottenere era questo:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	Antipasto 4
	Antipasto 5
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
Bè non sapendo come inserirlo in quell'ordine ho escogitato (almeno per 
l'immediato) quella soluzione che ho già riconosciuto essere una 
soluzione laboriosa e ovviamente non ottimale.
Scusate per la lungaggine, ma mi sentivo in dovere di chiarire.
Robin
Ciao  tutti

Stefano Ferrari ha scritto:

Permettimi: NON HAI CAPITO NULLA. Se vedessi il programma ti renderesti 
conto. E poi ti garantisco che mi sa che non hai proprio idea di come 
funziona un programma per ristorante. Il programma funziona da 6 anni 
egregiamente, Solo che adesso mi è stata chiesta questa piccola modifica 
per esigenze di un ristoratore. E poi sappi che credo di essere un pò 
avanti (molto forse, ma non te lo lascio nemmeno immaginare) al tipo di 
gestione che descrivi te. Vuoi sapere un'altra cosa? Due palmari 
gestiscono sale di 100 tavoli in modo veloce e finora AFFIDABILE. Oddio 
può darsi anche che dopo questa modifica il programma diventerà meno 
affidabile.. bè lo rimodificheremo.
A proposito di analisi... mi fai ridere... fallo te un programma del 
genere poi vediamo.
Ciao

Ah, dimenticavo di aggiungere che a volte succede (spesso) che mentre un 
  commensale mangia l'antipasto l'altro vuole già il primo o la 
pizza.... E allora se non c'è un ordine di preparazione della comanda 
certe esigenze dei clienti non possono essere rispettate. In buona 
sostanza, chi ha qualche esperienza lo sa e io adesso ne ho parecchia 
nel campo, non è assolutamente prevedibile l'ordine con il quale le 
persone vogliono mangiare. Avete mai pensato che l'ordine di 
raggruppamento potrebbe essere un input per il cuoco a cucinare prima 
delle cose e poi altre? Ecco l'esigenza è questa.
Ah... per i più intelligentoni... prima di criticare aggiornatevi.
Ciao a tutti

 rimodificheremo.
Che altro c'è da dire ? :-(
Bye, G. 



Non ho parole! 
Il fatto è che sei tu a non aver *capito* che chi ti ha suggerito la
corretta soluzione ha immediatamente *capito* quello che tu hai
*capito* solo dopo sei anni (e sì che non si tratta di
rocket-science), ma che ancora non hai *capito* come risolvere perchè
ti mancano proprio le basi (e questo si *capisce* dal modo in cui hai
posto il problema).
Probabilmente la pezza a colore è degna del programma.
Complimenti.

 Scusate per la lungaggine, ma mi sentivo in dovere di chiarire.
Guarda che avevamo già capito tutti fin dall'inizio.
Sei tu che, non solo non hai capito una fava di come si lavora 
seriamente, ma addirittura sei talmente supponente da rifiutare le 
osservazioni corrette e da andare avanti per la tua strada (sbagliata).
Perchè se tu non usi un progressivo (che, come ripeto, può essere in 
prima battuta l'ordine di inserimento ma modificabile a piacere per le 
esigenze di servizio), NON E' detto che l'ordine di restituzione dei 
record sia quello che tu vuoi.
Diciamo che 90 volte su 100 è quello. Le restanti 10 volte non se ne è 
ancora accorto nessuno, perchè evidentemente la cosa non è così 
critica.
Ma mandare fuori un software con un bug, CONSAPEVOLI che ci sia un bug, 
per di più risolvibile con quattro righe di codice in croce, è cosa che 
non mi permetterei mai di fare.
Io.
Diciamo che la prossima volta che qualcuno mi dirà: "risolvere il 
problema con un software? No, grazie, ci abbiamo già provato ed è stato 
un disastro...", saprò chi ringraziare.
Alberto
-- 
Henry David Thoreau: L'uomo è tanto più ricco quanto meno costano i 
suoi piaceri.

 fallo te un programma del genere poi vediamo.
Io un programma del genere non lo faccio, questo è sicuro.
Alberto
-- 
Fabio Fazio: Se siamo alleati come mai nei nostri bar si vende Coca 
Cola e nei bar americani non si vende l'amaretto di Saronno?


============================================

 
Allora la Tabella (nella quale tutti gli utenti inseriscono le pietanze; 
non so se s'è capito ma si lavora in real-time con rete wireless e non 
con palmari) è ed era composta così: (Non è che mi consigliate di creare 
una tabella per ogni tavolo no? Perchè altrimenti lascio perdere pure di 
venire a leggere qua dentro. Comunuque:
	ID = long unique e chiave primaria
	NTavolo = Integer
	Descrizione = String
	Quantita = Long
	Costo = Double
	CodiceProdotto = Long
	Reparto = String
1) Mi pare che ci sia una chiave primaria unica, (forse mi ero spiegato 
male) che rende ogni riga unica e quindi l'ordine con il quale viene 
riempita la tabella è sempre quello dell'ID. Ogni pietanza viene 
inserita in base al tavolo e al reparto.
2) avevo provato ad ordinare in base all'ID e al reparto. Non funziona. 
Voglio dire, la query funziona eccome, ma l'utente non è contento, 
perchè così gli capita che una pietanza venga portata non tempestivamente.
3) La comanda viene inviata TUTTA (non per mia scelta ma per scelta 
degli utenti sia chiaro io infatti inizialmnete avevo ordinato per 
reparto e per ID) a tutti i reparti.
4) Facciamo questo esempio con un tavolo da 4 persone che ordinano:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	Antipasto 4
	-----------------
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	-----------------
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
A questo punto , dopo aver inserito tutto,  nella tabella di cui sopra, 
(si tenga presente che altri camerieri magari avranno inserito altro 
sempre nella stessa tabella) un cliente oltre ad antipasto 3 chiede una 
PIZZA.
Cosa succede? La pizza mi verrà inserita separatamente e all'ultimo. Così:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	Antipasto 4
	-----------------
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	-----------------
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
	Pizza
Quindi il cuoco e il pizzaiolo capiscono che la pizza deve essere 
portata per ultima. E invece la pizza va portata per prima. A questo 
punto sono nei guai. Come faccio ad inserire la pizza nel primo gruppo?
Se ordino per ID va all'ultimo perchè ha L'ID più grande. Se ordino per 
reparto non va bene perchè la pizza non va al posto giusto.
L'ordine che voglio ottenere quindi è il seguente:
	Antipasto 1
	Antipasto 2
	Antipasto 3
	PIZZA
	Antipasto 4
	-----------------
	Primo 1
	Primo 2
	Primo 3
	Primo 4
	-----------------
	Secondo 1
	Secondo 2
	Secondo 3
	Secondo 4
Adesso il caro Alberto, sempre che ritenga giusta l'impostazione della 
tabella, che per la cronaca si chiama CONSUMAZIONI, mi potrebbe fare il 
favore di dirmi come faccio ad inserire quella PIZZA tra il 3° e il 4° 
Antipasto. Oddio mi andrebbe bene anche nella stessa sezione. Io non ho 
saputo trovare di meglio per ora. MEA CULPA certo. Ma non per nulla 
avevo chiesto aiuto al newsgroup. Qua invece di aiuto trovo professoroni 
che mi bacchettano. Oddio, può essere che è stata colpa mia e che magari 
mi ero espresso male. Ma dato che :
 > Guarda che avevamo già capito tutti fin dall'inizio.
allora la mia colpa diventa inferiore. Forse non avevate capito nulla 
fin dall'inizio.
Chiedo scusa a tutto il newsgroup. E ovviamente se qualcuno avesse 
qualche idea migliore della mia sarei felice di accoglierla. Avevo 
scritto proprio per essere aiutato non per essere denigrato.
Ah per ultimo: tutta l'operazione di inserimento (ogni inserimento sia 
singolo sia l'operazione di spostamento e reintegro) è protetta da una 
transazione Begin - Committ - o Roll - e quindi se per caso dovesse 
fallire qualcosa non ho rovinato nulla. Avviso l'utente di rifare in un 
secondo l'operazione.
Grazie a tutti!!!!!!  SIC!!!!!!!!!!!!!!!!!!!
Bygv

 delle cose e poi altre?
Che con il metodo che ti ho indicato già funzionerebbe senza problemi, in
quanto, al contrario di come hai analizzato, il problema non è cercare di
fare un'AddNew in mezzo a dei record, ma è dare l'ordine corretto di
preparazione/consegna alla cucina.
E io non mi ritengo certo un analista...

robin ha detto questo martedì :

La risposta ti è stata data, ma è evidente che non vuoi leggerla.
I record non si inseriscono in mezzo, ma si inseriscono e basta. Dopo 
di che puoi vederli come ti pare semplicemte ordinandoli e filtrandoli. 
Ora è evidente che l'ID automatico non potrà mai soddisfare le tue 
esigenze, ma hai bisogno di un ID manuale, gestibile da programma che 
ti permetta di ordinare e filtrare i dati secondo le tue esigenze. I 
suggerimenti che ti sono stati dati, vertono in questo senso, quindi 
con calma, ti consiglierei di rileggerli con più attenzione, perchè ti 
risolvono il problema.


 Grazie a tutti!!!!!!  SIC!!!!!!!!!!!!!!!!!!!
Figurati.


 affidabile.. bè lo rimodificheremo.
Non capisco perchè te la prenda così,
certo io posso -come ho specificato nella mia risposta- non aver capito 
il problema, quindi un mio limite, ma puoi anche esserti spiegato male 
tu, non credi?
Se sei tanto sicuro della tua soluzione perchè venire qui a chiedere?
 > A proposito di analisi... mi fai ridere... fallo te un programma del
 > genere poi vediamo.
 > Ciao
Vedi, quando parli con qualcuno sopratutto su un NG, non puoi mai avere 
la certezza del livello di esperienza e quanto sia bravo o meno il tuo 
interlocutore. Io so quello che faccio, come lo faccio e da quanto lo 
faccio, quando mi imbatto in una mia lacuna cerco -sempre- di imparare 
da chi ha più esperienza e/o conoscenza.
Siccome non mi interessa scadere in discorsi sul celodurismo da 
quindicenni, se vuoi riportare la discussione a un livello costruttivo 
va benissimo, si cerca di capire meglio assieme il problema,
altrimenti pazienza, ti faccio ugualmente i miei migliori auguri per il 
proseguo della tua professione.
ciao
stefano

 per cui c'è un aggiornamento continuo)
Penso che l'apprezzamento dei neuroni fosse rivolto a me,
dunque ...
riporto quanto da te scritto:
"Ho creato una tabella che mi serve da contenitore temporaneo in cui 
sposto i record che mi interessano.
Intanto li cancello, temporaneamente, dalla tabella originale.
Quindi dalla tabella temp li ricopio nella tabella originale. 
Preventivamente ho memorizzato in una variabile lID del record prima del 
quale voglio inserire il nuovo record, quindi gli altri li aggiungo 
semplicemente cancellandoli dalla tabella temp."
Senza conoscere la struttura del database si possono fare solo delle 
supposizioni, non sapendo sapendo quindi com'è fatto il tuo db posso 
solo immaginare che ci sia una tabella (ben normalizzata) dove hai 
memorizzato il menu del ristorante,
tu hai specificato che ELIMINI un record dalla tabella originale (il 
menu?) e lo sposti nella tabella temporanea,
permettimi di farti notare che così facendo, se il cameriereA sceglie la 
pietanza "cozze alla marinara" questo record viene tolto dalla tabella 
madre e spostato nella tabella temporanea dove ci rimarrà per un tot di 
tempo in cui noi non siamo a conoscenza (decimi di secondo, secondi, 
decine di secondi, boh) se in questo lasso di tempo il cameriereB vuole 
scegliere la pietanza "cozze alla marinara" come fa, nella tabella madre 
non la trova ... e allora some si comporta? Sta li a punzecchiare il 
palmare fino a che le "cozze alla marinara" non ritornano disponibili?
Poi magari non ho assolutamente capito come è fatto il tuo db ma, abbi 
pazienza, spetta a te -per far capire agli altri il tuo problema- 
fornire tutti gli elementi giusti non a noi utlizzare tecniche 
chiromantiche per capire come tu hai fatto le cose.
ciao
stefano

 ha scritto nel messaggio 
news:46d203df$0$31746$5fc...@news.tiscali.it...

TU SEI COMPLETAMENTE FUORI DI TESTA!!!!
CON I CONSIGLI CHE TI HANNO DATO RISOLVI TUTTO IN UN AMEN!!!!
CONSIGLIO: LASCIA PERDERE E FAI COME TI HANNO DETTO
CIAO!!!!
IAK 

 futuro con calma non cambi questa soluzione immediata.
Mi pareva tutto già a posto ma adesso non posso evitare di darti del fesso.
La soluzione che ti ho postato risolveva il problema in modo sicuro e in 10 
minuti di sviluppo.
Hai voluto fare una soluzione incasinata, che richiede un mucchio di tempo e 
codice pastrocchio che mantenerlo e correggerlo sarà un disastro, che 
produrrà problemi che non riuscirai a riprodurre perchè dipende da cosa c'è 
nel db e non dai test che farai...
E poi insulti gli altri che ti suggeriscono che per ottenere 2 è più facile 
fare 1+1 e non ricorrere alle itegrali e equazioni di analisi matematica che 
danno soluzioni indefinite?
Mah...
Ciao 

 palmare fino a che le "cozze alla marinara" non ritornano disponibili?
[addendum]
a meno che non faccia tutto come istruzione atomica,
Begin T
	copi il record dalla tabella A alla B
	cancelli il record dalla tabella A
	copi il record dalla tabella B alla A
	cancelli il record dalla tabella B
Commit T
ma francamente mi sembra una soluzione cervellotica (senza offesa eh!).
ciao
stefano

 chiromantiche per capire come tu hai fatto le cose.
Chiedo venia, ma nel marasma del post precedente mi ero perso le righe 
della spiegazione.
stefano

 stefano
Ciao Stefano, rispondo a te ma spero che la risposta la leggano tutti. 
Spero TUTTI quelli che sono intervenuti.
Intanto vorrei chiarire una cosa: NON HO MAI VOLUTO OFFENDERE NESSUNO e 
se qualcuno si è sentito offeso chiedo PUBBLICAMENTE scusa a lui e a 
tutto il news, anche se le avevo già chieste precedentenmente. Poi io 
avevo solo detto che soluzione avevo trovato, bella o brutta che fosse 
(però prima ancora che io dicessi qualche parola di troppo) sono stato 
offeso. (Basta leggere attentamente tutti i post). Va bè per me è tutto 
a posto non è sucesso nulla. Facciamo finta di resettare il tutto.
Stefano, sto rispondendo a te perchè se tutti hanno capito quello che 
hai capito tu vuol dire che la domanda l'ho fatta veramente male e 
quindi è stata colpa mia se non mi son fatto capire.
Adesso voglio fare un ultimo tentativo, giusto per cercare di spiegarmi 
meglio, magari chissà stavolta ci riesco? Vediamo.
Il database intero è un solo file blabla.mdb ok?
Dentro ci sono le tabelle. Tante tabelle. Giusto?
Tra queste c'è la tabella MENU. Questa tabella viene riempita o corretta 
di tanto in tanto quando l'utente ritiene di variare i menu oppure i 
prezzi, aggiungere cancellare ecc. Ripeto questa tabella normalmente 
viene aperta in sola lettura (che è pure più veloce): durante il lavoro 
non serve modificarla. Questa contiene solo tutte le pietanze il loro 
costo, un codice, un ID ecc. Per cui con quanto scrivi sopra significa 
(mea culpa) che non hai capito il problema. Il/i cameriere/i le "cozze 
ecc" le trova/no sempre in qualsiasi istante in quanto questo MENU è in 
sola lettura. OK?
I clienti cosa fanno in genere? Mica mangiano per terra si siedono ad un 
tavolo no? Bene. Allora i camerieri vanno a prendere gli ordini al 
tavolo che ha un NUMERO. I tavoli sono numerati. E' l'unico modo, con un 
computer, per distinguerli; a meno che non li si voglia chiamare per 
nome. (Oddio qualcuno potrebbe anche farlo, magari io, un giorno o 
l'altro, visto che sono un pò cervellotico).
L'ordine che prende il cameriere si chiama: COMANDA. Lo sapevi? Si 
suppongo. Bene il punto è la COMANDA (D'ora in avanti CM).
Se si lavora con carta e penna il cameriere scrive le varie richieste e 
se a un certo punto qualcuno vuole inserito qualcosa semplicemente lo 
scrive in mezzo (come vuoi: più piccolino, con una V, con una freccia) e 
risolve il problema. Poi porta la CM in cucina e lì (non si fanno le 
fotocopie) se la guardano la cucina, il pizzaiolo il barista o no? E se 
per iniziare a un certo tavolo( diciamo il n. 1) cominciano con gli 
antipasti di certo il cuoco non gli prepara prima il pesce spada no?
Come decide il cuoco di preparare prima gli antipasti? Semplice, perchè 
di solito si magnano prima ma anche perchè sono i primi ad essere 
scritti nella CM. Ma se uno dei commensali decide che per antipasto 
vuole anche una pizza e lo decide dopo aver ordinato il tutto (quando la 
CM è completata), il cameriere deve dire al pizzaiolo che deve fare la 
pizza subito perchè deve essere portata insieme agli antipasti.
Io ho avuto la velleità di computerizzare il tutto con rete wireless e 
palmare che non è palmare ma bensì un pc vero e proprio di piccole 
dimensioni con XP professional. E siccome c'è il wireless, faccio 
stampare direttamente il tutto con tre stampanti in rete wireless. Cosa 
faccio stampare? La CM!!!  L'obiettivo è evitare che il cameriere vada 
dal pizzaiolo e gli dica (manualmente) "fammi la pizza insieme agli 
antipasti". Questo obiettivo, anche perchè agli utenti sembra una buona 
soluzione, si può raggiungere stampando la CM con l'ordine con cui  la 
pietanze vengono memorizzate in quel dato tavolo 1.
La CM, anzi tutte le CM, vengono memorizzate temporaneamente in una 
tabella che ho chiamato CONSUMAZIONI, dico temporaneamente perchè quando 
i clienti pagano le consumazioni devono essere cancellate e inserite in 
una tabella definitiva dalla quale poi si potrà fare statistica, si 
potranno ristampare delle fatture, delle ricevute fiscali, ecc. ecc.
questa tabella CONSUMAZIONI è fatta così:
     ID = long unique e chiave primaria
     NTavolo = Integer
     Descrizione = String
     Quantita = Long
     Costo = Double
     CodiceProdotto = Long
     Reparto = String
La chiave primaria non è auto incrementante come qualcuno pensa, ma l'ID 
è gestito manualmente da una Function che mi ricava un nuovo ID univoco. 
Per cui l'ID lo gestisco io. OK?
Allora come funziona? Il camerirere/i va al tavolo sceglie dal MENU (in 
sola lettura) la pietanza e la inserisce nelle CONSUMAZIONI. E crea la 
sua bella CM. Se tutto è a posto (nel 60%) dei casi (Tenete presente che 
quando il cam scive a mano cancella, riscrive, ma con un computer dopo 
che hai preso una CM di 20 portate dover ricancellare tutto e rifare da 
capo sarebbe bestiale.
Allora devi prevedere la possibilità di poter modificare in secondo 
tempo. OK, c'è il cliente rompicojoni che nel bel mezzo di antipasti 
messi nel reparto CUCINA, dopo aver preso 20 portate, vuole anche una 
pizzetta (Messa nel reparto PIZZERIA) tanto per dividerla con gli amici. 
Ecco, è qui che mi è sorto il problema. Ed ho fatto la domanda: sarebbe 
possibile mettere un record in mezzo ad altri due?
Sai qual'è la risposta? è NO. NO. NO. Non è possibile. Il record ce lo 
metti  o mediante una query o mediante un filtro come qualcuno diceva. 
Ma io come faccio a far andare una pizza del reparto Pizzeria, con un 
antipasto del reparto Cucina? Non è possibile. Una query li metterebbe 
ognuno al suo posto. E non uno di un tipo in mezzo agli altri di un 
altro tipo. Dico corbellerie? Mi pare di no. Allora cosa ho pensato?
Se io memorizzo nella tabella CONSUMAZIONITEMP le consumazioni del 
tavolo 1 in base al numero di tavolo (Ntavolo come campo) con una query 
posso trasferire queste pietanze nella tabella TEMP e le cancello dalla 
tab CONSUMAZIONI. Poi rimetto tutte le consumazioni della tabella temp 
in quella originale, ma a questo punto cambio l'ID, lo ricalcolo 
nuovamente, e (previsto nella routine) quando arrivo alla consumazione 
prima della quale volevo inserire qualche cosa, inserisco la nuova 
consumazione. Adesso le consumazioni sono ritrasferite dalla tab TEMP 
alla CONSUMAZIONI: è cambiato solo l'ID che adesso è nuovo per tutte e 
cioè non è più quello di prima che ovviamente è stato cancellato e non 
esiste più. Il tutto con BeginTrans - CommittTans o RollBackTrans. Cosa 
può succedere? Solo una cosa: che un altro cameriere nel frattempo 
mentre prende un'altra CM, può creare un ID che viene creato durante 
quegli spostamenti. Per cui duplicazione degli ID, e una delle due 
transazioni fallisce. Non ho perso nulla, solo un attimo di tempo per 
reinserire la pietanza che non era stata inserita (dell'uno o 
dell'altro) ma non ho rovinato nulla.
Spero di essere stato un tantino più chiaro.
RIPETO!!! Chiedo scusa a tutto il newsgroup, ma non sono riuscito, 
purtroppo, ad avere idee migliori. Ognuno di noi ha dei limiti. Questi 
probabilmente sono i miei.
Grazie a tutti signori.
Bygv

 Ognuno di noi ha dei limiti. Questi probabilmente sono i miei.
Il tuo limite non è certo un limite di competenza tecnica.
Tutti abbiamo cose che non conosciamo, nel nostro lavoro, e ogni giorno 
impariamo.
Il grosso limite è quando ci viene detto che stiamo procedendo sulla 
strada grossolanamente sbagliata, e si prosegue imperterriti, anzi, ci 
si sente pure offesi.
Questo è quello che distingue chi non ha speranze di migliorare, da chi 
un giorno o l'altro farà anche qualcosa di ben fatto (in questo campo, 
magari in altri campi hai il carattere giusto).
E con questo chiudo questo thread perchè mi rendo conto che sto 
sprecando bit e i già stanchi neuroni.
Alberto
-- 
Noi ammazziamo solo per motivi buoni.
E quando sono buoni, sta a noi indicarlo.
[Guccini]

 Bygv
Vedi Robin, tu ti sei impuntato sulla tua posizione senza voler prendere 
in considerazione quello che ti dicevano Alberto e tutti gli altri.
Hai iniziato a sboroneggiare con frasi del tipo "A proposito di 
analisi... mi fai ridere... fallo te un programma del genere poi vediamo. "
oppure "E poi sappi che credo di essere un pň avanti (molto forse, ma 
non te lo lascio nemmeno immaginare) al tipo di gestione che descrivi te."
e "Vuoi sapere un'altra cosa? Due palmari gestiscono sale di 100 tavoli 
in modo veloce e finora AFFIDABILE."
e detto da una persona che 5 mesi fa non sapeva nemmeno come collegarsi 
ad un db in rete (
http://snipurl.com/1q226
), scusa lasciamelo dire ma fa 
un po' sorridere (se poi non sei tu chiedo scusa).
tutto questo senza offesa e senza rancore naturalmente.
ciao e buon lavoro
stefano

 stefano
Grazie.
Cosě finalmente chiudiamo anche questo tran tran visto che finalmente ho 
capito la soluzione.
Ciao di nuovo
Robin
P.S. non era sarcasmo, volevo solo sdrammatizzare. Se mi conoscessi dal 
"vivo" ti accorgeresti subito che non sono il tipo che nč sboroneggia nč 
si atteggia.

 E' diverso, spero tu sia in grado di capirlo.
Alerto. Guarda ti sto rispondendo molto pacatamente. In quattro righe ti 
sei espresso in un modo che non "VOGLIO" prendere come offensivo. Ma 
sinceramente quando dici a una persona: "tu ti sei offeso, nessuno ti ha 
offeso" e "spero tu sia in grado di capirlo" non ti sembra di essere un 
pochino esagerato?
Senza offesa, uno ti potrebbe rispondere "ma tu chi kappa sei per 
arrogarti il diritto di pensare che un'altro non sia in grado di capire?"
In ogni caso non prenderla a male, volevo farti solo notare che   non 
sei mika tenerino quando scrivi. Sappi che il mondo è pieno di 
porcherie, e porcheria più porcheria meno che differenza fa?. Però 
quando  ad uno gli dici sei una porcheria, o quello che fai è una 
porcheria, anche se lo fosse davvero, bè certo non si può dire che 
quella persona è stata trattata con tatto. Un minimo di tatto ci vuole 
sempre, mi hanno insegnato che è buona cosa. E basta leggere i vari post 
e ti accorgi ad es. come Stefano pur dicendo le stesse cose, ha usato 
dei termini non offensivi, senza contare che alla fine mi ha fatto anche 
capire la soluzione del problema. E di questo l'ho ringraziato.
Cmq non mi voglio ripetere bast aleggere a inizio righe.
Ciao
Robin

 Robin
Ciao,
visto, bastava poco, un po di ascolto in più e tutto si risolve.
Cameriere Champagne!!!! (Ma lo voglio prima delle cozze...) :-)


      Reparto = String
Imho la soluzione più semplice è aggiungere un campo nella tabella MENU
MENU
  TuoiCampi
  OrdineDefault = integer
Questo lo valorizzi 1 per gli antipasti, 2 primi, 3 secondi, 3 pizza, 4
dolce ecc.
Sarà l'ordine standard delle pietanze.
Poi nella tabella consumazioni aggiungi lo stesso campo, e quando viene
inserito un rigo, carichi l'ordine default, che poi ovviamente potrà essere
cambiato:
1 CROSTINI
1 CROSTINI
2 PASTE
2 Pizza (cambiato)
3 Pizza (uno prende antipasto primo e pizza)
Quando il cameriere aggiunge una pizza da portare insieme agli antipasti,
non fa altro che richiamarla come ora, e metterci 1 al posto di 3.
Questo perchè hai detto che ti può andar bene l'ordine con cui portarle al
tavolo, e non assoluto. Sicuramente è molto semplice da gestire, e non devi
guardare di autoincrementare ecc.
Ovviamente ti potrà uscire:
1 CROSTINI
1 CROSTINI
1 PIZZA
Oppure
1 CROSTINI
1 PIZZA
1 CROSTINI
Ma se ti basta l'ordine con cui portare al tavolo, è semplice e funziona

 si atteggia.
tranquillo, capisco benissimo che ci si possa fraintendere, nessun problema.
ciao e buon lavoro.
stefano

 :-)
O porcaccia della miseria, mi devo cominciare a preoccupare. :-)
Insomma ormai conosci vita morte (tocco ferro) e miracoli di me.
Bè, quantomeno hai visto che non racconto balle.
Però la cosa mi preoccupa alquanto seriamente, mi sa che devo cambiare 
nick molto più spesso... o chissà che cosa.. magari navigare con la 
copertuta dell'IP.
In ogni modo su linux mi manca un programma com VB o Delphi. Si c'è 
Kylix ma rispetto a Delphi è una ciofeca. In C++ purtroppo... conosco 
solo l'ABC.. dalla D in poi niente.
Ciao
Robin

 devi ringraziare.
Io ringrazio tutti, per la pazienza che avete avuto, ma se tu non mi 
avessi fatto l'unzip non sarei arrivato alla soluzione. Detto come lo 
diceva Alberto, non lo capivo, perchè l'ID di ordinamento c'era già, 
magari sarebbe bastato dire che ci voleva un DOPPIO ID di ordinamento, 
uno generale, e un altro locale dedicato al singolo tavolo. In effetti 
tutta la mattinata l'ho dedicato a fare la modifica che funziona 
perfettamente e devo riconoscere che è molto elegante. Cmq, adesso mi ha 
provocato altri conflitti con altre parti del programma che dovrò 
risolvere pian piano. insomma un bel po di lavoro. :-)
Ciao e di nuovo grazie
Robin

 Robin
ciao
stefano

 Robin
figurati,
buon lavoro.
ciao
stefano