PDA

Visualizza versione completa : AZZERARE UN CONTATORE


paolonebuloni
03-02-2008, 10.29.06
un ordine è fatto da una o più posizioni. Es. ordine nr. 1 pos. 1, 2, 3, 4; ordine nr. 2 pos.1; ordine nr. 3 pos.1, 2. Con una maschera introduco il numero d'ordine (tipo dati contatore); con una sottomaschera introduco IDRiga (tipo dati contatore) e la pos. (tipo dati numerico). L'IDRiga rappresenta il conteggio di tutte le posizioni di tutti gli ordini (7 negli esempi) ed è logico che sia contatore. La pos. dovrebbe essere un contatore all'interno di ogni singolo ordine. La pos. deve ripartire da 1 ad ogni cambio d'ordine e deve aumentare di 1 ad ogni nuova riga d'ordine. Oggi sono costretto ad inserire il numero di pos. manualmente.

Billow
03-02-2008, 11.04.07
innanzittuto benvenuto

poichè non è chiaro a cosa tu faccia riferimento e non saprei in quale sezione spostarlo, ti invito a leggere il regolamento (http://forum.wintricks.it/regolamento.html), ed a fornire spiegazioni su cosa riguardi il tuo problema.

Thor
03-02-2008, 20.44.57
office (access, excel)?

programmazione?

solo lui ce lo può dire ^^

paolonebuloni
04-02-2008, 10.17.39
buongiorno a tutti. Grazie in anticipo a chi saprà aiutarmi.

avevo dimenticato di dire che sto imparando ad usare access 2003. Il mio problema è inserire automaticamente una posizione (ad es. posizione d'ordine o posizione di fattura) in una sottomaschera che ha già un contatore. La posizione deve aumentare di uno all'interno di ogni ordine o fattura mentre deve ripartire da uno ad ogni nuovo ordine che è un contatore della maschera principale.

Grazie di nuovo. Saluti.

Billow
04-02-2008, 10.25.02
spostato in Office suite ;)

LoryOne
04-02-2008, 19.29.40
Ora ti racconto una storiella:
Il campo contatore autoincrementante è sempre stato utile al 50% e disastroso nella restante percentuale; mi sono imbestialito più di una volta quando, cancellato un record, il contatore riprendeva sempre dal valore massimo raggiunto prima della cancellazione + 1.
Beh, a pensarci bene, poteva avere un senso, ma certamente il lavoro dei programmatori del A-Cess[o] sarebbe stato piuttosto complesso, in quanto avrebbero avuto una bella gatta da pelare se avessero dovuto rieffettuare la numerazione sequenziale su un DB relazionale, indipendentemente dalla sua complessità e dai vincoli impostati da chi ne aveva ideato la struttura.
Così, mi sono convinto che mi ero imbestialito per niente.
Come puoi risolvere ?
Con una Select MAX(X)+1 WHERE ... , dove X è la colonna che contiene il valore massimo calcolato sulla base della condizione specificata.
A-Cess[o] non può certo fare tutto da solo, quindi devi programmarlo facendo ricorso all'oggetto recordset ed assegnando manualmente il valore incrementato sulla base della query SQL che imposterai opportuamente ;)

Alexsandra
04-02-2008, 21.49.07
...A-Cess[o] ...
Oltre a quotare ...... è bestiale l'aggettivo :act:

miciomao
04-02-2008, 23.47.51
io lascerei stare gli id e i contatori e li terrei nascosti nella sottomaschera
userei un po di codice per numerare progressivamente "a vista" i numeri di posizone


On Error GoTo erh
With CodeContextObject.RecordsetClone
If Not (.BOF And .EOF) Then
.Bookmark = CodeContextObject.Bookmark
GetRecNum = .AbsolutePosition + 1
End If
End With
ext:
Exit Function
erh:
Exit Function
End Function


Per ottenere la numerazione progressiva registrare la funzione di cui sopra in un modulo del database, inserire nella maschera o sottomaschera continua una casella di testo non associata nella cui origine controllo scrivere:

=GetRecNum()

@LoryOne
conosco due metodi per tappare i buchi da eliminazioni record nei campi contatore incrementali, se vuoi ti posto qualche esempio
;)

LoryOne
05-02-2008, 08.07.38
Volentieri.
Sempre pronto ad acquisire nuovi metodi risolutivi :)
Posta di seguito (Y)

miciomao
05-02-2008, 10.20.38
considera che se il campo contatore non è chiave primaria o indicizzato con duplicati non ammessi potresti anche duplicare il valore lanciando due volte le funzioni, quella che segue è una semplice tabella (test) a 2 campi, ID (tipo Contatore) e testomsg (tipo Testo).

nel primo caso rimpiazzo il nr 3 con qry

DoCmd.RunSQL "INSERT INTO Test (ID, testomsg) VALUES (3, ""INSERT 3"");"


con questo rimpiazzo il 5

Esempio inserimento da VBA (DAO):

Dim rst as DAO.Recordset
Set rst = CurrentDb.OpenRecordset("Test")
rst.AddNew
rst!id = 5
rst!testomsg = ".AddNew 5"
rst.Update
rst.Close: Set rst=Nothing

LoryOne
05-02-2008, 10.34.48
Quindi (correggimi se sbaglio), supponendo la seguente ipotesi di inserimento:
1 INSERT 1
2 INSERT 2
3 INSERT 3
4 INSERT 4
5 INSERT 5
cancellassi la 5° riga e ne aggiungessi un'altra cosa succederebbe ?
A-cess[o] aggiungerebbe 6 all' ID della 5° riga (di fatto saltando l'incremento pari a 5) , ma nello stesso tempo modificherebbe l' ID pari a quello voluto secondo questa istruzione: DoCmd.RunSQL "INSERT INTO Test (ID, testomsg) VALUES (5, ""INSERT 5"");" ?

miciomao
05-02-2008, 11.09.35
si, il ragionamento è quello, cancelli il 5 e lui cmq continua dal 6 in poi. In pratica con le due funzioni non fai altro che una forzatura ma è naturale che il buco se c'è devi andartelo a cercare.
Ghhhhhhhhhhhhhhhhh :D

miciomao
06-02-2008, 13.42.37
eccola
questa è la query che ci dirà quali numeri mancano al progressivo
direi che con un po di codice si potrà creare una funzione che tappi automaticamente i buchi

è riferita sempre alla tabella Test di cui sopra


SELECT C1.ID+1 AS Da, (SELECT TOP 1 ID
FROM Test
WHERE ID>C1.ID+1
ORDER BY ID)-1 AS A
FROM [SELECT TOP 1 0 AS ID
FROM MSysobjects
UNION
SELECT ID
FROM Test]. AS C1 LEFT JOIN Test AS C2 ON C1.ID+1=C2.ID
WHERE C2.ID IS NULL
ORDER BY C1.ID;