Sign in Join
Wiki copytemporary

MS Access/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-Cette page explique comment utiliser une base de données **Microsoft Access** en utilisant [[ODBCConn/fr|ODBC]] et le SQLDB intégré de FPC.
1+---
2+[[Portal:Databases|**Portail de la base de données**]]
3+Références: · [[Databases/fr|Information générale]] · [[Database libraries/fr|Bibliothèques]] · [[Database field type/fr|Types de champ]] · [[Data Controls tab/fr|Contrôles]] · [[Lazarus DB Faq/fr|FAQ]] · [[SqlDBHowto/fr|Comment faire en SQL ?]] · [[Working With TSQLQuery/fr|Travailler avec TSQLQuery]] · [[How to write in-memory database applications in Lazarus/FPC/fr|Applications de base de données en mémoire]] · Tutoriels/articles pratiques : · [[Lazarus Database Overview/fr|Vue d'ensemble]] · [[SQLdb Tutorial0/fr|0 - Configuration de la base de données]] · [[SQLdb Tutorial1/fr|1 - Commençons]] · [[SQLdb Tutorial2/fr|2 - Edition]] · [[SQLdb Tutorial3/fr|3 - Requêtes]] · [[SQLdb Tutorial4/fr|4 - Modules de données]] · [[SQLdb Programming Reference/fr|Référence de programmation SQLdb]] · Bases de données · [[Advantage Database Server/fr|Advantage]] \- [[MySQLDatabases/fr|MySQL]] \- [[mssqlconn/fr|MSSQL]] \- [[postgres/fr|Postgres]] \- [[Firebird/fr|Interbase]] \- [[Firebird/fr|Firebird]] \- [[Oracle/fr|Oracle]] \- [[ODBCConn/fr|ODBC]] \- [[TParadox/fr|Paradox]] \- [[SQLite/fr|SQLite]] \- [[Lazarus Tdbf Tutorial/fr|dBASE]] \- MS Access \- [[Zeos tutorial/fr|Zeos]]
4+
5+Cette page explique comment utiliser une base de données **Microsoft Access** en utilisant [[ODBCConn/fr|ODBC]] et le SQLDB intégré de FPC.
26
37# Spécificités MS Access
48
59## UsePrimaryKeyAsKey
610
7-Dans les propriétés **TSQLQuery**, vous pouvez avoir besoin de définir UsePrimaryKeyAsKey à False.
11+Dans les propriétés **TSQLQuery** , vous pouvez avoir besoin de définir UsePrimaryKeyAsKey à False.
812
913## Obtenir le numéro auto de clé primaire tout juste inséré
1014
11-Après insertion des données, Access 2000 et supérieur permet de récupérer la clé primaire auto-incrémentée en utuilisant cette requête:
12-
13-``` SQL
15+Après insertion des données, Access 2000 et supérieur permet de récupérer la clé primaire auto-incrémentée en utuilisant cette requête:
16+```
1417SELECT @@IDENTITY
1518```
1619
1720## Pilotes ODBC
1821
1922### Windows
2023
21-Il y a deux pilotes [[ODBCConn/fr|ODBC]] différent pour Microsoft Access :
24+Il y a deux pilotes [[ODBCConn/fr|ODBC]] différent pour Microsoft Access :
2225
23-- L'ancien pilote qui peut seulement utiliser des fichiers au format.mdb, le nom du pilote est "Microsoft Access Driver (*.mdb)". Inclus dans plusieurs versions de Windows (de 2000 jusqu'à Vista (inclus?)) ; téléchargeable pour les anciennes versions de Windows comme partie des composants MDAC ou des composants Jet. En 32 bit seulement.
24-- Le nouveau pilote qui peut accéder aux fichiers .mdb et .accdb à la fois, le nom du pilote est "Microsoft Access Driver (*.mdb, *.accdb)". Téléchargeable comme le "Microsoft Access Database Engine 2010 Redistributable" ; disponible en 32 et 64 bit.
26+ * L'ancien pilote qui peut seulement utiliser des fichiers au format.mdb, le nom du pilote est "Microsoft Access Driver (*.mdb)". Inclus dans plusieurs versions de Windows (de 2000 jusqu'à Vista (inclus?)) ; téléchargeable pour les anciennes versions de Windows comme partie des composants MDAC ou des composants Jet. En 32 bit seulement.
27+ * Le nouveau pilote qui peut accéder aux fichiers .mdb et .accdb à la fois, le nom du pilote est "Microsoft Access Driver (*.mdb, *.accdb)". Téléchargeable comme le "Microsoft Access Database Engine 2010 Redistributable" ; disponible en 32 et 64 bit.
2528
26-Comme d'habitude, avec un Lazarus/FPC 32 bit, utilisez des pilotes ODBC 32 bit. Avec un Lazarus/FPC 64 bit, utilisez des pilotes ODBC 64 bit.
29+Comme d'habitude, avec un Lazarus/FPC 32 bit, utilisez des pilotes ODBC 32 bit. Avec un Lazarus/FPC 64 bit, utilisez des pilotes ODBC 64 bit.
2730
2831### Unix/Linux
2932
30-Le [projet mdbtools](http://sourceforge.net/projects/mdbtools/) offre un support limité pour MS Access. Il inclut un pilote ODBC qui pourrait être utilisé. Essayez d'installer des paquets comme mdbtools mdbtools-dev mdbtools-gmdb.
33+Le [projet mdbtools](<http://sourceforge.net/projects/mdbtools/>) offre un support limité pour MS Access. Il inclut un pilote ODBC qui pourrait être utilisé. Essayez d'installer des paquets comme mdbtools mdbtools-dev mdbtools-gmdb.
3134
32-Au moins sur Debian, Le nom du pilote ODBC est "MDBTools".
35+Au moins sur Debian, Le nom du pilote ODBC est "MDBTools".
3336
3437# Instructions de DSN basé sur un fichier
3538
36-Un fichier DSN est simplement un fichier contenant les réglage de connexion. La raison de ce fichier DSN est que si vous voulez distribuer une connexion à une source de données à plusieurs utilisateurs sur différents systèmes sans avoir à la configurer sur chaque système. Par exemple, je peux créer une un fichier DSN vers une base de données de rapports sur mon bureau. Je peux alors envoyer le fichier vers mes utilisateurs, ils peuvent enregistrer le fichier DSN dans leur disque dur et faire pointer leur applications de rapports vers le fichier DSN.
39+Un fichier DSN est simplement un fichier contenant les réglage de connexion. La raison de ce fichier DSN est que si vous voulez distribuer une connexion à une source de données à plusieurs utilisateurs sur différents systèmes sans avoir à la configurer sur chaque système. Par exemple, je peux créer une un fichier DSN vers une base de données de rapports sur mon bureau. Je peux alors envoyer le fichier vers mes utilisateurs, ils peuvent enregistrer le fichier DSN dans leur disque dur et faire pointer leur applications de rapports vers le fichier DSN.
3740
38-Si vous voulez utiliser un DSN basé sur fichier avec le pilote SQLdb ODBC :
41+Si vous voulez utiliser un DSN basé sur fichier avec le pilote SQLdb ODBC :
3942
4043## Configurer le fichier DSN
4144
42-- Ouvrez le \[Source de donnés ODBC\] dans le panneau de contrôle de l'outil d'administration.
43-- Allez sur l'onglet \[Fichier DSN\], cliquez sur Ajouter puis sélectionner \<pilote Microsoft Access\>.
44-- Ensuite, naviguez vers le chemin courant de votre projet Lazarus por enregistrer le fichier .dsn, parce que ce fichier DSN contiendra la configuration demandée pour accéder à votre fichier de base de données Access (.mdb) qui sera utilisé dans votre TODBCConnection \[FileDSN\].
45+ * Ouvrez le [Source de donnés ODBC] dans le panneau de contrôle de l'outil d'administration.
46+ * Allez sur l'onglet [Fichier DSN], cliquez sur Ajouter puis sélectionner <pilote Microsoft Access>.
47+ * Ensuite, naviguez vers le chemin courant de votre projet Lazarus por enregistrer le fichier .dsn, parce que ce fichier DSN contiendra la configuration demandée pour accéder à votre fichier de base de données Access (.mdb) qui sera utilisé dans votre TODBCConnection [FileDSN].
4548
4649### Contenus de fichier DSN
4750
48-A titre de référence, un fichier DSN qui fait référence à un fichier de base de données MS Access **peut** ressembler à quelque chose **comme** ceci :
49-
50-```DOS
51+A titre de référence, un fichier DSN qui fait référence à un fichier de base de données MS Access **peut** ressembler à quelque chose **comme** ceci :
52+```
5153[ODBC]
52-DRIVER=Microsoft Access Driver (*.mdb)
53-UID=admin
54-UserCommitSync=Yes
55-Threads=3
56-SafeTransactions=0
57-PageTimeout=5
58-MaxScanRows=8
59-MaxBufferSize=2048
60-FIL=MS Access
61-DriverId=25
62-DefaultDir=
63-DBQ=YOUR_msaccess.mdb
54+ DRIVER=Microsoft Access Driver (*.mdb)
55+ UID=admin
56+ UserCommitSync=Yes
57+ Threads=3
58+ SafeTransactions=0
59+ PageTimeout=5
60+ MaxScanRows=8
61+ MaxBufferSize=2048
62+ FIL=MS Access
63+ DriverId=25
64+ DefaultDir=
65+ DBQ=YOUR_msaccess.mdb
6466```
6567
6668## Configurez votre projet pour utiliser un DSN basé sur fichier
6769
68-L'utilisation de grille et d'autres composants liés aux données est identique à celle des autres connecteurs SQLDB, donc nous n'en parlerons pas ici.
70+L'utilisation de grille et d'autres composants liés aux données est identique à celle des autres connecteurs SQLDB, donc nous n'en parlerons pas ici.
6971
70-Comme vous utilisez une connexion ODBC, vous devriez avoir un objet **TODBCConnection**.
72+Comme vous utilisez une connexion ODBC, vous devriez avoir un objet **TODBCConnection**.
7173
72-Propriétés TOBDCConnection :
74+Propriétés TOBDCConnection :
7375
74-- FileDSN : le chemin d'accès complet (avec le nom de fichier) vers le fichier DSN enregistré précédemment, p.ex. c:\mylazarus\project1\myFile.dsn.
75-- Username : admin (ou n'importe quel utilisateur dont vous avez besoin si vous exploitez la sécurité d'Access), *ce paramètre n'est pas nécessaire si aucune sécurité d'Access n'est utilisée*'.
76+ * FileDSN : le chemin d'accès complet (avec le nom de fichier) vers le fichier DSN enregistré précédemment, p.ex. c:\mylazarus\project1\myFile.dsn.
77+ * Username : admin (ou n'importe quel utilisateur dont vous avez besoin si vous exploitez la sécurité d'Access), _ce paramètre n'est pas nécessaire si aucune sécurité d'Access n'est utilisée'_.
7678
77-Ne pas définir d'autres propriétés.
79+Ne pas définir d'autres propriétés.
7880
7981# DSN Système/Utilisateur
8082
81-Comme expliqué dans l'article sur [[ODBCConn/fr|ODBC]], vous pouvez aussi utiliser des DSN systèem ou utilisateur, où les réglages de connexion sont définis dans le panneau de contrôle au lieu d'être stocké dans un fichier.
83+Comme expliqué dans l'article sur [[ODBCConn/fr|ODBC]], vous pouvez aussi utiliser des DSN systèem ou utilisateur, où les réglages de connexion sont définis dans le panneau de contrôle au lieu d'être stocké dans un fichier.
8284
83-Le TODBCConnection devrait avoir comme DatabaseName : \<name_of_your_DSN\>.
85+Le TODBCConnection devrait avoir comme DatabaseName : <name_of_your_DSN>.
8486
8587# DSN sans connexion
8688
87-Comme expliqué dans l'article sur [[ODBCConn/fr|ODBC]], vous pouvez aussi créer une connexion sans DSN vers votre base de données Access, vous pouvez spécifier tous les paramètres dans le code, quelque chose comme cela :
88-
89-``` pascal
90- //Notice we're using the new MS Access driver, we could probably use the old one too:
91- conn.Driver:='Microsoft Access Driver (*.mdb, *.accdb)';
92- conn.Params.Add('DBQ=c:\somedirectory\test.mdb');
93- ... add whatever parameters you want/need...
89+Comme expliqué dans l'article sur [[ODBCConn/fr|ODBC]], vous pouvez aussi créer une connexion sans DSN vers votre base de données Access, vous pouvez spécifier tous les paramètres dans le code, quelque chose comme cela :
9490```
95-
96-Voici un exemple de comment interroger une table dans un fichier .mdb en utilisant TODBCConnection, TSQLTransaction and TSQLQuery (le fichier .mdb existe dans le même dossier que le programme exécutable) :
91+//Notice we're using the new MS Access driver, we could probably use the old one too:
92+ conn.Driver:='Microsoft Access Driver (*.mdb, *.accdb)';
93+ conn.Params.Add('DBQ=c:\somedirectory\test.mdb');
94+ ... add whatever parameters you want/need...
95+```
9796
98-``` pascal
97+Voici un exemple de comment interroger une table dans un fichier .mdb en utilisant TODBCConnection, TSQLTransaction and TSQLQuery (le fichier .mdb existe dans le même dossier que le programme exécutable) :
98+```
9999procedure TForm1.Button1Click(Sender: TObject);
100-begin
101- //connection
102- ODBCConnection1.Driver := 'Microsoft Access Driver (*.mdb, *.accdb)';
103- ODBCConnection1.Params.Add('DBQ=.\test.mdb'); // or specify full path to mdb file
104- ODBCConnection1.Params.Add('Locale Identifier=1031');
105- ODBCConnection1.Params.Add('ExtendedAnsiSQL=1');
106- ODBCConnection1.Params.Add('CHARSET=ansi');
107- ODBCConnection1.Connected := True;
108- ODBCConnection1.KeepConnection := True;
109-
110- //transaction
111- SQLTransaction1.DataBase := ODBCConnection1;
112- SQLTransaction1.Action := caCommit;
113- SQLTransaction1.Active := True;
114-
115- SQLQuery1.DataBase := ODBCConnection1;
116- SQLQuery1.UsePrimaryKeyAsKey := False;
117- SQLQuery1.SQL.Text := 'select * from Customers';
118- SQLQuery1.Open;
119-end;
100+ begin
101+ //connection
102+ ODBCConnection1.Driver := 'Microsoft Access Driver (*.mdb, *.accdb)';
103+ ODBCConnection1.Params.Add('DBQ=.\test.mdb'); // or specify full path to mdb file
104+ ODBCConnection1.Params.Add('Locale Identifier=1031');
105+ ODBCConnection1.Params.Add('ExtendedAnsiSQL=1');
106+ ODBCConnection1.Params.Add('CHARSET=ansi');
107+ ODBCConnection1.Connected := True;
108+ ODBCConnection1.KeepConnection := True;
109+
110+ //transaction
111+ SQLTransaction1.DataBase := ODBCConnection1;
112+ SQLTransaction1.Action := caCommit;
113+ SQLTransaction1.Active := True;
114+
115+ SQLQuery1.DataBase := ODBCConnection1;
116+ SQLQuery1.UsePrimaryKeyAsKey := False;
117+ SQLQuery1.SQL.Text := 'select * from Customers';
118+ SQLQuery1.Open;
119+ end;
120120```
121121
122122# Exemple de code
123123
124124## Lazarus: Contrôles liés aux données sur les fiches
125125
126-Exemple de code source fonctionnel :<http://www.mediafire.com/file/ne1jx3zpnwzefq3/msaccesstest2.zip>.
127-
128-``` pascal
126+Exemple de code source fonctionnel :<http://www.mediafire.com/file/ne1jx3zpnwzefq3/msaccesstest2.zip>.
127+```
129128unit Unit1;
130-
131-{$mode objfpc}{$H+}
132-
133-interface
134-
135-uses
136- Classes, SysUtils, odbcconn, sqldb, db, FileUtil, LResources, Forms, Controls,
137- Graphics, Dialogs, DBGrids, DbCtrls, StdCtrls, Printers, PrintersDlgs;
138-
139-type
140-
141- { TForm1 }
142-
143- TForm1 = class(TForm)
144- Button1: TButton;
145- Button2: TButton;
146- Button3: TButton;
147- Button4: TButton;
148- Datasource1: TDatasource;
149- DBEdit1: TDBEdit;
150- DBEdit2: TDBEdit;
151- DBGrid1: TDBGrid;
152- ODBCConnection1: TODBCConnection;
153- PrintDialog1: TPrintDialog;
154- SQLQuery1: TSQLQuery;
155- SQLTransaction1: TSQLTransaction;
156- procedure Button1Click(Sender: TObject);
157- procedure Button2Click(Sender: TObject);
158- procedure Button3Click(Sender: TObject);
159- procedure Button4Click(Sender: TObject);
160- procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
161- procedure FormShow(Sender: TObject);
162- private
163- { private declarations }
164- procedure PrintDbGrid(dbGrid:TdbGrid);
165- public
166- { public declarations }
167- end;
168-
169-var
170- Form1: TForm1;
171-
172-implementation
173-
174-{ TForm1 }
175-
176-procedure TForm1.FormShow(Sender: TObject);
177-begin
178- //connection
179- ODBCConnection1.FileDSN := ExtractFilePath(Application.ExeName) + 'file.dsn';
180- ODBCConnection1.Connected := True;
181- ODBCConnection1.KeepConnection := True;
182-
183- //transaction
184- SQLTransaction1.DataBase := ODBCConnection1;
185- SQLTransaction1.Action := caCommit;
186- SQLTransaction1.Active := True; //not applied to ms access(false)
187-
188- SQLQuery1.DataBase := ODBCConnection1;
189- SQLQuery1.UsePrimaryKeyAsKey := False;
190-
191- SQLQuery1.SQL.Text := 'select * from table1';
192-
193- // :id is the parameter for the field name id
194- SQLQuery1.deleteSQL.Text := 'delete from table1 where id=:id';
195- //:name is the parameter for the field name name
196- SQLQuery1.updateSQL.Text := 'update table1 set name=:name where id=:id';
197-
198- DataSource1.DataSet := SQLQuery1;
199- DBGrid1.DataSource := DataSource1;
200- DBGrid1.ReadOnly := true;
201-
202- DBEdit1.DataField := 'id';
203- DBEdit1.DataSource := DataSource1;
204- DBEdit2.DataField := 'name';
205- DBEdit2.DataSource := DataSource1;
206-
207- SQLQuery1.Open;
208-end;
209-
210-function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;
211-begin
212- Result:=Round(int64(nNumber)*int64(nNumerator)/nDenominator);
213-end;
214-
215-procedure TForm1.PrintDbGrid(dbGrid:TdbGrid);
216-const
217- LeftMargin = 0.05;
218- TopMargin = 0.05;
219- BottomMargin = 0.05;
220-var
221- i: integer;
222- x,y: integer;
223-begin
224- if PrintDialog1.Execute then
129+
130+ {$mode objfpc}{$H+}
131+
132+ interface
133+
134+ uses
135+ Classes, SysUtils, odbcconn, sqldb, db, FileUtil, LResources, Forms, Controls,
136+ Graphics, Dialogs, DBGrids, DbCtrls, StdCtrls, Printers, PrintersDlgs;
137+
138+ type
139+
140+ { TForm1 }
141+
142+ TForm1 = class(TForm)
143+ Button1: TButton;
144+ Button2: TButton;
145+ Button3: TButton;
146+ Button4: TButton;
147+ Datasource1: TDatasource;
148+ DBEdit1: TDBEdit;
149+ DBEdit2: TDBEdit;
150+ DBGrid1: TDBGrid;
151+ ODBCConnection1: TODBCConnection;
152+ PrintDialog1: TPrintDialog;
153+ SQLQuery1: TSQLQuery;
154+ SQLTransaction1: TSQLTransaction;
155+ procedure Button1Click(Sender: TObject);
156+ procedure Button2Click(Sender: TObject);
157+ procedure Button3Click(Sender: TObject);
158+ procedure Button4Click(Sender: TObject);
159+ procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
160+ procedure FormShow(Sender: TObject);
161+ private
162+ { private declarations }
163+ procedure PrintDbGrid(dbGrid:TdbGrid);
164+ public
165+ { public declarations }
166+ end;
167+
168+ var
169+ Form1: TForm1;
170+
171+ implementation
172+
173+ { TForm1 }
174+
175+ procedure TForm1.FormShow(Sender: TObject);
225176 begin
226- Printer.BeginDoc;
227- Printer.Canvas.Font.Size := 12;
228-
229- y := Round(TopMargin*Printer.PageHeight);
230- dbGrid.DataSource.DataSet.First;
231- while not dbGrid.DataSource.DataSet.Eof do
177+ //connection
178+ ODBCConnection1.FileDSN := ExtractFilePath(Application.ExeName) + 'file.dsn';
179+ ODBCConnection1.Connected := True;
180+ ODBCConnection1.KeepConnection := True;
181+
182+ //transaction
183+ SQLTransaction1.DataBase := ODBCConnection1;
184+ SQLTransaction1.Action := caCommit;
185+ SQLTransaction1.Active := True; //not applied to ms access(false)
186+
187+ SQLQuery1.DataBase := ODBCConnection1;
188+ SQLQuery1.UsePrimaryKeyAsKey := False;
189+
190+ SQLQuery1.SQL.Text := 'select * from table1';
191+
192+ // :id is the parameter for the field name id
193+ SQLQuery1.deleteSQL.Text := 'delete from table1 where id=:id';
194+ //:name is the parameter for the field name name
195+ SQLQuery1.updateSQL.Text := 'update table1 set name=:name where id=:id';
196+
197+ DataSource1.DataSet := SQLQuery1;
198+ DBGrid1.DataSource := DataSource1;
199+ DBGrid1.ReadOnly := true;
200+
201+ DBEdit1.DataField := 'id';
202+ DBEdit1.DataSource := DataSource1;
203+ DBEdit2.DataField := 'name';
204+ DBEdit2.DataSource := DataSource1;
205+
206+ SQLQuery1.Open;
207+ end;
208+
209+ function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;
210+ begin
211+ Result:=Round(int64(nNumber)*int64(nNumerator)/nDenominator);
212+ end;
213+
214+ procedure TForm1.PrintDbGrid(dbGrid:TdbGrid);
215+ const
216+ LeftMargin = 0.05;
217+ TopMargin = 0.05;
218+ BottomMargin = 0.05;
219+ var
220+ i: integer;
221+ x,y: integer;
222+ begin
223+ if PrintDialog1.Execute then
224+ begin
225+ Printer.BeginDoc;
226+ Printer.Canvas.Font.Size := 12;
227+
228+ y := Round(TopMargin*Printer.PageHeight);
229+ dbGrid.DataSource.DataSet.First;
230+ while not dbGrid.DataSource.DataSet.Eof do
231+ begin
232+ x := Round(LeftMargin*Printer.PageWidth);
233+ for i := 0 to dbGrid.DataSource.DataSet.FieldCount-1 do
234+ begin
235+ printer.Canvas.TextOut(x,y,dbGrid.DataSource.DataSet.Fields[i].AsString);
236+ x := x + MulDiv(dbGrid.Columns[i].Width,72, dbGrid.Width);
237+ end;
238+ dbGrid.DataSource.DataSet.Next;
239+ y := y + printer.Canvas.TextHeight('A');
240+ if y > (1-TopMargin-BottomMargin)* Printer.PageHeight then
241+ begin
242+ y := Round(TopMargin*Printer.PageHeight);
243+ Printer.NewPage;
244+ end;
245+ end;
246+ Printer.EndDoc;
247+ end
248+ else
249+ Form1.caption := 'NO PRINTER INSTALLED';
250+ end;
251+
252+ procedure TForm1.Button1Click(Sender: TObject);
253+ begin
254+ PrintDbGrid(DBGrid1);
255+ end;
256+
257+ procedure TForm1.Button2Click(Sender: TObject);
258+ begin
259+ if button2.Caption = 'new' then
260+ begin
261+ SQLQuery1.Insert;
262+ button2.Caption := 'save';
263+ exit
264+ end
265+ else
232266 begin
233- x := Round(LeftMargin*Printer.PageWidth);
234- for i := 0 to dbGrid.DataSource.DataSet.FieldCount-1 do
267+ if (dbedit1.Text = '') or (dbedit2.Text = '')
268+ then
235269 begin
236- printer.Canvas.TextOut(x,y,dbGrid.DataSource.DataSet.Fields[i].AsString);
237- x := x + MulDiv(dbGrid.Columns[i].Width,72, dbGrid.Width);
238- end;
239- dbGrid.DataSource.DataSet.Next;
240- y := y + printer.Canvas.TextHeight('A');
241- if y > (1-TopMargin-BottomMargin)* Printer.PageHeight then
270+ SQLQuery1.Cancel;
271+ end
272+ else
242273 begin
243- y := Round(TopMargin*Printer.PageHeight);
244- Printer.NewPage;
274+ if SQLQuery1.State = dsInsert then
275+ begin
276+ SQLQuery1.Post;
277+ SQLQuery1.ApplyUpdates;
278+ Form1.caption := 'ADDED';
279+ end;
245280 end;
246281 end;
247- Printer.EndDoc;
248- end
249- else
250- Form1.caption := 'NO PRINTER INSTALLED';
251-end;
252-
253-procedure TForm1.Button1Click(Sender: TObject);
254-begin
255- PrintDbGrid(DBGrid1);
256-end;
257-
258-procedure TForm1.Button2Click(Sender: TObject);
259-begin
260-if button2.Caption = 'new' then
261-begin
262- SQLQuery1.Insert;
263- button2.Caption := 'save';
264- exit
265- end
266- else
267- begin
268- if (dbedit1.Text = '') or (dbedit2.Text = '')
269- then
282+ button2.Caption := 'new';
283+ end;
284+
285+ procedure TForm1.Button3Click(Sender: TObject);
270286 begin
271- SQLQuery1.Cancel;
272- end
273- else
287+ if SQLQuery1.RecordCount>0 then
288+ begin
289+ SQLQuery1.Delete;
290+ SQLQuery1.ApplyUpdates;
291+
292+ //REMOVED or ADD this 2 lines if there is a problem in your SQLdB
293+ //THESE 2 lines apparently work around a bug in SQLdB for MS_Access dataBase'
294+ //**** missing reference to bugtracker item; please create a bugtracker item
295+ //SQLQuery1.Close;
296+ //SQLQuery1.Open;
297+
298+
299+ Form1.caption := 'DELETED';
300+ end;
301+ end;
302+
303+ procedure TForm1.Button4Click(Sender: TObject);
274304 begin
275- if SQLQuery1.State = dsInsert then
276- begin
277- SQLQuery1.Post;
278- SQLQuery1.ApplyUpdates;
279- Form1.caption := 'ADDED';
280- end;
305+ if SQLQuery1.RecordCount>0 then
306+ begin
307+ SQLQuery1.Edit;
308+ SQLQuery1.Post;
309+ Sqlquery1.ApplyUpdates;
310+ Form1.caption := 'UPDATED';
311+ end;
281312 end;
282- end;
283-button2.Caption := 'new';
284-end;
285-
286-procedure TForm1.Button3Click(Sender: TObject);
287-begin
288-if SQLQuery1.RecordCount>0 then
289- begin
290- SQLQuery1.Delete;
291- SQLQuery1.ApplyUpdates;
292-
293- //REMOVED or ADD this 2 lines if there is a problem in your SQLdB
294- //THESE 2 lines apparently work around a bug in SQLdB for MS_Access dataBase'
295- //**** missing reference to bugtracker item; please create a bugtracker item
296- //SQLQuery1.Close;
297- //SQLQuery1.Open;
298-
299- Form1.caption := 'DELETED';
300- end;
301-end;
302-
303-procedure TForm1.Button4Click(Sender: TObject);
304-begin
305- if SQLQuery1.RecordCount>0 then
306- begin
307- SQLQuery1.Edit;
308- SQLQuery1.Post;
309- Sqlquery1.ApplyUpdates;
310- Form1.caption := 'UPDATED';
311- end;
312-end;
313-
314-procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
315-begin
316- SQLQuery1.Close;
317- CanClose := True;
318-end;
319-
320-initialization
321- {$I unit1.lrs}
322-
323-end.
313+
314+ procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
315+ begin
316+ SQLQuery1.Close;
317+ CanClose := True;
318+ end;
319+
320+ initialization
321+ {$I unit1.lrs}
322+
323+ end.
324324```
325325
326326## Créer une base de données par programmation
327327
328-En utilisant un pilote ODBC, vous pouvez créer des bases de données Microsoft Access par programme. (Note: la gestion des erreurs n'a pas été testée ; veuillez mettre à jour la page si vous l'avez testé)
329-
330-Programme d'exemple :
328+En utilisant un pilote ODBC, vous pouvez créer des bases de données Microsoft Access par programme. (Note: la gestion des erreurs n'a pas été testée ; veuillez mettre à jour la page si vous l'avez testé)
331329
332-``` pascal
330+Programme d'exemple :
331+```
333332program CreateAccessDb;
334-
335-{$mode objfpc}{$H+}
336-
337-uses
338- {$IFDEF UNIX}{$IFDEF UseCThreads}
339- cthreads,
340- {$ENDIF}{$ENDIF}
341- Classes, sysutils,
342- LCLType;
343-
344-Const
345- ODBC_ADD_DSN=1;
346- ODBC_CONFIG_DSN=2;
347- ODBC_REMOVE_DSN=3;
348- ODBC_ADD_SYS_DSN=4;
349- ODBC_CONFIG_SYS_DSN=5;
350- ODBC_REMOVE_SYS_DSN=6;
351- ODBC_REMOVE_DEFAULT_DSN=7;
352-function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;
353- lpszDriverString: PChar; lpszAttributes: PChar): Integer; stdcall; external 'odbccp32.dll';
354-function SQLInstallerError(iError: integer; pfErrorCode: PInteger; lpszErrorMsg: string; cbErrorMsgMax: integer; pcbErrorMsg: PInteger): integer; stdcall; external 'odbccp32.dll';
355-
356-function CreateAccessDatabase(DatabaseFile: string): boolean;
357-var
358- DBPChar: PChar;
359- Driver: PChar;
360- ErrorCode, ResizeErrorMessage: integer;
361- ErrorMessage: PChar;
362- retCode: integer;
363-begin
364- driver := 'Microsoft Access Driver (*.mdb, *.accdb)';
365- { With this driver,
366- CREATE_DB/CREATE_DBV12 will create an .accdb format database;
367- CREATE_DBV4 will create an mdb
368- http://stackoverflow.com/questions/9205633/how-do-i-specify-the-odbc-access-driver-format-when-creating-the-database
369- }
370- DBPChar:=PChar('CREATE_DBV4="'+DatabaseFile+'"');
371- retCode := SQLConfigDataSource(Hwnd(nil), ODBC_ADD_DSN, Driver, DBPChar);
372- if retCode<>0 then
373- begin
374- //try alternate driver
375- Driver := 'Microsoft Access Driver (*.mdb)';
376- DBPChar:=PChar('CREATE_DB="'+DatabaseFile+'"');
377- retCode := SQLConfigDataSource(Hwnd(nil), ODBC_ADD_DSN, Driver, DBPChar);
378- end;
379- if retCode=0 then
380- begin
381- result:=true;
382- end
383- else
384- begin
385- result:=false;
386- ErrorCode:=0;
387- ResizeErrorMessage:=0;
388- // todo: verify how the DLL is called - use pointers?; has not been tested.
389- GetMem(ErrorMessage,512);
390- try
391- SQLInstallerError(1, @ErrorCode, ErrorMessage, SizeOf(ErrorMessage), @ResizeErrorMessage);
392- finally
393- FreeMem(ErrorMessage);
333+
334+ {$mode objfpc}{$H+}
335+
336+ uses
337+ {$IFDEF UNIX}{$IFDEF UseCThreads}
338+ cthreads,
339+ {$ENDIF}{$ENDIF}
340+ Classes, sysutils,
341+ LCLType;
342+
343+ Const
344+ ODBC_ADD_DSN=1;
345+ ODBC_CONFIG_DSN=2;
346+ ODBC_REMOVE_DSN=3;
347+ ODBC_ADD_SYS_DSN=4;
348+ ODBC_CONFIG_SYS_DSN=5;
349+ ODBC_REMOVE_SYS_DSN=6;
350+ ODBC_REMOVE_DEFAULT_DSN=7;
351+ function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;
352+ lpszDriverString: PChar; lpszAttributes: PChar): Integer; stdcall; external 'odbccp32.dll';
353+ function SQLInstallerError(iError: integer; pfErrorCode: PInteger; lpszErrorMsg: string; cbErrorMsgMax: integer; pcbErrorMsg: PInteger): integer; stdcall; external 'odbccp32.dll';
354+
355+ function CreateAccessDatabase(DatabaseFile: string): boolean;
356+ var
357+ DBPChar: PChar;
358+ Driver: PChar;
359+ ErrorCode, ResizeErrorMessage: integer;
360+ ErrorMessage: PChar;
361+ retCode: integer;
362+ begin
363+ driver := 'Microsoft Access Driver (*.mdb, *.accdb)';
364+ { With this driver,
365+ CREATE_DB/CREATE_DBV12 will create an .accdb format database;
366+ CREATE_DBV4 will create an mdb
367+ http://stackoverflow.com/questions/9205633/how-do-i-specify-the-odbc-access-driver-format-when-creating-the-database
368+ }
369+ DBPChar:=PChar('CREATE_DBV4="'+DatabaseFile+'"');
370+ retCode := SQLConfigDataSource(Hwnd(nil), ODBC_ADD_DSN, Driver, DBPChar);
371+ if retCode<>0 then
372+ begin
373+ //try alternate driver
374+ Driver := 'Microsoft Access Driver (*.mdb)';
375+ DBPChar:=PChar('CREATE_DB="'+DatabaseFile+'"');
376+ retCode := SQLConfigDataSource(Hwnd(nil), ODBC_ADD_DSN, Driver, DBPChar);
377+ end;
378+ if retCode=0 then
379+ begin
380+ result:=true;
381+ end
382+ else
383+ begin
384+ result:=false;
385+ ErrorCode:=0;
386+ ResizeErrorMessage:=0;
387+ // todo: verify how the DLL is called - use pointers?; has not been tested.
388+ GetMem(ErrorMessage,512);
389+ try
390+ SQLInstallerError(1, @ErrorCode, ErrorMessage, SizeOf(ErrorMessage), @ResizeErrorMessage);
391+ finally
392+ FreeMem(ErrorMessage);
393+ end;
394+ raise Exception.CreateFmt('Error creating Access database: %s', [ErrorMessage]);
395+ end;
394396 end;
395- raise Exception.CreateFmt('Error creating Access database: %s', [ErrorMessage]);
396- end;
397-end;
398-
399-begin
400- writeln('Result: ');
401- write(CreateAccessDatabase('d:\cop\t\bla.mdb'));
402-end.
397+
398+ begin
399+ writeln('Result: ');
400+ write(CreateAccessDatabase('d:\cop\t\bla.mdb'));
401+ end.
403402```
404403
405404## Problème de jeu de caractères
406405
407-Les anciennes bases de données Access sont encodées en utilisant le jeu de caractères ANSI (je en sais pas au sujet des nouvelles, elles utilisant sans doute des chaînes large). Ainsi, les caractères non imprimables ne sont pas affichés correctement dans un DBGrid ou autre contrôle sensible aux données. Cela peut corrigé en attachant des gestionnaire aux événements OnGetText et OnSetText du DataSet après overture :
408-
409-``` pascal
406+Les anciennes bases de données Access sont encodées en utilisant le jeu de caractères ANSI (je en sais pas au sujet des nouvelles, elles utilisant sans doute des chaînes large). Ainsi, les caractères non imprimables ne sont pas affichés correctement dans un DBGrid ou autre contrôle sensible aux données. Cela peut corrigé en attachant des gestionnaire aux événements OnGetText et OnSetText du DataSet après overture :
407+```
410408uses
411- lconvencoding;
412-
413-procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
414-var
415- i: Integer;
416-begin
417- for i:=0 to DataSet.Fields.Count-1 do
418- begin
419- if DataSet.Fields[i].DataType=ftString then
409+ lconvencoding;
410+
411+ procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
412+ var
413+ i: Integer;
420414 begin
421- DataSet.Fields[i].OnGetText := @ConvertFromDB;
422- DataSet.Fields[i].OnSetText := @ConvertToDB;
415+ for i:=0 to DataSet.Fields.Count-1 do
416+ begin
417+ if DataSet.Fields[i].DataType=ftString then
418+ begin
419+ DataSet.Fields[i].OnGetText := @ConvertFromDB;
420+ DataSet.Fields[i].OnSetText := @ConvertToDB;
421+ end;
422+ end;
423423 end;
424- end;
425-end;
426-
427-procedure TForm1.ConvertFromDB(Sender: TField; var aText: string; DisplayText: Boolean);
428-begin
429- if not Sender.IsNull then
430- aText := WinCPToUTF8(Sender.AsString); // if encoded in windows default code page
431-end;
432-
433-procedure TForm1.ConvertToDB(Sender: TField; const aText: string);
434-begin
435- if aText <> '' then
436- Sender.Value := UTF8ToWinCP(aText);
437-end;
424+
425+ procedure TForm1.ConvertFromDB(Sender: TField; var aText: string; DisplayText: Boolean);
426+ begin
427+ if not Sender.IsNull then
428+ aText := WinCPToUTF8(Sender.AsString); // if encoded in windows default code page
429+ end;
430+
431+ procedure TForm1.ConvertToDB(Sender: TField; const aText: string);
432+ begin
433+ if aText <> '' then
434+ Sender.Value := UTF8ToWinCP(aText);
435+ end;
438436```
439437
440438# Exemple de base de données
441439
442-Microsoft Access est fourni avec l'exemple de base de données Northwind.
440+Microsoft Access est fourni avec l'exemple de base de données Northwind.
443441
444-Si vous avez seulement installé le moteur d'exécution, vous pouvez utiliser cette base de données alternative depuis le projet Mondial comme base de test : [1](http://databases.about.com/od/sampleaccessdatabases/a/Microsoft-Access-Sample-Database-Countries-Cities-And-Provinces.htm)
442+Si vous avez seulement installé le moteur d'exécution, vous pouvez utiliser cette base de données alternative depuis le projet Mondial comme base de test : [[1]](<http://databases.about.com/od/sampleaccessdatabases/a/Microsoft-Access-Sample-Database-Countries-Cities-And-Provinces.htm>)
445443
446444# Voir aussi
447445
448-- [[ODBCConn/fr|ODBCConn]] Le connecteur ODBC que cet article utilise.
446+ * [[ODBCConn/fr|ODBCConn]] Le connecteur ODBC que cet article utilise.
449447
450448---
451-*From the Free Pascal wiki, page "MS Access/fr", as it stood on 2020-02-20 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
449+*From the Free Pascal wiki, page "MS Access/fr", as the Internet Archive kept it on 2025-03-15, last changed on 2020-02-21. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history