Newsgroup: it.comp.appl.access
Titolo: "moltiplicare" record se un numero contenuto in un campo è maggiore a 1

Ciao a tutti!!!
 
Vi spiego il mio problema..
Ho la seguente tabella contenente i seguenti valori:
 
 
nome_cliente1    Località1     1     ecc  ecc
nome_cliente2    Località2     1     ecc  ecc
nome_cliente3    Località3     3     ecc  ecc
nome_cliente4    Località4     2     ecc  ecc
nome_cliente5    Località5     1     ecc  ecc
 
Voglio che dove il numero è maggiore di 1 (terza colonna), vengano
creati x doppioni del medesimo record in funzione di quanto vale il
numero, e che il medesimo sia riportato a 1.  Per semplificare, dalla
tabella sopra voglio ottenere il seguente risultato:
 
nome_cliente1    Località1     1     ecc  ecc
nome_cliente2    Località2     1     ecc  ecc
nome_cliente3    Località3     1     ecc  ecc
nome_cliente3    Località3     1     ecc  ecc
nome_cliente3    Località3     1     ecc  ecc
nome_cliente4    Località4     1     ecc  ecc
nome_cliente4    Località4     1     ecc  ecc
nome_cliente5    Località5     1     ecc  ecc
 
 
Come posso fare tramite (possibilmente) una query?
 
 
Grazie 1000 a chi possa aiutarmi.
 
 
Miky

It happens that Michele Zariah formulated :

Sarebbevi qualche impedimento alla soluzione con quattro righe di 
codice VBA?
 
Bruno
 
 

 Bruno
 
Va molto bene anche tramite VBA...
Considera che sono negato, quindi da non tralasciare niente di
(magari) ovvio..
 
Grazie 1000
 
Miky

Michele Zariah wrote on 22-03-12 :

Ma sai come eseguire (da un pulsante, da un evento...) una procedura 
VBA?
 
Bruno
 
 

 Bruno
 
Certo, ma come devo fare per il resto?
 
 
Cordialità

 Certo, ma come devo fare per il resto?
 
Fa' così:
===================================
Private Sub Command4_Click()
Dim db As Database, RS_0 As Recordset, RS As Recordset
Dim i As Long, j As Long, SQL As String, n As Long
Dim NomeTabella As String, CampoContatore As String
'
' Definizioni
' ----------------------
NomeTabella = "Tabella"
CampoContatore = "Num"
' ----------------------
'
Set db = CurrentDb
Set RS_0 = db.OpenRecordset("Tabella", dbOpenDynaset)
 
SQL = "SELECT " & NomeTabella & ".* FROM " & NomeTabella & _
      " WHERE (((" & NomeTabella & ".[" & CampoContatore & "])>1));"
Set RS = db.OpenRecordset(SQL, dbOpenDynaset)
 
Do Until RS.EOF
    n = RS(CampoContatore) - 1
    RS.Edit
    RS(CampoContatore) = 1
    RS.Update
    For i = 1 To n
        RS_0.AddNew
        For j = 1 To RS_0.Fields.Count
            RS_0.Fields(j - 1) = RS.Fields(j - 1)
        Next
        RS_0.Update
    Next
    RS.MoveNext
Loop
 
End Sub
========================================
 
Bruno
 
 


Grazie 1000!!!  funziona in maniera perfetta!!!!
 
Non ho capito però la logica.. puoi inserire qualche commento ad ogni
passaggio?  Mi piacerebbe capire.. so che chiedo molto, quindi
apprezzo anche se non commenterai.
 
PS:
e supponendo di voler creare un'altra tabella con tutti i dati (sia
quelli a valore 1 originari che quelli sdoppiati) come dovrei
procedere?
Questo mi permetterebbe di avere sia la tabella d'origine intonsa, che
la seconda tabella con i record splittati.
 
Grazie 1000 veramente.
 
 
 
Miky

 la seconda tabella con i record splittati.
 
Stai dicendo le cose a rate e in modo incompleto.
Comunque, manualmente e nella maniera più "barbara" possibile:
ricopia TUTTA la tabella originale sulla nuova tabella ed esegui la 
procedura su detta nuova tabella.
 
Bruno
 
 

 Bruno
 
Grazie 1000!!!!
 
tutto perfetto!!!
 
Cordialità
 
 
Miky

Buongiorno,
ho bisogno di una aiuto per risolvere un problema molto simile a quello sopra citato;
Ho un db Biblioteca e volevo creare una maschera dove potevo inserire un libro (in questo caso Titolo, editore, prezzo e così via) e, tramite l'inserimento della quantità, veniva automaticamente moltiplicato.
Questo per non inserire lo stesso libro 10, 20 o 30 volte...
 
Grazie mille 


 ...
 
1. Controlla se veramente hai bisogno di salvare tutti i dati
del libro ripetitivamente. � contro le regole di costruzione
se sarebbe possibile di risolvere con una relazione 1:n.
 
2. Se veramente devi farlo in principio puoi usare la tecnica
trattata nella discussione citata. Provala e se non riesci
incolla il codice che hai provato, descrivi cosa non funziona
o dove non sai come procedere.
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 

 Access FAQ:  
http://www.donkarl.com/it
 
 
Io volevo fare una query di insert dicendogli che quel record (Titolo, Editore, Prezzo ecc...) me lo deve riscrivere per il numero riportato in "Quantità" (in quantità naturalmente ci sarà il numero delle copie che mi hanno portato)
 
Se ci fosse un modo per dargli questo comando (anche in sql)...
 
 
Grazie e scusate tantissimo

 Se ci fosse un modo per dargli questo comando (anche in sql)...
 
Come già scritto puoi usare il metodo con DAO come trattato
nella discussione citata. In SQL non esiste un comando per
inserire un record più volte. Però se non vuoi usare DAO ma
SQL esiste un trucco:
 
1. Creati una nuova tabella "tblNumero" con un solo campo
"Numero" del tipo Long Integer. Inserisciti i valori da 1 a 100
o quale sarebbe il numero massimo che puo accadere.
 
2. Crea la query di accodamento che volevi creare con il
riferimento all Id nella maschera per scegliere il libro giusto.
 
Se non sai come farlo devi raccontare qui i dettagli come
il nome delle tabelle di origine e destinazione, nome della
maschera, nome della chiave primaria per un libro.
 
3. Nella query aggiungi anche la tabella tblNumero senza
collegamento all'altra tabella. Aggiungi il campo Numero alla griglia
e come criterio usi un riferimento al controllo con il numero delle
copie, cioè:
 
<=Forms!TuaMaschera!TuoControlloConIlNumero
 
Questo di accoda tante copie quante indicate.
 
4. Nella maschera puoi p.e. usare un pulsante con una riga
di codice al clic per eseguire la query:
 
DoCmd.OpenQuery "NomeDellaQuery"
 
vedi anche: 
http://www.donkarl.com/it?FAQ2.4
 
