• User

    Non elencare nella select i duplicati dallo split

    Ciao non so come evitare la duplicazione dei risultati dallo split, premetto che lo script funziona

    
    
    <% loca = request.querystring("loc")  sql = "SELECT DISTINCT localita FROM offerte WHERE tipo = '" & request.querystring("mod") & "' GROUP BY localita" Set rs = Server.CreateObject("ADODB.Recordset") rs.Open sql, Conn, 3  if rs.eof then else %> <td > <select size="1" name="loc" onchange='this.form.submit()'>  <% rs.MoveFirst  Do While Not rs.EOF  controllo = rs.fields("localita")  arryControllo = Split(Controllo, ", ")   For i=0 to UBound(arryControllo)  stringa = Trim(arryControllo(i))  %>  <option value="<%=stringa%>"<%if loca = "" & stringa & "" then%>selected="selected"<%end if%> ><%=stringa%></option> <% Next  rs.MoveNext Loop rs.Close set rs = Nothing end if %>
    
    

    Grazie


  • Moderatore

    Ciao djjunior, prima domanda:

    Perché nel campo localita della tabella offerte ci sono campi separati da virgola?

    Ciò vuol dire che se nella prima riga ci sono "parma, firenze, modena" e nella seconda riga "torino, parma, milano", necessariamente nella tua lista avrai parma due volte...


  • User

    Ciao.. si nelle righe del campo località ci possono essere città replicate come indichi tu. Posso ovviare? E come? Grazie


  • Moderatore

    Rispettando la "Prima Forma Normale".
    Dovresti scomporre la colonna "localita" in una tabella dipendente dalla prima "offerte".

    A questo punto con una JOIN tra le due funzionerà anche la DISTINCT.


  • User

    Puoi farmi un esempio? Non ho capito come fare, grazie


  • Moderatore

    La tabella "offerte" attualmente contiene le colonne tipo e localita, dovrebbe contenerne altre come ad esempio un IDOfferta o simili che dovrebbe essere la chiave della tabella.

    Se è così, dovresti creare una seconda tabella ("Localita" ad es.), che dovrebbe avere una sua chiave, un riferimento alla tabella "offerte" [ForeignKey], diciamo fkOfferte, e infine il nome della località (ad es. nome). Ogni riga di "Localita" contiene una sola località e il riferimento alla tabella "Offerte".

    A questo punto potrai eseguire una query di questo tipo:

    
    SELECT DISTINCT Localita.nome FROM Localita LEFT JOIN offerte WHERE offerte.tipo = '" & request.QueryString("mod") & "'
    
    

    Tutti i dati attualmente raccolti dovranno essere riversati nella nuova tabella con il riferimento (fkOfferte) giusto e d'ora in avanti dovrai salvare le località nella nuova tabella.


  • User

    Grazie ARTCAVA, creare una nuova tabella al momento sarebbe alquanto complicato perchè si tratterebbe di modificare il db.
    Mi hanno segnalato questo codice da sostituire allo split, ma non so come implementarlo al mio script, puoi darmi una mano?

    
    
    Function SplittaDistinct(str,sep)
        dim strx, sepx, arr, i, dic
        set dic=Server.CreateObject("Scripting.Dictionary")
        arr = Split(str,sep)
        strx=""
        sepx=""
        for i=LBound(arr) to UBound(arr)
            if not dic.Exists(arr(i)) then
                strx=strx & sepx & arr(i)
                dic.Add arr(i),true
                sepx=sep
            end if
        next
    
    

    Grazie


  • Moderatore

    Ciao djjunior, non vorrei sembrarti pedante, ma modificare il DB per me è mandatorio... Qualsiasi altro "accrocchio"-code sarebbe ridondante ed inutile, nonché ricettacolo di futuri problemi o errori.

    Scusami se sono schietto e diretto, ma questo è il mio modesto pensiero.


  • User

    Ciao ARTCAVA,
    ho seguito il tuo suggerimento ho impostato così il db:

    TABELLA : OFFERTE

    CAMPI:
    cod_cliente
    tipo

    NUOVA TABELLA : LOCALITA

    CAMPI:
    cod_cliente
    localita

    (ogni località ha come key cod_cliente, uguale su entrambi le tabelle) tipo

    id 1
    cod_cliente 167618
    localita MILANO
    id 2
    cod_cliente 167618
    localita ROMA
    id 3
    cod_cliente 167618
    localita NAPOLI
    id 4
    cod_cliente 387363
    localita MILANO
    id 5
    cod_cliente 387363
    localita ROMA

    Ecco ora non riesco a fare la query, per leggere i dati, perche sotto tue suggerimento ho fatto questa query:

    SELECT DISTINCT localita.localita FROM localita LEFT JOIN offerte WHERE offerte.tipo_pasto = '" & request.QueryString("mod") & "'

    purtroppo ho questo errore sulla query: [Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause.

    Premetto che ho fatto prima una prova relazionando le tabelle con il solo campo "cod_cliente"

    ma anche senza relazione ed ho sempre il suddetto errore

    Dove sbaglio, grazie per il tuo aiuto.
    G.


  • User

    modificando lo script così:

    
    sql = "SELECT localita.localita FROM localita LEFT JOIN offerte ON localita.cod_cliente = offerte.cod_cliente WHERE offerte.tipo_pasto = '" & request.QueryString("mod") & "'"
    
    

    Ho questo errore:

    
    Response object error 'ASP 0251 : 80004005'Response Buffer Limit Exceeded/offerta.asp, line 0
    Execution of the ASP page caused the Response Buffer to exceed its configured limit.
    
    

  • Moderatore

    Eccomi:
    la tabella OFFERTE secondo me dovrebbe avere i seguenti campi:

    id
    cod_cliente
    tipo

    Mentre la tabella LOCALITA:

    id
    offertaid
    nome

    Riprendo l'esempio iniziale

    OFFERTE:

    [TABLE="class: grid, width: 200, align: left"]

    [TD]id (key)[/TD]
    [TD]cod_cliente[/TD]
    [TD]tipo[/TD]
    [/TR]

    [TD]1[/TD]
    [TD]12345[/TD]
    [TD]A[/TD]
    [/TR]

    [TD]2[/TD]
    [TD]12345[/TD]
    [TD]A[/TD]
    [/TR]
    [/TABLE]

    LOCALITA:

    [TABLE="class: grid, width: 200, align: left"]

    [TD]id (key)[/TD]
    [TD]offertaid (foreign key)[/TD]
    [TD]nome[/TD]
    [/TR]

    [TD]1[/TD]
    [TD]1[/TD]
    [TD]Parma[/TD]
    [/TR]

    [TD]2[/TD]
    [TD]1[/TD]
    [TD]Roma[/TD]
    [/TR]

    [TD]3[/TD]
    [TD]1[/TD]
    [TD]Milano[/TD]
    [/TR]

    [TD]4[/TD]
    [TD]2[/TD]
    [TD]Torino[/TD]
    [/TR]

    [TD]5[/TD]
    [TD]2[/TD]
    [TD]Napoli[/TD]
    [/TR]

    [TD]6[/TD]
    [TD]2[/TD]
    [TD]Parma[/TD]
    [/TR]
    [/TABLE]

    La relazione è tra offertaid della tabella LOCALITA e id della tabella OFFERTE

    Spero così di aver chiarito cosa intendessi all'inizio


  • User

    Scusa x capire, xchè nn posso utiLizzare il campo codice cliente come relazione tra tabelle?


  • Moderatore

    Perché così avevo capito...

    Mi sa che devi spiegarmi cosa devi fare senza parlare di tabelle o campi... Le cosiddette specifiche funzionali e non quelle tecniche.

    La località è legata all'offerta o al cliente?


  • User

    In pratica se vedi al primo mio post avevo necessità di splittare le località perché l avevo inserite in un campo chiamato Località della tabella offerte. Ma c era il problema dei duplicati e tu mi hai suggerito di suddividere su altra tabella solo le localita, una per ogni rigo. Ora ieri t ho inviato come è costruito ora il db e ho relazionato un campo univoco tra di loro e cioè il codice cliente che è un campo testo nel db e contiene lettere e numero tipo: xg565d. Le località sono legate all offerta tramite questa relazione Quindi la query deve essere che quando il TIPO è presente nel db deve elencarmi nelle option della select le localita di tutte le offerte presenti con quel TIPO evitando i duplicati. Spero di essermi spiegato, vedi comunque mio.post di ieri come ho impostato il db ora e vedi dove sbaglio la query. Perché è la query che sbaglio ma nn so dove. Grazie


  • Moderatore

    Allora, la query dovrebbe essere:

    SELECT DISTINCT localita.localita FROM localita LEFT JOIN offerte **ON localita.cod_cliente = offerte.cod_cliente** WHERE offerte.tipo_pasto = '" & request.QueryString("mod") & "'