|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
Varie domande su Access
Sto cercando aiuto per la creazione di un mio progetto. Dato che sono un neofita, accetto volentieri i vostri pareri e suggerimenti.
Il mio progetto è il seguente: Vorrei creare una semplice Tabella nella quale inserire 3 campi: - quantità: Numerico - importo: Numerico/Valuta - totale: Numerico/Valuta Nei primi due campi devo inserire i valori, ma nel terzo il risultato dovrebbe comparirmi subito (del tipo [quantita]*[importo]). Come posso fare dato che Access 97 (credo anche per le versioni successive) mi dice che posso solo inserire valori e no campi? Come posso creare un inserimento automatico di valori dovuto ai campi precedenti ([quantita] e [importo])? Ho trovato una semplice soluzione: creare una Tabella con i soli campi "quantita" e "importo"; generare una Query che si rifaccia alla Tabella appena creata; modificarla aggiungento il campo "totale:[quantita]*[importo]". Il mio problema sembra risolto, ma solo in apparenza. Infatti quando visualizzo la Query appena creata vedo che il valore di "totale" non è espresso in valuta, ma come un semplice numero. Che devo fare? Esiste un modo più sbrigativo per fare tutto con una sola Tabella (senza Query)? Cerco questa risposta perchè il mio progetto non finisce qui: Questa Tabella da creare, diventerebbe una "Tabella Figlia" di una "Tabella Madre" nella quale vorrei creare un campo "spesa" (del tipo "spesa:Somma([totale])"). Creando una Query della "Tabella Madre" ho notato che non mi convalida il campo "spesa:Somma([totale])". Cosa posso fare? Se mi fosse noto come sia possibile creare un campo di Tabella con inserimento automaticco ("totale":[quantita]*[importo]), come posso ricavare un risultato automatico "spesa" da un' altra Tabella? Ci sarebbero altre domande, ma per adesso spero di risolvere questi due primi intoppi. Se quello che ho scritto non fosse del tutto chiaro, non rinunciate a chiedermi spiegazioni. Ultima modifica di Musketeer Fly : 23-10-2003 alle 12:28. |
![]() |
![]() |
![]() |
#2 | |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Re: Varie domande su Access
Quote:
|
|
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Re: Varie domande su Access
Quote:
Primo, creare la tua tabella con quantità e prezzo unitario Secondo, creare una query aggiungendo il campo prezzo totale Terzo, creare una seconda query contenente un campo con formula "somma" basata sul campo "prezzo totale" della prima query. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
X zakzakit
Grazie per avermi risposto.
Non ti ho scritto subito poichè ero impegnato ( e ancora adesso) a fare delle prove per il mio progetto. Sono riuscito a crearmi la Query che volevo (in grado di calcolarmi totale:[quantita]*[importo]). Come mi hai suggerito, ho creato una nuova Query per calcolarmi spesa:Somma([totale]), ma adesso mi servirebbe metterla in relazione con una tabella Acquisti. Mi spiego meglio. Creata la Tabella Merci (con [quantita] e [importo]) e la Query Merci (nella quale ho aggiunto totale:[quantita]*[importo]), vorrei crearmi una Tabella Acquisti nella quale far comparire il seguente campo: [dataAcquisto] Mi piacerebbe avere un campo aggiuntivo che mi indicasse la spesa giornaliera. Questo campo non può essere incluso nella tabella Acquisti? Creando la Query Acquisti (contenente il solo capo spesa:Somma([totale])) come posso associarla alla Tabella Acquisti (ossia a fare corrispondere ad ogni Acquisto giornaliero la sua relativa spesa)? Queste domande non sono solo rovolte a zakzakit, ma anche a tutti coloro che sono disposti a darmi suggerimenti. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
x zakzakit
Utilizzando l' "espediente" che hai suggerito a Panhas (http://forum.hwupgrade.it/showthread...hreadid=544191), sono riuscito a creare la Tabella Merci e la Maschera Merci (utilizzando il generatore di codice) senza utilizzare alcuna Query. (I calcoli avvengono in automatico e inseriti nella tabella - cosa che mi premeva di più da risolvere!)
Adesso, attraverso il generatore di codice, come posso rendere l' inserimento automatico Somma(totale) nella Tabella Acquisti? Mi spiego meglio atraverso la descrizione delle fasi che ho seguito (Ti potrà sembrare un riassunto di tutto quello che ho detto in questa discussione). Ho creato la Tabella Merci, con i seguenti campi: IDAcquisti - Numerico (come collegamento alla Chiave Primaria della Tabella Acquisti, campo necessario per la creazione di una tabella Figlia e per Le Relazioni) quantita - Numerico importo - Numerico,Valuta totale - Numerico,valuta Subito dopo ho creato la Tabella Acquisti, con i seguenti campi: IDAcquisti - Contatore (Chiave primaria, necessaria per la creazione di una tabella Madre) spesa - Numerico,Valuta Con l' autocomposizione ho creato la Maschera Acquisti e la SottoMaschera Merci . A questo punto sono entrato in "Visualizzazione struttura", spostato su "importo" e dalla linguetta "Evento", selezionando "prima di aggiornare", ho generato il codice: totale = quantita * importo Poi mi sono spostato sulla linguetta "Dato" e ho bloccato il campo (in modo da non inserire dati). Attraverso l' uso della maschera appena creata e senza utilizzare query, come posso inserire in autoamtico la somma dei valori di "totale" in "spesa"? Ho provato a generare il codice del tipo: spesa = Somma(totale), ma viene riconosciuta come instruzione errata. Ho risolto il problema della somma attraverso il comando DSum("totale", "tMerci"), ma come faccio a dire al programma che "spesa" fa parte della tabella Acquisti? E dove devo generare questo codice: sempre in "importo" o in un altro campo? E a quale "evento" devo associarlo? |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Se ho ben capito, non dovresti avere bisogno di scrivere codice.
Per creare un campo totalizzatore nella sottomaschera, crea per prima cosa un campo numerico generico non legato, quindi seleziona "proprietà", linguetta "dati", imposta la proprietà "origine controllo" come =Somma(x) dove "x" è il nome del tuo campo. E' anche opportuno impostare la proprietà "nome elemento" ad un valore mnemonico apprpriato, per esempio "spesa totale". Se poi vuoi fare riferimento nella maschera principale al campo "spesa totale" della sottomaschera, sia nel codice sia nella proprietà "origine dati", devi fare riferimento a: [Nome sottomaschera].[Form]![spesa totale] (sostituendo a "nome sottomaschera" appunto il nome della tua sottomaschera). |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
x zakzakit
Il procedimento che mi hai descritto, lo conoscevo, ma non serve al mio scopo, poichè non mi memorizza il dato nella tabella Acquisti e in più mi da pure l' errore "#NOME?".
Se hai letto come ho creato le due tabelle e come ho programmato il codice nell' evento "Prima di aggiornare" di "importo", sono arrivato al punto che devo fare inseire in automatico la somma di "totale" nel campo "spesa" della Tabella Acquisti attraverso l' uso della sua maschera. Ma il comando Somma() non viene riconosciuto dal generatore di codice. L' unico comando-somma che conosce è DSum (ma ho avuto dei risultati non positivi con questo comando). Allora scartato la riga di codice spesa = Somma(totale), sono passato alla riga spesa = DSum("totale", "tMerci"), ma attraverso questo comando non viene inserito alcun valore nel campo spesa della maschera Acquisti (per essere sinceri la riga di codice che ho inserito è la seguente spesa = totale + DSum("totale", "tMerci")). Non ottengo alcun valore nel campo spesa della maschera Acquisti, perchè il codice non riconosce la posizione del campo spesa (non presente nella sottomaschera)(1) o bisogna utilizzare comandi diversi di codice(2)? Se il problema è dovuto solamente al caso (1), ti sarei grato se mi scrivessi la riga corretta di codice e mi specificassi dove deve essere inserita (dato che io pensavo di inserirla nell' evento "prima di aggiornare" della voce "importo"). Grazie ancora per la tua disponibilità. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Ok, ti faccio un esempio di come potresti gestire records della tabella acquisti nella maschera merci, ipotizzando che la tabella acqisti abbia solamente i campi [id acquisti] e [spesa], e che la maschera merci sia una semplice maschera contenente i campi della tabella merci.
in visualizzazione struttura, cliccando col pulsante destro sul quadratino nero in alto a sinistra per selezionare le proprietà della maschera, seleziona "proprietà", linguetta "evento", proprietà "dopo aggiornamento" ed inserisci: Let strsql = "delete from acquisti where [id acquisti] =" & [id acquisti] CurrentDb().Execute (strsql) Let strsql = "insert into acquisti([id acquisti],spesa) select [id acquisti],sum(totale) from merci where [id acquisti]=" & [id acquisti] & " group by [id acquisti]" CurrentDb().Execute (strsql) Nella proprietà "su eliminazione" inserisci: Let strsql = "delete from acquisti where [id acquisti] =" & [id acquisti] CurrentDb().Execute (strsql) (Fai attenzione alla sintassi delle istruzioni perchè degli spazi omessi possono generare errori di esecuzione non rilevati in fase di editing). Le istruzioni "let" generano una stringa con un comando sql, che viene poi eseguito dal comando "execute". L'istruzione sql "delete" comanda di cancellare dalla tabella acquisti tutti i records che abbiano il valore [id acquisti] uguale a quello impostato in maschera (associato alla tabella merci). L'istruzione sql "insert" comanda di generare un record nella tabella acquisti con il campo [id acquisti] uguale a quello presente in maschera e con il campo spesa uguale alla somma del campo totale di tutti i records della tabella merci che abbiano [id acquisti] uguale a quello presente in maschera. "strsql" è un nome di variabile arbitrario. L'evento "dopo aggiornamento" viene eseguito anche dopo un inserimento, per cui non è necessario inserire codice nella proprietà "dopo inserimento". (Tieni sempre presente, però, che è più conveniente gestire i campi calcolati tramite le query piuttosto che memorizzarli in tabelle e doverli poi gestire con del codice). |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
x zakzakit
Ho provato a inserire le righe da te suggerite, ma il programma da subito un errore riguardo alla parola "strsql" nell' istruzione "Let strsql". Mi dici che è possibile utilizzare le Query per calcolarmi la Somma di totale nella Tabella Acquisti? E come?
Riesco a crearmi una Query solamente di riepilogo per calcolarmi la Somma, ma se ci aggiungo un campo come IDAcquisti, la Query non mi fornisce alcun dato. Ho sbagliato qualcosa? C' è un modo differente di agire? Devo utilizzare solamente Query per i calcoli o posso tenermi le due Tabelle create (tAcquisti,tMerci) e la sottomaschera Merci con i campi calcolati in automatico con l' inserimento del codice totale = quantita * importo e poi crearmi la Query di calocolo per la "spesa"? |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Per "strsql", se l'errore che ti dà è di variabile non definita, aggiungi un'istruzione
dim strsql all'inizio della funzione. Per le query, per esempio 1. crei la tabella merci con i campi [id acquisti],quantità,prezzo. 2. crei una query basata sulla tabella merci aggiungendo il campo totale=quantità * prezzo 3. crei una seconda query basata sulla prima query contenente i campi [id acquisti] e somma(totale). oppure puoi creare la seconda query direttamente sulla tabella così: 3. crei una query basata sulla tabella contenente i campi [id acquisti] e somma(quantità * prezzo) Il vantaggio delle query rispetto al codice non è il risparmio di spazio sul disco, che è irrilevante, ma è l'integrità del database così creato. Qualsiasi modifica apportata alle tabelle si riflette automaticamente sulle query, mentre con l'approccio del codice vb i totali risultano corretti solamente se passi attraverso la maschera che li gestisce. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
x zakzakit
Ma le righe di codice che mi hai scritto dove devo metterle esattamente: come evento della Maschera Acquisti o come evento della SottoMaschera Merci?
|
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Il codice deve essere inserito in una maschera contenente [id acquisti] della tabella merci
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Il codice di esempio non funziona in una sottomaschera.
Comunque la soluzione migliore è creare un campo totalizzatore ("origine controllo"=somma(totale)) nella sottomaschera, e se vuoi farne riferimento nella maschera principale, riferirti ad esso come [nomesottomaschera].[form]![nomecampototalizzatore] |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
Conosco bene il modo per calcolarmi la Somma(totale). Difatti ho creato una casella di testo "spesa" nella SottoMaschera Merci del tipo =Somma(totale). Il risultao che volevo sono riuscito ad ottenerlo, ma a questo punto, nalla maschera Acquisti, ho impostato il campo "spesaTotale" come =[Form]![nomeSottoMaschera]![spesa] (questo il comando giusto riconosciuto da Access) - Tuttavia il risultato ottenuto non viene salvato nella Tabella Acquisti. Come faccio a far memorizzare questo risultato nel campo "spesaTotale" della Tabella Acquisti? E' possibile? Ti sarei grato se mi spiegassi passo per passo le istruzione da inserire.
Come avrai capito il mio obbliettivo è di inserire in automatico la spesa giornaliera nella relativa Tabella Acquisti. Ultima modifica di Musketeer Fly : 29-10-2003 alle 12:10. |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Ho provato in diversi modi, ma non riesco ad aggiornare il record nella maschera principale.
Comunque, scusami se insisto, se tu non inserisci il campo spesa totale nella tabella acquisti, bensì crei una query SELECT [acquisti].[id acquisti], Sum([merci].[totale]) AS spesatotale FROM acquisti INNER JOIN merci ON [acquisti].[id acquisti]=[merci].[id acquisti] GROUP BY [acquisti].[id acquisti]; ottieni il valore che cerchi. Nella maschera usi la tabella e calcoli la spesa totale tramite il campo [sottomaschera].[form]![nomecampo], mentre in qualsiasi altra applicazione usi la query, e non devi scrivere neanche una riga di codice. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
Alla fine il risultato della spesa sono riuscito a farlo comparire nella Maschera Acquisti, ma la mia richiesta è:
esiste un comando o una riga di istruzione che memorizzi la spesa della Maschera Acquisti nella Tabella Acquisti? |
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Ho creato nel mio database:
-tabella "acquisti", con campi [id acquisti], spesa -tabella "merci", con campi [id acquisti], quantità, prezzo -maschera acquisti con sottomaschera merci. Ho inserito il codice qui sotto negli eventi di aggiornamento e cancellazione della sottomaschera. Questo codice aggiorna il campo "spesa" della tabella "acquisti" come totale del prodotto quantità*prezzo della tabella "merci", per tutti i record della tabella "merci" che abbiano [id acquisti] corrispondente. Dim rec As Recordset Dim sqlstring As String Dim spesatot sqlstring = "select * from merci where [id acquisti]=" & [id acquisti] Set rec = CurrentDb().OpenRecordset(sqlstring, dbOpenDynaset) rec.MoveFirst spesatot = 0 Do Until rec.EOF Let spesatot = spesatot + rec!quantità * rec!prezzo rec.MoveNext Loop sqlstring = "update acquisti set spesa =" & spesatot & " where [id acquisti]=" & [id acquisti] CurrentDb().Execute sqlstring (Rimango sempre dell'idea, però, che la query sia la soluzione migliore). |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Aug 2002
Città: Torino
Messaggi: 1165
|
Ma se apro la SottoMaschera in Visualizzazione Struttura e accedo agli eventi, ho una lista nella quale trovo:
Prima di inserire Dopo inserimento Prima di aggiornare Dopo aggiornamento Su eliminazione Prima di conferma eliminazione Dopo conferma eliminazione Su apertura Su caricamento Su scaricamento Su chiusura Su attivazione su disattivazione In quali di questi eventi devo mettere il codice da te suggerito? TI ringrazio sempre per il tempo che mi stai dedicando. Una domanda sempre su Access che non centra con questo progetto: ho visto che con la creazione di "Maschere di input" per i campi di una tabella, mi succede una strana cosa - Ad esempio quando ho creato il campo "CodFiscale" e ho inserito la seguente "Maschere di input" >LLLLLL00L00L000L;;_ con Access 97 non ho alcun problema (difatti ottengo CCCCCC22C22C222C); invece con Access 2000 e con Access XP all' immissione del codice fiscale, mi creano sempre dei problemi e un output diverso da quello desiderato (mi fa inserire 17 caratteri al posto di 16, poichè legge il segno ">" come un carattere e non come una operazione per rendere Maiuscoli i caratteri). E' un problema che ho solo io, dovuto al mio sistema operativo (Windows XP Home, invece con Access 97 utilizzo WIndows NT4) o succede anche ad altri? e se succede ad altri, esiste una patch o bisogna fare una modifica al programma? Ultima modifica di Musketeer Fly : 30-10-2003 alle 11:24. |
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: May 2003
Città: Saronno
Messaggi: 161
|
Io l'ho messo in questi due:
Dopo aggiornamento Su eliminazione che dovrebbero garantirti che ad ogni modifica di "merci" corrisponda una modifica di "acquisti", a meno di crolli della macchina ed errori di programma, nel qual caso l'integrità del database va ristabilita "a mano" (mentre con il metodo della query questo problema non esiste). |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:10.