View Full Version : [Office-openoffice] Programma con form
Avrei la necesità di creare un programmino leggero con office o openoffice che compia piccole operazioni.
Vorrei creare una form che abbia un textbox , una combobox che prenda dati da una query su db, un'altra combo che faccia altrettanto con un altra query ma che cambi i valori che si possono scegliere a seconda della scelta della prima (quindi cambi query), e un tasto submit che faccia eseguire una calcolo sui valori scelti e lo restituisca magari su un altra textbox.
Vorrei aiuto su come poter fare. Riesco più o meno a creare la form coi controlli ma ad es. non so come far fare le scelte diverse alla seconda combo e come fare la macro.
Grazie davvero a chi volesse aiutarmi.
E magari, prima di aprire nuovi thread, rispondere a quelli precedenti in cui si è ricevuta attenzione, no ?
http://www.hwupgrade.it/forum/showthread.php?t=1724332
Hai perfettamente ragione, mi ero scordato di rispondere, l'ho fatto ora e prometto d fare meglio in futuro!! Se potessi darmi una manina in quest'altra situazione...
Grazie
Bene. :)
Io ti consiglio ovviamente di usare Office ( preferibilmente 2003 o 2007 ).
Perciò userei Excel come applicazione, che estrae i dati da Access e ha il miglior supporto alle form di tutto il pacchetto Office...
Il DB Access lo hai già realizzato ? Sei già arrivato ad estrarre il recordset con VBA ?
Per ora ho fatto un database con :
ID-NOMENAZIONE-CODICEREGIONE-FASCIAPESO-NOMEFORNITORE
In realtà avevo fatto delle prove su openoffice, così su due piedi non so come fare per creare maschere con controlli associati al database.
Non ho estratto recordset.
Grazie
Chiarisco meglio: ho creato e riempito un database che al momento consiste di una sola tabella con attributi :
ID-NOMENAZIONE-CODICEREGIONE-FASCIAPESO-NOMEFORNITORE
Ho creato anche una maschera con le combo come avevo detto. Non so come fare per fare il cambio dinamico dei dati della combo come nel primo post e non so come fare per recuperare i valori dei controlli, eseguire operazioni con questi dati e associare il risultato a un altro controllo.
Chiarisco meglio: ho creato e riempito un database che al momento consiste di una sola tabella con attributi :
ID-NOMENAZIONE-CODICEREGIONE-FASCIAPESO-NOMEFORNITORE
Ho creato anche una maschera con le combo come avevo detto. Non so come fare per fare il cambio dinamico dei dati della combo come nel primo post e non so come fare per recuperare i valori dei controlli, eseguire operazioni con questi dati e associare il risultato a un altro controllo.
Beh, se stai facendo tutto in Access, allora userai una creazione guidata maschera.
Prima crei una Query che prende tutti i campi desiderati dalla tabella >> costruisci la tua maschera in creazione guidata, basata sulla Query appena creata, ma lascia fuori i campi che andrai ad associare poi alle ComboBox.
Apri la maschera appena creata in vis. struttura, inserisci una nuova Combo, e segui la procedura guidata creazione combo.
Scegli l'opzione "Trova un record nella maschera basato sul valore...", e associa la Combo al campo della tabella che vuoi...
Comunque in questo caso Una Query = Una Maschera.
Se non ho capito male tu all'inizio parlavi anche di una Combo "cambia-query" ?
Grazie, si volevo fare 2 combo di cui la seconda aggiornava i suoi valori quando si cambiano i valori della prima... stile javascript... Vorrei prendere i valori della seconda da una query così come quelli della prima. Ho provato anche a creare del codice VBA pechè dovrei fare delle operazioni confrontando i valoi passati tramite la combo o una textbox con quelli presenti nel db ma non ci sono riuscito....quindi:
Come ci si collega al nostro db in vba?
Come si eseguono le query?
ho provato così ma ho dei problemi
Private Sub Comando7_Click()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim stringa As String
stringa = "Select * FROM costi WHERE Nazione = Francia AND Peso = 2; "
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open stringa, conn
If rs.EOF Then
MsgBox "Nessun dato"
Else
Testo4.SetFocus
Testo4.Value = rs("tariffa")
End If
Set cn = Nothing
Set rs = Nothing
End Sub
dice che ci sono problemi con i parametri in rs.Open stringa, conn
...altra domanda nelle query dove si devono mettere le "" tipo where x="ciao" come si fa? perchè mi da problemi di fine comando
Spero di non avere chiesto troppe cose insieme ma contribuiscono tutte alla cosa che sto facendo.
Grazie ancora
UP, ....se pensate che sia meglio faccio più 3d per fare le domande...
volevo fare 2 combo di cui la seconda aggiornava i suoi valori quando si cambiano i valori della prima... stile javascript... Vorrei prendere i valori della seconda da una query così come quelli della prima. Ho provato anche a creare del codice VBA pechè dovrei fare delle operazioni confrontando i valoi passati tramite la combo o una textbox con quelli presenti nel db ma non ci sono riuscito....quindi:
Come ci si collega al nostro db in vba?
Come si eseguono le query?
ho provato così ma ho dei problemi
Private Sub Comando7_Click()
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim stringa As String
stringa = "Select * FROM costi WHERE Nazione = Francia AND Peso = 2; "
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open stringa, conn
If rs.EOF Then
MsgBox "Nessun dato"
Else
Testo4.SetFocus
Testo4.Value = rs("tariffa")
End If
Set cn = Nothing
Set rs = Nothing
End Sub
Andiamo con ordine :
1. Se fai tutto in Access ci sono buone probabilità che tu non debba usare alcun codice VBA ( io avevo parlato di VBA perchè inizialmente ti avevo consigliato du usare le Form di Excel, non quelle di Access... ).
Se vuoi che il cambiamento su una Combo "pilota" ti permetta di scorrere i record della maschera, devi fare una procedura guidata creazione maschera, come ti ho già detto.
2. Quella SELECT è ovvio che non funziona, per 2 motivi :
- se nella tabella hai un campo NOMENAZIONE, poi non puoi richiamarlo come Nazione dalla Select.
- WHERE NOMENAZIONE = 'Francia' .
3. In generale puoi avere più controlli su una stessa maschera di Access, e senza codice VBA, che fanno riferimento a Query differenti >> Prima ti crei le Query in Access, magari parametriche, le salvi, e poi associando i controlli della maschera alle query, esegui i confronti...
4. Sarebbe molto più semplice se facessi un esempio concreto per volta di ciò che vuoi ottenere. Spesso la gente non risponde ai thread perchè il tempo è scarso, e se inoltre bisogna star lì ad interpretare ciò che uno chiede è meglio lasciar perdere.
Allora...ricapitolo la situazione:
ho creato un database in ACCESS con una sola tabella tariffe coi seguent campi:
ID-NAZIONI-PROVINCE-FORNITORI-TIPOSPED-PESOMIN-PESOMAX-PREZZO
ed ho creato per ora le query :
1)select distinct nazioni from tariffe;
2)select distinct province from tariffe where nazioni = "Estonia";
3)select distinct province from tariffe where nazioni = "Lettonia";
ho poi creato sempre in access una maschera con 2 caselle combinatorie.
Alla prima ho associato la query 1 e vorrei che le opzioni della seconda fossero i risultati delle query 2 o 3 a seconda della scelta della prima casella combinatoria.
Se ho ben capito dovrebbe essere possibile senza meyttere mano al codice.Come si fa?
Infine vorrei inserire un pulsante e un campo testo dove alla pressione del pulsante eseguo una funzione utilizzando i valori selezionati dalle combo e restituisco il risultato nel campo testo.
Come posso fare? Quì forse va messo mano a vba?
Grazie
up HELP.....
ho trovato le seguenti soluzioni su google ma non me ne funziona nemmeno una...
1) aggiungere una afterupdate alla prima combo così:
Private Sub combo1_AfterUpdate()
Me.combo2.RowSource = "SELECT provinceCap FROM tariffe
WHERE nazioni = " & Me.combo1
End Sub
2) basare l'origine record della maschera su una query di questo tipo :
SELECT *
FROM tariffe
WHERE (((nazioni) LIKE nz([forms]![Maschera1]![combo1],"*")) AND ((tariffe.[provinceCap]) LIKE nz([forms]![Maschera1]![combo2],"*")));
e poi crear gli after update in questo modo...
Private Sub combo1_AfterUpdate()
Me.Requery
combo1.Requery
combo2.Requery
End Sub
Private Sub combo2_AfterUpdate()
Me.Requery
combo1.Requery
combo2.Requery
End Sub
ma nessuna funziona o lameno mi pare
AIUTOOOOOOOOOOOOOO:help:
Io invece farei così :
1. Anzitutto le query :
Query1 :
SELECT DISTINCT tariffe.NAZIONI
FROM tariffe;
Query2 (parametrica) :
SELECT DISTINCT tariffe.PROVINCE
FROM tariffe
WHERE tariffe.NAZIONI = [nazione];
Le tue Query2 e Query3 le puoi cestinare.
2. Ho una maschera con 2 combo che chiamo "cmbNaz" e "cmbProv".
- cmbNaz è associata direttamente a Query1.
- cmbProv non è associata.
3. cmbNaz contiene già tutte le nazioni all'avvio della maschera, mentre la cmbProv si popola di conseguenza, con questo codice :
Private Sub cmbNaz_Change()
Dim naz As String
cmbNaz.SetFocus
If cmbNaz.Text <> "" Then naz = cmbNaz.Text
Dim QD As QueryDef
Set QD = CurrentDb.QueryDefs("Query2")
QD.Parameters("nazione") = naz
Dim RS As Recordset
Set RS = QD.OpenRecordset
Dim i As Integer
i = 0
For i = 0 To cmbProv.ListCount - 1
cmbProv.RemoveItem (0)
Next i
RS.MoveFirst
While Not RS.EOF
cmbProv.AddItem (RS("PROVINCE").Value)
RS.MoveNext
Wend
cmbProv.SetFocus
cmbProv.Text = cmbProv.ItemData(0)
RS.Close
QD.Close
Set RS = Nothing
Set QD = Nothing
End Sub
Prova... ;)
Ti ringrazio moltissimo, solo che ho il seguente errore quando faccio la selezione:
mi si apre una finestra che dice:
Errore di runtime '3601'
Parametri insufficenti, previsto 2
e se apro il debug sembra che il problema risieda in :
Set RS = QD.OpenRecordset
help again
Da me funziona perfettamente invece ( Access 2003 ).
Tua versione di Access ?
La mia è 2007, ora ci riprovo da capo... scusa, non è che puoi darmi qualche commento in più sul codice?
In particolare non ho capito il significato di <> "" nella riga 5 e il comando next i.
Grazie ancora
Benissimo, grazie a Dio funziona davvero, ho risolto... avevo una serie di problemi:
la cmbProv non si chiamava così,
L' attributo province lo chiamavo provinceCap
Dovevo impostare il tipo origine riga di CmbProv come elenco valori
Grazie Mille ancora, se puoi mi dai due commenti per quello che ti ho chiesto?
Ultima cosa (o quasi)... è possibile fare il deploy del progetto access (per chi ha access)nel senso di creare un file che esegua direttamente la maschera?
Poi ora dovrei inserire un bottone che prende i valori dalle combo e da un campo text, fa una funzione e restituisce il valore su una text....ma guardo se ci arrivo da solo senza rompere oltre. :D
Benissimo, grazie a Dio funziona davvero, ho risolto... avevo una serie di problemi:
la cmbProv non si chiamava così,
L' attributo province lo chiamavo provinceCap
Dovevo impostare il tipo origine riga di CmbProv come elenco valori
:doh: :D
Perchè avevi qualche dubbio che non funzionasse ? :O
Grazie Mille ancora, se puoi mi dai due commenti per quello che ti ho chiesto?
Ultima cosa (o quasi)... è possibile fare il deploy del progetto access (per chi ha access)nel senso di creare un file che esegua direttamente la maschera?
If cmbNaz.Text <> "" Then naz = cmbNaz.Text
Esegue un semplice controllo di sicurezza sul fatto che in quel momento la cmbNaz non stia mostrando una stringa vuota...
Qui si potrebbe inserire un codice opportuno, nel caso si verifichi ( a volte il comportamento dei controlli su Access Forms è "anomalo"... ) ma se va sempre liscio lo lasci pure così com'è...
Next i
non è altro che l'istruzione di chiusura del For precedente ( in VB non è richiesto che si ripeta "i" dopo Next, ma io lo faccio sempre > quando creerai routines con 300 righe e 5 For nidificati capirai il perchè ;) ).
Ripeto l'ultama domanda che ho fatto... per altre cose prometto di aprire nuovi 3d....
E' possibile fare il deploy del progetto access (per chi ha access)nel senso di creare un file che esegua direttamente la maschera?
E' possibile fare il deploy del progetto access (per chi ha access)nel senso di creare un file che esegua direttamente la maschera?
Se stai pensando ad un .exe di Access, e che magari non necessiti di avere Access sulla macchina del cliente, temo proprio non si possa fare.
Quello che puoi fare è convertire il tuo DB in un file "compilato" .mde, che permette all'utente di fare tutto, ma non di vedere/modificare il codice VBA ( la modalità progettazione sulle maschere è disabilitata ;) ).
Ciao , sono ancora qua....ho un altro problema nel codice che non mi riesce risolvere... ho creato un altra query parametrica:
SELECT DISTINCT tariffe.prezzo
FROM tariffe
WHERE tariffe.nazioni=[nazione] AND tariffe.provinceCap=[province] AND tariffe.pesomin<[peso] AND tariffe.pesomax>[peso] AND tariffe.fornitore=[fornitore] AND tariffe.tiposped=[tipo];
e ho ampliato la mia maschera per eseguire restituire il valore di una query su una textbox.
Private Sub calcolatarbtn_Click()
Dim naz As String
Dim prov As String
Dim peso As Double
Dim res As Double
Dim forn As String
Dim tiposp As String
forn = "bartolini"
tiposp = "euroexpr"
cmbNaz.SetFocus
If cmbNaz.Text <> "" Then naz = cmbNaz.Text
cmbProv.SetFocus
If cmbProv.Text <> "" Then prov = cmbProv.Text
peso = pesotext.Value
Dim QD1 As QueryDef
Set QD1 = CurrentDb.QueryDefs("Query3")
QD1.Parameters("nazione") = naz
QD1.Parameters("province") = prov
QD1.Parameters("peso") = peso
QD1.Parameters ![fornitore] = forn
QD1.Parameters ![tipo] = tiposp
Dim RS1 As Recordset
Set RS1 = QD1.OpenRecordset
RS1.MoveFirst
bartolinieutext.SetFocus
res = RS1("prezzo").Value
bartolinieutext.Text = res
RS1.Close
QD1.Close
Set RS1 = Nothing
Set QD1 = Nothing
End Sub
Nel codice vorrei passare i valori forn e tiposp alla query ma mi da errore in fase di debug esattamente quì:
QD1.Parameters ![fornitore] = forn
ho provato sia con questa sintassi che con quella usata per gli assegnameni di prima ma ho sempre lo stesso problema...help
UP, continuo a scrivere quì perchè no credo che sia OT
L'errore che mi viene dato è :
rrore di runtime 3265 elemento non trovato in questo insieme.
Pratiacmente nella mia maschera ho creato anche 2 text e un bottone e vorrei che alla pressione del bottone vengano passati alla query parametrica i valori recuperati dalle 2 combo ,da una text e da 2 valori String che io specifico nel codice. Il problema sembra risiedere in questi valori che cnon recupero dai controlli.
:help:
...
QD1.Parameters("nazione") = naz
QD1.Parameters("province") = prov
QD1.Parameters("peso") = peso
QD1.Parameters ![fornitore] = forn
QD1.Parameters ![tipo] = tiposp
...
Ma perchè usi due modi diversi per passare i parametri ?! :rolleyes:
Perchè non fai :
QD1.Parameters ("fornitore") = forn
QD1.Parameters ("tipo") = tiposp
così come i precedenti ?
mi areva di averlo scritto...era solo per fare una prova se l'errore era nella sintassi che usavo per passare i valori alla query... ma sembra nn essere quello...
Suggerimenti?
Risolto, ho cambiato il nome del parametro nella query e nel codice da fornitore a fornitori.....BOH!!!!
comunque grazie a Dio va..
Grazie dell' interesse
Risolto, ho cambiato il nome del parametro nella query e nel codice da fornitore a fornitori.....BOH!!!!
comunque grazie a Dio va..
Grazie dell' interesse
Mah, secondo me hai fatto parecchio casino con i nomi dei campi del DB e/o parametri :
Es.: prima PROVINCE, poi provinceCap - prima FORNITORI, poi fornitore... Quando hai deciso i nomi ( campi, parametri, pulsanti ecc... ) non è molto furbo continuare a cambiarli... ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.