Continuos form valorizzare campo

di il
17 risposte

Continuos form valorizzare campo

Ciao a tutti,
ho un problema che non riesco a risolvere (probabilmente mi sfugge qualcosa)
ho una subform (countinuos form) con alcuni campi calcolati in base ad un valore numerico della main form che può variare (editabile)
Su ogni riga, se il valore del campo calcolato f3 è uguale a "+" devo poter inserire manualmente i valori nei campi f7 ed f8 ; negli altri casi f7 ed f8 devono rimanere non editabili e calcolati dinamicamente.
Ho 2 funzioni che calcolano rispettivamente il valore di f7 ed f8 ma non capisco dove collocarle per poterli valorizzare al caricamento.

(NB: sono riuscito ad abilitare l'editing dei 2 campi per le sole righe nelle quali f3 è uguale a "+")

Se qualcuno riesce a indicarmi come risolvere il problema sarei molto grato

sb

17 Risposte

  • Re: Continuos form valorizzare campo

    Prova a caricarle nell'evento "dopo aggiornamento" del campo calcolato che può assumere il valore "+"
  • Re: Continuos form valorizzare campo

    Ciao Angelo,
    purtroppo l'evento " Sub f3_AfterUpdate()" non viene richiamato in fase di caricamento delle righe.
    Le colonne ed f8 rimangono quindi vuote ......
    Ho provato ad utilizzare una casella di testo ed utilizz. la funzione come origine dati; funziona perfettamente, ma non so come copiare il valore ottenuto nel campo

    sb
  • Re: Continuos form valorizzare campo

    I campi [f7] e [f8] sono controlli non associati?

    la subform ha origine da una tab modificabile?
  • Re: Continuos form valorizzare campo

    I campi [f7] e [f8] sono associati alla tabella D (quindi devono essere salvati in essa)
    la subform ha origine da un'sql su tale tabella (D) ed è modificabile (salva correttamente i dati che salvo in [f9] [f10] [f11].....)

    sb
  • Re: Continuos form valorizzare campo

    Potresti indicare i nomi esatti di:
    - Maschera
    - Sottomaschera
    - il campo numerico nella Maschera
    - i nomi dei campi [f3], [f7], [f8]
    - tutte le espressioni che avresti impostato nei vari campi?
  • Re: Continuos form valorizzare campo

    Provo a dare una risposta:
    Forse potresti creare una query di aggiornamento dei campi [f7] e [f8] passandoci come valore "Aggiorna a:" le funzioni da te già elaborate.

    Successivamente, al caricamento della subform, fai eseguire la query.
  • Re: Continuos form valorizzare campo

    X Osvaldo:

    si tratta di una struttura gerarchica a 4 livelli:

    Maschera: Commessa
    Sottomaschere: Certificati, SubLotti, Collaudi

    il problema si verifica al livello della maschera Collaudi, continuous form della tabella omonima (Collaudi)

    il campo [f3] in realtà è una casella di testo unbound (non fa parte della tabella) la cui orifine è: =CercaLivello([SALIVEL];'C')

    Function CercaLivello(xSALIVEL As String, xMas As String)
    Dim Lett As String
    If xMas = "C" Then
    xRCQUANT = [Forms]![Commessa]![xQtaSub]
    xARPIACON = [Forms]![Commessa]![ARPIACON]
    ElseIf xMas = "P" Then
    xRCQUANT = [Forms]![RientriParziali]![xQtaCs]
    xARPIACON = [Forms]![RientriParziali]![ARPIACON]
    End If
    xLVCDCOL = Null
    NaNr = Null
    QtaPrel = Null

    Set db = CurrentDb
    Set rst = db.OpenRecordset("select top 1 LVCDCOL from Livelli where livelli.LVCDLIV='" & xSALIVEL & "' and (" & xRCQUANT & " - livelli.LVQTAMX) < 0 ORDER BY (" & xRCQUANT & " - livelli.LVQTAMX) desc", dbOpenSnapshot)
    If rst.EOF Then
    MsgBox " Errore ricerca Livello "
    Else
    With rst
    Do While Not .EOF
    If IsNull(!LVCDCOL) Then
    MsgBox " Errore ricerca Livello "
    Else
    Lett = !LVCDCOL
    End If
    .MoveNext
    Loop
    End With
    End If
    rst.Close
    db.Close
    Set rst = Nothing
    Set db = Nothing
    CercaLivello = Lett
    End Function

    reperisce quindi un valore da un'altra tabella (Livelli) e si chiama "Lett" [f3]

    di seguito le due funzioni pubbliche che reperiscono i valori dei 2 campi incriminati da un'ulteriore tabella (Campionam);

    CDQTAPV numerico [f7]
    CDNANR stringa [f8]

    Function CercaPzprel(xLett As String, xSALQA As Double, xMas As String)
    If xMas = "C" Then
    xARPIACON = [Forms]![Commessa]![ARPIACON]
    ElseIf xMas = "P" Then
    xARPIACON = [Forms]![RientriParziali]![ARPIACON]
    End If
    If Not IsNull(xSALQA) Then
    ySALQA = Replace(xSALQA, ",", ".")
    End If
    Set db = CurrentDb
    SQLstr = "select CPQTAPV, CPNANR from Campionam where Campionam.CPPIANO='" & xARPIACON & "' and CPLIV='" & xLett & "' and CPLQA= " & ySALQA
    Set rst = db.OpenRecordset(SQLstr, dbOpenSnapshot)
    If rst.EOF Then
    MsgBox " Errore ricerca Pezzi da prelevare"
    Else
    With rst
    Do While Not .EOF
    If IsNull(!CPNANR) Then
    MsgBox " Errore ricerca Pezzi da prelevare "
    Else
    NaNr = !CPNANR
    QtaPrel = !CPQTAPV
    End If
    .MoveNext
    Loop
    End With
    End If
    rst.Close
    db.Close
    Set rst = Nothing
    Set db = Nothing
    CercaPzprel = QtaPrel
    End Function

    Function CercaNaNr(xLett As String, xSALQA As Double, xMas As String)
    If xMas = "C" Then
    xARPIACON = [Forms]![Commessa]![ARPIACON]
    ElseIf xMas = "P" Then
    xARPIACON = [Forms]![RientriParziali]![ARPIACON]
    End If
    If Not IsNull(xSALQA) Then
    ySALQA = Replace(xSALQA, ",", ".")
    End If
    Set db = CurrentDb
    SQLstr = "select CPQTAPV, CPNANR from Campionam where Campionam.CPPIANO='" & xARPIACON & "' and CPLIV='" & xLett & "' and CPLQA= " & ySALQA
    Set rst = db.OpenRecordset(SQLstr, dbOpenSnapshot)
    If rst.EOF Then
    MsgBox " Errore ricerca LQA "
    Else
    With rst
    Do While Not .EOF
    If IsNull(!CPNANR) Then
    MsgBox " Errore ricerca LQA "
    Else
    NaNr = !CPNANR
    QtaPrel = !CPQTAPV
    End If
    .MoveNext
    Loop
    End With
    End If
    rst.Close
    db.Close
    Set rst = Nothing
    Set db = Nothing
    CercaNaNr = NaNr
    End Function
  • Re: Continuos form valorizzare campo

    X Angelo
    Non credo possa funzionare (ma forse non ho capito bene la tua proposta).
    Tieni presente che il contenuto di Lett è condizionato dal campo RCQTACF, campo della subform Certificati (livello 2) editabile.

    "Successivamente, al caricamento della subform, fai eseguire la query."
    In quale evento potrei collocare l'esecuzione della query?

    grazie
  • Re: Continuos form valorizzare campo

    Cerco di capirci qualcosa...
    il problema si verifica al livello della maschera Collaudi, continuous form della tabella omonima (Collaudi)
    i campi [f7] e [f8] sono associati alla tabella D (quindi devono essere salvati in essa)
    la subform ha origine da un'sql su tale tabella (D) ed è modificabile (salva correttamente i dati che salvo in [f9] [f10] [f11].....)
    dunque...
    [f7] e [f8] sono 2 campi che si trovano nella submask collaudi e dipendono dall'omonima tabella "collaudi" SI o No ?

    poi....
    il campo [f3] in realtà è una casella di testo unbound (non fa parte della tabella) la cui orifine è: =CercaLivello([SALIVEL];'C')
    Tieni presente che il contenuto di Lett è condizionato dal campo RCQTACF, campo della subform Certificati (livello 2) editabile.
    dunque...
    [f3] è un controllo non associato che prende il suo valore dalla funzione cercalivello (il cui risultato dipende da un campo del subform certificati): Si o NO ?

    Se sono nel giusto potresti postarmi la stringa SQL della subform Collaudi (che dovrebbe essere la D)?
  • Re: Continuos form valorizzare campo

    Ciao Angelo,
    la risposta è SI per entrambe le tue domande.

    di seguito la query:
    SELECT Collaudi.*, SpecificheA.* FROM Collaudi INNER JOIN SpecificheA ON (Collaudi.CDARTSPEC=SpecificheA.[SANMDIS]) AND (Collaudi.CDPOS = SpecificheA.SAPOS);
  • Re: Continuos form valorizzare campo

    Potresti darmi i nomi dei 3 campi della tabella e i relativi controlli della subform che li ospita?

    parlo ovviamente di [f3], [f7] e [f8]... che , te lo chiedo ancora, sono sulla stessa riga in ogni record della subform collaudi?


    ps:
    sto tendando di capire se , come credo sia, èpossibile applicare la query di aggiornamento.
  • Re: Continuos form valorizzare campo

    Ciao Angelo,

    [f3] è una casella di testo unbound il cui nome è "Lett" la cui origine è: =CercaLivello([SALIVEL];'C')
    Ottengo il valore associando la riga Collaudi che sto trattando alla riga di Specifiche (dalla quale ottengo il campo SALIVEL) e cerco nella tabella Livelli il record che ha il primo valore superore a RCQTACF (campo della subform continous form Certificati) in LVQTAMX


    CDQTAPV numerico [f7] e CDNANR stringa [f8] sono campi della tabella Collaudi i cui valori dovrebbero essere ottenuti (per tutti i casi in cui non sono editabili) con le funzioni:

    CercaPzprel(xLett As String, xSALQA As Double, xMas As String)
    e
    CercaNaNr(xLett As String, xSALQA As Double, xMas As String)

    Provengono dalla stessa tabella Campionam partendo dal valore del campo Lett [f3] e da un valore della tabella Specifiche (SALQA) associata a Collaudi.
    A me servivano separati, potrebbero diventare una funzione sola.
  • Re: Continuos form valorizzare campo

    NB:
    da Tinto:
    SELECT Collaudi.*, SpecificheA.* FROM Collaudi INNER JOIN SpecificheA ON (Collaudi.CDARTSPEC=SpecificheA.[SANMDIS]) AND (Collaudi.CDPOS = SpecificheA.SAPOS);
    Mi sono dovuto basare sulle informazioni che mi hai dato, o meglio su quelle che sono riuscito a comprendere , percui è possibile che, se ho saltato qualche "variabile", il risultato non sia quello atteso... (l'asterisco della stringa SQL, non mi ha permesso di leggere correttamente i nomi dei campi [f3], [f7] e [f8] per cui nella query che ho preparato li ho chiamati semplicemente [f3], [f7] e [f8] senza le parentesi quadre... nel caso provvedi tu a sostituire Collaudi.*, SpecificheA.* come da indicazioni sotto...).

    posto la query:
    UPDATE Collaudi INNER JOIN SpecificheA ON (Collaudi.CDARTSPEC = SpecificheA.[SANMDIS]) AND (Collaudi.CDPOS = SpecificheA.SAPOS) SET Collaudi.f7 = CercaNaNr([f3]), Collaudi.f8 = CercaPzprel([f3])
    WHERE (((Collaudi.f3)<>"+"));
    ps: come argomento delle funzioni sono consapevole di aver messo [f3] ovviamente quella è una condizione, mentre i paramentri sono altri (e mi devi indicare tu quali sono i nomi dei campi da passare come argomento - tieni presente che se sono nella query puoi indicarlo come [nomecampo] altrimenti ho bisogno di sapere dove sono 'Formxxx.nomecomtrollo')

    Fai una copia del DB... la query di aggiornamento se mal utilizzata è pericolosa... e prova i seguenti passaggi:
    Crea una query in modalità struttura e Tasto Destro richiama la visualizzazione SQL e copiaci la stringa di cui sopra salva la query e chiudila Chiamala "qry_Update"

    Sostituzione di Collaudi.*, SpecificheA.* --> nella struttura query fai doppio click su tutti i campi che sono utilizzati sia dalla query stessa che dalla subform che li ospita assicurati che [f3], [f7] e [f8] senza parentesi siano i nomi esatti e mi raccomando..... IMPORTANTE ... non premere il punto esclamativo. ( nella query che ti ho postato, i campi [f3], [f7] e [f8] sono già stati inclusi... nel caso devi solo correggere il nome)
    Se riesci prova ad attribuire tu gli argomenti alle funzioni.

    quando hai fatto... se ti va di postare la query l'analizziamo...

    Giunti a Questo Punto, se tutto è andato bene, siamo a metà dell'opera.

    Al fine di decidere come e dove far lavorare la query affrontiamo ancora qualche questione:

    Quali sono gli eventi che dovrebbero dare luogo al calcolo delle funzioni e alla rispettiva visualizzazione in [f7] e [f8]???
    ho una subform (countinuos form) con alcuni campi calcolati in base ad un valore numerico della main form che può variare (editabile)
    uno è sicuramente il controllo di cui sopra (qual'è il nome del controllo?)
    [f3] è una casella di testo unbound il cui nome è "Lett" la cui origine è: =CercaLivello([SALIVEL];'C')
    Ottengo il valore associando la riga Collaudi che sto trattando alla riga di Specifiche (dalla quale ottengo il campo SALIVEL) e cerco nella tabella Livelli il record che ha il primo valore superore a RCQTACF (campo della subform continous form Certificati) in LVQTAMX
    un altro dovrebbe essere [SALIVEL] ( è editabile ?) (se è si la risp: qual'è il nome del controllo?)
    un altro dovrebbe essere [RCQTACF ] ( è editabile ?) (se è si la risp: qual'è il nome del controllo?)

    Se vi sono altri controlli editabili che possono dar luogo al ricalcolo o non ho interpretato bene il ciclo di funzionamento del tuo prog... fammi sapere...

    saluti
  • Re: Continuos form valorizzare campo

    Spero di non aver interpretato male le tue istruzioni:

    UPDATE Collaudi INNER JOIN SpecificheA ON (Collaudi.CDARTSPEC = SpecificheA.[SANMDIS]) AND (Collaudi.CDPOS = SpecificheA.SAPOS) SET Collaudi.CDQTAPV = CercaNaNr(CercaLivello([SALIVEL],"C"), SALQA, "C"), Collaudi.CDNANR = CercaPzprel(CercaLivello([SALIVEL],"C"), SALQA, "C")
    WHERE ((CercaLivello([SALIVEL],"C")<>"+")) and CDNMCOM= [Forms]![Commessa]!CMNMCOM and CDSUBLOT = [Forms]![Commessa]!xSubLot and CDARTSPEC = [Forms]![Commessa]!xArtSpec;

    Il campo [f3] non fa parte di nessuna tabella, quindi ho dovuto richimare 2 volte la funzione CercaLivello: non so se questo è ottimizzabile.
    Ho anche modificato la clausola WHERE per limitare l'azione della query ai soli record interessati (siamo al terzo livello).

    Questa è la select con tutti i campi utilizzati:
    SELECT Collaudi.CDPZDIF, Collaudi.CDRILMIN, Collaudi.CDRILMAX, Collaudi.CDVALOK, Collaudi.CDVALNO, Collaudi.CDVALNOT, Collaudi.CDVALNOT, Collaudi.CDNOTEST, Collaudi.CDQTAPV, Collaudi.CDNANR, SpecificheA.SARIF, SpecificheA.SADESCR, SpecificheA.SATOLLER, SpecificheA.SALIVEL, SpecificheA.SALQA, SpecificheA.SAMETOD, SpecificheA.SACDSTRM
    FROM Collaudi INNER JOIN SpecificheA ON (Collaudi.CDPOS = SpecificheA.SAPOS) AND (Collaudi.CDARTSPEC = SpecificheA.[SANMDIS]);




    Ho usato la tecnica di valorizzare le caselle di testo che compongono la chiave nella main form.
    Spostandomi o modificando la quantità nella seconda subform modifico le caselle di testo:
    [Forms]![Commessa]!xSubLot
    [Forms]![Commessa]![xQtaSub]

    Spostandomi nella seconda subform modifico il contenuto della casella di testo:
    [Forms]![Commessa]!xArtSpec

    Questo è il codice legato alla modifica del sublotto nella main form
    Private Sub xSubLot_AfterUpdate()
    Form_CollaudiSublotti.RecordSource = "SELECT CollaudiSublotti.* FROM CollaudiSublotti WHERE CSNMCOM=Forms![Commessa]!CMNMCOM CSSUBLOT=Forms![Commessa]!xArtSpec;"
    Form_Lotti.Requery
    End Sub

    e questo nella subform 1
    Private Sub RCQTACF_AfterUpdate()
    Call Form_Current
    End Sub
    Private Sub Form_Current()
    Forms![Commessa]!xSubLot = Me.RCSUBLOT
    Forms![Commessa]!xQtaSub = Me.RCQTACF
    End Sub

    spero di aver risposto a tutto
    grazie
Devi accedere o registrarti per scrivere nel forum
17 risposte