1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| Option Compare Database
Option Explicit
' Nom de la table dans laquelle on va sauver la sélection
Const strTableSelection = "tblSelectionFmSelecteur"
' Nom du champ dans la table
Const strChampSelection = "Réf produit"
' Nom du contrôle servant de clé pour mémoriser sélection
Const strCtlCle As String = "F1"
' Variable pour savoir si la touche "Control" est appuyée
Dim bToucheCTL As Boolean
' Variable pour savoir si la touche "Shift" est appuyée
Dim bToucheShift As Boolean
' ------------------------
' Chargement du formulaire
' ------------------------
Private Sub Form_Load()
Call ViderSelection
Me.Requery
Me.txtEnrSelectionnes = DCount("*", strTableSelection)
End Sub
' ---------------------
' Bouton Souris relâché
' ---------------------
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lngSelTop As Long, lngSelHeight As Long
Dim lngCurrRec As Long, lngCurrSecTop As Long
lngSelTop = Me.SelTop: lngSelHeight = Me.SelHeight
' Si pas de sélection, sortir
If lngSelHeight < 1 Then Exit Sub
lngCurrRec = Me.CurrentRecord
lngCurrSecTop = Me.CurrentSectionTop
bToucheCTL = ((Shift And acCtrlMask) = acCtrlMask)
bToucheShift = ((Shift And acShiftMask) = acShiftMask)
If Not bToucheCTL Then Call ViderSelection
SauverSelection2 lngSelTop, lngSelHeight
ActualiserFormulaire lngSelTop, lngSelHeight, lngCurrRec, lngCurrSecTop
Me.txtEnrSelectionnes = DCount("*", strTableSelection)
End Sub
' --------------------------------
' Suppression de la sauvegarde des
' enregistrements sauvegardé
' --------------------------------
Private Sub ViderSelection()
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "DELETE FROM [" & strTableSelection & "]"
End Sub
' -------------------------------------------
' Sauvegarde du champ clé des enregistrements
' sélectionnés
' -------------------------------------------
Private Sub SauverSelection2(lngSelTop As Long, lngSelHeight As Long)
Dim i As Long, rsfm As DAO.Recordset, db As DAO.Database, rs As DAO.Recordset
Dim strChamp As String
' Quitter si recordset vide
Set rsfm = Me.RecordsetClone
If rsfm.RecordCount = 0 Then Exit Sub
' Quitter si premier enregistrement de la sélection est
' au dela du dernier enregistrement
rsfm.MoveLast
If lngSelTop > rsfm.RecordCount Then Exit Sub
' Aller au premier enregistrement lngSelTop
rsfm.MoveFirst
rsfm.Move (lngSelTop - 1)
' Nom du champ lié au contrôle F1
strChamp = Me.F1.ControlSource
On Error GoTo ErrH:
' Copier champ clé "réf produit"
Set db = CurrentDb
Set rs = db.OpenRecordset(strTableSelection, dbOpenDynaset)
For i = 1 To lngSelHeight
rs.AddNew
rs(strChampSelection) = rsfm(strChamp)
rs.Update
rsfm.MoveNext
If rsfm.EOF Then Exit For
Next
ExitHere:
If rs.EditMode <> dbEditNone Then rs.CancelUpdate
rs.Close
Exit Sub
ErrH:
Select Case Err.Number
Case 3022 ' Ignorer les doublons
rs.CancelUpdate
If Not bToucheShift Then
' Syntaxe pour un champ numérique.
rs.FindFirst "[" & strChampSelection & "]=" & rsfm(strChamp)
' Syntaxe pour un champ texte.
'rs.FindFirst "[" & strChampSelection & "]='" & rsfm(strChamp) & "'"
If Not rs.NoMatch Then rs.Delete
End If
Resume Next
Case Else
MsgBox Err.Description, , "Erreur N. " & Err.Number & " dans Sub SauverSelection"
Resume ExitHere
End Select
End Sub
' ---------------------------------------- '
' Actualisation du formulaire et tentative
' de repositionnement
' ---------------------------------------- '
Sub ActualiserFormulaire(lngSelTop As Long, lngSelHeight As Long, _
lngCurrRec As Long, lngCurrSecTop As Long)
Dim lngDetailHeight As Long, lngHeaderHeight As Long, lngFooterHeight As Long
Dim lngRowNum As Long, lngRecNumRow1 As Long
Dim lngRowMax As Long
On Error Resume Next
lngHeaderHeight = Me.Section(acHeader).Height * IIf(Me.Section(acHeader).Visible = True, 1, 0)
lngFooterHeight = Me.Section(acFooter).Height * IIf(Me.Section(acFooter).Visible = True, 1, 0)
On Error GoTo 0
lngDetailHeight = Me.Section(acDetail).Height
' ligne = N° d'une ligne affichée par le formulaire continu.
' Compris entre 1 et Nombre max de lignes
' Par exemple 1 à 12, si le formulaire peut afficher 12 lignes simultanément
' Numéro de ligne de Me.CurrentRecord
lngRowNum = 1 + (lngCurrSecTop - lngHeaderHeight) / lngDetailHeight
' Numéro enregistrement de la ligne 1
lngRecNumRow1 = lngCurrRec - lngRowNum + 1
' Numéro ligne max
lngRowMax = (Me.InsideHeight - lngHeaderHeight - lngFooterHeight) / lngDetailHeight
Application.Echo False
Me.Requery
DoCmd.GoToRecord acActiveDataObject, , acLast
If lngRowNum <= lngRowMax Then
' Enr. actif etait visible
DoCmd.GoToRecord acActiveDataObject, , acGoTo, lngRecNumRow1
DoCmd.GoToRecord acActiveDataObject, , acGoTo, lngCurrRec
Me.SelTop = lngSelTop
Me.SelHeight = lngSelHeight
ElseIf lngSelHeight > lngRowMax Then
' Enr. actif n'était pas visible
' et selection > Nbre de lignes du formulaire
' - On va au dernier enregistrement de la selection
' en deux étapes pour être sur la dernière ligne.
' -> Sinon on se retrouve sur la première
' - On ne sélectionne que le dernier enregistrement.
' Sélection du bas vers le haut impossible avec SelTop/SelHeight
Me.SelTop = lngSelTop + lngSelHeight - lngRowMax
Me.SelTop = lngSelTop - 1 + lngSelHeight
Me.SelHeight = 1
Else
' Enr. actif n'était pas visible
' et selection <= Nbre de lignes du formulaire
' - On va au premier enregistrement de la sélection,
' il se postionne sur la première ligne
' - On recrée la sélection
Me.SelTop = lngSelTop
Me.SelHeight = lngSelHeight
End If
Application.Echo True
End Sub |
Partager