PDA

View Full Version : ACCESS esperti cercasi!! HELP


zuper
14-10-2003, 12:25
ciao ragà...

so che se non trovo una risposta qui sono un po nei cazzi ;)

ho un problema enorme in access...

ho svariate decine di database di access i quali al loro interno hanno link a decine di fogli excel...

chiaramente questi fogli sono linkati con percorso tipo g:

al lavoro dobbiamo cambiare la mappatura dei dischi, per cui per esempio dobbiamo passare da g: a y:

come cavolo faccio a modificare in maniera rapida la mappatura delle tabelle linkate??

se devo farlo a mano ci metto circa 2 settimane :cry: :cry:

se uso il linked table manager mi chiede PER OGNI SINGOLO FILE di ricercare a mano il nuovo puntamento....

a me basterebbe modificare la letteraaaaaaaaaaaaaaaa

please help me

ilsensine
14-10-2003, 12:28
Se la lettera "g:" è disponibile (ad es. non è stata assegnata a un nuovo disco), puoi metterci una pezza con il comando subst, intanto che cambi con calma i tutti i riferimenti.

zuper
14-10-2003, 12:30
Originariamente inviato da ilsensine
Se la lettera "g:" è disponibile (ad es. non è stata assegnata a un nuovo disco), puoi metterci una pezza con il comando subst, intanto che cambi con calma i tutti i riferimenti.

grazie...ma il prob non è metterci una pezza...comunque possiamo tenere su le mappature ancora per un po...

ma volevo evitare di cambiare tutto a mano ;)

mercurio76
14-10-2003, 16:19
Beh..non si riesce a fare una query di UPDATE che ti sostituisca la g con la y? Secondo me se po fa...

cionci
14-10-2003, 16:56
Direi che quello suggerito è il modo migliore per farlo...

zuper
15-10-2003, 07:45
beh se mi aiutate pure a farla vi sono QUASI debitore ;)

cionci
15-10-2003, 07:59
UPDATE Tabella SET Campo = "y" & Right([Campo],Len([Campo])-1);

zuper
15-10-2003, 08:05
Originariamente inviato da cionci
UPDATE Tabella SET Campo = "y" & Right([Campo],Len([Campo])-1);

calma calma....non ci capisco molto ;)

che devo fare?????

anjoletto82
15-10-2003, 08:20
Ma devi cambiare l'origine della tabella collegata o devi cambiare dei dati all'interno delle tabelle collegate??

cionci
15-10-2003, 08:21
Originariamente inviato da zuper
che devo fare?????
Se devi cambiare il percorso all'interno di un campi di testo devi fare una query come questa...

zuper
15-10-2003, 08:28
Originariamente inviato da cionci
UPDATE Tabella SET Campo = "y" & Right([Campo],Len([Campo])-1);

calma calma....non ci capisco molto ;)

che devo fare?????

zuper
15-10-2003, 08:35
Originariamente inviato da anjoletto82
Ma devi cambiare l'origine della tabella collegata o devi cambiare dei dati all'interno delle tabelle collegate??

devo cambiare l'origine...

abbiamo replicato tutti i dati su un nuovo server...

l'alberatura delle directory è uguale, cambia solo la lettera con cui si mappa il disco.....

cionci
15-10-2003, 09:50
Te l'ho detto...devi usare la query che ti ho dato... Crei una nuova query in visualizzazione struttura...
Chiudi -> Visualizza -> Visualizzazione SQL -> incolal la query che ti ho dato io mettendo:

Al posto di Tabella il nome della Tabella con i dati da cambiare...e al posto dei vari "Campo" il nome del campo della tabella da cambiare...

File -> Salva -> metti il nome della Query -> doppio click sulla query...

Fai prima un b ackup della tabella: click con il sx sulla tabella -> copia -> click con il sinistro sullo sfondo della lista delle tabelle -> incolla -> metti un nome per la tabella di backup -> seleziona Struttura e dati -> ok

zuper
15-10-2003, 09:55
ma il fatto è che i dati che sevo cambiare non sono in una tabella...

sono proprio i link della tabella stessa...

se vedi in tools linked table manager ti fa vedere i link a fogli esterni, ma non sono in nessuna tabella....SONO le tabelle stesse....

mi sono spiegato?

anjoletto82
15-10-2003, 13:43
Vai nel tuo database dove ci sono le tabelle collegate. Vai su Strumenti -> Utilità database -> Gestione tabelle collegate. Si apre una finestra con tutte le tabelle collegate e il loror rispettivo path. Selezioni tutto o (a gruppi) tutte le tabelle appartenenti allo stesso file. Metti a Vero la chek sotto "Richiedi sempre nuovo percorso" e dai OK. Lui ti chiederà il path del nuovo file per ripristinare le tabelle.

Avvertici se è andato tutto a buon fine!!

zuper
15-10-2003, 13:54
lo so, ma così devo selezionare il percorso a mano di tutte le tabelle linkate.....e in totale saranno 500...

è questo che non volevo fare ;)

cisky
15-10-2003, 19:32
Ho scritto una routine che dovrebbe fare al caso tuo.
Questo codice và inserito in un modulo di Access e devi utilizzare i riferimenti per la libreria DAO (Microsoft DA0 3.x Object Lybrary).

L'ho scritto abbastanza in fretta e diciamo che in linea di massima scorre tutte le tabelle, se una tabella è linkata cerca di risalire tramite la sua connessione al percorso fisico.Se il drive del percorso è diverso da quello che hai impostato nella costante NEW_DRIVE_LETTER (Non avevo voglia di fare un'interfaccia grafica ...) viene modificato il percorso e aggiornato il link alla tabella.

E' tutto molto grezzo, ma se lo modifichi per le tue esigenze non dovresti avere problemi.


Option Compare Database
Option Explicit

Public Sub s_ChangeDriveForLinkedTable()

Const NEW_DRIVE_LETTER As String = "D" ' *** Nuova lettera del Drive da impostare!

Dim oTbl As TableDef
Dim eMsgResult As VbMsgBoxResult
Dim sName As String
Dim sConnect As String
Dim sMsg As String
Dim lTotModify As Long
Dim bDone As Boolean
Dim bError As Boolean

On Error GoTo lError

For Each oTbl In CurrentDb.TableDefs ' *** Scorro tutte le tabelle

If oTbl.Attributes And dbAttachedTable Then ' *** Verifico se è una tabella collegata

sConnect = oTbl.Connect ' *** Recupero stringa di connessione

' *** Cerco di modificare la stringa di connessione sostituendo la lettera del drive con quella specificata
' nella costante NEW_DRIVE_LETTER (Se l'operazione ha esito positivo, viene impostato il flag bDone) e la
' funzione restituisce la stringa di connessione modificata
'
sConnect = f_TableLinkChange(sConnect, NEW_DRIVE_LETTER, bDone)

If bDone Then

' *** Chiedo conferma all'utente prima di procedere con la sostituzione della connessione
'
sMsg = "Vuoi modificare la connessione della tabella collegata '" & oTbl.Name & "'" & vbCrLf & vbCrLf & _
"[Vecchia Connessione = " & oTbl.Connect & "]" & vbCrLf & _
"[Nuova Connessione = " & sConnect & "]"

eMsgResult = MsgBox(sMsg, vbYesNoCancel Or vbInformation)

Select Case True

Case eMsgResult = vbYes
oTbl.Connect = sConnect ' *** Imposto nuova connessione

bError = False
oTbl.RefreshLink ' *** Aggiorno la connessione della tabella

If Not bError Then lTotModify = lTotModify + 1

Case eMsgResult = vbCancel
Exit For

Case Else ' vbNo
' ***
End Select

End If

End If

If oTbl.Attributes And dbAttachedODBC Then
' *** tabella linkata via ODBC... (Da gestire se è il caso ...)
End If

Next oTbl

If lTotModify > 0 Then
MsgBox "Operazione Completata! (Modificate " & lTotModify & " tabelle)", vbInformation
Else
MsgBox "Operazione Completata! (Nessuna tabella modificata)", vbInformation
End If

Exit Sub

lError:
bError = True
MsgBox Err & " - " & Err.Description, vbExclamation
Resume Next

End Sub

Private Function f_TableLinkChange(ByVal sConnect As String, ByVal sNewDriveLetter As String, ByRef bDone As Boolean) As String

Const DBPATH_FIND_STRING = "DATABASE=" ' *** Prefisso che indica il percorso linkato nella connessione della tabella

Dim iPos1 As Integer
Dim iPos2 As Integer
Dim sPath As String
Dim iLenFindString As Integer
Dim sRet As String

bDone = False
iPos1 = InStr(1, sConnect, DBPATH_FIND_STRING, vbTextCompare)

If iPos1 > 0 Then
iLenFindString = Len(DBPATH_FIND_STRING)

iPos2 = InStr(iPos1, sConnect, ";", vbTextCompare) ' *** Potrebbero esserci altri parametri dopo il parametro DATABASE

' *** Recupero il percorso (Linkato)
'
If iPos2 > 0 Then
sPath = Mid(sConnect, iPos1 + iLenFindString, (iPos2 - (iPos1 + iLenFindString)))
Else
sPath = Mid(sConnect, iPos1 + iLenFindString)
End If

If Len(sPath) > 0 Then

' *** Modifico il percorso sostituendo la lettera del Drive
'
'
bDone = f_ChangeDriveLetter(sNewDriveLetter, sPath)

If bDone Then

' *** Ricompongo la stringa di connessione
'
sRet = Mid(sConnect, 1, iPos1 - 1) & DBPATH_FIND_STRING & sPath
If iPos2 > 0 Then
sRet = sRet & Mid(sConnect, iPos2)
End If
End If

End If

End If

f_TableLinkChange = sRet

End Function

Private Function f_ChangeDriveLetter(ByVal sNewDriveLetter As String, ByRef sPath As String) As Boolean

Dim sOldDriveLetter As String
Dim iPos As Integer
Dim bRet As Boolean

sPath = Trim(sPath)

' *** Se la prima lettera del percorso è un "\" significa che è un percorso di rete!
'
If Left(sPath, 1) <> "\" Then
iPos = InStr(1, sPath, ":", vbTextCompare)
If iPos > 0 Then
sOldDriveLetter = Left(sPath, 1)

If sOldDriveLetter <> sNewDriveLetter Then
sPath = sNewDriveLetter & Mid(sPath, iPos)
bRet = True
End If
End If
End If

f_ChangeDriveLetter = bRet

End Function



Ciao!

zuper
15-10-2003, 20:22
beh comunque grazie per lo sbatti ;);)
domani al lavoro provo e ti faccio sapere ù;)

zuper
16-10-2003, 09:52
scusa la mia ignoranza...

io ho creato un modulo nuovo in access e ci ho copiato la pappardella :) che hai scritto....

ho modificato i parametri...

ma come faccio a farlo andare??

non c'è un run o qualcosa del genere???

zuper
16-10-2003, 09:55
ho capito....l'ho lanciato direttamente da vb;)

FUNZIONA....sei un grande ;);)

cisky
16-10-2003, 12:28
;)

riaw
26-11-2003, 09:13
Originariamente inviato da zuper
per cui per esempio dobbiamo passare da g:ay:




:eek: :eek: :eek:

zuper
26-11-2003, 09:37
Originariamente inviato da riaw
:eek: :eek: :eek:

se c'era la faccina che si faceva le canne te la mettevo subito

:D:D:D

cionci
26-11-2003, 09:41
C'è sempre questa !!!

:hic:

zuper
26-11-2003, 09:45
Originariamente inviato da cionci
C'è sempre questa !!!

:hic:


mmmm...non va bene...

riaw è proprio fuori :D:D

tipo questo

http://digilander.libero.it/jurada2003/422.gif