Pos1 = Mioset.AbsolutePosition

domenica 23 luglio 2017 - 11.11
Tag Elenco Tags  Windows Vista  |  Access (.mdb)  |  Office 2003  |  Chrome  |  Firefox

giamoros42 Profilo | Newbie

pos1 = Mioset.AbsolutePosition
Qualcuno sa dirmi il significato di questa istruzione VBA che usata per oltre 13 anni su Access 2007 non ha mai dato problema mentre ora con Access 2016 vien segnalata in errore con "Operazione non segnalata per questo tipo di oggetto" ?
Come sostituirla?
Grazie e cordiali saluti.

renarig Profilo | Expert

>pos1 = Mioset.AbsolutePosition

Cosa è Mioset ?????
certamente un qualcosa che hai definito te nella routine (sopra)
forse un RecordSet ma non siamo sicuri

Postaci il codice completo che magari si riesce a capire

.

giamoros42 Profilo | Newbie

Questa è la parte di programma interessata.

' elimina i movimenti della azioni che si accoppiano per sommatoria parziale

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

renarig Profilo | Expert

Dallo spezzone di codice postato non riesco ancora a capire cosa sia "Mioset"

Hai dichiarato le tutte le variabili ????? mi sembra di no ......

comunque Mioset potrebbe essere un "DAO.Recordset" oppure un "ADODB.Recordset"

Per lo piu il problema che lamenti al passaggio fra versioni dipende dai "riferimenti"
Quando sei nella finestra di VBA apri "Strumenti" ---> "riferimenti"
e controlla se cìè qualcosa contrassegnato con "MANCA"

Io non ho Access2016 ma escludo che "Mioset.absoluteposition" non funzioni


.

renarig Profilo | Expert

Con Access2016 prova il codice postato sotto,
vediamo cosa succede:

Public Sub TestAbsolPosit() Dim dbx As DAO.Database Dim rsx As DAO.Recordset Set dbx = DBEngine(0)(0) ' qui sotto mettici un NomeCampo e NomeTabella reali appartenenti al tuo DB Set rsx = dbx.OpenRecordset("SELECT NomeCampo FROM NomeTabella;", dbOpenDynaset) MsgBox (rsx.AbsolutePosition) rsx.Close dbx.Close Set rsx = Nothing Set dbx = Nothing End Sub

giamoros42 Profilo | Newbie

Questo programma è formato da una tabella principale ed altre 4 secondarie.
Per le varie attività a volte debbo elaborare dati da una o più tabelle concomitanti.
Allora faccio uso di dynaset ; sinceramente non so se si tratta di
DAO.Recordset" oppure un "ADODB.Recordset" ma questo è l'uso che ne faccio.
Creo un miaoriginerecord dove sono presenti i nomi dei campi della tabella interessata e/o dei campi non presenti in tabella ma creati dalle operazioni fra singoli campi.
Esempio:
miaoriginerecord = MioSQL & criteri & " ORDER BY Dataoper, Codnome, Nrec, Codcaus, Codtito, Quantità, Unitario, Nominale, Note, Quantità - Quantità, Quantità - Quantità, Quantità - Quantità, Quantità - Quantità"

Associo il mio SQL MioSQL = miaoriginerecord

Eseguo la query MioDB.Execute (MioSQL)

Creo un dynaset Set MioDB = DBEngine.Workspaces(0).Databases(0)

Creo e nomino la tabella dynaset che sarà creata Set Mioset = MioDB.OpenRecordset("Tab1", dbOpenTable) Il nuovo dynaset si chiamerà Tab1

A questo punto per puntare ai vari campi si dovranno usare i nomo Mioset!Codnome oppure Mioset!Codcaus.
Cordiali saluti.

giamoros42 Profilo | Newbie

Questo programma è formato da una tabella principale ed altre 4 secondarie.
Per le varie attività a volte debbo elaborare dati da una o più tabelle concomitanti.
Allora faccio uso di dynaset ; sinceramente non so se si tratta di
DAO.Recordset" oppure un "ADODB.Recordset" ma questo è l'uso che ne faccio.
Creo un miaoriginerecord dove sono presenti i nomi dei campi della tabella interessata e/o dei campi non presenti in tabella ma creati dalle operazioni fra singoli campi.
Esempio:
miaoriginerecord = MioSQL & criteri & " ORDER BY Dataoper, Codnome, Nrec, Codcaus, Codtito, Quantità, Unitario, Nominale, Note, Quantità - Quantità, Quantità - Quantità, Quantità - Quantità, Quantità - Quantità"

Associo il mio SQL MioSQL = miaoriginerecord

Eseguo la query MioDB.Execute (MioSQL)

Creo un dynaset Set MioDB = DBEngine.Workspaces(0).Databases(0)

Creo e nomino la tabella dynaset che sarà creata Set Mioset = MioDB.OpenRecordset("Tab1", dbOpenTable) Il nuovo dynaset si chiamerà Tab1

A questo punto per puntare ai vari campi si dovranno usare i nomo Mioset!Codnome oppure Mioset!Codcaus.
Cordiali saluti.

renarig Profilo | Expert

Mhhh!!!!! ......
nel codice che proponi vedo tante cose strane che non capisco

per usare un recordset devi prendere esempio dallo spezzone di codice che ho postati sopra

- Dichiari le variabili
- Apri il Recordset
- Lo usi
- Chiudi il Recordset

Io ho la sensazione che tu salti i passaggi numero 1 e 4 che invece sono fondamentali

Ripeto, anche se non ho Access2016 non posso credere che Absoluteposition non funzioni

magari posta uno stralcio del DB con dati minimi e insignigicanti
e ripulito da tutto quanto (codice e oggetti) non c'entra direttamente con il problema lamentato

.

giamoros42 Profilo | Newbie

Nell'ultima mia risposta ho dimenticato di rispondere sui riferimenti delle librerie.
Su un programma ne sono presenti 6 in un altro molti di più.
Vi allego le due immagini al fine di verificare quali possono essere eliminati o inseriti.
Comunque non c'è nessun riferimento mancante.
Sto lavorando per creare un mini DB
Frazie e cirdiali saluti

giamoros42 Profilo | Newbie

Il DB minimo si chiama Conti Mini test.mdb
La tabella principale si chiama Tabmov e la tabella Tab1 è in riassunto di quella principale per l'utente Andrea codice uguale a 6 creata attraverso il procedimento di cui alla mia del 250717 ore 17.11 e ore 17.18.
Nel modulo 1 sono presenti quasi la totalità delle dichiarazioni delle variabili del programma.
Quando viene lanciato il programma appare la schermata Vedi foto 1.
Attivare il bottone Report saldi analitico e appare la schermata Vedi foto 2
Qui attivi il bottone Andrea e successivamente il bottone Calcola saldo
Ti apparirà il messaggio dell'errore Vedi foto 3
L'errore fa parte della zona
' elimina i movimenti della azioni che si accoppiano per sommatoria parziale
faiazioniparziali:
Questa parte del programma dovrebbe accoppiare anche in maniera scalabile le azioni comprate e poi vendute parzialmente.
Per esempio si comprano 1000 azioni ma poi si vendono prima 100, poi altre 200 ed ancora 150
Quindi ci sarà ancora un giacenza di 550 azioni in essere.
In attesa , rimango a disposizione per qualsiasi chiarimento dovesse rendesi necessario cordiali saluti.

renarig Profilo | Expert

Hai messo dentro il file .ldb
invece dovevi mettere il file .accdb

.

giamoros42 Profilo | Newbie

Non ho un file il file .accdb
Guarda se questo va bene.
Saluti

renarig Profilo | Expert

non entro nel merito di tutto il codice ........
mi limito solo al problema del 1° post


a un certo punto del tuo modulo tu hai:
Set Mioset = MioDB.OpenRecordset("Tab1", dbOpenTable)
Un recordSet aperto in quel modo non suppotra Absoluteposition .......


aprilo invece in quest'altro modo e vedrai che funziona:
Set Mioset = MioDB.OpenRecordset("Tab1", dbOpenDynaset)

Facci sapere

.

giamoros42 Profilo | Newbie

Aprendo con questo comando
Set Mioset = MioDB.OpenRecordset("Tab1", dbOpenDynaset)
Mi dà l'errore run time 3147 come se un altro utente sta cercando di modificare gli stessi dati.
Vedi foto 4 ed inoltre l'errore e in un'altra parte del programma.
In attesa cordiali saluti.

giamoros42 Profilo | Newbie

Dim dbx As DAO.Database Dim rsx As DAO.Recordset
Questi due oggetti cosa sono?
Si possono paragonare a questi due?
Public Mioset As Recordset Public MioDB As Databasee

Se si possono essere definiti come publici e quindi come tali trovare la loro definizione nel Modulo 1 dove risiedono tutti i publici?
Grazie e cordali saluti.

renarig Profilo | Expert

>Questi due oggetti cosa sono?
>Si possono paragonare a questi due?

Sono sostanzialmente la stessa cosa,
di RecordSet ce ne sono sostanzialmente 2 "razze",
- DAO.Recordset
- ADODB.Recordset
Se lo dichiari esplicitamente come ho fatto io non ci sono problemi
se ometti la specifica invece ti "becca" quello che sta per primo fra i riferimenti del PC in questione


Poi tu dichiari tutte le variabili come pubbliche
ma se poi le usi in una singola Routine a cosa servè ????
Ti impegna solamente risorse

Una variabile dichiarata come pubblica la usi in tutti i moduli
Una variabile dichiarata in testa a un modulo la usi in tutte le routine di QUEL modulo
Una variabile dichiarata nella routine la usi solo in QUELLA routine


Quell' errore 3147 che lamenti (ma che a me non succede)
potrebbe derivare anche da quelle variabili pubbliche che
vengono usate da piu parti ?????

.



giamoros42 Profilo | Newbie

Debbo sinceramente dirti che la tua ultima mi ha lasciato molto perplesso in quanto il fatto di inserire le variabili solo nel modulo 1 non solo dovrebbe essere utile, come da me erroneamente supposto, ma potrebbe portare anche ad un decadimento di prestazioni e non ultimo anche, almeno lo spero, ai problemi da me precedentemente esposti.
Avrei deciso quindi di ritornare al vecchio sistema magari rimettendo le variabili all'inizio di ogni routine (meglio dire parte di un ramo del programma) ma usando il sistema da te descrittomi.
Dim dbx As DAO.Database Dim rsx As DAO.Recordset

Debbo comunque chiederti due cose:
La prima è quella che tu mi dici
' qui sotto mettici un NomeCampo e NomeTabella reali appartenenti al tuo Db'
ed io intendo tutti i campi che voglio elaborare come avviene da sempre e la tabella nome tab1 che è la tabella prodotta dalla Select mentre la tabella reale si chiama Tabmov .
Esempio:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
La seconda è che vedo al termine delle tue istruzioni
rsx.Close dbx.Close Set rsx = Nothing Set dbx = Nothing
Che dovrebbero chiudere delle attività rilasciando risorse libere dal sistema ma potrebbe essere una mia pia illusione per risolvere gli inconvenienti da me lamentati.
In attesa cordiali saluti.

giamoros42 Profilo | Newbie

Scusami ma ho ancora problemi per effettuare la prova di cui alla mia precedente.
Ho duplicato il vecchio file rinominandolo Conti prova test.
Ho inserito all'inizio di questa routine le tue indicazioni .
Dim dbx As DAO.Database
Dim rsx As DAO.Recordset
Dim SQL As String 'Questa è una variabile di lavoro
Poi creo la variabile di lavoro per richiedere cosa deve fare la stessa. Vedi foto 5.
In realtà i dati sono gli stessi della versione originale.
Quindi eseguo nell'ordine le istruzioni
Set dbx = DBEngine(0)(0) dbx.Execute (MioSQL) Set rsx = dbx.OpenRecordset("Tab1", dbOpenDynaset) MsgBox (rsx.AbsolutePosition)
che mi dà 0 ovvero tab1 non creata.
Non riesco a capire dove faccio l'errore. Dimmi dove sbaglio.
In attesa cordiali saluti.

1297x1041 132Kb

renarig Profilo | Expert

> che mi dà 0 ovvero tab1 non creata.

Perche dici che 0 significa che non ha creato la tabella ?????
la tabella è stata creara e sei al primo record ( il conteggio comimcia da 0 )

prova questa per convincerti:
Set dbx = DBEngine(0)(0) dbx.Execute (MioSQL) Set rsx = dbx.OpenRecordset("Tab1", dbOpenDynaset) MsgBox (rsx.AbsolutePosition) ' Risponde 0 RSx.MoveNext MsgBox (RSx.AbsolutePosition) ' Risponde 1 RSx.MoveNext MsgBox (RSx.AbsolutePosition) ' Risponde 2 RSx.MoveNext MsgBox (RSx.AbsolutePosition) ' Risponde 3 RSx.MoveFirst MsgBox (RSx.AbsolutePosition) ' Risponde ancora 0 RSx.MoveLast MsgBox (RSx.AbsolutePosition) ' Risponde il numero di record meno 1 (la conta comincia da 0) RSx.MovePrevious MsgBox (RSx.AbsolutePosition) ' Risponde il numero di record meno 2 ' Poi DEVI SEMPRE chiudere tutti gli oggetti rsx.Close dbx.Close Set rsx = Nothing Set dbx = Nothing
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5