Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [VB6] problema assurdo ADO

    Sto facendo un "programmino" in VB6 ma mi sono trovato davanti un problema che non riesco a capire che senso abbia...
    in pratica il programma serve per calcolare automaticamente delle clasifiche di alcune gare sportive. Memorizza tutti i risultati in un db access e poi li visualizza sotto forma di classifiche creando pagine html, in modo che possano essere pubblicati sul sito dell'organizzazione sportiva.
    Il problema in realtà non centra niente con la natura del programma.
    In pratica quando vado a leggere con ADO i dati della tabella dei risultati mi restituisce un record in meno di quelli presenti, e non ho usato clausole particolari, solo un "SELECT * FROM tabella ORDER BY colonna DESC". Se apro il db con access vedo che il record che non mi restituisce è sempre l'ultimo della tabella.
    La cosa assurda è che se prima di formulare la query ci metto un msgbox("scritta qualunque"), ADO mi restituisce il numero giusto di record, se invece non ci metto il msgbox un record non viene restituito.
    Che cavolo succede??? Non mi è mai capitata una cosa del genere...
    Il problema lo risolverei lasciando il msgbox, ma è una cosa che non ha senso!!!

    La parte problematica del codice è questa (ScoreOrder è la variabile che mi indica l'ordine dei dati):

    codice:
    If (ScoreOrder = 0) Then
        Query = "SELECT * FROM tabella ORDER BY col DESC, col1 ASC"
    ElseIf (ScoreOrder = 1) Then
        Query = "SELECT * FROM tabella ORDER BY col ASC, col1 ASC"
    End If
    frmMainForm.adoCompetitors.RecordSource = Query
    frmMainForm.adoCompetitors.Refresh
    Dim Data As ADODB.Recordset
    Set Data = frmMainForm.adoCompetitors.Recordset
    con questo codice mi da tutti i risultati della tabella meno l'ultimo record

    Se invece aggiungo il msgbox prima della formulazione della query ADo mi restituisce tutti i record. Ecco il codice che funziona:
    codice:
    MsgBox("")
    If (ScoreOrder = 0) Then
        Query = "SELECT * FROM tabella ORDER BY col DESC, col1 ASC"
    ElseIf (ScoreOrder = 1) Then
        Query = "SELECT * FROM tabella ORDER BY col ASC, col1 ASC"
    End If
    frmMainForm.adoCompetitors.RecordSource = Query
    frmMainForm.adoCompetitors.Refresh
    Dim Data As ADODB.Recordset
    Set Data = frmMainForm.adoCompetitors.Recordset
    Vi dico anche che le righe le leggo dopo con un Do While Loop, ma non penso che centri qualcosa...

    Vi prego datemi una mano...

    grazie a tutti
    Claudio

  2. #2
    prova a postare anche il ciclo che fai....nel do while loop
    perchè io di solito faccio
    Set RS as new adodb.recordset
    inizio ciclo
    ...
    fine ciclo
    Set Griglia.Recordset = RS

    prova o posta il tuo codice del ciclo.
    ciao

  3. #3
    dimenticavo, una curiosità.
    come fai da vb6 a creare pagine html?
    mi puoi spiegare (per curiosità e se vuoi) come riesci a fare questo passaggio?
    grazie ciao

  4. #4
    Utente di HTML.it L'avatar di wallrider
    Registrato dal
    Apr 2003
    Messaggi
    2,755
    basta creare un file html e metterci quello che ti pare!!!
    codice:
    open app.path & "\prova.html" for output as #1
    print #1,"<html>"'ecc
    close #1
    devi conoscere un pò l'html,però
    RIP Cicciobenzina 9/11/2010

    "Riseminaciceli, i ceci nell'orto"

  5. #5
    grazie, scusa.
    io conosco html, css e asp e altro per internet.
    mi puoi fare un esempio con un paio di righe?
    come faccio a fargli scrivere nella prima riga <html>, nella seconda
    <head>, nella terza <title>Titoto</title>, forse con VBCRLF?


    E scusa cosa significa input #1, ecc.?
    è forse aperto come file a chiave e non a sequenziale?
    posso scrivere anche aprendo un file in sequenziale?
    GRazie ciao

  6. #6
    anch'io imposto una variabile adodb.recordset

    codice:
    Dim Data As ADODB.Recordset
    Set Data = frmMainForm.adoCompetitors.Recordset
    If (Data.RecordCount > 0) Then
        'Creazione codice HTML classifica
        Dim RecordNum As Integer
        RecordNum = 1
        Do While (RecordNum <= Data.RecordCount)
            'codice creazione html
            '..... 
            Data.MoveNext
            RecordNum = RecordNum + 1
        Loop
    end if
    non metto il codice dell'html perchè è molto lungo e complesso, c'è dietro tutto un sistema di templates html che però finora ha sempre funzionato. Infatti nello stesso programma non è la prima volta che creo classifiche con l'html ma in questo caso non mi funziona...

    grazie ciao
    Claudio

  7. #7
    Dovresti utilizzare la proprietà EOF dell'oggetto Recordset per sapere quando hai finito i record disponibili e non basarti sul recordcount che in alcuni casi non funziona (dipende dalle impostazioni di apertura del recordset).

    Prova cosi:

    codice:
    Dim Data As ADODB.Recordset
    Set Data = frmMainForm.adoCompetitors.Recordset
    If (Data.RecordCount > 0) Then
        'Creazione codice HTML classifica
        Dim RecordNum As Integer
        RecordNum = 1
        While Not Data.Eof 
            'codice creazione html
            '..... 
            Data.MoveNext
            RecordNum = RecordNum + 1
        wend 
    end if

    Ciao
    lupusinfabula

    Programmatore VB, ASP, Delphi.

  8. #8
    prima della query aggiungi

    DoEvents
    Quando ti sei messo in testa di essere migliore di me ... R.DeNiro (TheScore)

  9. #9
    Mi spiace ma nessuna delle soluzioni funziona :
    il problema non sta nel ciclo, ma prima. se io scrivo
    codice:
    frmMainForm.adoCompetitors.RecordSource = Query
    MsgBox(frmMainForm.adoCompetitors.Recordset.RecordCount)
    nella finestra mi appare un record in meno di quelli presenti, ancora prima di entrare nel ciclo. se invece scrivo:
    codice:
    MsgBox("")
    frmMainForm.adoCompetitors.RecordSource = Query
    MsgBox(frmMainForm.adoCompetitors.Recordset.RecordCount)
    allora funziona...

    Non ho risolto nenche aggingendo prima della query il DoEvents, che oltretutto non so neanche cosa vuol dire... che cos'è???
    Claudio

  10. #10
    doevents
    lascia prima che tutti i processi terminino e poi esegue quello che c'è scritto dopo tipo se io ho questo codice

    codice:
    cn.execute("INSERT INTO tabella (campo1) values (valore1)")
    
    doevents
    'resto del codice
    vb6 aspetterà che il record sia inserito nel db prima di proseguire

    spero di essere stato chiaro
    Quando ti sei messo in testa di essere migliore di me ... R.DeNiro (TheScore)

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.