Selezione record da sottomaschera

di il
27 risposte

Selezione record da sottomaschera

Buongiorno a tutti, vi seguo ormai da diversi anni, in cui ho imparato molto su Access e su come impostare un database; le soluzioni ed i suggerimenti che ho trovato su questo forum sono state per me molto importanti. Premesso questo, è arrivato il mio momento di chiedere un aiuto…

Sto sviluppando un database, piuttosto complesso a dire il vero, per la gestione del punto vendita in cui lavoro. All'interno di questo database è implementata una funzione di creazione preventivi, basata su una tabella chiamata “PREVENTIVO”, collegata a diverse altre tabelle tra cui la tabella “PREVENTIVO_LINEE”, su cui vengono riportati linea per linea gli articoli inclusi nel preventivo (il campo di collegamento tra le due tabelle è “ID_PREVENTIVO” dalla tabella “PREVENTIVO”).

Ora, da alcuni di questi preventivi presenti in archivio può verificarsi la necessità di emettere un buono d'ordine verso il magazzino, per cui ho sviluppato un' apposita funzione  in cui su un evento click si crea un verbale che inserisce alcuni dati in una tabella “VERBALE”, collegata alla tabella preventivi da una relazione “MOLTI A MOLTI” e ad una tabella “VERBALE_LINEE” in cui riversare gli stessi dati presenti in “PREVENTIVO_LINEE” con lo stesso ID_PREVENTIVO del preventivo da cui ho lanciato la funzione. Specifico che nel mio caso non tutti i preventivi generano un buono d'ordine, ma un buono d'ordine può essere prodotto anche senza preventivo, come ad esempio una richiesta di fornitura articoli dal punto vendita al magazzino; per questo, in questa specifica funzione ho necessità di replicare i dati da preventivo a verbale, anche se so che non è il massimo della fluidità per la gestione del database….

Per fare questo ho sviluppato il seguente codice:

Private Sub VERBALE_ICO_Click()
DoCmd.RefreshRecord

DoCmd.Minimize
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If IsNull(Me![PREVENTIVO_VERBALE]![ID_PV].Value) = True Then
   DoCmd.OpenForm "VERBALE", acNormal, , , acFormAdd, acWindowNormal
   
'--------------------- ATTENZIONE: CONTATORE SEMPLIFICATO DA RIPORTARE IN ALTRE MASCHERE ----------------
   Forms![VERBALE]![VERB_NRPROG].Value = Nz(DMax("[VERBALE]![VERB_NRPROG]", "[VERBALE]"), 0) + 1
   Forms![VERBALE]![VERB_NUMERO].Value = Forms![VERBALE]![VERB_NRPROG].Value & "-VR"
'--------------------------------------------------------------------------------------------------------
   Forms![VERBALE]![VERB_TIPO].Value = 2
   Forms![VERBALE]![VERB_ANNOTAZIONI].Value = "Preventivo di riferimento nr. " & Me.PREV_NUMERO.Value & " in data " & Me.DATA.Value
   Forms![VERBALE]![PREVENTIVO_VERBALE]![ID_PREV].Value = Me.ID_PREVENTIVO.Value
   Forms![VERBALE]![PREVENTIVO_VERBALE]![ID_VERB].Value = Forms![VERBALE]![ID_VERB].Value
   DoCmd.RefreshRecord

   Dim RS1 As DAO.Recordset
   Dim RS1str As String
   Dim msg, style, title, response
   Dim RSCountSTR As String

   RS1str = "SELECT PREVENTIVO_LINEE.LINEA_NUMERO, PREVENTIVO_LINEE.ARTICOLO, PREVENTIVO_LINEE.DESCRIZIONE, PREVENTIVO_LINEE.UNITA_MISURA, PREVENTIVO_LINEE.[QUANTITA'_CFR], PREVENTIVO_LINEE.CATEGORIA_MERC, PREVENTIVO_LINEE.ID_PREVENTIVO FROM PREVENTIVO_LINEE INNER JOIN PREVENTIVO_VERBALE ON PREVENTIVO_LINEE.ID_PREVENTIVO = PREVENTIVO_VERBALE.ID_PREV WHERE (((PREVENTIVO_LINEE.ID_PREVENTIVO) = [PREVENTIVO_VERBALE].[ID_PREV]))"
   
   Set RS1 = CurrentDb.OpenRecordset(RS1str, dbOpenDynaset)
   If RS1.EOF = False Then
      With RS1
           RS1.MoveLast
           RSCountSTR = RS1.RecordCount
           msg = "VERIFICA VOCI DA INSERIRE IN BUONO D'ORDINE." & vbCrLf & "Voci che verranno importate dal preventivo: " & RSCountSTR & "." & vbCrLf & "Verificare la corrispondenza delle voci."
           style = OkOnly + vbInformation + vbDefaultButton1 + vbApplicationModal
           title = "ATTENZIONE"
           response = MsgBox(msg, style, title)
       End With
   End If
   RS1.MoveFirst
   Do While Not RS1.EOF
      Forms![VERBALE]![VERBALE_LINEE]![ID_VERB].Value = Forms![VERBALE]![ID_VERB].Value
      Forms![VERBALE]![VERBALE_LINEE]![NUMERO].Value = RS1.Fields("LINEA_NUMERO")
      Forms![VERBALE]![VERBALE_LINEE]![ARTICOLO].Value = RS1.Fields("ARTICOLO")
      Forms![VERBALE]![VERBALE_LINEE]![DESCRIZIONE].Value = RS1.Fields("DESCRIZIONE")
      Forms![VERBALE]![VERBALE_LINEE]![UNITA_MISURA_CFR].Value = RS1.Fields("UNITA_MISURA")
      Forms![VERBALE]![VERBALE_LINEE]![QUANTITA_CFR].Value = RS1.Fields("QUANTITA'_CFR")
      Forms![VERBALE]![VERBALE_LINEE]![CATEGORIA_MERC].Value = RS1.Fields("CATEGORIA_MERC")
      Forms![VERBALE]![VERBALE_LINEE].SetFocus
      DoCmd.GoToRecord , , acNewRec
      RS1.MoveNext
    Loop
    RS1.Close
    Set RS1 = Nothing
    Forms![VERBALE]![VERB_DATA].SetFocus
Else

   DoCmd.OpenForm "VERBALE", acNormal, , "[ID_VERB]=" & Me![PREVENTIVO_VERBALE]![ID_VERB], acFormEdit, acWindowNormal

End If
End Sub

Ora, la funzione di selezione restituisce i valori che mi aspetto, ma solo per il primo verbale che inserisco in tabella “VERBALE”, perchè, all'inserimento di un successivo record in tabella “VERBALE”, il recordset mi carica i record relativi al preventivo utilizzato, ma ci aggiunge anche tutti i record già presenti in “VERBALE_LINEE”.

Da qui la fatidica domanda: dove sbaglio?

Un sentito grazie a chi ha avuto la pazienza di leggere sino a qui e mi aiuterà a risolvere questo problema che mi sta bloccando ormai da una settimana…. 

27 Risposte

  • Re: Selezione record da sottomaschera

    Ad una prima veloce vista dovresti usare la HAVING al posto della WHERE 

  • Re: Selezione record da sottomaschera

    Ciao,

    ti giuro che ho riletto più e più volte il Thread e arrivo sempre ad un certo punto che mi perdo e non arrivo a capire bene cosa vuoi fare e come lo vuoi fare ;)

    Aggiungerei che per quello che ho capito e che vedo dal codice, il metodo utilizzato non mi sembra proprio il massimo.


    Allora provo a semplificare per vedere se capisco cosa vuoi fare:

    Tabelle Input:

    • PREVENTIVO (testate)
      • PREVENTIVO_LINEE (righe)

    Tabella Output:

    • VERBALE (testate)
      • VERBALE_LINEE (righe)

    Operazioni da eseguire:

    1. Selezionare un Preventivo e copiarlo in Verbale

    Fino a qui corrisponde a quello che fai e/o che vorresti fare?

    Perchè da questo punto in poi non ho capito il problema che hai. Cioè , quale azione successiva  ti crea il problema?

  • Re: Selezione record da sottomaschera

    Ciao By65Franco

    l'operazione da eseguire è "selezionare le righe del preventivo e riportarle nelle linee del verbale.

    Il problema è il seguente, descritto più semplicemente:

    1) inserisco il preventivo 1, con le righe a), b), c)

    2) creo il verbale 1, e mi importa correttamente le righe a), b), c)

    3) inserisco il preventivo 2, con le righe d), e), f)

    4) (e qui nasce il problema) creo il verbale 2, e mi importa le righe d), e), f) ma anche le righe a), b), c) del preventivo 1, anzichè le sole righe d), e), f) come desiderato

    5) creando un ulteriore preventivo con righe g), h), i), il relativo verbale mi importa a), b), c), d), e), f), g), h), i)

    E così via….

    Onestamente sono arrivato al limite delle mie conoscenze (che ammetto non essere approfonditissime) e non riesco a capire perchè il codice mi seleziona record che, se ho impostato correttamente la clausola WHERE, non dovrebbe considerare

  • Re: Selezione record da sottomaschera

    16/06/2023 - ivbrusa71 ha scritto:


    Sto sviluppando un database, piuttosto complesso a dire il vero, per la gestione del punto vendita in cui lavoro. All'interno di questo database è implementata una funzione di creazione preventivi, basata su una tabella chiamata “PREVENTIVO”, collegata a diverse altre tabelle tra cui la tabella “PREVENTIVO_LINEE”, su cui vengono riportati linea per linea gli articoli inclusi nel preventivo (il campo di collegamento tra le due tabelle è “ID_PREVENTIVO” dalla tabella “PREVENTIVO”).

    1. Abituati a nominare le tabelle sempre al PLURALE.
    2. “Preventivi collegata a diverse altre tabelle”: questa frase mi inquieta.
    3. Potresti mostrare la tua Finestra Relazioni?

    16/06/2023 - ivbrusa71 ha scritto:


    Ora, da alcuni di questi preventivi presenti in archivio può verificarsi la necessità di emettere un buono d'ordine verso il magazzino, per cui ho sviluppato un' apposita funzione  in cui su un evento click si crea un verbale che inserisce alcuni dati in una tabella “VERBALE”, collegata alla tabella preventivi da una relazione “MOLTI A MOLTI” e ad una tabella “VERBALE_LINEE” in cui riversare gli stessi dati presenti in “PREVENTIVO_LINEE” con lo stesso ID_PREVENTIVO del preventivo da cui ho lanciato la funzione. Specifico che nel mio caso non tutti i preventivi generano un buono d'ordine, ma un buono d'ordine può essere prodotto anche senza preventivo, come ad esempio una richiesta di fornitura articoli dal punto vendita al magazzino; per questo, in questa specifica funzione ho necessità di replicare i dati da preventivo a verbale, anche se so che non è il massimo della fluidità per la gestione del database….

    16/06/2023 - ivbrusa71 ha scritto:


    Ora, la funzione di selezione restituisce i valori che mi aspetto, ma solo per il primo verbale che inserisco in tabella “VERBALE”, perchè, all'inserimento di un successivo record in tabella “VERBALE”, il recordset mi carica i record relativi al preventivo utilizzato, ma ci aggiunge anche tutti i record già presenti in “VERBALE_LINEE”.

    Da qui la fatidica domanda: dove sbaglio?

    Temo che la risposta te la sei data da solo quando dichiari “ho necessità di replicare i dati da preventivo a verbale, anche se so che non è il massimo delle fluidità per la gestione del database”.

    Ribadisco la mia domanda del punto 3.

  • Re: Selezione record da sottomaschera

    Intanto devi distinguere preventivi da bolle, fatture e anche verbali (che non ho capito a cosa ti serve).

    Avrai delle singole relazioni.

    Preventivi con righeprrventivi

    Bolle con righebolle

    Fatture con righefatture

    E verbali con righeverbali.

    Quando emetti un verbale, nella tabella righeverbali avrai un campo di riferimento al preventivo.

    Quindi da una combo ti selezioni il preventivo ed apri una griglia ricavata da una query che ti mostra le righe preventivo.

    ClickClick sul record e vai a inserire la righeverbale cosi:

    Idrigaverbale (lo metti tu o autoincrementale)

    Idverbale lo metti in automatico in base alla tabella madre

    Idarticolo lo prelevi da rigapreventivo dove hai fatto doppio click

    Il prezzo idem come sopra

    Ti resta da completare la quantità

    Dove sbagli?

    Nella select! Almeno al primo impatto di tutto quel codice superfluo… bastano un paio di righe di codice.

    Scrivi Inner join preventivo_verbale….

    Inner join prende i valori comuni tra due insiemi. Se verbali la stai popolando l'unico insieme comune è l'insieme vuoto.

    Cancella tutto.

    Se la struttura delle tabelle righe è uguale sia per preventivi che per verbali, usa insert 

    INSERT INTO [riggheverbale](campo1, campo2, campo3, ...) SELECT campo1, campo2, campo3, ... FROM [righepreventivi] WHERE id=blabla…

    Ti consiglio comunque di usare il primo metodo. Non sempre ad un preventivo mi ordinano tutto o magari evado una quantità parziale… o una insert dove i valori li passi tu.

  • Re: Selezione record da sottomaschera

    16/06/2023 - ivbrusa71 ha scritto:


    Ciao By65Franco

    l'operazione da eseguire è "selezionare le righe del preventivo e riportarle nelle linee del verbale.

    Il problema è il seguente, descritto più semplicemente:

    1) inserisco il preventivo 1, con le righe a), b), c)

    2) creo il verbale 1, e mi importa correttamente le righe a), b), c)

    3) inserisco il preventivo 2, con le righe d), e), f)

    4) (e qui nasce il problema) creo il verbale 2, e mi importa le righe d), e), f) ma anche le righe a), b), c) del preventivo 1, anzichè le sole righe d), e), f) come desiderato

    5) creando un ulteriore preventivo con righe g), h), i), il relativo verbale mi importa a), b), c), d), e), f), g), h), i)

    E così via….

    Onestamente sono arrivato al limite delle mie conoscenze (che ammetto non essere approfonditissime) e non riesco a capire perchè il codice mi seleziona record che, se ho impostato correttamente la clausola WHERE, non dovrebbe considerare

    quindi non vuoi importare tutto il preventivo in verbale ma solo le righe di preventivo che ti interessano ?

    Cioè se preventivo ha 10 righe in verbale ne voglio solo 3 (per esempio la prima, la quinta e l'ottava ?)

    Quindi vorresti riportare in verbale o tutte le righe del preventivo o solo alcune ?

  • Re: Selezione record da sottomaschera

    1) inserisco il preventivo 1, con le righe a), b), c)

    2) creo il verbale 1, e mi importa correttamente le righe a), b), c)

    3) inserisco il preventivo 2, con le righe d), e), f)

    4) (e qui nasce il problema) creo il verbale 2, e mi importa le righe d), e), f) ma anche le righe a), b), c) del preventivo 1, anzichè le sole righe d), e), f) come desiderato

    Certo che nasce il problema… hai sempre la stessa select sbagliata!

    SELECT PREVENTIVO_LINEE.LINEA_NUMERO, ecc…

    FROM PREVENTIVO_LINEE 

    INNER JOIN PREVENTIVO_VERBALE 

    ON PREVENTIVO_LINEE.ID_PREVENTIVO = PREVENTIVO_VERBALE.ID_PREV 

    WHERE (((PREVENTIVO_LINEE.ID_PREVENTIVO) = [PREVENTIVO_VERBALE].[ID_PREV]))" tutta la tabella?

    Sostituisci con 

    WHERE PREVENTIVO_LINEE.ID_PREVENTIVO = 1

    Se vuoi solo il preventivo 1

    WHERE PREVENTIVO_LINEE.ID_PREVENTIVO = 2

    Se vuoi solo il preventivo 2

    Ripeto! Già che scrivi una query, sfruttala per copiarti il risultato dentro righeverbale usa insert into blabla…

    Altrimenti parametrizza il numero preventivo e lo setti in base al preventivo che devi processare.

    Nel frattempo…. Studia le query!

  • Re: Selezione record da sottomaschera

    Errata corrige

    Idpreventivo non idrigapreventivo

    Con quelle maiuscole e tutto su una riga mi sono confuso…

  • Re: Selezione record da sottomaschera

    By65Franco

    in VERBALE vanno importate tutte le righe di un preventivo. Il processo lavorativo prevede l'emissione di un verbale di richiesta (da cui la tabella verbale) verso il magazzino materiali, in seguito all'accettazione del preventivo da parte del cliente.

    sihsandrea

    Se la struttura delle tabelle righe è uguale sia per preventivi che per verbali, usa insert 
    
    INSERT INTO [riggheverbale](campo1, campo2, campo3, ...) SELECT campo1, campo2, campo3, ... FROM [righepreventivi] WHERE id=blabla…

    La struttura delle tabelle “PREVENTIVO_LINEE” e “VERBALE_LINEE” è simile, in comune hanno solo alcuni campi (articolo, descrizione ecc., che sono quelli che ho inerito nella query di riferimento del recordset).

    L'esigenza lavorativa è , come detto sopra, di produrre un buono d'ordine verso il magazzino in seguito all'accettazione da parte del cliente del preventivo. Non chiedermi perchè non mandiamo al magazzino direttamente il preventivo….diciamo che la mia organizzazione non brilla per flessibilità….. 

    Per quello che riguarda la mia esigenza, diamo per scontato che quello che è riportato nelle righe del preventivo (che riesco ad ottenere senza problemi con una parte di programma già consolidata e funzionante) deve passare pari pari sulle righe del verbale di richiesta verso il magazzino. Da qui l'idea di ricavare questi dati tramite recordset dalla tabella “PREVENTIVO_LINEE"  e passarli alla tabella “VERBALE_LINEE”.

    parametrizza il numero preventivo e lo setti in base al preventivo che devi processare

    Se ho ben inteso quello che volevi suggerirmi, sarebbe il mio intento che avrei voluto realizzare con la clausola 

    WHERE (((PREVENTIVO_LINEE.ID_PREVENTIVO) = [PREVENTIVO_VERBALE].[ID_PREV]))

    dando per acquisito l' ID del preventivo (che è comune e collegato correttamente alle relative linee).

    Sono d'accordo sul codice un po' prolisso….effettivamente anziché passare campo per campo il dato posso sicuramente usare l'opzione INSERT INTO, ma ahimè questo temo non risolva il problema dei record duplicati…..ma mi riservo di riprovare il tutto seguendo il tuo suggerimento.

    OsvaldoLaviosa

    Non riesco a postare la schermata delle relazioni. Brevemente, per quanto riguarda la tabella PREVENTIVO è collegata in relazione uno-a-molti alle due tabelle PREVENTIVO_LINEE e PREVENTIVO_DETTAGLIO, dove vengono riportati tutti i dati di articoli e prezzi. E' poi collegata in relazione molti-a-molti con una tabella CLIENTI, che altro non è che l'anagrafica dei clienti. Infine, come già detto prima, è collegata in relazione molti-a-molti con la tabella VERBALE, con cui intendo realizzare il verbale di richiesta verso il magazzino. Se ti servono altri dati fammi sapere. 

  • Re: Selezione record da sottomaschera

    Beh, se verbali è la fotocopia di preventivi al netto di alcuni campi, aggiungi a preventivo un campo verbale e i verbali li ricavi con la select su verbale. Non scrivi altro codice se non una query di update. Le relazioni sono le stesse e non crei altre tabelle.

    Se vuoi solo il codice da inserire senza usare query Allora Editi tabella preventivi e inserisci nr verbale.

    Il form verbali sarà un duplicato del form preventivi ma invece di preventivi troverai scritto verbali, nascondendo i campi superflui.

    Le righe saranno già settate per il preventivo in essere ma vedrai scritto verbale al posto di preventivo.

  • Re: Selezione record da sottomaschera

    16/06/2023 - ivbrusa71 ha scritto:


    Non riesco a postare la schermata delle relazioni.

    Descrivi tutto dettagliatamente così:
    - nomi propri di tutte le tabelle: già fatto
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni

    16/06/2023 - ivbrusa71 ha scritto:


    E' poi collegata in relazione molti-a-molti con una tabella CLIENTI

    Quale tabella? Perché molti-a-molti?

  • Re: Selezione record da sottomaschera

    16/06/2023 - ivbrusa71 ha scritto:


    in VERBALE vanno importate tutte le righe di un preventivo. Il processo lavorativo prevede l'emissione di un verbale di richiesta (da cui la tabella verbale) verso il magazzino materiali, in seguito all'accettazione del preventivo da parte del cliente.

    ok, allora non fai altro che importare un preventivo in verbale 

    Questa operazione è estremamente semplice ma per come hai impostato il processo ti sei complicato un po' la vita… 

    Devi normalizzare il flusso perchè con due istruzioni fai proprio tutto, velocemente e in modo non solo semplice ma anche affidabile.

    un processo normale dovrebbe consentirti di :

    1. selezionare il preventivo desiderato
    2. inserire i records del preventivo nella tabella verbali
    3. se vuoi visualizzare il verbale appena generato lo passerai alla Form o subForm filtrando verbali per Id nuovo verbale creato oppure per id preventivo presente nella tabella verbale

    la cosa che non mi piace affatto è che aggiungi i records nel recordset della form … perchè? quale uso specifico ne fai di tale metodo? 

    Personalmente abbandonerei tale metodo sostituendolo con due Insert , uno per la testata e uno per le righe 

    Sei non te la senti di creare la stringa sql da codice vba ti consiglio di crearti due semplici query di accodamento
    Quando vedi che le due query espongono in modo corretto i dati in verbali, a quel punto le esegui da codice, sostituendo il codice da scritto, e alla fine apri la form filtrando l'id come hai già fatto e/o come citato qui sopra.

    Se invece vuoi scrivere nel vba il codice delle due query, le apri in modalita SQL e fai il copia incolla della stringa nel vba. Modifica gli eventuali punti, virgole, punti e virgola, etc… e con un semplice DBEngine(0)(0).Execute “tua stringa sql” esegui le tue Insert…

    Se usi bene i vari ID e li imposti correttamente nelle tabelle, non avrai il problema che hai segnalato.

    Ecco, secondo me questo può essere un metodo veloce da scrivere e velocissimo da eseguire, una strada delle tante da poter seguire.

  • Re: Selezione record da sottomaschera

    16/06/2023 - sihsandrea ha scritto:


    Beh, se verbali è la fotocopia di preventivi al netto di alcuni campi, aggiungi a preventivo un campo verbale e i verbali li ricavi con la select su verbale. Non scrivi altro codice se non una query di update. Le relazioni sono le stesse e non crei altre tabelle.

    Se vuoi solo il codice da inserire senza usare query Allora Editi tabella preventivi e inserisci nr verbale.

    Il form verbali sarà un duplicato del form preventivi ma invece di preventivi troverai scritto verbali, nascondendo i campi superflui.

    Le righe saranno già settate per il preventivo in essere ma vedrai scritto verbale al posto di preventivo.

    Ancor meglio !!!  concordo… ridondare specularmente le stesse informazioni su più tabelle non ha molto senso, ma dipende dalla struttura e organizzazione del progetto.

    Al limite basterebbe anche un campo Boolean da fleggare su True or False (oppure Si/No) che indicherà "Preventivo Approvato"

  • Re: Selezione record da sottomaschera

    sihsandrea

    Quindi la soluzione che mi prospetti è quella di relazionare PREVENTIVI e VERBALI in relazione uno-a-uno. Solo che mi domando cosa succede quando devo inserire un verbale di richiesta al magazzino svincolato da un preventivo (esempio: richiesta materiale al magazzino per il punto vendita)

    OsvaldoLaviosa

    Per brevità, ti elenco solo tabelle e campi che mi interessano (inutile appesantire il post con parti del progetto che funzionano senza problemi):

    Tabella PREVENTIVO
    ID_PREVENTIVO (chiave primaria)
    PREVENTIVO_NRPROG (numerico intero)
    DATA (data)
    RIFERIMENTI (testo breve)
    IMPORTO (numerico precisione doppia, valuta euro)

    tabella PREVENTIVO_CLIENTE
    ID_PV (chiave primaria)
    ID_PREV (numerico, collegamento uno-a-molti su PREVENTIVO.ID_PREVENTIVO)
    ID_CLIENTE (numerico, collegamento uno-a-molti su tabella CLIENTI.ID_CLIENTI) 

    Tabella PREVENTIVO_LINEE
    ID_LINEE (chiave primaria)
    ID_PREVENTIVO (numerico, collegamento uno-a-molti su PREVENTIVO.ID_PREVENTIVO)
    LINEA_NUMERO (numerico intero)
    ARTICOLO (numerico, collegato ad una tabella articoli)
    QUANTITA (numerico)
    CAT_MERC
    IMPONIBILE (numerico precisione doppia, valuta euro)
    IVA (numerico)
    TOTALE (numerico precisione doppia, valuta euro)

    tabella PREVENTIVO_RIEPILOGO
    ID_RIEPILOGO(chiave primaria)
    ID_PREVENTIVO (numerico, collegamento uno-a-molti su PREVENTIVO.ID_PREVENTIVO)
    …seguono diverse righe relative ad imponibile, iva e totale non collegate ad altre tabelle

    tabella PREVENTIVO_VERBALE
    ID_PV (chiave primaria)
    ID_PREV (numerico, collegamento uno-a-molti su PREVENTIVO.ID_PREVENTIVO)
    ID_VERB (numerico, collegamento uno-a-molti su VERBALE.ID_VERBALE) 

    tabella VERBALE
    ID_VERB (chiave primaria)
    VERB_NRPROG (numerico)
    DATA (data)
    …seguono altre righe di dettaglio non collegate ad altre tabelle

    tabella VERBALE_LINEE
    ID_LINEE (chiave primaria)
    ID_PREVENTIVO (numerico, collegamento uno-a-molti su PREVENTIVO.ID_PREVENTIVO)
    LINEA_NUMERO (numerico intero)
    ARTICOLO (numerico, collegato ad una tabella articoli)
    QUANTITA (numerico)
    CAT_MERC

    -----------------------------

    Riflettendoci, le relazioni molti-a-molti potrebbero essere superflue….mi prendo un po' di tempo per studiarci

    By65Franco

    1. selezionare il preventivo desiderato
    2. inserire i records del preventivo nella tabella verbali
    3. se vuoi visualizzare il verbale appena generato lo passerai alla Form o subForm filtrando verbali per Id nuovo verbale creato oppure per id preventivo presente nella tabella verbale

    L'idea era esattamente quella….

    la cosa che non mi piace affatto è che aggiungi i records nel recordset della form … perchè? quale uso specifico ne fai di tale metodo? 

    L'intenzione era quella di “svincolarmi” da una struttura rigida del tipo “preventivo=verbale”, visto che come ho già detto nel mio caso non sempre un preventivo genera un verbale verso il magazzino, ed un verbale può essere generato anche senza preventivo (chiaramente questa funzione non l'ho ancora sviluppata, ma dovrà essere presente nella versione definitiva), per cui le tabelle dei dati devono essere comuni . Dopodichè il metodo più semplice che ho individuato è inserire i dati in tabella per mezzo della maschera corrente…non molto elegante, lo ammetto, ma nel mio caso efficace…

     Aggiungi una conoscenza non del tutto approfondita e molto fai-da-te….sono conscio dei miei limiti, ma cerco di affrontarli e superarli in primis con gli strumenti che conosco, poi se non ne vengo a capo cerco aiuto…. Ti ringrazio comunque per gli spunti di riflessione. Cerco di perderci un po' di tempo nel weekend per studiare una soluzione. Nel frattempo grazie.

Devi accedere o registrarti per scrivere nel forum
27 risposte