Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168

    problema grosso con randomizzazione recordset e (credo) incremento ID su database

    Ciao a tutti,
    sono difronte a un problema per me gravoso, perchè mi sta bloccando totalmente su un lavoro, spero possiate darmi una mano voi perchè non so più che pesci pigliare...

    Ho applicato, modificandolo per mie esigenze specifiche, uno script ASP di ordinamento random di un recordset che ho trovato in rete al seguente indirizzo:
    http://www.aspcode.it/articoli/84_Re...omicamente.htm
    (mi scuso se la pubblicazione di un link a un sito esterno va contro le regole del forum, ma in questo caso credo sia utile per farvi capire meglio dove ho messo mano io rispetto allo script originale...)

    Questo il codice (modificato, ma funzionante) che sto utilizzando:

    codice:
    <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
    
    <%
    Set rs = Server.CreateObject("adodb.recordset")
    ConnStr = "Provider=Microsoft.Jet.Oledb.4.0;data source=" &_
      Server.MapPath("database/miodb.mdb") & ";"
    rs.activeconnection = ConnStr
    rs.Source = "SELECT IDcat FROM categorie" 'Seleziona gli ID delle categorie
    rs.Open
    arrID = rs.GetRows() ' Salva nell'array gli ID delle categorie
    intRows = UBound(arrID,2) 'numero delle categorie, meno uno (0..N-1)
    rs.Close
    rs.Source = "SELECT IDcat, titolo, foto FROM categorie"
    rs.CursorType = 0 ' adForwardOnly
    rs.CursorLocation = 3 ' cursore lato client
    rs.Open
    Set rs.ActiveConnection = Nothing ' ci "stacchiamo" dalla sorgente dati%>
    
    <% Set objDic = CreateObject("Scripting.Dictionary")
    
    ' Riempiamo il Dictionary con gli ID delle categorie
    For i = 0 To intRows
      objDic.Add arrID(0,i), arrID(0,i)
    Next
    Randomize Timer
    
    For intCurrentRow = 0 To intRows
      intRnd = Int((intRows + 1) * RND) + 1 'ID random
      boolExists = objDic.Exists(intRnd)
      If boolExists Then ' se L'ID esiste nel Dictionary...
        rs.Move intRnd - 1, 1 ' ...muoviamo il puntatore sulla riga bersaglio...
        objDic.Remove(intRnd) ' ...e cancelliamo l'ID dal Dictionary
        ' Mostriamo il record selezionato casualmente%>
        
    	  <%
    		xml = xml & "<track>"
    		xml = xml & "<title><![CDATA[" & rs("titolo") & "]]></title>"
    		xml = xml & "<image><![CDATA[" & rs("foto") & "]]></image>"
    		xml = xml & "</track>"
    	  %>	  
    	  
        <%
      Else
        intCurrentRow = intCurrentRow - 1 ' se l'ID non esiste, ripetiamo lo stesso ciclo FOR
      End If
    Next
    
    xml = xml & "</trackList></playlist>"
    
    xml = "<playlist version=""1"" xmlns=""http://xspf.org/ns/0/""><title>Il mio elenco</title><info>http:/xspf.org/xspf-v1.html</info><trackList>" & xml
    
    response.ContentType = "text/xml"
    response.write xml
    
    rs.Close : Set RS = Nothing
    Set objDic = Nothing
    %>
    Come vedete, tale script, oltre ad estrarre dal DB un recordset da randomizzare, ha il compito di prendere i dati estratti e formattarli in modo da generare un output di tipo XML (come da altro esempio trovato in rete).

    Queste 2 funzionalità funzionano correttamente, fino a quando non aggiungo un nuovo record al mio DB e la pagina ASP/XML non mi visualizza più niente, anzi, si pianta. Ho notato che quando aggiungo (manualmente o tramite apposito manager) un nuovo record, questo assume un ID che non è consecutivo a quelli dei records di esempio già presenti (6 records, con ID dall'1 al 6), questo per effetto di precedenti test di inserimento/cancellazione.
    Quindi, nel caso specifico, l'ID del nuovo record non sarà 7 ma, ad esempio, 25.

    Il risultato, come detto, è che la pagina ASP atta a restituirmi i dati che mi servono non si carica, pagina bianca e tutto piantato...

    Se invece cancello il record appena creato, tutto rifunziona magicamente, questo mi fa pensare che il nuovo ID (non consecutivo agli altri 6) non piaccia allo script.

    Cosa devo fare? C'è qualcuno tra voi che può aiutarmi, magari mettendo mano al codice o al DB, per risolvere questo problema?

    Vi ringrazio molto per l'aiuto e la disponibilità, spero di ricevere presto delle risposte!



    t.

  2. #2
    l'ID autoincrementante non ti da *per sua natura* nessuna garanzia di consecutività -- potrai sempre avere dei buchi! aggiungi alla tua tabella una colonna numerica che conterrà un numero (che gestirai tu) che sarà sempre consecutivo, e usa quello nella routine

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    168
    ciao optime,
    grazie per il tuo suggerimento, ho provato ad aggiungere il nuovo campo numerico e funziona, finchè però non elimino uno o più record intermedio, e allora si ripresenta il problema della pagina che non si carica.
    posso provare a gestire l'incremento automatico di 1 unità, ma se elimino uno o più record, come ricostituisco automaticamente la serie numerica consecutiva?
    posso gestire al limite l'assegnazione del nuovo numero in fase di nuovo inserimento, facendo un check dei numeri "vuoti" e andando ad incasellarlo al primo posto vuoto disponibile... ma se il "vuoto" è rappresentato da 2 o più unità, otterrei dinuovo lo stesso problema...
    siamo sicuri che non esista invece un metodo alternativo per l'ordinamento random, che non tenga conto della consecutività dell'ID o di altro campo numerico?
    io ho cercato in rete, ho letto di algoritmi e cose "strane", che sicuramente non sarei in grado di applicare per mia inesperienza.
    spero in vostre ulteriori idee, e ringrazio optime!
    t.

  4. #4
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Il problema dell'inserimento corretto del numero di posizione non c'è se gestisci bene la cancellazione.
    Se ogni volta che cancelli un record riaggiorni le posizioni dei numeri che precedentemente ad esso erano successivi non avrai mai buchi in fase di inserimento.

    Roby

  5. #5
    SELECT ... WHERE ... ORDER BY RND()




    se ho capito bene edit: mi sa che non va... provo a ritrovare il codice che avevo usato

  6. #6
    per avere una colonna profressiva in più SOLO a runtime, puoi ispirarti a questo esempio http://groups.google.com/group/micro...e?hl=nl&rnum=5

  7. #7
    con poche righe, al volo (recordset disconnesso)... sembra buono

    set rs = server.createobject("ADODB.Recordset")

    rs.cursorlocation = adUseClient

    rs.open "select ..", cnn, adOpenDynamic, adLockOptimistic, adCmdText

    set rs.activeconnection = nothing

    randomize

    while rs.recordcount > 0

    rs.absoluteposition = cint(rnd() * (rs.recordcount - 1) + 1)

    ' QUI STAMPO

    rs.delete

    rs.update

    wend

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.