Newsgroup: it.comp.lang.visual-basic
Titolo: problema con query

Sono alle prese con un problema sul mio programma e spero che qualc'uno
sappia darmi una dritta. Vi espongo il problema:
io ho un file in mdb dove ho il campo1 che si richiama altri tre campi
(es. il campo 1 contiene il nome colore aragosta che si compone dal
campo rosso con qt. 0,5 e dal campo unità grammi).
il problema che nel mio file non devo avere colori duplicati con gli
stessi componenti, qt. e unità di misura. Datemi per favore una mano che
stò impazzzzendo.

group by colore,qta,misura

 ha scritto nel messaggio
news:3B024961...@tin.it...



Per tua informazione, visto che ti stanno tanto antipatiche le domande sui
database, si dà il caso che Vb permetta di usare gli oggetti Dao, gli Ado ed
anche Odbc.
Inoltre buona parte dello sviluppo non "giocoso" su Vb ha a che fare con la
gestione dei dati.
Domande sull'uso dei database NON sono OT, come credo che ti potranno
confermare tutti.
Se hai bisogno di pubblicizzare un altro Ng, fai pure, con discrezione
please... , se hai voglia di rispondere -seriamente- anche, sennò non
rompere le...  OOOO
( p.s.
Chiedo scusa a tutti per lo spazio inutile occupato da questa serie di
risposte.)
ciao
ugo

 group by colore,qta,misura

Ah, allora il problema cambia, dal msg sopra sembrava che il problema era in
select, non in insert.
Colori uguali per qtà uguali e misura uguali (cioè colori uguali con misura
diversi sono accettati) oppure MAI 2 colori uguali?
Devi comunque fare 2 query: con una fai un select  di quello che ti serve;
se NON restituisce record puoi inserire.
Non mi viene in mente nessun modo per fare un insert solo se il colore da
inserire non esiste in un'unica "botta".

Sei quasi vicino al problema: MAI due colori uguali.
il problema però e che io ho una tabella dove registro il codice del colore e il
nome mentre in un'altra registro i componenti del colore la qt. e unità. Perchè
un colore può essere composto da più componenti. esempio:
Colore                                    componente
qt.            unità
Verde Mare                            verde
0,5            grammi
                                               blu
0,2            grammi
                                               bianco
0,1            grammi
                                               n...
n...            n....
quindi io devo controllare che i componenti che formano il colore non siano
ripetuti nelle stesse qt ed unita perchè
formerebbero lo stesso colore anche se io lo chiamo con un altro nome. Come vedi
non è tanto semplice io ci stò
impazzendo da una settimana vedi se puoi darmi una mano.
Comunque ti ringrazio lo stesso anticipatamente.
Ciao Sergio
Cristiano Larghi ha scritto:


Ma avrai un modo per estrarre solo i dati che ti servono.
Se lui fornisce colore=color, quantità=qta, unità=u fai una select tra le 2
tabelle per vedere se esiste di già:
select color from tabellacolori inner join tabellaqtaunita on ....(qua il
tuo collegamento tra le 2 tabelle) where colore=color and qta=qta and
unita=u
Se non restituisce valori allora va inserito.

 Ma avrai un modo per estrarre solo i dati che ti servono.


mi spiace ma non capisco il problema:
select idcolore from colore join tabcol on colore.idcolore=tabcol.ipcolore
where nomecol='coloreinserito' and qt=quainserita and unmis='misurainserita'
=> se restituisce 1 record vuol dire che c'è di già...

 => se restituisce 1 record vuol dire che c'č di gią...
E' questo il problema che i record non sono uno ma possono essere due tre ed
oltre
dopo il "Where" non posso inserire un valore ma n. valori.
come ti ho riportato nella tabella Tabcol.

Mi spiace ma non ci capiamo, vediamo se qualcun altro capisce (come fanno ad
essercene più di uno con tutti i valori uguali? se usi nella query AND
significa "E", non "O"....)


Eccomi caduto nella trappola :)
Pensavo di trovare ormai un ot :), invece si sta trattando il problema originario :(
Ipotizzo una soluzione in pseudocodice (non ho access qui con me),
basandomi sul presupposto di confrontare due matrici (o recordset)
ordinate per componente e quantita', con una sola unita' di misura
consentita per ogni componente.
Function ColoreUguale(ByVal idColoreOld As Long) As Boolean
    Dim rsOld As Recordset      // dataset estratto dal database
    Dim rsNew As Recordset    // dataset temporaneo da confrontare con il db
    // estrae le info sul colore dal database 
    rsOld.Open "SELECT ncomp, qt " & vbNewLine & _
                      "FROM Tabcol " & vbNewLine & _
                      "WHERE ipcolore = " & CStr(idColoreLong) & vbNewLine & _
                      "ORDER BY ncomp, qt
     If rsOld.EOF Then GoTo free_mem
      // per comodita' ipotizziamo che si un recordset, ma potrebbe essere una matrice
      rsNew.Open select_ordinata_per ncomp_e_qt
     Do
          If (rsOld!ncomp <> rsNew!ncomp) Then GoTo free_mem
          If (rsOld!qt <> rsNew!qt) Then GoTo free_mem
          rsOld.MoveNext
          rsNew.MoveNext
          If (rsOld.EOF And rsNew.EOF) Then ColoreUguale = True
     Loop Until (rsOld.EOF Or rsNew.EOF)
free_mem:
    If (not rsOld Is Nothing) Then rsOld.Close : set rsOld = Nothing
    If (not rsNew Is Nothing) Then rsNew.Close : set rsNew = Nothing 
End Function
hth, hal

 significa "E", non "O"....)
Perchè non è un record che io devo confrontare ma ma più records in blocco per
determinare che il colore che ho
inserito è uguale. il colore rosso con qt. 0,5 ce ne sono 400 di records, mentre
con il rosso+verde+blu con le stesse
quantità ce ne deve essere uno solo. Perchè un colore è composto da più colori
base.
Esempio:
se io ho il colore Rosso Ferrari, per comporre tale colore dovrò utilizzare i
seguenti colori base:
rosso 0,5 grammi
nero 0,1 grammi
giallo 0,2 grammi
come vedi io non devo controllare che ci sia solo il rosso con 0,5 di qt. ma
devo controllare
tutti e tre i colori contemporaneamente per determinare se ci sono altri colori
uguali.
Spero di essere stato più chiaro.
Ciao Sergio

Urca
adesso mi è chiaro
la logica di Hal mi sembra corretta: fai la select, carichi in una matrice e
confronti i risultati.

 Urca
