Visualizza la versione completa : Manipolare i Campi in Access
pippo2008
19-05-2008, 15:18
Ragazzi mi trovo a diventare pazzo su una cosa forse semplice, ma non so se con una query in access si possa fare. Allora ho due tabelle relazionate fra loro uno a molti ( anagrafica(uno) con esami (molti) ). Su queste due tabelle (anagrafica e esami) eseguo una query di selezione. Attraverso questa query di selezione costruisco delle etichette adesive. Il probleme è banale, quando devo creare un'etichetta ed il paziente preso dall'anagrafica ha fatto un solo esame, questo mi propone una sola etichetta e mi va bene, ma quando invece il paziente sempre preso dall'anagrafica ha associato in quella giornata non solo un esame ma molti altri, per ogni esame mi ripropone un'etichetta, mettendomi sempre la stessa anagrafica poichè il paziente è sempre quello, ma poi su ogni etichetta giustamente l'esame diverso. Io vorrei una sola etichetta con in un solo campo tutti gli esami, al massimo separati da una virgola. Mi chiedevo se attraverso uan quesry,
potevo pescare una sola volta i dati del paziente dall'anagrafica e tutti gli esami fatti (ovviamente in cui l'ID esame è sempre quello della stessa giornata) caricarli in un unico campo, campo che poi pesco per l'etichetta.
Come diavolo devo fare, sto impazzendo.
Puoi schematizzare sul thread la struttura della tabella?
Penso di aver capito il problema e di avere una risoluzione, ma sarebbe molto più chiaro con i campi della tabella in evidenza verificare se la soluzione possa essere accettabile.
pippo2008
20-05-2008, 10:52
Grazie Sandro per avermi risposto, dimmi come posso farti avere una copia del db, purtroppo non sono molto bravo e non ti seguo molto sul ragionamento chemi hai fatto. Fin quando mi capita un solo paziente con un solo esame, mi va bene una sola etichetta. Però quando lo stesso paziente ha fatto duo o più esami, questo mi stampa per ogni esame una etichetta con riportato di nuovo l'anagrafica. Io vorrei una sola etichetta e nel campo TipoEsame tutti gli esami fatti in quel momento da quel paziente. Se mi mandi una e-mail ti allego il file. Anzi lo allego ora al forum. Graznie ancora.
Niente no nposso allegare .zip al forum
Ti esce per caso
PIPPO - ESAME SANGUE
PIPPO - ESAME URINE
PIPPO - ESAME FECI
invece tu vorresti far uscire
PIPPO - ESAME SANGUE, ESAME URINE, ESAME FECI
qualcosa di simile?
P.S.: Scusa gli esempi non sono appropriati..nel caso spiegami cosa vorresti che uscisse che ci tentiamo ;)
pippo2008
20-05-2008, 13:11
ESATOOOOOO come si fa ? ?
Cavolo forse è la volta buona, come si fa ? ? ?
Ho fatto questo esempio:
Tabella PAZIENTI:
ID, NOME e COGOME
Tabella ESAMI:
ID,DESCRIZIONE,ID_PAZ
In un modulo devi creare la funzione Concatenate:
Option Compare Database
Function Concatenate(pstrSQL As String, Optional pstrDelim As String = ", ") As String
Dim rs As New ADODB.Recordset
rs.Open pstrSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Dim strConcat As String
With rs
If Not .EOF Then
.MoveFirst
Do While Not .EOF
strConcat = strConcat & .Fields(0) & pstrDelim
.MoveNext
Loop
End If
.Close
End With
Set rs = Nothing
If Len(strConcat) > 0 Then
strConcat = Left(strConcat, Len(strConcat) - Len(pstrDelim))
End If
Concatenate = strConcat
End Function
Adesso puoi scrivere una query di questo tipo:
SELECT p.id, p.nome, p.cognome, Concatenate("SELECT e.descrizione from esami e where e.id_paz=" & p.id) As Descrizione from pazienti p
;)
pippo2008
21-05-2008, 10:58
Cosa intendi per modulo, intendi VBA ?
Mi potresi dare maggiori dettagli, non sono un buon programmatore in VBA.
poi la funzione concatenate la richiamo prima della query giusto ?
Aggiungi un nuovo modulo (Lo trovi tra gli oggetti; dove ci sono Tabelle, Query, ecc..)
e lì dentro ci incolli il codice della funzione Concatenate.
Quindi scrivi la query usando quella funzione (seguendo l'esempio che ti ho inviato prima).
Ciao
pippo2008
21-05-2008, 12:45
Grazie ancora, ho preparato il modulo come mi hai detto, ora c'è un problemino, che la query che ho si presenta così.
SELECT DettaglioEsame.IDEsame, Esame.DataEsame, TipoEsame.TipoEsame
FROM (CategoriaEsame INNER JOIN TipoEsame ON CategoriaEsame.IDCatagoriaEsame = TipoEsame.IDCategoriaEsame) INNER JOIN (Paziente INNER JOIN (Esame INNER JOIN DettaglioEsame ON Esame.IDEsame = DettaglioEsame.IDEsame) ON Paziente.IDPaziente = Esame.IDPaziente) ON TipoEsame.IDTipoEsame = DettaglioEsame.IDTipoEsame
WHERE (((DettaglioEsame.IDEsame)=[Forms]![Esame]![IDEsame]));
penso che la funzione "Concatenate" vada messa dove c'è il FROM, giusto ?
Questa è la query che mi costruisce l'etichetta dove ci saranno solo gli esami, mentre una seconda etichetta, che ho fatto con una query semplice, conterrà solo l'anagrafica del paziente.
Potresti uppare il tuo database su un server e poi darci il link per scaricarlo?
Così gli diamo un'okkiata.
;)
pippo2008
22-05-2008, 09:07
Ti posso mandare un .zip per e-mail ma non so dove spedirti il tutto.
Un esempio preso dal tuo database:
SELECT p.cognomePaziente,p.NomePaziente, Concatenate("SELECT de.provepaziente from Esame e, DettaglioEsame de where de.idesame=e.idesame and e.idPaziente=" & p.idPaziente) As Descrizione from paziente p
La puoi anche modificare come query parametrica se ti serve.
...cmq io porterei tutto su un dabase un po più serio di Access (dotato di Stored Procedure) e mi farei lì le mie Procedure/Viste necessarie.
;)
vBulletin® v3.7.3, Copyright ©: 2000-2012, Jelsoft Enterprises Ltd.
Traduzione italiana Team: vBulletin-italia.it |