Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684

    Prelevare record con campo contatore più alto

    Voorei prelevare da una tabella "x" dal compo "CODICE", tipo contatore crescente a chiave numerica, il numero più alto.

    Tabella "x":
    CODICE -> campo contatore a chiave primaria
    CLIENTE -> Numerico intero lungo
    DATA -> DATA/ORA
    STATO -> Numerico Byte 'contemplato solo 1 e 0
    Stato = 0 e' di default.

    Ho pensato di creare una query per l'SQL, in questo modo:
    [CODE]
    idutente = 1
    conn...
    SQL = "SELECT TOP 1 * FROM x WHERE cliente = "& idutente &" AND stato = 0 ORDER BY codice DESC"
    creazione rs
    apertura rs

    idordine = rs("codice")

    chiusura rs

    ecc...

    Cosa dite va bene? In poche parole dovrei inserire in un'altra tabella "dettagliordini" il codice del prodotto e l'id dell'ordine.
    Per sapere qeull'ordine a che id fa riferimento ho pensato di creare questo controllo... infatti controllo l'ultimo ordine di quell'utente non evaso... cosi' alla variabile "idordine" gli assegno l'id dell'ordine avente il numero piu' alto.

    E' giusto il ragionamento?

    Grazie

  2. #2
    sì! Oppure (ma è tanto non uso access non ricordo se lo supporta) puoi fare SELECT MAX(ID)!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684
    Ok per l'SQL...

    ecco il codice, che interroga il database e mi restituisce l'id piu' alto:
    codice:
    ...
    IF len(idutente) > 0 THEN
    
    'controllo e prelevo id dal campo codice dalla tabella ordini
    sqlordineid = "SELECT TOP 1 * FROM ordini WHERE cliente = "& idutente &" AND stato = 0"
    Set rsordineid = Server.CreateObject("ADODB.Recordset")
    rsordineid.Open sqlordineid, conn ,3,3
    do while not(rsordineid.eof)
    idordine = rsordineid("codice")
    rsordineid.movenext
    loop
    rsordineid.close
    set rsordineid = nothing
    
    END IF
    
    response.write "Codice dell'ordine" & idordine & "
    "
    Avendo la tabella ordini così composta, mi restituisce idordine = 1!
    CODICE | CLIENTE | DATA | STATO
    1 1 21/02/06 0
    2 1 22/02/06 0

    Dovrebbe restituirmi 2, ho scritto top 1...

    sicurmanete sbaglio con il do while... loop, cosa devo usare?

    grazie

  4. #4
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Devi utilizzare la sintassi
    codice:
     Max(ID)
    codice:
    SQL = "SELECT Max(ID) AS MaxID FROM tabella"
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684
    OK ho risolto così:
    codice:
    IF len(idutente) > 0 THEN
    
    'controllo e prelevo id dal campo codice dalla tabella ordini
    sqlordineid = "SELECT * FROM ordini WHERE cliente = "& idutente &" AND stato = 0"
    Set rsordineid = Server.CreateObject("ADODB.Recordset")
    rsordineid.Open sqlordineid, conn ,3,3
    'Sposto il cirsore all'ultimo record che rispetta la SELECT
    rsordineid.movelast
    idordine = rsordineid("codice")
    
    rsordineid.close
    set rsordineid = nothing
    
    END IF
    
    response.write "Codice dell'ordine" & idordine & "
    "
    OK, cosi' funziona, ho creato vari record con valori idutente uguali e stato = 0 mi prende l'ultimo... e se l'ultimo ha valore stato = 1 mi prende l'ultimo con valore stato = 0

    Penso che così dovrebbe andare... almeno su 6 record, ho rpovato con varie combinazioni e' funziona a dovere...

    Fatemi sapere, possibilmente, se c'è qualche errore!!!

    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684
    Si ma io devo prendere l'id piu' alto che rispetta i valori della select... ovvero prendere in considerazione l'id più alto che contiene il valore memorizzato nella session passato alla variabile IDUTENTE e (stato = 0)

    ho usato il recordset.movelast

    Mi sono spiegato?

  7. #7
    Ma scusa fare una cosa che ti fa usare un'istruzione in meno non è + performante?
    Metti le condizioni nella where della query:


    SELECT MAX(ID) AS ULTIMOID FROM TABELLA WHERE cliente = "& idutente &" AND stato = 0"


    rstUltimoId=objrs("ULTIMOID")

    et voilà! Non essere esoso la memoria è preziosa sopratutto quando si parla di asp!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684
    non ho capito bene la sintassi con il MAX(ID)

    allora:

    SELECT MAX(ID) AS codice FROM ordini WHERE cliente = "& idutente &" AND stato = 0"

    poi:

    set rsordineid = Server....
    rsordineid.Open sql, conn ,3,3

    idordine = rsordine("codice")

    Ma mi restituisce questo errore:
    Microsoft JET Database Engine (0x80040E10)
    Nessun valore specificato per alcuni parametri necessari.
    ala linea dell'apertura del record set...

    Come mai?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    684
    ieri sera, in preda ad un attacco di isteria... ho commesso un errore banalissimo...

    ho dimenticato di inserire il nome esatto del campo contatore nel MAX(*) e ho tralasciato ID, nome che frequentemente assegno al campo contatore... ecco il motivo per il quale non andava.

    Grazie della dritta... non conscevo, visto che programmo in asp da poco, il comando MAX(ID) dell'SQL.

    Potete darmi un link dove poter accedere ad una buona guida SQL?

    Grazie...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.