Newsgroup: it.comp.appl.access
Titolo: Qry accod a 2 tabelle (1 aggiunge solo un nuovo record ogni volta che viene attivata)

Buongiorno,
ho queste tre tabelle
TBL_MP (materie prime)
mp_id     chiave primaria (campo contatore)
mp_desc
mp_costo
vlist_id    chiave esterna della tabella versione listino
TBL_CSTMP (costi materie prime)
cstmp_id   chiave primaria (contatore)
mp_id        chiave esterna della tabella Materie prime
cstmp_costo
vlist_id       chiave esterna della tabella versione listino
TBL_ Vlistino (versione listino
vlist_id        chiave primaria (campo contatore)
vlist_data    Data listino
Collegamento TBL_MP.mp_id  1  a molti TBL_CSTMP_mp.id
Un listino con tre tabelle, perchè volevo trovare un modo che ogni
giorno, mi trovo l'ultimo listino con i valori inseriti. Se anche solo
un valore cambio, io prendo tutto il listino e lo creo nuovo con le
modifiche (Il listino può subire variazioni giornaliere).
Quindi i valori vanno inseriti nella tabella materie prime, e con una
query di accodamento, salvo i record all'interno della tabella CSTMP
costi.
Domande:
1) esiste un modo, per caricare e visualizzare tutti i valori di una
tabella ? Ossia, c'è un comando che mi permetta dalla tabella cstmp
già di trovare l'elenco di tutti i campi che esistono nella tabella
mp_id ? (xchè al momento devo io compilare i nuovi record della
tabella costi inserendo tutte le materie prime che esistono nella
tabella materie prime )
2) Con la query di accodamento, questa prende tutti i valori che
esistono nella tabella mp, e crea tanti record nella tabella cstmp.
Come devo fare per far si che ogni volta che viene eseguita la query di
accodamento, questa mi crei un 1 unico record nella tabella vlistino ?
Grazie infinite,
Samantha

 >

30/12/06
A questo punto crea una maschera in modalità "maschera continua" che
ha come origine record la seguente query:
SELECT * FROM TBL_CSTMP WHERE cstmp_data=
format$(forms!Distinta!cboData,"mm-dd-yyyy") OR forms!Distinta!cboData
IS NULL
Quindi inserisci nella maschera distinta un controllo Sottomaschera,
che chiamerai per esempio smCosti, che abbia come origine controllo la
maschera di cui sopra.
A questo punto nella routine associata all'evento DopoAggiornamento
della casella combinata cboData, scrivi la seguente istruzione:
me.smCosti.Requery
Così facendo, ogni volta che selezioni una data con la casella
combinata l'elenco dei costi presenti nella sottomaschera viene
aggiornato in funzione del valore scelto.



Ciao VT, come hai potuto notare nell'altro post mi spiego meglio x
esempi:
Nella tabella materie prime ho 3 record
mp_id   mp_desc
1          RAME
2          ACCIAIO
3          FERRO
Ora, voglio fare un listino. Creo una tabella costi. Faccio una
maschera, dove l'utente trova una casella combinata dalla quale
scegliere la materia prima.  Quindi, per ogni materia prima, lui dovrà
creare un nuovo record nella tabella costi.  Operazioni manuali. Se ha
50 materie prime, ad ogni nuovo listino dovrà cliccare 50 volte in
sequenza le materie prime.
cstmp_id     mp_id    mp_desc   cstmp_data
1                1           RAME        28/12/06
2                2           ACCIAIO     28/12/06
3                3           FERRO      28/12/06
Per ovviare a questo fatto, perchè l'utente potrebbe anche scordare
una materia prima, ho pensato che inserendo il campo costo nella
tabella materie prime, lì posso direttamente inserire i costi,
presentando quindi il contenuto intero della tabella materie prime. Con
una query di accodamento poi (quindi con quella tua sopra), prendo
l'intera tabella mp con costi e li accodo nella tabella costi.
 INSERT INTO TBL_CSTMP ( matpri_id, cstmp_costo )
 SELECT TBL_MATPRI.matpri_id, TBL_MATPRI.matpri_costo
 FROM TBL_MATPRI WHERE TBL_MATPRI.matpri_id NOT IN(SELECT matpri_id
 FROM TBL_CSTMP WHERE cstmp_data=Date() );
Io all'utente presento due maschere, che però entrambe appoggiano
sulla TBL_MATPRI
Una maschera si chiama materie prime, dove l'utente vede i campi:
matpri_id
matpri_desc
e l'altra maschera si chiama listino, dove l'utente vede i campi:
matpri_id
matpri_desc
matpri_costi
Quando apre la form listino, lui la troverà con i dati di ieri. Se
c'è da modificare il valore di un singolo record, lo modifica, e poi
tramite pulsante "SalvaListino", mi aziona la query di accodamento che
salva tutti i dati nella tabella costi.
Con la tua query, l'utente può premere 100 volte il comando
"SalvaListino", ma solo la prima volta di ogni giorno lui accoderà
l'intero listino con la data di oggi.
Ora, rimane il problema di automatizzare le attività: accoda se la
data di oggi non esiste, oppure aggiorna se la data di oggi esiste.
Guardando i vecchi post, ne ho trovato uno che tramite macro permette
di azionare in sequenza due diverse query, (in quel caso la prima era
di accodamento e la seconda di eliminazione).
Il codice è il seguente:
dim tuaquery as string
tuaquery = "nometuaquerydiaccodamento"
DoCmd.OpenQuery tuaquery, acViewNormal, acEdit
tuaquery = "nometuaquerydiaggiornamento"
DoCmd.OpenQuery tuaquery, acViewNormal, acEdit
Questo codice (è la prima volta che lo faccio) lo devo salvare in
visual basic editor, quando vado sulle proprietà del comando
"SalvaListino" nella scheda evento -> su clic -> [routineEvento] ...
clicco sui tre puntini e trovo questo codice:
Private Sub acc_listino_Click()
On Error GoTo Err_acc_listino_Click
    Dim stDocName As String
    stDocName = "ACC_LISTINO"
    DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_acc_listino_Click:
    Exit Sub
Err_acc_listino_Click:
    MsgBox Err.Description
    Resume Exit_acc_listino_Click
End Sub
Io dovrei teoricamente sostituire da Dim a Do.Cmd.OpenQuery con il
codice sopra che ho incollato? Poi provo e provo anche sotto la dritta
che mi hai dato, per la scelta della data dei costi, lasciando perdere
quindi la tabella vlistino.
Mi resta ancora un dubbio, stupido ma che è il fulcro
dell'applicazione: come unire i costi delle materie prime ai componenti
delle materie prime... poi proverò anche questo!
Grazie infinite, mi spiace ripetermi ma grazie,
Samantha


Samantha ha scritto:

VT, mi sono accorta che stavo facendo un errore, perchè la query di
aggiornamento opera nella tabella dove sono i dati, e non accodandoli,
non parte da una tabelle sorgente a tabella destinazione, ma da campo a
campo della stessa tabella.
Perciò, è molto piu' semplice fare la query di accodamento (quella
tua) x i nuovi listini, e fare una seconda maschera listino, che si
basa sulla tabella costi. la prima la farò attivare come NuovoListino,
la seconda come AggiornaListino.
Buon lavoro
Samantha
