View Full Version : Microsoft Access
Ciao a tutti.
Chiedo una info a chi mi può aiutare. Sto creando un semplice data base con access dove mi effettua un conteggio di valori su una macchina che conta dei pezzi tramite il PLC. Cerco di essere più caro!!!!!
Ho creato una interfaccia Access che mi fa visualizzare il conteggio minuto per minuto dei pezzi che entrano in una macchina che sceglie le Piastrelle tramite una fotocellula collegata ad un PLC. Pertanto io prendo i valori dal PLC tramite un programma e li vado a lavorare con Ms Access come file allegato . Quello che devo fare ora creare un'altra finestra accanto a quella del valore che mi visualizza la differenza tra il record2 e il record 1 , cioè ho bisogno che lui in automatico per ogni conteggio che fa mi calcola il record 2 meno il record 1 in modo da sapere un totale dei pezzi lavorati.
Mi auguro di non essere stato troppo contorto
Grazie a chi mi risponde.
Cioè, in pratica vorresti un "trigger" in Access...
Ad ogni nuovo inserimento Access dovrebbe mettere nella stessa tabella o in una nuova la differenza di "VALORE", ossia ultimo_inserimento - penultimo_inserimento... Right ?
Ciao
Intanto grazie per la risposta. Io non uso molto access ma un trigger si intendono delle relazioni?
In pratica a me interessa che ad ogni valore che aumenta come illustarto in foto di conseguenza accanto fa il calcolo del valore successivo meno quello precedente. per intenderci se il record2 dovrà essere dato da record 3 meno il record 2 ecc.....
Spero di essermi spiegato!!!!
In pratica a me interessa che ad ogni valore che aumenta come illustarto in foto di conseguenza accanto fa il calcolo del valore successivo meno quello precedente. per intenderci se il record2 dovrà essere dato da record 3 meno il record 2 ecc.....
Spero di essermi spiegato!!!!
Si, beh diciamo che "interpretando" quello che hai scritto, sei l'ennesimo utente che sbatte la capoccia :muro: sul problema-trigger di Access...
Cmq, un trigger è un'operazione che scatta in un RDBMS al verificarsi di un certo evento, come ad esempio l'insert di un nuovo record.
Access non supporta i trigger, purtroppo, perciò bisognerebbe capire anzitutto che tipo di accesso hai al programma che scrive sul DB ( puoi leggerne / modificarne il codice ? ). Se, come penso, non puoi mettere mano al codice del programma, e puoi solo modificare il DB stesso, hai 2 strade :
1. Access può supportare i triggers, che io sappia, una volta convertito in applicazione ADP ( credo serva SQL Server per farlo... ) :
http://office.microsoft.com/it-it/access/HP030854151040.aspx
Non ho mai provato a creare un "ADP" da un .mdb e lavorarci sopra, perciò non garantisco...
2. Cercare di aggirare il problema con le semplici funzioni di Access, visto che il codice VBA ( come una Public Function, ad esempio, che risolverebbe subito... ) non è accessibile dai campi calcolati... Ma la vedo davvero dura !
A proposito di questo punto, sono molto curioso di vedere se qualcuno qui del Forum ce la fa ! :)
è una sfida? :)
...dai non dirmi così altrimenti non faccio più le cose per cui sono pagato e mi butto solo su questo :D
La prima soluzione che mi viene in mente è questa:
Assumendo che ci sia una tabella da cui il programma legge i dati, ci aggiungiamo un campo che conterrà la differenza di ogni record rispetto al record precedente.
A quel punto sull'apertura della maschera ci mettiamo un algoritmo di questo tipo:
1) per ogni record nella maschera fai quanto segue:
Inizializzo una variabile booleana di appoggio, tipo "controlla= true"
1.1) Se controlla=true allora sono sul record di cui devo memorizzare il valore del campo "valore" ad esempio in una variabile intera "campo_valore"
1.1.1) Metto controlla=false
1.2) se Controlla=false, allora siamo sul secondo record da in cui dobbiamo mettere la differenza, quindi: Me.Valore = Me.valore - campo_valore
1.2.1) Controlla = true
1.3) spostati sul record successivo
questa è la prima soluzione in a grandi linee che mi è venuta in mente, l'ho scritto di getto quindi potrei aver sbagliato qualcosa...intanto è uno spunto :)
EDIT: se fate avere il database penso di riuscire a mettere sta cosa...
... La prima soluzione che mi viene in mente è questa:
Assumendo che ci sia una tabella da cui il programma legge i dati, ci aggiungiamo un campo che conterrà la differenza di ogni record rispetto al record precedente.
A quel punto sull'apertura della maschera ci mettiamo un algoritmo di questo tipo:
...
...
No, temo tu non abbia capito.
Il nostro amico ha già un programma esterno al DB ( il cui linguaggio non è al momento noto, potrebbe essere VB6, .NET, C++ o chissà quale... ).
Il programma scrive nella tabella dei dati che arrivano via PLC.
Perciò ( da come l'ho inteso io ) visto che lui non può / non vuole modificare il sorgente del programma, vorrebbe che Access facesse tutto ogni volta che il programma esterno ( e quindi niente Forms o maschere di Access ) esegue una INSERT.
Tu parli di maschera, ma non la puoi usare, e non puoi far riferimento a codice VBA o a Stored Query direttamente da un campo calcolato...
Insomma quello che vuole è un classico trigger...
Salve Ragazzi
Intanto vi ringrazio della vostra collaborazione. Vi cercherò di spiegarvi meglio il tutto:
Io ho un file tipo quello che vi allego per ogni macchina, che mi viene generato dal software che interagisce con il PLC. A questo punto io non ho fatto altro che collegare questo file in access creando delle tabelle. Questi file essendo collegati in access non posso manipolarli e pertanto sto cercando di fare quello che posso. Ora mi sono fatto la mia maschera e fin qui tutto bene. Il problema che devo aggiuingere due cose importanti che sono:
[B]Ricerca per data e ora ( devo effettuare una ricerca tipo dal giorno x al giorno y dalle ore x alle ore y)
[B]Conteggio del record successivo con quello precedente (record 2 - record 1), questo mi serve per avere un riscontro più immediato di quanti pezzi lavora la macchina al minuto senza far perdere tempo all'operatore di fare i calcoli.
Di nuovo grazie mille a tutti !!!!!!!!!!!!!!!!!!!!!!!!!
Io ho un file tipo quello che vi allego per ogni macchina, che mi viene generato dal software che interagisce con il PLC. A questo punto io non ho fatto altro che collegare questo file in access creando delle tabelle. Questi file essendo collegati in access non posso manipolarli e pertanto sto cercando di fare quello che posso. Ora mi sono fatto la mia maschera e fin qui tutto bene. Il problema che devo aggiuingere due cose importanti che sono:
[B]Ricerca per data e ora ( devo effettuare una ricerca tipo dal giorno x al giorno y dalle ore x alle ore y)
[B]Conteggio del record successivo con quello precedente (record 2 - record 1), questo mi serve per avere un riscontro più immediato di quanti pezzi lavora la macchina al minuto senza far perdere tempo all'operatore di fare i calcoli.
Ah, ecco. Quindi la catena è :
PLC > Programmino > File txt > Access.
Quindi nessuno ti vieta di aprire Access "a bocce ferme" ed eseguire Query e Macro come ti pare ?
Non s'era capito, per questo pensavo che il programma scrivesse direttamente sul DB e mi ero posto il problema del trigger... Vabbè... Certo ragazzi, a volte vi esprimete proprio da cani ! :mad: :D
:doh: :doh: :doh: :doh:
Si confermo sono stato un pò contorto all'inizio.
Comunque pensi di potermi aiutare?
Ciao Grazie
:doh: :doh: :doh: :doh:
Si confermo sono stato un pò contorto all'inizio.
Comunque pensi di potermi aiutare?
Ciao Grazie
Direi proprio di sì.
Intanto ho risolto il tuo primo ed unico quesito ( che ora è diventato il secondo... ), ossia il calcolo delle differenze :
1. Nella tabella Access, che io chiamo "T_PLC", dopo "data", "ora", "valore" aggiungi un campo numerico > "differenza".
2. Crea una Stored Query "Query_SEL" :
SELECT T_PLC.data, T_PLC.ora, T_PLC.valore
FROM T_PLC;
3. Crea un'altra Stored "Query_UPD" :
UPDATE T_PLC SET T_PLC.differenza = [=differenza]
WHERE (((T_PLC.data)=[=data]) AND ((T_PLC.ora)=[=ora]));
4. Su una maschera, crea un pulsante "Calcola Differenze" e associa questo codice al Click :
Dim QDSel As QueryDef
Set QDSel = CurrentDb.QueryDefs("Query_SEL")
Dim QDUpd As QueryDef
Set QDUpd = CurrentDb.QueryDefs("Query_UPD")
Dim RS As Recordset
Set RS = QDSel.OpenRecordset
Dim valPre As Long
valPre = 0
Dim val As Long
val = 0
RS.MoveFirst
While Not RS.EOF
valPre = RS("valore").Value
RS.MoveNext
On Error GoTo EX
val = RS("valore").Value
QDUpd.Parameters("=data") = RS("data").Value
QDUpd.Parameters("=ora") = RS("ora").Value
QDUpd.Parameters("=differenza") = val - valPre
QDUpd.Execute
Wend
EX:
RS.Close
QDSel.Close
QDUpd.Close
Set RS = Nothing
Set QDSel = Nothing
Set QDUpd = Nothing
E il gioco è fatto ! ;)
Ciao
Ti ringrazio nuovamente per la cortesia della risposta, ma ti volevo chiedere che ho un problema con la modfica dei file collegati nella tabella cioè , essendo file collegati non possono essere modificati e non posso aggiungere il campo "differenza" come posso fare?
:muro: :muro: :muro: :muro: :muro:
Ciao Grazie mille!!!!
Ciao
Ti ringrazio nuovamente per la cortesia della risposta, ma ti volevo chiedere che ho un problema con la modfica dei file collegati nella tabella cioè , essendo file collegati non possono essere modificati e non posso aggiungere il campo "differenza" come posso fare?
:muro: :muro: :muro: :muro: :muro:
Ciao Grazie mille!!!!
E' un gran brutto modo di importare, quello dei "files collegati", credimi. Ti può dare l'illusione di una gran semplicità, ma poi è un bel bastone nelle ruote quando devi lavorarci sul serio, su quella tabella...
Fossi in te :
1. Non userei alcun collegamento con il file txt.
2. Metto il mio "FILE.txt" nella stessa dir del DB .mdb.
3. Creo la tabella vuota "T_PLC" destinata a contenere i records del txt, con tutti i campi che mi pare >> in questo caso : data / ora / valore / differenza, come ti avevo già detto.
4. Semplicissima Stored Query parametrica "Query_TXT" :
INSERT INTO T_PLC ( data, ora, valore )
VALUES ([data], [ora], [valore]);
5. Codice da lanciare ( pulsantino "Carica TXT" ) per popolare la tabella in un colpo solo :
Dim nomeDB As String
nomeDB = CurrentDb.Name
Dim PercorsoDB As String
PercorsoDB = nomeDB
Do
PercorsoDB = Mid(PercorsoDB, 1, Len(PercorsoDB) - 1)
If Right(PercorsoDB, 1) = "\" Then Exit Do
Loop
Dim nFile As Integer
nFile = FreeFile
Dim strLinea As String
Open PercorsoDB & "FILE.txt" For Input As nFile
Dim QD As QueryDef
Set QD = CurrentDb.QueryDefs("Query_TXT")
Dim arrayLinea() As String
Dim P_data As Date
Dim P_ora As Date
Dim P_valore As Long
Dim i As Integer
i = 0
Do While Not EOF(nFile)
Line Input #nFile, strLinea
arrayLinea = Split(strLinea, " ")
MsgBox strLinea
P_data = CDate(arrayLinea(0))
P_ora = CDate(arrayLinea(1))
P_valore = CLng(arrayLinea(2))
QD.Parameters("data") = P_data
QD.Parameters("ora") = P_ora
QD.Parameters("valore") = P_valore
QD.Execute
Loop
QD.Close
Set QD = Nothing
Close nFile
6. Fatto. ;) . A questo punto puoi usare la mia soluzione al post pecedente e fare tutto quello che vuoi col DB senza preoccuparti di collegamenti e vincoli inutili... Prova. :cool:
Scusami se sono scocciantema siccome non lo uso molto access mi tocca chiederti altre info.
Siccome il file è un file che conta di continuo poi viene aggiornato alla mia tabella? perciò lo avevo fatto collegato in modo tale si aggiornava di conseguenza anche nel DB. Inoltre se creo la TBL come mi hai indicato tu come faccio poi i miei valori della tbl a farli collegare ai file di testo.
Grazie mille per la pazienza.
Ah, ecco. Quindi la catena è :
PLC > Programmino > File txt > Access.
Quindi nessuno ti vieta di aprire Access "a bocce ferme" ed eseguire Query e Macro come ti pare ?
Mi auto-quoto : quando ti ho chiesto queste cose mi hai risposto "confermo"... :rolleyes:
Ora, non capisco qual è il problema. Questa macchina lavora giorno/notte per 365 giorni all'anno ?
Se rileggi i miei post precedenti :
- ultimo post : ti spiego proprio come popolare la tabella da file txt.
Lo puoi fare anche mentre il Plc/Programma sta girando, ma avrai sempre una "fotografia" del txt in quel momento lì, non so se mi spiego...
- penultimo post : come calcolare le differenze.
Nota : Se pensi di lanciare il mio codice più volte per eseguire la copia dati da txt a tabella sarà necessario modificarlo, in modo che non replichi n volte tutto il contenuto del txt stesso. Era per darti una soluzione alternativa alla tua, non ancora completa ma già funzionante e valida... Ma vedo che non ci capiamo... :muro:
Ciao
Grazie per l'ennesiam risposta, purtroppo non è che non ci capiamo, è che come ti ho già detto non conosco un c.... di access e quindi per questo motivo ti faccio molte domande. Ti chiedo un'altra informazione se hai volgia di rispondermi :) :)
Nella fase 6 che mi hai scritto del 20-06-2008 16:06 dove dici di inserire un pulsante carica txt per popolare la tabella.
Domanda sicuramente stupida per te: dove devo inserire il pulsante in una maschera ??Cioè creare una maschera ed inserire il pulsante carica TXT . Immaggino di no ma siccome non so come fare se riesci oltre a quello che mi hai già inviato mi potresti guidare passo passo come fare il tutto?
Scusa il fastidio e ti ringrazio anche se non puoi .
Ciao Grazie:doh: :doh: :doh:
Cioè creare una maschera ed inserire il pulsante carica TXT.
Esatto.
Crei una semplice maschera, e al Click del pulsante associ quel codice. :)
Ciao
Grazie per la risposta. Purtroppo ho fatto tutte le prove ma non riesco ma di errori di continuo.
Senti ti volevo chiedere una cortesia, se tu puoi me lo faresti tu e me lo invii tramite mail se hai lo possibilità, in quanto ho perso molto tempo e devo preparare questo db altrimenti rischio un lavoro.
Magari mi fai le basi e poi lo sistemo io mi basta la ricerca per data e ora e il calcolo della differenza che esce per ogni record.
Se puoi mi fai sapere. Altrimenti ti ringrazio comunque della tua disponibilità.
Ciao Grazie
Ciao
Grazie per la risposta. Purtroppo ho fatto tutte le prove ma non riesco ma di errori di continuo.
Senti ti volevo chiedere una cortesia, se tu puoi me lo faresti tu e me lo invii tramite mail se hai lo possibilità, in quanto ho perso molto tempo e devo preparare questo db altrimenti rischio un lavoro.
Magari mi fai le basi e poi lo sistemo io mi basta la ricerca per data e ora e il calcolo della differenza che esce per ogni record.
Se puoi mi fai sapere. Altrimenti ti ringrazio comunque della tua disponibilità.
Ciao Grazie
Ti usciranno errori perchè devi referenziare nel progetto le librerie ADO e DAO.
E poi seguire alla lettera i miei esempi...
Potrebbe anche essere dovuto alla versione di Access che usi ( io sto su Access 2003 )...
Quando posto un codice è perchè l'ho provato, quindi posso dimostrare che da me funziona al 100 %. Non avrebbe senso venire qui sul Forum e postare codici a casaccio... Se non ho tempo evito proprio di rispondere.
Se vuoi una consulenza completa... Beh, il periodo "Trial" termina qui... :D ;)
Comunque praticamente ti ho già fatto tutto io...
Ciao
Grazie per la risposta. Ma tagliamo corto !!!
Senza tanti controsensi cosa chiederesti ((economicamente)) per potermi fare questo DB.
Ciao Grazie
Ciao
Grazie per la risposta. Ma tagliamo corto !!!
Senza tanti controsensi cosa chiederesti ((economicamente)) per potermi fare questo DB.
Ciao Grazie
Beh, forse "tagliare corto" non è che ti convenga proprio, con l'unica persona da cui alla fine hai ricevuto un aiuto fattivo e concreto ( mica blah blah :blah: )...
Detto questo credo non sia corretto fare/ricevere offerte economiche "in chiaro" su questo Forum ( a parte il Mercatino ).
Almeno usa il pvt. Se vogliamo parlare d'affari, ben volentieri, ma in privato, o via Mail...
Sono disposto ad avere le specifiche esatte del programma/DB e poi vediamo...
Infine, per quanto riguarda i "controsensi" ( o intendevi "doppi sensi"... ;) ) io non ne faccio proprio uso. :)
Ciao
La mia era solo una battuta non volevo essere poco cortese. Comunque sicuramente ti ringrazio della disponibilità se mi dai il tuo indirizzo mail ti invio una mail con tutti i dettagli.
Ciao Grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.