n° 219
Novembre 2017
Luglio 18, 2018, 05:07:53 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Access database condiviso con VB6  (Letto 1089 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 75


Mostra profilo
« inserita:: Aprile 24, 2018, 02:55:59 »

Salve,
Sicuramente ho sbagliato sezione e chiedo scusa...

Ho un problema con un DataBase Access utilizzato in condivisione tra due istanze dello stesso programma creato in VB6

Il programma puo' essere lanciato in Modalità Master o Terminale
le due istanze del programma sono in collegamento tramite connessione tcp

Ad ogni operazione effettuata su una delle istanze viene inviato un telegramma all'altra istanza per compiere determinate azioni...

Il mio problema nasce nel momento che attraverso una delle due istanze modifico un singolo campo di una singola tabella e invio il telegramma di rilettura dell'intera tabella modificata...

La stessa funzione restituisce risultati differenti...
L'istanza su cui viene effettuata la modifica rilegge i dati appena modificati

l'altra istanza rilegge i dati non ancora aggiornati
(Inserendo un istruzione Sleep(5000) prima della rilettura i dati sono aggiornati...
ma non posso permettermelo)

Sembra che i dati non vengano salvati immediatamente sul database ma ci sia un periodo di latenza tra le istruzioni di update e chiusura della connessione e l'effettivo salvataggio su file fisico per cui l'altra istanza non vede i dati aggiornati...

la mia domanda e' la seguente:
-E' un impostazione di Access?
-Devo eseguire un comando specifico da VB6 per forzare il riversamnto delle modifiche prima di inviare il telegramma di aggiornamento all'altra istanza?

Registrato
michele.p
Administrator
Sr. Member
*****

Karma: +11/-2
Scollegato Scollegato

Messaggi: 659


Mostra profilo
« Risposta #1 inserita:: Aprile 24, 2018, 04:06:51 »

E se provassi a fare dapprima una query per verificare l'aggiornamento dei dati e, in caso positivo, permetti l'invio in automatico del telegramma per l'avvenuto aggiornamento?

Sull'esempio di questo snip in PHP (il terzo dall'alto, o il primo dal basso  Linguaccia ):

https://www.w3schools.com/php/php_mysql_update.asp
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 75


Mostra profilo
« Risposta #2 inserita:: Aprile 24, 2018, 04:11:10 »

Grazie della risposta...

Il problema e' proprio quello...
La funzione di ricarica tabella nell'istanza su cui e' fatta la modifica viene richiamata prima dell'invio del telegramma e rilegge i dati aggiornati...

Allego pezzo di codice utilizzato
Codice:
'//####################################################
'//#Modifica Campo Tabela Zone
'//####################################################
    Set DBP = OpenDatabase(CfgLayout.DB_Park, , False)
    Set RsZona = DBP.OpenRecordset("SELECT * FROM Piazze INNER JOIN Zone ON Piazze.ID_Zona = Zone.ID_Zona WHERE Piazze.ID_Piazza = " & SelPiazza)
    If Not RsZona.EOF Then
        RsZona.edit
        If Index = 0 Then
            If RsZona.Fields("TipoZona") = ZONA_STOC_FINITI Then
              CambiaColore = 1
            End If
            RsZona.Fields("TipoZona") = ZONA_EMERGENZA
        Else
            If RsZona.Fields("TipoZona") = ZONA_EMERGENZA And RsZona.Fields("TipoZonaDefault") = ZONA_STOC_FINITI Then
              CambiaColore = 2
            End If
            RsZona.Fields("TipoZona") = RsZona.Fields("TipoZonaDefault")
        End If
        RsZona.Update
''        '//#Mirco 2018_04_24 - Gestione aggiornamento senza Recordset
''        iSelZona = RsZona.Fields("Zone.ID_Zona").value
''        If (Index = 0) Then
''            iNuovoTipoZona = ZONA_EMERGENZA
''        ElseIf (Index = 1) Then
''            iNuovoTipoZona = RsZona.Fields("TipoZonaDefault").value
''        End If
''        strSql = "Update Zone Set TipoZona = " & Str(iNuovoTipoZona) & " " & _
''                 "Where ID_Zona = " & Str(iSelZona) & "                  "
''        DBP.Execute (strSql)
    End If
    RsZona.Close
    DBP.Close
    Set RsZona = Nothing
    Set DBP = Nothing
'//####################################################
'//#Rielttura Tabella Zone
'//####################################################
    Call CaricaZone
'//####################################################
'//#Invio Telegramma all'altra Istanza
'//####################################################
    Call MasterRemoteSend(TERM_CARICA_ZONE)



Codice:
Public Sub CaricaZone()
On Local Error Resume Next
Dim Dbpark As Database
Dim TbZone As Recordset
    'Carica tutte le zone
    Set Dbpark = OpenDatabase(CfgLayout.DB_Park, , False)
        Set TbZone = Dbpark.OpenRecordset("SELECT Zone.* From Zone Where (((Zone.ID_Zona) > 0))ORDER BY Zone.ID_Zona;")
        With TbZone
            .MoveLast
            ReDim Zone(.Fields(ZP_ZONA_ID).value)
            Zone(0).TipoZona = .Fields(ZP_ZONA_ID).value
            .MoveFirst
            Do While Not .EOF
                Zone(.Fields(ZP_ZONA_ID)).Nome = .Fields(SP_NOME).value
                Zone(.Fields(ZP_ZONA_ID)).Descrizione = .Fields(ZP_DESCR).value
                Zone(.Fields(ZP_ZONA_ID)).TipoZona = .Fields(ZP_TIPO).value
                .MoveNext
            Loop
        End With
        TbZone.Close
    Dbpark.Close
End Sub



Codice:
'//####################################################
'//#Ricezione Telegramma all'altra Istanza
'//####################################################
    Case TERM_CARICA_ZONE
        '//#Mirco 2018_04_19
        Punto = 44
        Sleep (5000)
        CaricaZone
        If (IsLoaded("Park")) Then
            Call Draw_Box(Park.Sinottico, Piazze(), Parcheggio(), CfgLayout, CfgLayout.Color_Place, SetColor, , Park.SelPiano)
        End If

Registrato
michele.p
Administrator
Sr. Member
*****

Karma: +11/-2
Scollegato Scollegato

Messaggi: 659


Mostra profilo
« Risposta #3 inserita:: Aprile 25, 2018, 12:09:12 »

In sostanza vorresti eliminare l'attesa di 5000ms nella sezione "Ricezione Telegramma all'altra Istanza".
Fai la verifica li, al posto dell'attesa dei 5 secondi.
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 254


Mostra profilo
« Risposta #4 inserita:: Aprile 25, 2018, 03:47:48 »

Dovresti eseguire un refresh della cache di Jet dopo l'aggiornamento dei dai

Public Jet As JRO.JetEngine
Set Jet = New JRO.JetEngine

Jet.RefreshCache Conn

in cui conn è la connessione al db
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 75


Mostra profilo
« Risposta #5 inserita:: Aprile 26, 2018, 01:59:34 »

Il codice suggerito e' per Vb.net?

Utilizzando VB6 e i tipi DataBase e RecordSet non indico una connessione in modo esplicito

Esiste il modo per recuperarla una volta eseguita l'istruzione
    Set Dbpark = OpenDatabase(CfgLayout.DB_Park, , False)
Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 254


Mostra profilo
« Risposta #6 inserita:: Aprile 27, 2018, 12:00:28 »

Certo che è per VB6. Ma usa ADO e non DAO (vecchissimo) e aggiungi un riferimento a Jet Replication Object
Registrato
Mircosoft
Jr. Member
**

Karma: +0/-0
Scollegato Scollegato

Messaggi: 75


Mostra profilo
« Risposta #7 inserita:: Aprile 27, 2018, 09:28:15 »

Scusa la mia ignoranza...

Non riesco a capire come applicare il tuo suggerimento al codice postato...

Registrato
oregon
Jr. Member
**

Karma: +22/-6
Scollegato Scollegato

Messaggi: 254


Mostra profilo
« Risposta #8 inserita:: Aprile 27, 2018, 10:30:42 »

Allora ...

il mio suggerimento è legato alla libreria ADO. Tu utilizzi DAO, quindi, come prima cosa dovresti utilizzare la libreria ADO al posto della DAO nel tuo programma

in secondo luogo dovresti aggiungere un riferimento alla libreria Jet Replication Object (JRO) e aggiungere il codice indicato

Se INVECE vuoi continuare ad usare DAO, potresti provare (ma NON garantisco il funzionamento) ad inserire il codice di update all'interno di una "transazione" (BeginTrans ... CommitTrans) avendo cura di indicare alla commit il parametro dbForceOSFlush, vedi

https://msdn.microsoft.com/en-us/library/office/ff835985.aspx
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines