Query di Aggiornamento o Eliminazione vba

Anonimo
2016-03-15T14:36:30+00:00

Pierluigi

Salve a tutti e complimenti per il forum

eccomi di nuovo per un vostro aiuto

Ho tre tabelle:

1° Tabella (Articoli) :

id_articolo (chiave primaria)

CodArticolo

DescrizioneArticolo

Note

UItrev

Annirev

Ultcal

2° Tabella: (Armadio) :

id_armadio (chiave primaria)

CodArmadio

3° Tabella (Movimenti)

CodMovimento(chiave primaria)

Id_articolo

Id_armadio

DataMov

OraMov

Quantita

Notex

Le tre tabelle sono collegate:

id_articoli tabella(Articoli) uno a molti con tabella(Movimenti) id_articolo

id_armadiotabella(Armadio) uno a molti con tabella(Movimenti) id_armadio

Domanda : sarebbe possibile tramite una maschera fare un movimento articolo tramite una Query di Aggiornamento che aggiorni la quantità  di un articolo in base all’ Armadio scelto.

Nella maschera ho 3 combo: prima dove scelgo l’articolo (cmbArt)

Seconda combo : (**cmbArPre)**dove scelgo Armadio di prelievo

Casella di testo: dove mi esce la quantità dell’articolo disponibile in base in base all’Armadio scelto con combo cmbArPre.

Casella di testo: dove inserisco la quantità di prelievo.

Terza combo :(cmbArDes) dove scelgo l’Armadio di destinazione dell’Articolo.

Sarebbe possibile se ho Es: 100 pippo in Armadio A ne sposto 20 pippo in Armadio B con una query di Aggiornamento che mi aggiorni solo le quantità in Tabella Movimenti  senza avere numeri negativi:

100 pippo  A

-20 pippo  A

20  pippo B

Ma in questo modo : 80 pippo A

20 pippo B

In pratica che mi aggiorni solo le quantità in Tabella Movimenti

Questo è il codice della maschera attuale :

Private Sub Form_Load()

' MsgBox "ATTENZIONE !!!! COMPILARE DA 1 A 5 SEGUENDO LE ETICHETTE ROSSE "

End Sub

Private Sub cmdReset_Click()

DoCmd.Close acForm, "MasComplessa"

End Sub

Private Sub cmbArt_AfterUpdate()

' Aggiorno la Casella combinata Armadi con le quantita dell'articolo scelto

'Dim varArt As String

'varArt = Nz(Me!cmbArt.Value, "")

'Dim StSq1 As String

'StSq1 = ""

'StSq1 = StSq1 & "SELECT "

'StSq1 = StSq1 & "Movimenti.CodArmadio, "

'StSq1 = StSq1 & "Sum(Movimenti.Quantita) As TotArm "

'StSq1 = StSq1 & "FROM "

'StSq1 = StSq1 & "Movimenti "

'StSq1 = StSq1 & "GROUP BY "

'StSq1 = StSq1 & "Movimenti.CodArmadio, "

'StSq1 = StSq1 & "Movimenti.CodArticolo "

'StSq1 = StSq1 & "HAVING "

'StSq1 = StSq1 & "((Movimenti.CodArticolo)='" & varArt & "')"

'StSq1 = StSq1 & "AND Sum(Movimenti.Quantita) > 0"

'StSq1 = StSq1 & "AND Movimenti.CodArmadio <> 'FUORI USO'"

'StSq1 = StSq1 & ";"

'Me!cmbArPre.RowSource = StSq1

Me!cmbArPre.Requery

Me!FilArm.Visible = True

Me.txtQDis = Me.cmbArt.Column(2)

Me.txtQTra.Enabled = Nz(Me.cmbArt + Me.cmbArPre, 0)

'Call AggCon

End Sub

Private Sub cmbArPre_AfterUpdate()

' Aggiorno la casella combimata Articoli in funzione dell'armadio scelto

'Dim varArm As String

'varArm = Nz(Me!cmbArPre.Value, "")

'Dim StSq2 As String

'StSq2 = ""

'StSq2 = StSq2 & "SELECT "

'StSq2 = StSq2 & "Articoli.DescrizioneArticolo, "

'StSq2 = StSq2 & "Movimenti.CodArticolo, "

'StSq2 = StSq2 & "Articoli.Note, "

'StSq2 = StSq2 & "Sum(Movimenti.Quantita) As TotQu "

'StSq2 = StSq2 & "FROM "

'StSq2 = StSq2 & "Articoli "

'StSq2 = StSq2 & "INNER JOIN "

'StSq2 = StSq2 & "Movimenti "

'StSq2 = StSq2 & "ON "

'StSq2 = StSq2 & "Articoli.CodArticolo = Movimenti.CodArticolo "

'StSq2 = StSq2 & "GROUP BY "

'StSq2 = StSq2 & "Articoli.DescrizioneArticolo, "

'StSq2 = StSq2 & "Movimenti.CodArticolo, "

'StSq2 = StSq2 & "Articoli.Note, "

'StSq2 = StSq2 & "HAVING "

'StSq2 = StSq2 & "((Movimenti.CodArmadio)='" & varArm & "')"

'StSq2 = StSq2 & "AND Sum(Movimenti.Quantita) > 0"

'StSq2 = StSq2 & "AND Movimenti.CodArmadio <> 'FUORI USO'"

'StSq2 = StSq2 & ";"

'Me!cmbArt.RowSource = StSq2

Me.cmbArt.Requery

Me!FilArt.Visible = True

Me.txtQDis = Me.cmbArPre.Column(2)

Me.txtQTra.Enabled = Nz(Me.cmbArt + Me.cmbArPre, 0)

'Call AggCon

End Sub

Private Sub AggCon()

' aggiorna i controlli di maschera

'Dim varArt As String

'varArt = Nz(Me!cmbArt.Value, "")

'Dim varArm As String

'varArm = Nz(Me!cmbArPre.Value, "")

'    Me.txtQTra.Enabled = True

'     Me.txtQDis.Value = DSum("Movimenti.Quantita", "Movimenti", "((codArticolo='" & varArt & "') AND (CodArmadio='" & varArm & "'))")

End Sub

Private Sub txtQTra_DblClick(Cancel As Integer)

Me.txtQTra.Value = Me.txtQDis.Value

Call txtQTra_AfterUpdate

End Sub

Private Sub txtQTra_AfterUpdate()

If Me.txtQTra.Value > Me.txtQDis.Value Then

Dim str As String

str = ""

str = str & "Vuoi trasferire una quantita" & vbNewLine

str = str & "superiore al disponibile" & vbNewLine & vbNewLine

str = str & "La operazione è consentita" & vbNewLine

str = str & "avrai come risultato delle" & vbNewLine

str = str & "giacenze negative" & vbNewLine & vbNewLine

str = str & "         Vuoi proseguire ???" & vbNewLine

Dim msgxx As Integer

msgxx = MsgBox(str, vbInformation + vbYesNo + vbDefaultButton2)

 If msgxx = 7 Then      ' si = 6  /  No = 7

Me.txtQTra.Value = ""

'DoCmd.GoToControl ("TxtQTra")

 Me.cmbArDes.Enabled = True

Exit Sub

End If

End If

End Sub

Private Sub cmbArDes_AfterUpdate()

Me.cmdExecute.Enabled = True

Me.cmdExecute.Caption = "Trasferisci"

End Sub

Private Sub cmdExecute_Click()

Dim varDat As Date   ' La data

varDat = Me.txtDatx.Value

Dim varArt As String ' Atricolo

varArt = Me.cmbArt.Value

Dim varQua As Integer

varQua = Me.txtQTra.Value

Dim varAPr As String ' Armadio di prelievo

varAPr = Me.cmbArPre.Value

Dim varADe As String ' Armadio di Destinazione

varADe = Me.cmbArDes.Value

Dim varNot As String

varNot = Nz(Me.txtNote.Value, "")

Dim strSql As String

strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

Me.cmbArt & "," & Me.cmbArDes & "," & CLng(Me.txtDatx) & "," & Me.txtQTra & ",'" & Me.txtNote & "')"

DBEngine(0)(0).Execute strSql, &H80

strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

Me.cmbArt & "," & Me.cmbArPre & "," & CLng(Me.txtDatx) & "," & -Me.txtQTra & ",'" & Me.txtNote & "')"

DBEngine(0)(0).Execute strSql, &H80

MsgBox " OK! MOVIMENTO ESEGUITO! "

 Call cmdReset_Click

End Sub

' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

' Faccio il carico nell'armadio scelto

'Dim StSq3 As String

'StSq3 = ""

'StSq3 = StSq3 & "INSERT INTO "

'StSq3 = StSq3 & "Movimenti "

'StSq3 = StSq3 & "( "

'StSq3 = StSq3 & "DataMov, "

'StSq3 = StSq3 & "CodArticolo, "

'StSq3 = StSq3 & "Quantita, "

'StSq3 = StSq3 & "CodArmadio, "

'StSq3 = StSq3 & "Notex "

'StSq3 = StSq3 & ") "

'StSq3 = StSq3 & "SELECT "

'StSq3 = StSq3 & "#" & Format$(varDat, "mm/dd/yyyy") & "# AS XDat, "

'StSq3 = StSq3 & "'" & varArt & "' AS XArt, "

'StSq3 = StSq3 & varQua & " AS XQua, "

'StSq3 = StSq3 & "'" & varADe & "' AS XArm, "

'StSq3 = StSq3 & "'" & varNot & "' AS XNot"

'StSq3 = StSq3 & ";"

'DBEngine(0)(0).Execute (StSq3)' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

' Faccio lo scarico nell'armadio scelto

'StSq3 = ""

'StSq3 = StSq3 & "INSERT INTO "

'StSq3 = StSq3 & "Movimenti "

'StSq3 = StSq3 & "( "

'StSq3 = StSq3 & "DataMov, "

'StSq3 = StSq3 & "CodArticolo, "

'StSq3 = StSq3 & "Quantita, "

'StSq3 = StSq3 & "CodArmadio, "

'StSq3 = StSq3 & "Notex "

'StSq3 = StSq3 & ") "

'StSq3 = StSq3 & "SELECT "

'StSq3 = StSq3 & "#" & Format$(varDat, "mm/dd/yyyy") & "# AS XDat, "

'StSq3 = StSq3 & "'" & varArt & "' AS XArt, "

'StSq3 = StSq3 & (varQua * -1) & " AS XQua, "

'StSq3 = StSq3 & "'" & varAPr & "' AS XArm, "

'StSq3 = StSq3 & "'" & varNot & "' AS XNot"

'StSq3 = StSq3 & ";"

'DBEngine(0)(0).Execute (StSq3)

' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

'MsgBox " OK! MOVIMENTO ESEGUITO! "

'Call cmdReset_Click

'End Sub

Ciao,grazie

 Pierluigi

Microsoft 365 e Office | Access | Per la casa | 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

11 risposte

Ordina per: Più utili
  1. Anonimo
    2016-03-15T19:58:47+00:00

    ciao Pierluigi,

    [...]

    Altro problema....... no ne esco più.......

    [...]

    posta pure che vedrai che qualcuno risponde sempre :-)

    [...]

    Come posso fare per visualizzare questo sempre in Tabella Movimenti :

    [...]

    a me piaceva più prima...comunque...

    devi condizionare la stringa sql sulla base di questo ragionamento.

    se l'articolo che sto spostando in quell'armadio di destinazione non ha alcun record per quel armandio allora devo inserire una riga per la qta che voglio spostare.

    Altrimenti...se una riga di quell'articolo per quell'armadio ha una riga allora aggiorno la qta esistente di quella riga presente nella tabella sommandogli la qta che sto spostando.

    tutto questo in VBA diventa questo....ah....ovviamente parti da una situazione pulita di movimenti in cui hai solo un articolo per armadio inserito nella tabella movimenti  e non due righe o più per articolo con lo stesso armadio.

    ( spero di essermi spiegato...)

    cosi potrebbe andare...tutti gli articoli hanno qta negli armadi tranne sandro che per il quale puoi aggiungere l'armadio c o variare gli altri due).

    questo l'evento click del command button cmdExecute , ho inserito anche un controllo per evitare di spostare più limoni, pere o altro da un armadio all'altro di quelle disponibili :

    Private Sub cmdExecute_Click()

    If Me.txtQTra > CLng(Me.txtQDis) Then

        VBA.MsgBox "non puoi movimentare una qta eccedente quella disposibile!", vbCritical, "warning"

        Exit Sub

    End If

    Dim strSql As String

    strSql = "UPDATE Movimenti SET Movimenti.Quantita =" & Me.txtQDis - Me.txtQTra & _

              " WHERE Movimenti.id_articolo=" & Me.cmbArt & _

              " AND Movimenti.id_armadio=" & Me.cmbArPre

    DBEngine(0)(0).Execute strSql, &H80

    strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

              Me.cmbArt & "," & Me.cmbArDes & "," & CLng(Me.txtDatx) & "," & Me.txtQTra & ",'" & Me.txtNote & "')"

    If DCount("id_armadio", "movimenti", "id_armadio=" & Me.cmbArDes & " and id_articolo=" & Me.cmbArt) > 0 Then

        Dim lngQtyToBeUpdated As Long

        lngQtyToBeUpdated = DLookup("quantita", "movimenti", "id_armadio=" & Me.cmbArDes & " and id_articolo=" & Me.cmbArt)

        strSql = "UPDATE Movimenti SET Movimenti.Quantita =" & lngQtyToBeUpdated + Me.txtQTra & _

                 " WHERE Movimenti.id_articolo=" & Me.cmbArt & _

                 " AND Movimenti.id_armadio=" & Me.cmbArDes

    End If

    DBEngine(0)(0).Execute strSql, &H80

    Me.cmbArt.Requery

    Me.cmbArPre.Requery

    MsgBox " OK! MOVIMENTO ESEGUITO! "

    'Call cmdReset_Click

    End Sub

    **** edit ****

    aggiungi un Me.cmbArDes.Requery su dopo aggiornamento della combo cmbArPre appena prima di end sub, altrimenti il controllo non mostra tutti gli armadi di destinazione... :-)

    **** end edit ****

    Facci sapere.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-03-15T18:52:44+00:00

    ciao,

    Altro problema....... no ne esco più.......

    Ho questa tabella : Movimenti

    In Armadio AA ho 100 limoni

    Cod_Movimento Id_armadio Id_articolo Quantita
    77 AA LIMONI 100

    Faccio movimento; tolgo da Armadio AA  5 LIMONI e li metto in Armadio BB ed ho:

    CodMovimento Id_armadio Id_articolo Quantita
    77 AA LIMONI 95
    78 BB LIMONI 5

    tolgo 2 LIMONI da Armadio BB e li metto in Armadio AA e la tabella Movimenti mi visualizza questo :

    CodMovimento Id_armadio Id_articolo Quantita
    77 AA LIMONI 95
    78 BB LIMONI 5
    79 AA LIMONI 2

    Come posso fare per visualizzare questo sempre in Tabella Movimenti :

    CodMovimento Id_armadio Id_articolo Quantita
    77 AA LIMONI 97
    78 BB LIMONI 3

    Per Fare i Movimenti uso Maschera con questo Codice :

    Private Sub Form_Load()

       ' MsgBox "ATTENZIONE !!!! COMPILARE DA 1 A 5 SEGUENDO LE ETICHETTE ROSSE "

    End Sub

    Private Sub cmdReset_Click()

        DoCmd.Close acForm, "MasComplessa"

    End Sub

    Private Sub cmbArt_AfterUpdate()

    Me!cmbArPre.Requery

    Me!FilArm.Visible = True

    Me.txtQDis = Me.cmbArt.Column(2)

    Me.txtQTra.Enabled = Nz(Me.cmbArt + Me.cmbArPre, 0)

    'Call AggCon

    End Sub

    Private Sub cmbArPre_AfterUpdate()

    Me.cmbArt.Requery

    Me!FilArt.Visible = True

    Me.txtQDis = Me.cmbArPre.Column(2)

    Me.txtQTra.Enabled = Nz(Me.cmbArt + Me.cmbArPre, 0)

    'Call AggCon

    End Sub

    Private Sub AggCon()

    ' aggiorna i controlli di maschera

    'Dim varArt As String

    'varArt = Nz(Me!cmbArt.Value, "")

    'Dim varArm As String

    'varArm = Nz(Me!cmbArPre.Value, "")

     '    Me.txtQTra.Enabled = True

       '     Me.txtQDis.Value = DSum("Movimenti.Quantita", "Movimenti", "((codArticolo='" & varArt & "') AND (CodArmadio='" & varArm & "'))")

        End Sub

    Private Sub txtQTra_DblClick(Cancel As Integer)

        Me.txtQTra.Value = Me.txtQDis.Value

        Call txtQTra_AfterUpdate

    End Sub

    Private Sub txtQTra_AfterUpdate()

    If Me.txtQTra.Value > Me.txtQDis.Value Then

    Dim str As String

    str = ""

    str = str & "Vuoi trasferire una quantita" & vbNewLine

    str = str & "superiore al disponibile" & vbNewLine & vbNewLine

    str = str & "La operazione è consentita" & vbNewLine

    str = str & "avrai come risultato delle" & vbNewLine

    str = str & "giacenze negative" & vbNewLine & vbNewLine

    str = str & "         Vuoi proseguire ???" & vbNewLine

    Dim msgxx As Integer

    msgxx = MsgBox(str, vbInformation + vbYesNo + vbDefaultButton2)

    If msgxx = 7 Then      ' si = 6  /  No = 7

                Me.txtQTra.Value = ""

                'DoCmd.GoToControl ("TxtQTra")

     Me.cmbArDes.Enabled = True

                Exit Sub

            End If

    End If

    End Sub

    Private Sub cmbArDes_AfterUpdate()

         Me.cmdExecute.Enabled = True

        Me.cmdExecute.Caption = "Trasferisci"

    End Sub

    Private Sub cmdExecute_Click()

    Dim varDat As Date   ' La data

    varDat = Me.txtDatx.Value

    Dim varArt As String ' Atricolo

    varArt = Me.cmbArt.Value

    Dim varQua As Integer

    varQua = Me.txtQTra.Value

    Dim varAPr As String ' Armadio di prelievo

    varAPr = Me.cmbArPre.Value

    Dim varADe As String ' Armadio di Destinazione

    varADe = Me.cmbArDes.Value

    Dim varNot As String

    varNot = Nz(Me.txtNote.Value, "")

    Dim strSql As String

    strSql = "UPDATE Movimenti SET Movimenti.Quantita =" & Me.txtQDis - Me.txtQTra & _

               " WHERE Movimenti.id_articolo=" & Me.cmbArt & _

               " AND Movimenti.id_armadio=" & Me.cmbArPre

    Me.cmbArt.Requery

     Me.cmbArPre.Requery

    DBEngine(0)(0).Execute strSql, &H80

    strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

              Me.cmbArt & "," & Me.cmbArDes & "," & CLng(Me.txtDatx) & "," & Me.txtQTra & ",'" & Me.txtNote & "')"

    Me.cmbArt.Requery

    Me.cmbArDes.Requery

    DBEngine(0)(0).Execute strSql, &H80

    MsgBox " OK! MOVIMENTO ESEGUITO! "

     Call cmdReset_Click

    End Sub

    'MsgBox " OK! MOVIMENTO ESEGUITO! "

    'Call cmdReset_Click

    'End Sub

    ciao, grazie

    Pierluigi

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-03-15T17:27:47+00:00

    ciao,Sandro

    chiedo scusa avevo cancellato questo:

    strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

              Me.cmbArt & "," & Me.cmbArDes & "," & CLng(Me.txtDatx) & "," & Me.txtQTra & ",'" & Me.txtNote & "')"

    Me.cmbArt.Requery

     Me.cmbArDes.Requery

    ora funziona....

    ciao, Sandro,

    grazie, grazie mille

    Pierluigi

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-03-15T17:07:30+00:00

    ciao,Sandro

    ho incollato il tuo codice, in Tabella Movimenti mi aggiorna il totale dell'Armadio di prelievo ma non mi inserisce

    l'Armadio di destinazione : se sposto 5 LIMONI dall'Armadio AA (con giacenza 100 limoni), la Tabella Movimenti (qui sotto) è giusta.

    92 LIMONI AA 11-mar-16 01:29 95

    Siccome i 5 LIMONI li ho messi nell'Armadio BB, con la combo (cmbArDes) la Tabella Movimenti dovrebbe essere

    così :

    92 LIMONI AA 11-mar-16 01:29 95
    183 LIMONI BB 15-mar-16 18:02 5

    ciao, Sandro, grazie

    Pierluigi

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2016-03-15T15:27:39+00:00

    ciao Pierluigi,

    prova a sostituire l'action query del seguente statement :

    strSql = "insert into movimenti (id_articolo, id_armadio, dataMov, quantita, notex) values (" & _

               Me.cmbArt & "," & Me.cmbArPre & "," & CLng(Me.txtDatx) & "," & -Me.txtQTra & ",'" & Me.txtNote & "')"

    con questa :

     strSql = "UPDATE Movimenti SET Movimenti.Quantita =" & Me.txtQDis - Me.txtQTra & _

              " WHERE Movimenti.id_articolo=" & Me.cmbArt & _

              " AND Movimenti.id_armadio=" & Me.cmbArPre

    e aggiungi queste righe :

    Me.cmbArt.Requery

    Me.cmbArPre.Requery

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento