Condividi tramite

Selezionare Ultimo Record Inserito

Anonimo
2024-03-06T09:35:18+00:00

Buongiorno a tutti

eccomi con una nuova richiesta di aiuto, ho una tabella "DBDDT" collegata con una relazione una a molti con la tabella "DB_DETTAGLIODDT", ho necessità di poter dovere cancellare l'ultimo DDT inserito e solo questo, non posso quindi lasciare all'utente la possibilità di scegliere di cancellare il record, ma devo pilotarlo esclusivamente sull'ultimo DDT inserito.

La Tabella principale non ha un campo contatore, il campo chiave è il campo "NUM_DDT" che è un campo TESTO composto da un numero di quattro cifre, la barra "/" e l'anno, il numero si rinnova al primo DDT del nuovo anno, in pratica se l'ultimo DDT dell'anno 2023 è il 0177/2023 il primo DDT del 2024 sarà 0001/2024, il tutto ottenuto tramite un algoritmo.

Il problema è che se vado a selezionare l'ultimo record con il comando:

DMax("NUM_DDT", "DBDDT"), mi riporta il più alto che per lui è 0177/2023 mentre per me è il 0029/2024, ho provato anche con l'istruzione DLast ma il risultato non cambia.

Come posso fare per permettere al programma di posizionarsi esclusivamente sull'ultimo DDT inserito e attraverso l'istruzione:

DoCmd.RunCommand acCmdDeleteRecord

essere sicuro che vada a cancellare l'ultimo DDT?

Grazie a tutti per la collaborazione

Ciro

Microsoft 365 e Office | Access | Per il lavoro | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-03-07T08:48:29+00:00

ciao Ciro,

se al click del command button visualizzi nella form il record da eliminare, non c'è ragione che venga eliminato altro...non mi viene in mente null'altro sfortunatamente...

l'istruzione che segue :

DoCmd.RunCommand acCmdDeleteRecord

di fatto elimina il record corrente...

sorry,

ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2024-03-06T16:28:20+00:00

Ciao,

ti basta una istruzione del tipo :

DoCmd.RunSql ("Delete * From DBDDT Where num_ddt = '" & MaxKey & "'")

e eventualmente una requery della form se il record è visualizzato.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2024-03-06T15:01:52+00:00

    ciao Ciro,

    piacere tutto mio.

    tabella1 nel mio esempio è la tabella lato1 che nel tuo caso contiene la testata del ddt, data, numero, destinatario, consegna...ect...

    la query estrae il numero massimo di DDT dell'anno, il predicato va adattato per il nome reali dei campi del tuo scenario.

    right$ è una funzione intrinseca che permette di estrarre da dx un numero di caratteri da una stringa, in questo caso restituisce l'anno del ddt.

    le modiche da apportare dovrebbero essere veramente minimali....

    facci sapere.

    un saluto, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2024-03-06T13:51:49+00:00

    Ciao Sandro

    è sempre un piacere risentirti, purtroppo no credo di aver capito bene cosa suggerisci, vediamo un po'

    quella che indichi come tabella1 è la mia tabella DBDDT, corretto?

    Da questa creo una query (che tu indichi con "qMaxPR" ) della quale non capisco i predicato (sarà il mio limite del SQL), e guardandola dl unto di vista della struttura, seleziono l'anno (campo già presente nella tabella DBDDT e creo un campo espressione dove calcolo il MaxDiProgressivo, utilizzando l'espressione Right$?

    scusami ma sono moto arrugginito, è tanto che non uso access

    un abbraccio

    Ciro

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2024-03-06T13:13:21+00:00

    ciao Ingegnere,

    allora:

    tabella e relativa query che estrare il maggiore. attenzione sempre alla definizione di primo e ultimo all'interno dei db relazionali, in quanto conta sempre l'ordinamento.

    predicato della query :

    SELECT Right$([T.progressivo],4) AS anno, Max(T.progressivo) AS MaxDiprogressivo

    FROM Tabella1 AS T

    GROUP BY Right$([T.progressivo],4)

    HAVING (((Right$([T.progressivo],4))=Year(Date())));

    estramamente selettivo.

    da Vba di un command button :

    Private Sub cmdDelete_Click() 
    
    Dim rst    As DAO.Recordset 
    
    Dim strPR  As String 
    
    Set rst = DBEngine(0)(0).OpenRecordset("qMaxPR", 4) 
    
    Me.RecordsetClone.FindFirst "progressivo='" & rst.Fields(1) & "'" 
    
    If Not rst.NoMatch Then 
    
       Me.Bookmark = Me.RecordsetClone.Bookmark 
    
       If VBA.MsgBox(prompt:="Vuoi cancellare il record corrente?", _ 
    
                  buttons:=vbCritical + vbOKCancel, _ 
    
                  title:="Attenzione..!") Then 
    
         DoCmd.SetWarnings False 
    
         DoCmd.RunCommand acCmdDeleteRecord 
    
         DoCmd.SetWarnings True 
    
       End If 
    
    End If 
    
    DBEngine(0)(0).Execute "delete * from tabella2 where progressivo='" & rst.Fields(1) & "'", &H80 
    
    rst.Close 
    
    Set rst = Nothing 
    
    End Sub 
    

    la seconda action query invocata in VBA ha lo scopo di cancellare le righe di dettaglio lato molti selezionando la "pseudo" PK del numero di DDT.

    Magari effettua qualche prova su un DB muletto, prima di perdere info vitali :-)

    HTH.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento