Visualizza versione completa : AZZERARE UN CONTATORE
paolonebuloni
03-02-2008, 11.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, 12.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.
office (access, excel)?
programmazione?
solo lui ce lo può dire ^^
paolonebuloni
04-02-2008, 11.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, 11.25.02
spostato in Office suite ;)
LoryOne
04-02-2008, 20.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, 22.49.07
...A-Cess[o] ...
Oltre a quotare ...... è bestiale l'aggettivo :act:
miciomao
05-02-2008, 00.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, 09.07.38
Volentieri.
Sempre pronto ad acquisire nuovi metodi risolutivi :)
Posta di seguito (Y)
miciomao
05-02-2008, 11.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, 11.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, 12.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, 14.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;
vBulletin® v3.8.6, Copyright ©2000-2024, Jelsoft Enterprises Ltd.