+ Rispondi al Thread
Pagina 1 di 5 123 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 42

Discussione: Problema con query

  1. #1
    ettorpa non è in linea Novello
    Post
    28

    Problema con query

    Salve a tutti,

    Mi sono registrato da poco a questo forum e volevo chiedervi un piccolo aiuto.

    Mi spiego:
    Allora ho creato un motore di ricerca interno che mi estrae i dati dalle tabelle del db access.

    Il problema è il seguente:
    Come è strutturata ora la query, quando inserisco nel campo input un codice/articolo Esempio: F300SA1510 (Drum Samsung ML-1510) mi estrae il codice richiesto con tutte le condizioni che sono in query..e fin quì tutto bene.
    Ma....se volessi estrarre tutti i codici che iniziano per F300SA...per concorrente etc..

    F300SA1510 - TIZIO
    F300SA1710 - CAIO
    F300SA2850 - SEMPRONIO
    F300SA3050 - ETC
    ETC...
    Come potrei fare??? come potete vedere dal codice, ho commentato la query con le like% per non estrarre duplicati.

    ************posto la pagina:****************

    codice:
    <%
    Dim Cerca
    Cerca = Replace(Request.Form("search"), "'", "")
    if Cerca = "" then
    Response.write ""
    Response.end
    end if
    Dim DbPath, Conn
    
    DbPath="/db/db.mdb"
    Set Conn = Server.CreateObject("ADODB.Connection")
    
    Conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(DbPath)
    
    Dim strSQL,strSQL2, Rs
    strSQL = "Select * from Dati2 where code='" & Cerca & "' order by code asc"
    
    'strSQL = "Select * from Dati2 where code like '%" & Cerca & "%' or ID like '%" & Cerca & "%' or description like '%" & Cerca & "%' order by code asc"
    
    Dim cn,cm
    Set cn = Server.CreateObject("ADODB.Connection")
    cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="& Server.MapPath("/db/db.mdb")
    
    Set Rs = Server.CreateObject("ADODB.Recordset")
    
    Rs.Open strSQL, Conn, 3, 3
    
    
    if Rs.EOF then
    
    Response.write "Nessun risultato trovato!"
    else
    
    Do while NOT Rs.EOF
    
    %>
    
    <table width="100%" border="0" cellspacing="1" cellpadding="5" id="table95" style="border-top-width: 0px; border-bottom-width: 0px">
    <tr> 
    <td bgcolor="#D3D3D3" align="center" width="12%"><b>
    <font face="Verdana" size="2" color="#800000">Date</font></b></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Concorrente</b></font></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Code</b></font></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Description</b></font></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Code_oem</b></font></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Grm_sea</b></font></td>
    <td bgcolor="#D3D3D3" align="center" width="30%"><font face="Verdana" size="2"><b>Grm_con</b></font></td>
    <td bgcolor="#008080" align="center" width="30%"><font face="Verdana" size="2" color="#FFFFFF"><b>Prezzo_Sea</b></font></td>
    <td bgcolor="#000800" align="center" width="30%"><font face="Verdana" size="2" color="#FFFFFF"><b>Prezzo_Conc</b></font></td>
    <td bgcolor="#000800" align="center" width="30%"><font face="Verdana" size="2" color="#FFFFFF"><b>Prezzo_min</b></font></td>
    <td bgcolor="#000800" align="center" width="30%"><font face="Verdana" size="2" color="#FFFFFF"><b>Prezzo_medio</b></font></td>
    <td bgcolor="#000800" align="center" width="30%"><font face="Verdana" size="2" color="#FFFFFF"><b>Prezzo_max</b></font></td>
    
    
    </tr>
    <tr>
    <td bgcolor="#FFCC33" width="12%"><font face="Verdana" size="2"><%=Server.HTMLEncode(rs("data_reg"))%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%=Server.HTMLEncode(rs("concorrente"))%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%=Server.HTMLEncode(rs("code"))%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("description") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("code_oem") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("grammi_sea") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("grammi_con") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("price") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%Response.write "" & Rs ("prezzo_concorrenza") & "" & ""%></font></td>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%set rs=cn.execute ("Select MIN(prezzo_concorrenza) as minimo from Dati2 WHERE code='" & Cerca & "' ")%><p align="center"><font color="#FF0000" face="Verdana" size="2"><%response.write ""&rs("minimo")%></font>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%set rs=cn.execute ("Select AVG(prezzo_concorrenza) as media from Dati2 WHERE code='" & Cerca & "' ")%><p align="center"><font color="#008000" face="Verdana" size="2"><%response.write ""&rs ("media")%></font>
    <td bgcolor="#FFCC33" width="30%"><font face="Verdana" size="2"><%set rs=cn.execute ("Select MAX(prezzo_concorrenza) as massimo from Dati2 WHERE code='" & Cerca & "' ")%><p align="center"><font color="#000080" face="Verdana" size="2"><%response.write ""&rs ("massimo")%></font></p>
    </tr> 
    </table>
    </form>
    
    <table width="80%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="#ffffff">
    <tr>
    <td>
    </tr>
    </table>
    <div align="center"><br>
    
    <%
    Rs.MoveNext 
    
    Loop 
    
    End If
    
    %> 
    
    </div>
    <p align="center"></p>
    </form>
    </div>
    
    </body>
    
    </html>
    
    <%
    
    Rs.close
    
    Set Rs = Nothing
    
    Conn.close
    
    Set Conn = Nothing
    %>
    
    In sostanza vorrei avere il prezzo minimo,medio e massimo per "concorrente" su tutti i record che soddisfano la richiesta.
    Invece ora mi restituisce 1 solo record con prezzo min,med e max per concorrente.

  2. #2
    L'avatar di birby
    birby non è in linea Scolaretto
    Luogo
    Brescia
    Post
    124
    ciao, per poterti rispondere dovresti postare la struttura della tabella Dati2.

  3. #3
    ettorpa non è in linea Novello
    Post
    28
    Ciao Birby, innanzitutto grazie per avermi risposto.

    Allora la tabella è composta con i seguenti campi : (alcuni li ho omessi perchè al momento non servono)

    Tabella Dati2:
    concorrente,code,description,code_oem,grammi_sea,g rammi_con,price,prezzo_concorrenza

  4. #4
    L'avatar di birby
    birby non è in linea Scolaretto
    Luogo
    Brescia
    Post
    124
    Dunque, un paio di suggerimenti ...
    Nella query con l'operatore LIKE, se vuoi realizzare la condizione " tutti i codici che iniziano per F300SA" devi togliere la wildcard (%) iniziale, perchè altrimenti considera anche record che iniziano con altri caratteri ma che hanno al loro interno "F300SA".
    Per quanto riguarda l'estrazione dei valori di minimo, massimo e media del campo <prezzo_concorrenza> riferito a ciascun concorrente per il codice in esame, la query che utilizzi è sbagliata perchè devi raggruppare per concorrente, usando la clausola GROUP BY di SQL.

    Tuttavia rimango un pochino perplesso dalla struttura della tua tabella e quindi del tuo database.
    Mi spiego: che senso ha avere il campo <concorrente> , il campo <price> ed il campo <prezzo_concorrenza> nella stessa tabella?
    Io mi sarei aspettato di avere una tabella degli articoli, una tabella dei fornitori ed una tabella dei listini prezzi nel tuo database, con le opportune chiavi primarie e le opportune relazioni; mi sa che il tuo database non è normalizzato....


  5. #5
    ettorpa non è in linea Novello
    Post
    28
    Ti spiego:

    il campo concorrente è relativo appunto al concorrente/concorrenza
    il campo price è relativo al mio prezzo
    il campo prezzo concorrenza è relativo appunto alla concorrenza.

    quindi per fare un'analisi, nel report io ho i seguenti dati:

    concorrente,codice,descrizione,prezzomio,prezzo_co ncorrenza,prezzo_minimo(concorrenza),prezzo_medio( concorrenza),prezzo_massimo(concorrenza)

    dove il codice,descrizione,prezzomio sono relativi al mio db aziendale...e il resto è confrontato con i dati della concorrenza.
    in effetti ho creato da un mio db..un altro db affiancato..(dati miei + dati concorrenza) ecco il motivo.

    ovviamente i campi: prezzomin,med,max non sono veri campi db ma il risultato di query.

  6. #6
    ettorpa non è in linea Novello
    Post
    28
    Devo modificare questa query?

    <%set rs=conn.execute ("Select MIN(prezzo_concorrenza) as minimo from Dati2 WHERE code LIKE '%" & Cerca & "%' ")%><%response.write ""&rs("minimo")%>
    <%set rs=conn.execute("Select MIN(((prezzo_concorrenza)/1.30)/1.05)/1.10 as minimo from Dati2 WHERE code LIKE '%" & Cerca & "%' ")%><%Response.write ""&rs("minimo")%>
    In questo modo va bene?

    <%set rs=conn.execute ("Select MIN(prezzo_concorrenza) as minimo from Dati2 GROUP BY code")%><%response.write ""&rs("minimo")%>
    <%set rs=conn.execute("Select MIN(((prezzo_concorrenza)/1.30)/1.05)/1.10 as minimo from Dati2 GROUP BY code")%><%Response.write ""&rs("minimo")%>

  7. #7
    ettorpa non è in linea Novello
    Post
    28
    <%set rs=conn.execute ("Select MIN(prezzo_concorrenza) as minimo from Dati2 WHERE code LIKE '%" & Cerca & "%' ")%><%response.write ""&rs("minimo")%>
    <%set rs=conn.execute("Select MIN(((prezzo_concorrenza)/1.30)/1.05)/1.10 as minimo from Dati2 WHERE code LIKE '%" & Cerca & "%' ")%><%Response.write ""&rs("minimo")%>
    In questo modo va bene?

    <%set rs=conn.execute ("Select MIN(prezzo_concorrenza) as minimo from Dati2 GROUP BY code")%><%response.write ""&rs("minimo")%>
    <%set rs=conn.execute("Select MIN(((prezzo_concorrenza)/1.30)/1.05)/1.10 as minimo from Dati2 GROUP BY code")%><%Response.write ""&rs("minimo")%>

  8. #8
    L'avatar di birby
    birby non è in linea Scolaretto
    Luogo
    Brescia
    Post
    124
    Quote Originariamente inviato da ettorpa Visualizza il messaggio
    Ti spiego:

    il campo concorrente è relativo appunto al concorrente/concorrenza
    il campo price è relativo al mio prezzo
    il campo prezzo concorrenza è relativo appunto alla concorrenza.

    quindi per fare un'analisi, nel report io ho i seguenti dati:

    concorrente,codice,descrizione,prezzomio,prezzo_co ncorrenza,prezzo_minimo(concorrenza),prezzo_medio( concorrenza),prezzo_massimo(concorrenza)

    dove il codice,descrizione,prezzomio sono relativi al mio db aziendale...e il resto è confrontato con i dati della concorrenza.
    in effetti ho creato da un mio db..un altro db affiancato..(dati miei + dati concorrenza) ecco il motivo.

    ovviamente i campi: prezzomin,med,max non sono veri campi db ma il risultato di query.
    Perdonami, ma sono ancora un pochino confuso .... mi pare di capire che la tabella Dati2 sia in realtà il risultato di una query e che su quella tabella tu voglia effettuare una ricerca che dovrebbe restituirti, dato l'input parziale F300SA tutti i record il cui codice INIZI con quella stringa oppure tutti i record il cui ID CONTENGA quella stringa oppure tutti i record la cui descrizione CONTENGA quella stringa. Se è questo che vuoi, la query che utilizzerei è:
    codice:
    SELECT id, concorrente, code, description, code_oem, grammi_sea, grammi_con, price, prezzo_concorrenza 
    FROM Dati2
    WHERE code Like 'F300SA%' 
    OR id Like '%F300SA%'
    OR description Like '%F300SA%'
    ORDER BY code
    Bene.
    Estratti questi dati, per compilare il tuo report vorresti indicare il prezzo minimo, medio e massimo della concorrenza riferito all'articolo cercato: nel tuo codice tu eseguivi tre query distinte sulla tabella Dati2 passando come argomento della clausola WHERE la famosa stringa "F300SA".
    Tale implementazione è scorretta ; io modificherei la query che ho scritto prima in questo modo:
    codice:
    SELECT id, concorrente, code, description, code_oem, grammi_sea, grammi_con, price, 
    MIN(prezzo_concorrenza) AS minimo, AVG(prezzo_concorrenza) AS medio, MAX(prezzo_concorrenza) AS massimo
    FROM Dati2
    GROUP BY id, concorrente, code, description, code_oem, grammi_sea, grammi_con, price
    HAVING code Like 'F300SA%' 
    OR id Like '%F300SA%'
    OR description Like '%F300SA%'
    ORDER BY code
    Ti consiglio di provare questa query, modificare il tuo codice togliendo le tre query distinte che eseguivi nel ciclo e verificare se i risultati che ottieni sono in linea con le tue aspettative.


  9. #9
    ettorpa non è in linea Novello
    Post
    28
    Grazie mille per la risposta e per il tuo interessamento...ci sei quasi vicino...bravissimo...pero' devo esserti più chiaro sulla situazione.


    Allora il succo è questo: la tabella Dati2 è in realtà il risultato di una query (perchè è stata generata su di un'altra tabella del db, aventi altri campi e poi concatenati con questa nuova tabella)
    Sulla nuova tabella (Dati2) io vorrei effettuare una ricerca che dovrebbe restituirmi, dato un input di ricerca per categoria/codice.
    Esempio:
    codice:
    F300SA (tutti i drum/tamburi che iniziano per codice e marca)
    F1120SA (tutti i microchip che iniziano per codice e marca)
    F800SA (tutti i pcr che iniziano per codice e marca)
    F400SA (tutte le wiper blade che iniziano per codice e marca)
    F500SA (tutte le doctor blade che iniziano per codice e marca)
    ETC...I codici sono tantissimi.(parliamo di materie prime per la rigenerazione dei toner laser compatibili..per intenderci :-)
    Ovviamente la ricerca deve essere fatta per codice specifico (se lo si conosce) o parziale tipo: F300SA-F1120SA-F400SA-F500SA-F200DE-F200HP ETC... oppure per testo (descrizione)

    Ho provato con le tue query e direi che hai centrato l'obiettivo...però la ricerca deve essere estesa e non solo F300SA..quindi posso lasciare solo il like '%" giusto???
    Quindi nella tua query , mi mancano solo gli ultimi 2 valori (campi) da inserire: Prezzo_RSD (conversione da dinari e euro), Prezzo_Acquisto (pz min di acquisto)

    1°:
    codice:
    valuta = (1/118.57)  - settato a inizio pagina
    RESPONSE: <%if not(isnull(objrs("priced"))) then response.write(formatnumber(objrs("priced")*valuta,2))else response.write("")end if%>
    DOVE "priced" sarebbe il campo che mi restituisce la conversione RSD-EURO.

    2°:
    Con questo tipo di formula, calcolato sul prezzo minimo della concorrenza, mi ricavo il prezzo minimo di acquisto.
    codice:
    <%set rs=conn.execute ("Select MIN(((prezzo_concorrenza)/1.30)/1.05)/1.10 as minimo from Dati2 WHERE code LIKE '%" & Cerca & "%' ")%><%Response.write ""&rs("minimo")%>
    E direi che abbiamo concluso.

  10. #10
    L'avatar di birby
    birby non è in linea Scolaretto
    Luogo
    Brescia
    Post
    124
    Ho provato con le tue query e direi che hai centrato l'obiettivo...però la ricerca deve essere estesa e non solo F300SA..quindi posso lasciare solo il like '%" giusto???
    Ciao !
    Sono contento di averti aiutato; quando ho scritto la query ho lasciato la stringa "F300SA" solo a titolo di esempio; nella scrittura del codice definitivo in ASP dovrai utilizzare la query con la tua variabile "Cerca" come argomento della clausola HAVING.


+ Rispondi al Thread
Pagina 1 di 5 123 ... ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi