Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57

    [VB6] Operazioni sul DB (VBA - ACCESS)

    Allora premetto che parto proprio da zero. Devo fare uno scriptino VBA su Access.

    Legge dati da tabelle, li analizza e modifica dei campi qua e là.

    Vi posto subito il codice che sto iniziando a testare per capirci qualcosa:

    Set db = CurrentDb
    Set Sistemi = db.OpenRecordset("Sistemi", dbOpenDynaset)
    Set Resi = db.OpenRecordset("Resi", dbOpenDynaset)
    Set MDC = db.OpenRecordset("MDC", dbOpenDynaset)

    Resi.MoveFirst
    Do Until Resi.EOF

    Query = "SELECT * FROM Sistemi WHERE [serial_number] = '" & Resi("SN") & "';"
    Set Risultato = db.OpenRecordset(Query, dbOpenDynaset)
    If IsNull(Risultato.RecordCount) Then GoTo Prossimo
    -> Risultato.MoveFirst

    Query = "SELECT * FROM MDC WHERE [custcode] = " & Risultato("custcode") & ";"
    Set Risultato1 = db.OpenRecordset(Query, dbOpenDynaset)
    If Not IsNull(Risultato1.RecordCount) Then
    Risultato1.MoveFirst
    MDC.Edit
    MDC("Stato") = "Prova"
    MDC.Update
    End If

    Prossimo:
    Resi.MoveNext
    Loop

    Sistemi.Close
    Resi.Close
    MDC.Close
    db.Close
    Il problema sta nella riga con la freccina (lo so perchè se provo a stampare qualcosa prima di quella riga la stampa, se ci provo subito dopo no).

    All'inizio c'era un Do-Until per scorrere Risultato. Poi mi sono reso conto che i dati hanno una corrispondenza univoca quindi posso leggere tranquillamente i campi di risultato senza dover fare un ciclo perchè avrò un record solo.
    A questo punto non sapevo se l'istruzione MoveFirst servisse ancora.
    Ma tanto non funza sia che la levo sia che la lascio.

    Cosa sbaglio?



    Ah, il GoTo mi serve perchè non ho il Continue e non so come risolvere il problema dei recordset vuoti che mi facevano impallare i cicli.

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Scusa,
    ma l'obiettivo finale di questo codice quale sarebbe?

    Cosa ti proponi di modificare ed in base a quali condizioni?

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Principalmente è uno scriptino di test che mi serve come punto di partenza per fare una cosina più grossa (parto dal banale per poi infilarci le complicazioni, visto che non conosco ancora bene il linguaggio).

    Cmq il concetto è più o meno questo:
    scorro la tabella Resi
    per ogni record cerco sulla tabella Sistemi se c'è un seriale associato (Risultato)
    uso questo seriale per cercare nella tabella MDC tutte le righe che lo contengono (Risultato1)
    cambio la colonna "stato" delle righe così trovate, scrivendoci prova.

    Ovviamente poi ci dovrò aggiungere roba, operazioni con le date etc... E lo stato dipenderà da questa roba. Ma per ora sarei già contento se riuscissi a scriverci prova

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Come supponevo.

    Sarebbe più semplice fare un JOIN che ti restituisca i record interessati e su cui puoi poi modificare il valore in un colpo solo, ma bisogna vedere come sono strutturate le tabelle in gioco.
    Poche righe di codice sarebbero sufficienti a fare tutto il lavoro, ottimizzandolo.

    Le tabelle hanno una chiave primaria?
    C'è un campo che relaziona le tabelle? Qual'è
    Puoi mostrare la struttua delle tabelle?

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Guarda è una cosa che mi han chiesto di fare per un progettino, quindi non so quanta libertà ho di farla in un'altra maniera.

    Inoltre ci sono un bel pò di controlli da inserire ma che ho lasciato per eventuali passi successivi (per esempio se la data di un record rientra in un certo range lavora quel record in un altro modo oppure se un seriale è presente in una certa tabella salta la lavorazione di quel record etc...).

    Cmq tutte le tabelle hanno un Id, chiave primaria, incrementale.
    Non c'è un campo che relaziona tutte le tabelle. Il campo SN di Resi corrisponde al campo serial_number di Sistemi. E il campo custcode di Sistemi corrisponde al campo custcode di MDC.

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Kujo
    Guarda è una cosa che mi han chiesto di fare per un progettino, quindi non so quanta libertà ho di farla in un'altra maniera.
    Non credo di capire il senso della tua frase:
    Farla 'in un'altra maniera' che problemi ti da?

    Direi invece che attualmente lo stai facendo nella maniera sbagliata, nel senso che visto che stai usando un database, allora usa il linguaggio dei database: SQL .
    Ovviamente sei liberissimo di usare il linguaggio VB6, soprattutto se te lo impongono, ma è davvero un peccato perchè SQL è molto potente.

    Usando il linguaggio SQL potrebbe bastare una singola query INNER JOIN per ottenere solo le righe in cui i due numeri seriali corrispondono, esempio :

    codice:
    SELECT Sistemi.<CampiCheTiServono>, Resi.<CampiCheTiServono>
    FROM Sistemi INNER JOIN Resi ON Sistemi.serial_number = Resi.SN
    Così ho già ottenuto tutte le righe che hanno il seriale uguale.

    Poi basta aggiungere il secondo JOIN (o una sotto-query) per mostrare solo le righe in MDC che contengono i seriali della prima.

    Guarda che l'ho buttata giù 'al volo' perchè non conoscendo la struttura delle tue tabelle e del risultato finale che devi ottenere è un po' difficile 'prenderci giusto-giusto'


  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Si ovvio grazie ora vedo se riesco ad adattarla alle mie esigenze.
    E soprattutto se posso farla così o se devo per forza usare VBA.
    Nel frattempo, anche solo per curiosità (o anche perchè potrebbe servirmi se dovessi percorrere invece quella strada), mi sai dire perchè il codice che ho postato mi da problemi?
    A me non è chiaro cosa sbaglio o_O

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Kujo
    Si ovvio grazie ora vedo se riesco ad adattarla alle mie esigenze.
    E soprattutto se posso farla così o se devo per forza usare VBA.
    Vedo che non hai capito...

    Originariamente inviato da Kujo
    Nel frattempo, anche solo per curiosità (o anche perchè potrebbe servirmi se dovessi percorrere invece quella strada), mi sai dire perchè il codice che ho postato mi da problemi?
    A me non è chiaro cosa sbaglio o_O
    Come si fa a saperlo?
    - non si conoscono i dati, o per meglio dire: non si nulla delle tue tabelle...
    - non hai indicato il tipo di errore...
    E' un po' dura non credi?

    La sola cosa che posso dire è che non puoi passare al record seguente, ma questo l'hai già capito da solo.


  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Ok allora, per non creare un nuovo topic:
    sono andato avanti ho evitato di fare qualcosa che potevo non fare, ora però ho un problema per fare un controllo.

    Il fatto è che ho un output che devo inserire in una query, via script.
    L'output è un campo di un oggetto record tipo
    Record("Campo")
    e se lo attacco alla query così, nei i casi in quei quel campo è nullo, si impalla, mi dice che la sintassi è sbagliata.

    Allora ho pensato di metterci un if e controllare prima se quel campo è nullo.
    Ma non riesco a fare questa cosa così banale. Ho provato sia
    isNull(Record("Campo")) sia Record("Campo") = 0
    In entrambi i casi mi dice che non trova l'oggetto, che non è un oggetto valido.
    Come si fa il controllo per verificare che quel dato non sia vuoto prima di passarlo in pasto ad altra roba?

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.