Loop o altro?

giovedì 04 novembre 2010 - 12.27
Tag Elenco Tags  Access (.mdb)

Se2 Profilo | Junior Member

Cioa a tutti, io ho questo codice un po' rudimentale che vorrei venisse ripetuto epr tutti i record della tabella. Devo usare la funzione loop o ci sono altre soluzioni? In qualsiasi caso sia che debba usare il loop o il for next ( come ho letto in un'altra discussione ) mi potreste modificare il mio codice? purtroppo sono molto scarso di vba
GRAZIE 1000

Il codice è

If Me.[Quantità_cartonicini] <> "0" Then
Me.[Quantità_cartonicini] = ((Quantità_cartonicini) - 1)
DoCmd.OpenReport "Report_stampa_attestati", acViewPreview, "", "", acNormal
DoCmd.PrintOut acPages, 1, 1, acHigh, 1, True
[Stampa_attestato].Value = "no stampa"
End If

ugk111 Profilo | Junior Member

Se ho capito hai la necessità di stampare il report "Report_stampa_attestati" per la quanti cartoncini presenti nel tuo database
quind se così fosse potresti usare il seguente codice copiandolo nell' evento SU APERTURA della maschera di interesse oppure farlo eseguire dopo l'apertura della maschera alla pressione di un pulsante .Ovviammente la maschera deve avere come origine dati la tabella che contiene il campo Quantita_cartoncini.
In pratica vendono contati i record presenti nella tabellaA che contengono il campo Quantità_cartoncini che dovrebbe essere pari ad 1

Dim J,ContatoreCartoncini as integr ' dichiarazione del tipo di variabili vengono tefinite numeriche intere

ContatoreCartoncini = DCount("Quantita_cartoncini", "tabellaA") 'conta record
for J=1 to ContatoreCartoncini 'ciclo da 1 a ContatoreCartoncini

DoCmd.OpenReport "Report_stampa_attestati", acViewPreview, "", "", acNormal
DoCmd.PrintOut acPages, 1, 1, acHigh, 1, True

Docmd.gotorecord,,acnext ' va al record successivo
next J

Se2 Profilo | Junior Member

Ciao e innanzittutto grazie 1000 per la risposta. Ho provato il codice ma mi da un errroe
Errore di compilazione: Tipo definitio dall'utente non definito

e mi seleziona , contatorecartoncini As integr
Io ho inserito in origine dati la tabellaA contenente il campo Quantita_cartoncini e ho impostato il campo Contatorecartoncini come Contatore mentre il campo Quantita_cartoncini come testo
Ciao Grazie

P.s. sarebbe possibile ottenere che ogni voltoa che stampa o un singolo record o alla fine della stampa mi inserisca un valore negativo corrispondente al numero di stampe effettuate in modo da avere il numero di cartonicini disponibili sempre aggiornato?
GRAZIE

ugk111 Profilo | Junior Member

scusa ma si tratta di un errore di battitura nella istruzione
Dim J,ContatoreCartoncini as integr ' dichiarazione del tipo di variabili vengono tefinite numeriche intere
in pratica ho digitato integr mentre la definizione corretta è integer quindi dovrai solo riscrivere
Dim J,ContatoreCartoncini as integer ' dichiarazione del tipo di variabili vengono tefinite numeriche intere
La seconda parte della tua richiesta non mi è chiara puoi spiegarmi meglio ?

Se2 Profilo | Junior Member

Scusa ma non mi sono spiegato bene e mi dispiace averti fatto perdere tempo
Io ho una tabella contenente dei nomi che devono essere stampati. Dovendo essere utilizzati dei cartoncini avrei bisogno che mi venissero stampati un numero di nominativi uguale e non superiore al numero di cartoncini disponibili. Ad es io ho da stampare
Luca
Marco
Sergio
Maria

e avendo solo 2 cartonicini disponibili ( dato contenuto in un'altra tabella denominata "Cartoncini" Campo "Cartoncini disponibili" ) dovrebbero venire stampati solo i primi due nominativi ( luca,Marco)
Al termine della stampa o durante mi servirebbe che nel campo "cartoncinci disponibili" della tabella "Cartonicini" venisse inserito un -2 corrispondente al numero di cartoncini utilizzati in modo tale che con una query di somma il numero di cartoncini disponibili inserito nella tabella "Cartoncini" campo Campo "Cartoncini disponibili" diventa 0 impedendo la stampa
GRAZIE e scusa per la spiegazione non chiara !!!!

ugk111 Profilo | Junior Member

non preoccuparti non è un aperdita di tempo. comunque il percorso per la soluzione si allunga un po' inquanto
sembrerebbe che la stampa dei nominativi avvenga in base al numero dei cartoncini quindi conoscendo questo valore poi dovresti preoccuparti di selezionare di volta in volta i nomi da estrapolare e poi stampare (luca e marco). sai come superare questo punto ? se si passiamo oltre fammi sapere

Se2 Profilo | Junior Member

Ciao sinceramente non m'inteno molto di vba
Ora ho creato ( copiando qua e la ) questo codice per la selezione manuale
ID è contenuto nella Tabella Nominativi

If Not IsNull(Me.[lista]) Then
DoCmd.OpenReport "Report stampa", acNormal, "", "[ID]=[Forms]![006_msc]![lista]", acReadOnly, acNormal
DoCmd.OpenForm "007_msc", acNormal, "", "[ID]=[Forms]![006_msc]![lista]", acReadOnly, acNormal
DoCmd.OpenReport "Report stampa", acViewPreview, "", "[ID]=[Forms]![006_msc]![lista]", acReadOnly, acNormal
DoCmd.OpenForm "017_msc", acNormal, "", "", acEdit, acNormal
End If
Me.Requery
Me.[lista].Requery
----
Private Sub Form_Load()
DoCmd.GoToRecord acForm, "017_msc", acNewRec
[Numero cartoncini].Value = "-1"
DoCmd.Close acForm, "017_msc"
End Sub
GRAZIE

ugk111 Profilo | Junior Member

scusa se ti pongo ancora domande e non ti offro soluzioni, ma il codice che hai scritto è suddivisibile in due parti :una sul caricamento della maschera (load) ed il resto è applicato a cosa? ad un pulsante sulla maschera? sulla maschera hai creato una casella combinta (o un elenco) dalla quale selezionando un nome parta subito la stampa del cartoncino ?

Se2 Profilo | Junior Member

Figurati, anzi grazie per l'aiuto...
è associato all'evento DblClick
In pratica ho una combobox "lista" in cui sono visualizzati l'elenco di nominativi da stampare
Ciao grazie

ugk111 Profilo | Junior Member

una possibile soluzione potrebbe essere la seguente:
creare la maschera sulla tabella contenente i nomi ,nel mio caso la tabella è nomi o attribuisci tale origine dei dati alla mascgera già creata poi
dovrebbe bastrae copiare il seguente codice con le dovute modifiche
la tabella nomi da me creta contiene solo il campo id e nome e aggiungi alla mashera una casella di testo nel mio caso testo6

Option Compare Database
Public ContatoreCartoncini As Integer

Private Sub CasellaCombinata4_AfterUpdate() 'sostituisci CasellaCombinata4 con la tua
' Trova il record corrispondente al controllo
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[id] = " & Str(Nz(Me![CasellaCombinata4], 0)) 'sostituisci CasellaCombinata4 con la tua

If Not rs.EOF Then Me.Bookmark = rs.Bookmark

Dim EseguiSql, Risposta, Messaggio As String
Messaggio = "Fine Cartoncini"


Select Case ContatoreCartoncini

Case Is > 0 'se contatorecartoncini è maggiore di zero esegue
ContatoreCartoncini = ContatoreCartoncini - 1 'la sottrazione di un dal contatorecartoncino per la stampa
Testo6 = ContatoreCartoncini 'assegna il valore del contatorecartoncino alla casella di testo6 (nella maschera) doCmd.OpenReport "nomi Query", acViewPreview 'apre il report
EseguiSql = "UPDATE cartoncini SET cartoncini.Quantita_cartoncini = Testo6" 'esegue la query di aggiornamento
DoCmd.RunSQL EseguiSql
Case 0
Risposta = MsgBox(Messaggio, vbCritical + vbOKOnly)
EseguiSql = "UPDATE cartoncini SET cartoncini.Quantita_cartoncini = Testo6"
DoCmd.RunSQL EseguiSql
Exit Sub

Case Is < 0

End Select

End Sub

Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False
ContatoreCartoncini = DLookup("Quantita_cartoncini", "cartoncini", "id_cartoncini = 1") ' legge il valore dell'unica riga della tabella quantificartoncini
Testo6 = ContatoreCartoncini assegna ol valore trovato a testo6
End Sub

il report dovrà essere creato utilizzanodo come origine dei dati una query di selezione in base al valore ricrato dalla casella combinata tipo


SELECT nomi.id, nomi.nome
FROM nomi
WHERE (((nomi.nome)=[Forms]![nomi]![nome]));


come vedi è un po' più complicato ma sicuramente a mio parere più efficente

Se2 Profilo | Junior Member

Cioa e innanzitutto grazie per il tuo AIUTO!!!
Però ho dei problemi nella realizzazione.
Ti spiego come ho fatto: ho creato una maschera "nomi" a cui ho collegato una tabella "nomi" e ho inserito una combobox "nome" con origine controllo "nome" e ho inserito una casella di testo Testo6 "non associato"
poi ho creato un report "Report_stampa_attestati" con origine record la query "SELECT nomi.ID, nomi.nome FROM nomi WHERE (((nomi.nome)=[Forms]![nomi]![nome]));" e su apertura della maschera

Option Compare Database
Public ContatoreCartoncini As Integer

Private Sub CasellaCombinata4_AfterUpdate() 'sostituisci CasellaCombinata4 con la tua
' Trova il record corrispondente al controllo
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[id] = " & Str(Nz(Me![CasellaCombinata4], 0)) 'sostituisci CasellaCombinata4 con la tua

If Not rs.EOF Then Me.Bookmark = rs.Bookmark

Dim EseguiSql, Risposta, Messaggio As String
Messaggio = "Fine Cartoncini"


Select Case ContatoreCartoncini

Case Is > 0 'se contatorecartoncini è maggiore di zero esegue
ContatoreCartoncini = ContatoreCartoncini - 1 'la sottrazione di un dal contatorecartoncino per la stampa
Testo6 = ContatoreCartoncini 'assegna il valore del contatorecartoncino alla casella di testo6 (nella maschera) doCmd.OpenReport "nomi Query", acViewPreview 'apre il report
EseguiSql = "UPDATE cartoncini SET cartoncini.Quantita_cartoncini = Testo6" 'esegue la query di aggiornamento
DoCmd.RunSQL EseguiSql
Case 0
Risposta = MsgBox(Messaggio, vbCritical + vbOKOnly)
EseguiSql = "UPDATE cartoncini SET cartoncini.Quantita_cartoncini = Testo6"
DoCmd.RunSQL EseguiSql
Exit Sub

Case Is < 0

End Select

End Sub

Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False
ContatoreCartoncini = DLookup("Quantita_cartoncini", "cartoncini", "id_cartoncini = 1") ' legge il valore dell'unica riga della tabella quantificartoncini
Testo6 = ContatoreCartoncini 'assegna ol valore trovato a testo6
End Sub

Ora non capisco a quale combobox si riferisce "CasellaCombinata4"
Ho creato una tabella "cartoncini" con campi "Quantita_cartoncini" e "id_cartoncini" ma non ho capito se devo associare i campi nella maschera
Abbi pazienza ma per me è arabo il VBA
GRAZIE 1000

ugk111 Profilo | Junior Member

la casellacombinata4 dovrebbe essere la tua "casellacombinata nomi" ed il codice scritto per la casellacombinata4 va applicato all'evento della casellacombinta dopo aggiornamento (after update) quindi nel codice dovresti sostituire tuttele le "casellacombinata4" con la tua "nomi".Non devi applicare nessun evento all?apertura della maschera in quanto la seconda delle due prime righe va scritta direttamente.infine Non devi associare la tabella cartoncini in quanto l'istruzione dlookup provvederà a leggere il valore interessato.fammi sapere se sono stato più chiaro.

Se2 Profilo | Junior Member

Ciao, non sei tu che non sei chiaro... sono io che sbaglio qualcosa... in effetti ho apportato le modifiche da te proposte ma non capita nulla.
Ti allego il database... scusa

ugk111 Profilo | Junior Member

Non ti preoccupare è tutto ok.ho apportato delle modifiche importatnti,a mio avviso, nelle tabelle,ovvero non si può mettere l'id dopo i campi dati ,dovrà essere sempre il primo e nel caso essere la chiave primaria della tabella. fatto ciò ho dato una aggiustatina alla tua maschera,report e query.spero ti vada bene

Se2 Profilo | Junior Member

E' PERFETTO!!!!!!!! GRAZIE 100000000000

ugk111 Profilo | Junior Member

di nulla
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5