Newsgroup: it.comp.appl.access
Titolo: problema con if...then

ciao a tutti.
premessa:
A/97 - win 98 se - pc PIII 550 mhz a 128 md di ram
Il problema:
ultimata una lavorazione con access ho la necessità di esportare una certa
tabella in un nuovo database, il cui nome viene specificato in una input
box:
vorrei però che la procedura facesse una serie di controlli. ho scritto
questo codice maualcosa non va:
Function exportexport2()
' questa procedura consente di esportare la tabella 'tutto per cassa' in un
nuovo database.
' questo nuovo database verrà creato con la medesima procedura, sarà
possibile assegnargli un nome
' e sarà possibile assegnare un nuovo nome alla tabella 'tutto per cassa'
che verrà esportata
Dim nomedbs As String ' variabile che indica il nome del nuovo database
Dim nometbl As String ' variabile che indica il nuovo nome per la tabella
'tutto per cassa'
Dim myfile 'variabile che indica il nome del nuovo dbase con l'intero
percorso
Dim msg, style, title, response, mystring
Dim vabuo As String
vabuo = "ho capito, non vuoi esportare niente"
' il comando che segue avvia una maschera di immissione per la digitazione
del dbase da creare
nomedbs = InputBox("digita il nome del databsae da creare, nel quale
esportare la lavorazione Armida 'senza addendo fittizio'. Importante: digita
il nome del database seguito da '.mdb'", "immetti un nome per il dbase")
If nomedbs <> "" Then
MsgBox "un attimo di pazienza, ora verifico se il nome immesso è già
presente in archivio"
End If
If nomedbs = "" Then ' se non viene effettuata alcuna digitazione...
msg = "su, su, non succede niente, il nome lo puoi mettere..."
style = vbYesNo + vbDefaultButton2
title = "dai un nome al nuovo dbase"
response = MsgBox(msg, style, title)
' un msgbox fornisce nuove istruzioni...
If response = vbYes Then
mystring = "Si"
nomedbs = InputBox("riprova a digitare il nome del dbase seguito
dall'estensione .mdb")
If nomedbs = "" Then
response = MsgBox(vabuo)
Close
ElseIf nomedbs <> "" Then
MsgBox "un attimo di pazienza, ora verifico se il nome immesso è già
presente in archivio"
Else
mystring = "No"
response = MsgBox(vabuo)
Close
End If
End If
End If
' ora si procede alla verifica dell'esistenza del dbase k:\MSOFFICE\...\
&nomedbs
myfile = Dir("d:\" & nomedbs)
Do While myfile > ""
If myfile <> "" Then ' se lo trova
MsgBox "file già presente. Se premi 'SI' il file esistente verrà eliminato e
sostituito da un nuovo database e non sarà possibile annullare tale
operazione", _
vbYesNo, "verifica esistenza file"
If MsgBox("file già presente. Se premi 'SI' il file esistente verrà
eliminato e sostituito da un nuovo database e non sarà possibile annullare
tale operazione", _
vbYesNo, "verifica esistenza file") = vbYes Then
Kill "d:\" & nomedbs
Else
nomedbs = InputBox("riprova a digitare il nome del dbase seguito
dall'estensione .mdb")
myfile = Dir("D:\" & nomedbs)
End If
End If
Loop  ' ripete la procedura fino a che non viene indicato un nome valido per
il dbase
' adesso crea il nuovo dbase
Dim wrkPredefinita As Workspace
Set wrkPredefinita = DBEngine.Workspaces(0)
Dim dbsNuovo As Database
Set dbsNuovo = wrkPredefinita.CreateDatabase("d:\" & nomedbs, dbLangGeneral,
dbEncrypt)
nometbl = InputBox("digita il nome con il quale vuoi esportare la tabella
'tutto per cassa'")
If nometbl = "" Then
MsgBox "c'hai paura, eh coniglio!"
End If
DoCmd.TransferDatabase acExport, "Microsoft Access", "D:\" & nomedbs,
acTable, "tutto per cassa", nometbl
MsgBox "esportazione riuscita"
End Function
Con questo codice tutto va bene se nella prima input box viene indicato un
nome di database valido, seguito da .mdb. Il nuovo dbase, infatti viene
regolarmente creato, e la tabella viene esportata con il nome indicato nella
specifica input box (nometbl)
ogni comportamento diverso genera problemi. Infatti:
1) la input box per la immissione del nome del dbase presenta di default due
botton, ok e annulla. facendo click su annulla la procedura dovrebbe essere
annullata e chiusa (e non ho capito come questo dovrebbe succedere, visto
cha anche sull'help in linea, non ho trovato istruzioni specifiche per la
valorizzazione del tasto annulla...). Invece con annulla, (e continuo a non
capire perchè) si passa al messagebox successivo (per intenderci: msg = "su,
su, non succede niente, il nome lo puoi mettere..."), da cui , premendo no
si riavvia la procedure, anzichè chiudersi ( mystring = "No"  -  response =
MsgBox(vabuo) - Close)
2) se invece, sia per errore che intenzionalmente non si digita alcun nome
per il database si genera un loop dal quale non si esce che mettendo cmq un
nome valido per il dbase
3) nella input box per l'inserimento del nome tabella se premo annulla va in
debug perchè non trova il nome della tabella da esportare (comando
docmd.exportdatabase). Ma annulla (cos' come nel primo casa) non dovrebbe
generare la conseguenza di interrompere la procedura.
per favore, potete dirmi dove sbaglio nella scrittura del codice?
grazie e tanti auguri di buon natale e felice anno nuovo
Antonio

Per motivi di tempo, non ho letto con sufficiente attenzione il tuo
messaggio per darti una risposta precisa.
Mi limito quindi ad una "dritta": tieni conto che la funzione
InputBox, se l'utente fa click su Annulla, restituisce ua stringa
vuota. Per intercettare questo comportamento basta quindi testare se
il valore restituito dalla input box č uguale a "".
HTH
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Cosě disse 
ivan....@tiscalinet.it
 Ven 25 Aug 2000 09:34:52 +0200)


EHm... ho dato un occhiata al codice che hai scritto: davvero simpatici i
msg che visualizzi !!
Comunque i consigli che voglio darti sono questi:
1) non scrivere un sacco di IF una dentro l'altra se non riesci a gestire il
groviglio che ne viene fuori !!!!
2) se vuoi controllare gli input di una InputBox non scrivere 2 o più volte
lo stesso codice per lo stesso risultato... che poi vedi che non funziona e
non ci si capisce più niente;
3) prima di scrivere il codice così come ti viene in mente al momento, pensa
un po' all'algoritmo che devi implementare e (un modo molto semplice e
immediato) fai una specie di simulazione... prova ad eseguire te il codice
che scrivi come se fossi il pc e scoprirai da solo quali errori hai
commesso!!!!!
4) un'ultima cosa: io sono abituato a INDENTARE le istruzioni, cioè quando
un gruppo di istruzioni vengono eseguite solo in determinate condizioni o
sono logicamente assieme aumento il rientro con un TAB !
es:
IF <condizione vera> THEN
        <istruzioni>
ELSE
        <altre istruzioni>
END IF
AHHH ! Cosa importantissima... nel codice che hai scritto i controlli che
fai con le IF non devi spezzettarli qua e là !
es di errore:
IF <condizione vera> THEN
        rispo=msgbox (.....
END IF
IF rispo= eccetera ....     <------ questo controllo su "rispo" non devi
farlo fuori dalla IF precedente !!! ma lo devi inentare così:
IF <condizione vera> THEN
        rispo=msgbox (.....
        IF rispo= eccetera .... <----- qui lo devi mettere !! OKAY ???
END IF
Spero di averti chiarito un po' dove sbagli... ma non preoccuparti che è
sbagliando che si impara !!
CIAO CIAO
G.

 ecc... ecc ... ecc ...
Prova ad utilizzare la funzione di debag e segui passo passo il tuo
programma.
Ti accorgerai immediatamente dove c'è un errore o dove il programma esegue
una istruzione non voluta.
Ciao
Marco Dell'Oca
D.M.Software

 ha scritto nel messaggio
news:MiT%5.143295$hk4.5...@news.infostrada.it...

Premesso che non sono andato a controllare tutto ciò che fa la procedura, ma
che mi sono limitato a rivedere il problema da te segnalato, io l'avrei
scritta circa così (circa perché non l'ho controllata, ma sono andato a
braccio)
Function exportexport2()
' questa procedura consente di esportare la tabella 'tutto per cassa' in un
nuovo database.
' questo nuovo database verrà creato con la medesima procedura, sarà
possibile assegnargli un nome
' e sarà possibile assegnare un nuovo nome alla tabella 'tutto per cassa'
che verrà esportata
Dim nomedbs As String ' variabile che indica il nome del nuovo database
Dim nometbl As String ' variabile che indica il nuovo nome per la tabella
'tutto per cassa'
Dim myfile 'variabile che indica il nome del nuovo dbase con l'intero
percorso
Dim msg, style, title, response, mystring
Dim vabuo As String
vabuo = "ho capito, non vuoi esportare niente"
' il comando che segue avvia una maschera di immissione per la digitazione
del dbase da creare
ChiediNomeDB:
    nomedbs = InputBox("digita il nome del databsae da creare, nel quale
esportare la lavorazione Armida 'senza addendo fittizio'. Importante: digita
il nome del database seguito da '.mdb'", "immetti un nome per il dbase",
"ArmidaSAF.mdb")
    If nomedbs = "" Then
        MsgBox vabuo
        Exit Function
    else
        If right$(nomedbs, 4) <> ".mdb"  Then nomedbs = nomedbs & ".mdb"
        myfile = Dir("k:\MSOFFICE\" & nomedbs)
        If myfile <> "" Then ' se lo trova
            response= MsgBox("file già presente. Se premi 'SI' il file
esistente verrà eliminato e sostituito da un nuovo database e non sarà
possibile annullare tale operazione", _
vbYesNo, "verifica esistenza file")
            If response = vbYes Then
                Kill "k:\MSOFFICE\" & nomedbs
            Else
                Goto ChiediNomeDB
            End If
        End If
    End if
' di qui in poi non ho controllato il codice
' adesso crea il nuovo dbase
Dim wrkPredefinita As Workspace
Set wrkPredefinita = DBEngine.Workspaces(0)
Dim dbsNuovo As Database
Set dbsNuovo = wrkPredefinita.CreateDatabase("d:\" & nomedbs, dbLangGeneral,
dbEncrypt)
nometbl = InputBox("digita il nome con il quale vuoi esportare la tabella
'tutto per cassa'")
If nometbl = "" Then
MsgBox "c'hai paura, eh coniglio!"
End If
DoCmd.TransferDatabase acExport, "Microsoft Access", "D:\" & nomedbs,
acTable, "tutto per cassa", nometbl
MsgBox "esportazione riuscita"
End Function
Vorrei farti notare come
- indentando, si aumenti la leggibilità del codice;
- l'uso della clausola Else ti permetta di risparmiare codice;
- inserendo un valore predefinito, si possa usare la stringa vuota ("") in
uscita dall' InputBox per riconoscere se è stato premuto il pulsante Annulla
della stessa.
Si poteva fare di meglio, togliendo anche quel Goto, ma adesso non ho tempo
e te lo lascio come ulteriore miglioria da inserire.
Ciao
--
Silvio
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access


Grazie Silvio
ovviamente funziona tutto alla perfezione
e raffrontando la tua soluzione con quella che avevo intravisto
mi sono reso conto di aver cercato strade tortuose in luogo di vie dirette.
vorrei però chiederti ancora un consiglio
nell'ultima parte del codice(quella che non hai contollato - e che funziona
cmq) vorrei apportare una modifica. la cosa è questa
quando appare la inputbox per l'inserimento del 'nometbl' se confermo senza
inserire testo o premo annulla va in debug.
c'è modo di imporre nella input box che al tasto annulla faccia eseguito un
evento, tipo exit function oppure goto "chiamanomedb".
ti ringrazio anticipatamente e ti rinnovo gli auguri di buon natale
ringrazio inoltre tutti coloro che mi hanno aiutato ed anche a loro va il
mio più sentito augurio di buone festività
antonio


 ha scritto nel messaggio
news:1Sa16.169313$hk4.6...@news.infostrada.it...

Mah, vedi... ti va in errore se premi Annulla perché, dopo aver controllato
che la nometbl è vuota, prosegui con il programma, invece di farla riempire.
Comunque, rimane valida l'ipotesi di utilizzare un valore predefinito
nell'InputBox:
    ...
InsNomeTabella:
    nometbl = InputBox("digita il nome con il quale vuoi esportare la
tabella 'tutto per cassa'",,"-")
    If nometbl="" Then Exit Function
    If nometbl = "-" Then
        MsgBox "c'hai paura, eh coniglio!"
        Goto InsNomeTabella
    End If
    ...
Anche in questo caso uso un Goto x farti meglio capire la logica, ma si
possono usare sistemi + eleganti, anche se, essendo io nato,
informaticamente parlando, con il Basic su Apple IIe, Pet 2001 e Vic20, il
Goto è un'antica abitudine.
Tanti Auguri nuovamente anche a te.
--
Silvio
