Newsgroup: it.comp.lang.delphi
Titolo: Query difficili

Ho un problema di non facile soluzione. Una ASL memorizza in una
tabella i pazienti dando come identificativo unico il numero di
cartella clinica, per cui in questa tabella sono presenti stessi
pazienti che hanno eseguito più ricoveri. Dovrei spezzare questa
tabella in due tabelle relazionate in cui nella prima compaiano
univocamente i pazienti e nella seconda i ricoveri (num. di cartella).
Purtroppo non è tutto, queste due tabelle dovrebbero aggiornarsi
automaticamente ogni tot. minuti. Qualsiasi suggerimento o esempio è
ben gradito.
Marco

 univocamente i pazienti e nella seconda i ricoveri (num. di cartella).
Scusa ma non ho capito qual'e' il problema. Se ho capito bene
il tuo sarerbbe un tipico caso di tabelle con rapporto "uno a enne". 
Quindi, in finale, dovrai crearti due tabelle:
  Tabella PAZIENTI
  ID_CARTELLA (o ID_PAZIENTE)  
  CAMPOPAZIENTI1
  CAMPOPAZIENTI2
  CAMPOPAZIENTI3
  [...]
  Tabella RICOVERI
  ID_CARTELLA (o ID_PAZIENTE)
  CAMPORICOVERI1
  CAMPORICOVERI2
  CAMPORICOVERI3
  [...]
La relazione (uno a "enne" tra le tabelle sarebbero ovviamente sul 
campo ID_CARTELLA. Giusto? E allora qual'e' il problema? Le query
che devi fare per estrarre i dati necessari a creare le due tabelle
partendo da una originaria? E perche' le tabelle devono aggiornarsi 
reciprocamente a intervalli di tempo regolari? 
----------------------
Leonardo Lomartire
l.lom...@rasnatech.com

 > pazienti che hanno eseguito piů ricoveri. Dovrei spezzare questa


Ti spiego piů in dettaglio e schematicamente il problema.
Ho una vista su un db Oracle che corrisponde alla registrazione in
ingresso dei pazienti
PAZIENTE      NUM CARTELLA
Tizio                01
Caio                02
Tizio                03
...                     ...
In questa tabella la chiave primaria č il num di cartella per cui posso
avere "Tizio" che esegue piů ricoveri.
Dovrei arrivare ad una situazione in cui ho due tabelle relazionate del
tipo 1 a N
IDPAZIENTE     PAZIENTE
1                          Tizio
2                          Caio
IDPAZIENTE    NUM CARTELLA
1                        01
1                        03
2                        02
Come faccio a realizzare queste due tabelle partendo dalla vista Oracle
e fare in modo che quando la vista si aggiorni si aggiornino anche le
mie tabelle?
Non la vedo tanto facile :( Ciao
Marco


 ha scritto nel messaggio
news:8fb7h8$gee$1...@nmaster.tin.it...


Non ho purtroppo accesso alla base dati di Oracle di proprietą
dell'Olivetti la quale nega
qualsiasi accesso se non tramite una vista predifinita e uguale per
tutti, quindi niente view,
trigger ecc. Io uso Interbase 5.6+D5 ma ho trovato comodo alle volte
usare Access+odbc per
questo tipo di problemi in quanto posso eseguire una veloce
manutenzione sul posto in caso di
modifiche alla base dati. Questo č tutto.
Marco


 Ti spiego piů in dettaglio e schematicamente il problema.
Ok, il problema adesso e' un po' piu' chiaro. Se ho capito bene la vista
Oracle che dicevi e' l'UNICA possibilita' di accesso che ti danno.
Quindi
di andare a leggere le tabelle non se ne parla e non se ne parla di
creare viste snapshots o stored procedure sul server Oracle. Giusto?
Quindi l'unica strada che hai e' fare delle query su questa vista e
eventualmente scriverti il risultato in locale (o comunque su un server 
dove puoi accedere liberamente).
Le query sono la parte piu' facile. 
Credo ti servano delle query tipo:
1) Per la tabella PAZIENTI
   SELECT NUM_CARTELLA FROM VISTA_UNICA 
   GROUP BY NUM_CARTELLA ORDER BY NUM_CARTELLA
   (Naturalmente oltre la colonna NUM_CARTELLA ti tiri giu' tutte 
   quelle che ti servono per la tabella PAZIENTI)
   Questa query ti restituira' un dataset con un record per ogni
   NUM_CARTELLA, quindi per ogni cartella clinica (se ho capito bene
   una cartella corrisponde a un paziente, quindi NUM_CARTELLA sarebbe
   l'identificativo univoco sia della cartella che del paziente)
2) Per la tabella RICOVERI puoi fare una semplice 
   SELECT ID_PAZIENTE, NUM_CARTELLA, etc
   FROM VISTA_UNICA
A questo punto hai 2 dataset con i dati che ti servono.
Se poi hai bisogno di scrivere in locale questi dati puoi utilizzare
una TBatchMove o cose del genere.
Poi c'e' il problema dell'aggiornamento, e qui, se ho capito bene, 
iniziano i dolori.
Se non hai accessi al database Oracle che non sia quella famosa
VISTA_UNICA di cui dicevi la vedo male. Non credo ci siano molte altre 
strade se non fare una routine che a intervalli regolari (ma io metterei
un bottone AGGIORNA DATI sulla tua applicazione client) RI-Esegue le due
query di cui sopra e RI-scrive le tabelle locali. 
A occhio e croce dire che il tutto e' piuttosto pesante e delicato da 
gestire, soprattutto se hai bisogno di scriverti in locale questi dati.
Ma hai bisogno di portarti in locale i dati, non puoi limitarti ad
eseguire
ogni volta le query magari aggiungendo delle condizioni di WHERE?
Leonardo Lomartire
l.lom...@rasnatech.com