1 |
|
---|
2 | {ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
3 | º º
|
---|
4 | º Sibyl Portable Component Classes º
|
---|
5 | º º
|
---|
6 | º Copyright (C) 1995,97 SpeedSoft Germany, All rights reserved. º
|
---|
7 | º º
|
---|
8 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ}
|
---|
9 |
|
---|
10 | Unit DBBase;
|
---|
11 |
|
---|
12 |
|
---|
13 | Interface
|
---|
14 |
|
---|
15 |
|
---|
16 | Uses Dos,SysUtils,Classes,Forms,Dialogs,DbLayer;
|
---|
17 |
|
---|
18 | Type
|
---|
19 | TField=Class;
|
---|
20 | TDataSet=Class;
|
---|
21 | TDataSource=Class;
|
---|
22 |
|
---|
23 | ESQLError=Class(Exception);
|
---|
24 |
|
---|
25 | TDataChange=(dePositionChanged,deDataBaseChanged,deTableNameChanged);
|
---|
26 |
|
---|
27 | TDataChangeEvent=Procedure(Sender:TObject;event:TDataChange) Of Object;
|
---|
28 |
|
---|
29 |
|
---|
30 | TDataLink=Class(TComponent)
|
---|
31 | Private
|
---|
32 | FDataSource:TDataSource;
|
---|
33 | FOnDataChange:TDataChangeEvent;
|
---|
34 | Procedure SetDataSource(NewValue:TDataSource);
|
---|
35 | Procedure Notification(AComponent:TComponent;Operation:TOperation);Override;
|
---|
36 | Procedure DataChange(event:TDataChange);
|
---|
37 | Protected
|
---|
38 | Procedure SetupComponent;Override;
|
---|
39 | Public
|
---|
40 | Destructor Destroy;Override;
|
---|
41 | Property DataSource:TDataSource Read FDataSource Write SetDataSource;
|
---|
42 | Property OnDataChange:TDataChangeEvent Read FOnDataChange Write FOnDataChange;
|
---|
43 | End;
|
---|
44 |
|
---|
45 |
|
---|
46 | TTableDataLink=Class(TDataLink)
|
---|
47 | Private
|
---|
48 | Function GetColRowField(Col,Row:LongInt):TField;
|
---|
49 | Function GetNameRowField(Name:String;Row:LongInt):TField;
|
---|
50 | Function GetFieldCount:LongInt;
|
---|
51 | Function GetFieldName(Index:LongInt):String;
|
---|
52 | Protected
|
---|
53 | Procedure SetupComponent;Override;
|
---|
54 | Public
|
---|
55 | Property Fields[Col,Row:LongInt]:TField Read GetColRowField;
|
---|
56 | Property FieldsFromColumnName[Col:String;Row:LongInt]:TField Read GetNameRowField;
|
---|
57 | Property FieldCount:LongInt Read GetFieldCount;
|
---|
58 | Property FieldNames[Index:LongInt]:String read GetFieldName;
|
---|
59 | End;
|
---|
60 |
|
---|
61 |
|
---|
62 | TFieldDataLink=Class(TDataLink)
|
---|
63 | Private
|
---|
64 | FFieldName:PString;
|
---|
65 | Procedure SetFieldName(Const NewValue:String);
|
---|
66 | Function GetFieldName:String;
|
---|
67 | Function GetField:TField;
|
---|
68 | Protected
|
---|
69 | Procedure SetupComponent;Override;
|
---|
70 | Public
|
---|
71 | Destructor Destroy;Override;
|
---|
72 | Property FieldName:String Read GetFieldName Write SetFieldName;
|
---|
73 | Property field:TField Read GetField;
|
---|
74 | End;
|
---|
75 |
|
---|
76 |
|
---|
77 | TDataSource=Class(TComponent)
|
---|
78 | Private
|
---|
79 | FDataSet:TDataSet;
|
---|
80 | FOnDataChange:TDataChangeEvent;
|
---|
81 | Procedure SetDataSet(NewValue:TDataSet);
|
---|
82 | Procedure Notification(AComponent:TComponent;Operation:TOperation);Override;
|
---|
83 | Protected
|
---|
84 | Procedure SetupComponent;Override;
|
---|
85 | Procedure DataChange(event:TDataChange);Virtual;
|
---|
86 | Public
|
---|
87 | Destructor Destroy;Override;
|
---|
88 | Published
|
---|
89 | Property DataSet:TDataSet Read FDataSet Write SetDataSet;
|
---|
90 | Property OnDataChange:TDataChangeEvent Read FOnDataChange Write FOnDataChange;
|
---|
91 | End;
|
---|
92 |
|
---|
93 |
|
---|
94 | TFieldType=(ftUnknown,ftString,ftSmallInt,ftInteger,ftWord,ftBoolean,
|
---|
95 | ftFloat,ftCurrency,ftBCD,ftDate,ftTime,ftDateTime,ftBytes,
|
---|
96 | ftVarBytes,ftAutoInc,ftBlob,ftMemo,ftGraphic,ftFmtMemo,
|
---|
97 | ftTypedBinary,ftOLE);
|
---|
98 |
|
---|
99 | EDataBaseError=Class(Exception);
|
---|
100 |
|
---|
101 | TFieldDefs=Class;
|
---|
102 | TFieldDef=Class;
|
---|
103 |
|
---|
104 | TOnFieldChange=Procedure(Sender:TField) Of Object;
|
---|
105 |
|
---|
106 | TField=Class
|
---|
107 | Private
|
---|
108 | FSize:Longword; //store size of datatype (floatfield!)
|
---|
109 | FValue:Pointer;
|
---|
110 | FValueLen:LongWord;
|
---|
111 | FDataType:TFieldType;
|
---|
112 | FDataSet:TDataSet;
|
---|
113 | FFieldDef:TFieldDef;
|
---|
114 | FRequired:Boolean;
|
---|
115 | FRow:LongInt;
|
---|
116 | FCol:LongInt;
|
---|
117 | FReadOnly:Boolean;
|
---|
118 | FOnChange:TOnFieldChange;
|
---|
119 | Procedure FreeMemory;
|
---|
120 | Procedure GetMemory(Size:Longint);
|
---|
121 | Function GetFieldName:String;
|
---|
122 | Function GetIsNull:Boolean;
|
---|
123 | Procedure SetNewValue(Var NewValue;NewLen:LongInt);
|
---|
124 | Function GetAsVariant:Variant;Virtual;
|
---|
125 | Procedure SetAsVariant(NewValue:Variant);Virtual;
|
---|
126 | Function GetIsIndexField:Boolean;
|
---|
127 | Function GetCanModify:Boolean;
|
---|
128 | Function GetReadOnly:Boolean;
|
---|
129 | Protected
|
---|
130 | Procedure SetAsValue(Var Value;Len:LongInt);Virtual;
|
---|
131 | Function GetAsString:String;Virtual;
|
---|
132 | Procedure SetAsString(Const NewValue:String);Virtual;
|
---|
133 | Function GetAsAnsiString:AnsiString;Virtual;
|
---|
134 | Procedure SetAsAnsiString(NewValue:AnsiString);Virtual;
|
---|
135 | Function GetAsBoolean:Boolean;Virtual;
|
---|
136 | Procedure SetAsBoolean(NewValue:Boolean);Virtual;
|
---|
137 | Function GetAsDateTime:TDateTime;Virtual;
|
---|
138 | Procedure SetAsDateTime(NewValue:TDateTime);Virtual;
|
---|
139 | Function GetAsFloat:Extended;Virtual;
|
---|
140 | Procedure SetAsFloat(Const NewValue:Extended);Virtual;
|
---|
141 | Function GetAsInteger:LongInt;Virtual;
|
---|
142 | Procedure SetAsInteger(NewValue:LongInt);Virtual;
|
---|
143 | Procedure AccessError(Const TypeName:String);Virtual;
|
---|
144 | Procedure CheckInactive;
|
---|
145 | Public
|
---|
146 | Destructor Destroy;Override;
|
---|
147 | Procedure Clear;Virtual;
|
---|
148 | Procedure Assign(Field:TField);
|
---|
149 | Procedure SetData(Buffer:Pointer);
|
---|
150 | Property IsNull:Boolean Read GetIsNull;
|
---|
151 | Property ValueLen:LongWord Read FValueLen;
|
---|
152 | Property DataType:TFieldType Read FDataType;
|
---|
153 | Property Required:Boolean Read FRequired Write FRequired;
|
---|
154 | Property Row:LongInt read FRow write FRow;
|
---|
155 | Property Value:Variant read GetAsVariant write SetAsVariant;
|
---|
156 | Property IsIndexField:Boolean read GetIsIndexField;
|
---|
157 | Property CanModify:Boolean read GetCanModify;
|
---|
158 | Property DataSet:TDataSet read FDataSet;
|
---|
159 | Property DataSize:LongWord read FValueLen;
|
---|
160 | Property ReadOnly:boolean read GetReadOnly write FReadOnly;
|
---|
161 | Property Index:LongInt read FCol;
|
---|
162 | Published
|
---|
163 | Property FieldName:String Read GetFieldName;
|
---|
164 | Property AsString:String Read GetAsString Write SetAsString;
|
---|
165 | Property AsAnsiString:AnsiString Read GetAsAnsiString Write SetAsAnsiString;
|
---|
166 | Property AsBoolean:Boolean Read GetAsBoolean Write SetAsBoolean;
|
---|
167 | Property AsDateTime:TDateTime Read GetAsDateTime Write SetAsDateTime;
|
---|
168 | Property AsFloat:Extended Read GetAsFloat Write SetAsFloat;
|
---|
169 | Property AsInteger:LongInt Read GetAsInteger Write SetAsInteger;
|
---|
170 | Property OnChange:TOnFieldChange read FOnChange write FOnChange;
|
---|
171 | End;
|
---|
172 | TFieldClass=Class Of TField;
|
---|
173 |
|
---|
174 |
|
---|
175 | TStringField=Class(TField)
|
---|
176 | Protected
|
---|
177 | Function GetAsString:String;Override;
|
---|
178 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
179 | Function GetAsAnsiString:AnsiString;Override;
|
---|
180 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
181 | Function GetAsBoolean:Boolean;Override;
|
---|
182 | Procedure SetAsBoolean(NewValue:Boolean);Override;
|
---|
183 | Function GetAsDateTime:TDateTime;Override;
|
---|
184 | Function GetAsFloat:Extended;Override;
|
---|
185 | Procedure SetAsFloat(Const NewValue:Extended);Override;
|
---|
186 | Function GetAsInteger:LongInt;Override;
|
---|
187 | Procedure SetAsInteger(NewValue:LongInt);Override;
|
---|
188 | Function GetAsVariant:Variant;Override;
|
---|
189 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
190 | Public
|
---|
191 | Property Value:String Read GetAsString write SetAsString;
|
---|
192 | End;
|
---|
193 |
|
---|
194 |
|
---|
195 | TSmallintField=Class(TField)
|
---|
196 | Protected
|
---|
197 | Function GetAsBoolean:Boolean;Override;
|
---|
198 | Procedure SetAsBoolean(NewValue:Boolean);Override;
|
---|
199 | Function GetAsString:String;Override;
|
---|
200 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
201 | Function GetAsAnsiString:AnsiString;Override;
|
---|
202 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
203 | Function GetAsSmallint:Integer;Virtual;
|
---|
204 | Procedure SetAsSmallInt(NewValue:Integer);Virtual;
|
---|
205 | Function GetAsFloat:Extended;Override;
|
---|
206 | Procedure SetAsFloat(Const NewValue:Extended);Override;
|
---|
207 | Function GetAsInteger:LongInt;Override;
|
---|
208 | Procedure SetAsInteger(NewValue:LongInt);Override;
|
---|
209 | Function GetAsVariant:Variant;Override;
|
---|
210 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
211 | Public
|
---|
212 | Property Value:Integer Read GetAsSmallint Write SetAsSmallInt;
|
---|
213 | End;
|
---|
214 |
|
---|
215 |
|
---|
216 | TIntegerField=Class(TField)
|
---|
217 | Protected
|
---|
218 | Function GetAsBoolean:Boolean;Override;
|
---|
219 | Procedure SetAsBoolean(NewValue:Boolean);Override;
|
---|
220 | Function GetAsString:String;Override;
|
---|
221 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
222 | Function GetAsAnsiString:AnsiString;Override;
|
---|
223 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
224 | Function GetAsFloat:Extended;Override;
|
---|
225 | Procedure SetAsFloat(Const NewValue:Extended);Override;
|
---|
226 | Function GetAsInteger:LongInt;Override;
|
---|
227 | Procedure SetAsInteger(NewValue:LongInt);Override;
|
---|
228 | Function GetAsVariant:Variant;Override;
|
---|
229 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
230 | Public
|
---|
231 | Property Value:LongInt Read GetAsInteger Write SetAsInteger;
|
---|
232 | End;
|
---|
233 |
|
---|
234 |
|
---|
235 | TAutoIncField=Class(TIntegerField)
|
---|
236 | End;
|
---|
237 |
|
---|
238 |
|
---|
239 | TBooleanField=Class(TField)
|
---|
240 | Protected
|
---|
241 | Function GetAsBoolean:Boolean;Override;
|
---|
242 | Procedure SetAsBoolean(NewValue:Boolean);Override;
|
---|
243 | Function GetAsString:String;Override;
|
---|
244 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
245 | Function GetAsAnsiString:AnsiString;Override;
|
---|
246 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
247 | Function GetAsFloat:Extended;Override;
|
---|
248 | Procedure SetAsFloat(Const NewValue:Extended);Override;
|
---|
249 | Function GetAsInteger:LongInt;Override;
|
---|
250 | Procedure SetAsInteger(NewValue:LongInt);Override;
|
---|
251 | Function GetAsVariant:Variant;Override;
|
---|
252 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
253 | Public
|
---|
254 | Property Value:Boolean Read GetAsBoolean Write SetAsBoolean;
|
---|
255 | End;
|
---|
256 |
|
---|
257 |
|
---|
258 | TFloatField=Class(TField)
|
---|
259 | Private
|
---|
260 | FPrecision:Longint;
|
---|
261 | Procedure SetPrecision(Value:Longint);
|
---|
262 | Protected
|
---|
263 | Function GetAsString:String;Override;
|
---|
264 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
265 | Function GetAsAnsiString:AnsiString;Override;
|
---|
266 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
267 | Function GetAsFloat:Extended;Override;
|
---|
268 | Procedure SetAsFloat(Const NewValue:Extended);Override;
|
---|
269 | Function GetAsInteger:LongInt;Override;
|
---|
270 | Procedure SetAsInteger(NewValue:LongInt);Override;
|
---|
271 | Function GetAsVariant:Variant;Override;
|
---|
272 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
273 | Public
|
---|
274 | Constructor Create;
|
---|
275 | Property Value:Extended Read GetAsFloat Write SetAsFloat;
|
---|
276 | Property Precision:Longint Read FPrecision Write SetPrecision;
|
---|
277 | End;
|
---|
278 |
|
---|
279 |
|
---|
280 | TCurrencyField=Class(TFloatField)
|
---|
281 | Public
|
---|
282 | Constructor Create;
|
---|
283 | End;
|
---|
284 |
|
---|
285 |
|
---|
286 | TDateField=Class(TField)
|
---|
287 | Private
|
---|
288 | FDisplayFormat:PString;
|
---|
289 | Private
|
---|
290 | Function GetDisplayFormat:String;
|
---|
291 | Procedure SetDisplayFormat(Const NewValue:String);
|
---|
292 | Protected
|
---|
293 | Function GetAsString:String;Override;
|
---|
294 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
295 | Function GetAsAnsiString:AnsiString;Override;
|
---|
296 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
297 | Function GetAsFloat:Extended;Override;
|
---|
298 | Function GetAsDateTime:TDateTime;Override;
|
---|
299 | Procedure SetAsDateTime(NewValue:TDateTime);Override;
|
---|
300 | Function GetAsVariant:Variant;Override;
|
---|
301 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
302 | Destructor Destroy;Override;
|
---|
303 | Public
|
---|
304 | Property Value:TDateTime Read GetAsDateTime Write SetAsDateTime;
|
---|
305 | Property DisplayFormat:String read GetDisplayFormat write SetDisplayFormat;
|
---|
306 | End;
|
---|
307 |
|
---|
308 |
|
---|
309 | TTimeField=Class(TField)
|
---|
310 | Private
|
---|
311 | FDisplayFormat:PString;
|
---|
312 | Private
|
---|
313 | Function GetDisplayFormat:String;
|
---|
314 | Procedure SetDisplayFormat(Const NewValue:String);
|
---|
315 | Protected
|
---|
316 | Function GetAsString:String;Override;
|
---|
317 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
318 | Function GetAsAnsiString:AnsiString;Override;
|
---|
319 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
320 | Function GetAsFloat:Extended;Override;
|
---|
321 | Function GetAsDateTime:TDateTime;Override;
|
---|
322 | Procedure SetAsDateTime(NewValue:TDateTime);Override;
|
---|
323 | Function GetAsVariant:Variant;Override;
|
---|
324 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
325 | Destructor Destroy;Override;
|
---|
326 | Public
|
---|
327 | Property Value:TDateTime Read GetAsDateTime Write SetAsDateTime;
|
---|
328 | Property DisplayFormat:String read GetDisplayFormat write SetDisplayFormat;
|
---|
329 | End;
|
---|
330 |
|
---|
331 |
|
---|
332 | TDateTimeField=Class(TField)
|
---|
333 | Private
|
---|
334 | FDisplayFormat:PString;
|
---|
335 | Private
|
---|
336 | Function GetDisplayFormat:String;
|
---|
337 | Procedure SetDisplayFormat(Const NewValue:String);
|
---|
338 | Protected
|
---|
339 | Function GetAsString:String;Override;
|
---|
340 | Procedure SetAsString(Const NewValue:String);Override;
|
---|
341 | Function GetAsAnsiString:AnsiString;Override;
|
---|
342 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
343 | Function GetAsFloat:Extended;Override;
|
---|
344 | Function GetAsDateTime:TDateTime;Override;
|
---|
345 | Procedure SetAsDateTime(NewValue:TDateTime);Override;
|
---|
346 | Function GetAsVariant:Variant;Override;
|
---|
347 | Procedure SetAsVariant(NewValue:Variant);Override;
|
---|
348 | Destructor Destroy;Override;
|
---|
349 | Public
|
---|
350 | Property Value:TDateTime Read GetAsDateTime Write SetAsDateTime;
|
---|
351 | Property DisplayFormat:String read GetDisplayFormat write SetDisplayFormat;
|
---|
352 | End;
|
---|
353 |
|
---|
354 |
|
---|
355 | TBlobField=Class(TField)
|
---|
356 | Protected
|
---|
357 | Function GetAsString:String;Override;
|
---|
358 | Function GetAsAnsiString:AnsiString;Override;
|
---|
359 | Public
|
---|
360 | Procedure LoadFromStream(Stream:TStream);
|
---|
361 | Property Value:Pointer Read FValue;
|
---|
362 | End;
|
---|
363 |
|
---|
364 |
|
---|
365 | TMemoField=Class(TField)
|
---|
366 | Protected
|
---|
367 | Function GetAsString:String;Override;
|
---|
368 | Function GetAsAnsiString:AnsiString;Override;
|
---|
369 | Procedure SetAsAnsiString(NewValue:AnsiString);Override;
|
---|
370 | Public
|
---|
371 | Property Value:AnsiString Read GetAsAnsiString write SetAsAnsiString;
|
---|
372 | End;
|
---|
373 |
|
---|
374 |
|
---|
375 | TGraphicField=Class(TBlobField)
|
---|
376 | Protected
|
---|
377 | Function GetAsString:String;Override;
|
---|
378 | End;
|
---|
379 |
|
---|
380 |
|
---|
381 | TFieldList=Class(TList) //List Of Fields (TField entries)
|
---|
382 | Public
|
---|
383 | Procedure Clear;Override;
|
---|
384 | End;
|
---|
385 |
|
---|
386 |
|
---|
387 | TFieldDef=Class
|
---|
388 | Private
|
---|
389 | FFields:TList;
|
---|
390 | FOwner:TFieldDefs;
|
---|
391 | FName:String;
|
---|
392 | FRequired:Boolean;
|
---|
393 | FSize:Longword;
|
---|
394 | FPrecision:LongInt;
|
---|
395 | FDataType:TFieldType;
|
---|
396 | FFieldNo:Longint;
|
---|
397 | FPrimaryKey:Boolean;
|
---|
398 | FForeignKey:PString;
|
---|
399 | FTypeName:PString;
|
---|
400 | Function GetFieldClass:TFieldClass;
|
---|
401 | Function GetPrimaryKey:Boolean;
|
---|
402 | Procedure SetPrimaryKey(NewValue:Boolean);
|
---|
403 | Function GetForeignKey:String;
|
---|
404 | Procedure SetForeignKey(Const NewValue:String);
|
---|
405 | Function GetTypeName:String;
|
---|
406 | Procedure SetTypeName(Const NewValue:String);
|
---|
407 | Public
|
---|
408 | Constructor Create(aOwner:TFieldDefs; Const aName:String;
|
---|
409 | aDataType:TFieldType; aSize:Longword; aRequired:Boolean;
|
---|
410 | aFieldNo:Longint);
|
---|
411 | Destructor Destroy;Override;
|
---|
412 | Function CreateField(Owner:TComponent):TField;
|
---|
413 | Public
|
---|
414 | Property Fields:TList Read FFields;
|
---|
415 | Property DataType:TFieldType Read FDataType;
|
---|
416 | Property FieldClass:TFieldClass Read GetFieldClass;
|
---|
417 | Property FieldNo:Longint Read FFieldNo;
|
---|
418 | Property Name:String Read FName;
|
---|
419 | Property TypeName:String Read GetTypeName write SetTypeName;
|
---|
420 | Property Precision:Longint Read FPrecision Write FPrecision;
|
---|
421 | Property Required:Boolean Read FRequired;
|
---|
422 | Property Size:Longword Read FSize Write FSize;
|
---|
423 | Property PrimaryKey:Boolean read GetPrimaryKey write FPrimaryKey;
|
---|
424 | Property ForeignKey:String read GetForeignKey write SetForeignKey;
|
---|
425 | End;
|
---|
426 |
|
---|
427 |
|
---|
428 | TFieldDefs=Class
|
---|
429 | Private
|
---|
430 | FDataSet:TDataSet;
|
---|
431 | FItems:TList;
|
---|
432 | Function Rows:Longint;
|
---|
433 | Function GetCount:Longint;
|
---|
434 | Function GetItem(Index:Longint):TFieldDef;
|
---|
435 | Public
|
---|
436 | Constructor Create(DataSet:TDataSet);
|
---|
437 | Destructor Destroy;Override;
|
---|
438 | Procedure Clear;
|
---|
439 | Function Add(Const Name:String; DataType:TFieldType; Size:Longint; Required:Boolean):TFieldDef;
|
---|
440 | Procedure Update;
|
---|
441 | Procedure Assign(FieldDefs: TFieldDefs);
|
---|
442 | Function Find(Const Name: string): TFieldDef;
|
---|
443 | Function IndexOf(Const Name: string): LongInt;
|
---|
444 | Public
|
---|
445 | Property Count:Longint Read GetCount;
|
---|
446 | Property Items[Index:Longint]:TFieldDef Read GetItem; default
|
---|
447 | End;
|
---|
448 |
|
---|
449 | TDataSetNotifyEvent=Procedure(DataSet:TDataSet) Of Object;
|
---|
450 |
|
---|
451 | {$M+}
|
---|
452 | TLocateOptions=Set Of (loCaseInsensitive,loPartialKey);
|
---|
453 | {$M-}
|
---|
454 |
|
---|
455 | {$M+}
|
---|
456 | TIndexOptions = Set of (ixPrimary, ixUnique, ixDescending,
|
---|
457 | ixCaseInsensitive, ixExpression);
|
---|
458 | {$M-}
|
---|
459 |
|
---|
460 | TDataSet=Class(TComponent)
|
---|
461 | Private
|
---|
462 | FCurrentRow:LongInt;
|
---|
463 | FCurrentField:LongInt;
|
---|
464 | FRowIsInserted:Boolean;
|
---|
465 | FFieldDefs:TFieldDefs;
|
---|
466 | FActive:Boolean;
|
---|
467 | FOpened:Boolean;
|
---|
468 | FDBProcs:TDBProcs;
|
---|
469 | FServer:PString;
|
---|
470 | FDataBase:PString;
|
---|
471 | FDataSetLocked:Boolean;
|
---|
472 | FRefreshOnLoad:Boolean;
|
---|
473 | FSelect:TStrings;
|
---|
474 | FDataChangeLock:Boolean;
|
---|
475 | FMaxRows:LongInt;
|
---|
476 | FBeforeOpen:TDataSetNotifyEvent;
|
---|
477 | FAfterOpen:TDataSetNotifyEvent;
|
---|
478 | FBeforeClose:TDataSetNotifyEvent;
|
---|
479 | FAfterClose:TDataSetNotifyEvent;
|
---|
480 | FBeforeInsert:TDataSetNotifyEvent;
|
---|
481 | FAfterInsert:TDataSetNotifyEvent;
|
---|
482 | FBeforePost:TDataSetNotifyEvent;
|
---|
483 | FAfterPost:TDataSetNotifyEvent;
|
---|
484 | FBeforeCancel:TDataSetNotifyEvent;
|
---|
485 | FAfterCancel:TDataSetNotifyEvent;
|
---|
486 | FBeforeDelete:TDataSetNotifyEvent;
|
---|
487 | FAfterDelete:TDataSetNotifyEvent;
|
---|
488 | FReadOnly:Boolean;
|
---|
489 | Private
|
---|
490 | Function GetBOF:Boolean;
|
---|
491 | Function GetEOF:Boolean;
|
---|
492 | Function GetField(Index:LongInt):TField;
|
---|
493 | Function GetFieldCount:LongInt;
|
---|
494 | Function GetFieldName(Index:LongInt):String;
|
---|
495 | Function GetFieldType(Index:LongInt):TFieldType;
|
---|
496 | Procedure SetCurrentField(NewValue:LongInt);
|
---|
497 | Procedure SetCurrentRow(NewValue:LongInt);
|
---|
498 | Procedure UpdateField(field:TField;OldValue:Pointer;OldValueLen:LongInt);
|
---|
499 | Function GetFieldFromColumnName(ColumnName:String):TField;
|
---|
500 | Procedure CheckRequiredFields;
|
---|
501 | Procedure SetFieldDefs(NewValue:TFieldDefs);
|
---|
502 | Procedure DesignerNotification(Var DNS:TDesignerNotifyStruct);
|
---|
503 | Function IsTable:Boolean;
|
---|
504 | Protected
|
---|
505 | Procedure SetupComponent;Override;
|
---|
506 | Procedure Loaded;Override;
|
---|
507 | Procedure DataChange(event:TDataChange);Virtual;
|
---|
508 | Procedure CheckInactive;Virtual;
|
---|
509 | Procedure SetActive(NewValue:Boolean);Virtual;
|
---|
510 | Procedure SetDataBaseName(Const NewValue:String);Virtual;
|
---|
511 | Function GetDataBaseName:String;Virtual;
|
---|
512 | Procedure SetServer(Const NewValue:String);Virtual;
|
---|
513 | Function GetServer:String;Virtual;
|
---|
514 | Function GetMaxRows:LongInt;Virtual;
|
---|
515 | Function GetResultColRow(Col,Row:LongInt):TField;Virtual;
|
---|
516 | Procedure CommitInsert(Commit:Boolean);Virtual;
|
---|
517 | Function UpdateFieldSelect(Field:TField):Boolean;Virtual;
|
---|
518 | Function GetFieldClass(FieldType:TFieldType):TFieldClass;Virtual;
|
---|
519 | Procedure InsertCurrentFields;
|
---|
520 | Procedure RemoveCurrentFields;
|
---|
521 | Procedure QueryTable;Virtual;
|
---|
522 | Procedure DoOpen;Virtual;
|
---|
523 | Procedure DoClose;Virtual;
|
---|
524 | Procedure DoPost;Virtual;
|
---|
525 | Procedure DoCancel;Virtual;
|
---|
526 | Procedure DoInsert;Virtual;
|
---|
527 | Procedure DoDelete;Virtual;
|
---|
528 | Property DataSetLocked:Boolean read FDataSetLocked write FDataSetLocked;
|
---|
529 | Public
|
---|
530 | Destructor Destroy;Override;
|
---|
531 | Function WriteSCUResource(Stream:TResourceStream):Boolean;Override;
|
---|
532 | Procedure ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);Override;
|
---|
533 | Procedure Open;
|
---|
534 | Procedure Close;
|
---|
535 | Procedure First;
|
---|
536 | Procedure Last;
|
---|
537 | Procedure Next;
|
---|
538 | Procedure Prior;
|
---|
539 | Procedure MoveBy(Distance:LongInt);
|
---|
540 | Procedure Refresh;
|
---|
541 | Procedure Post;Virtual;
|
---|
542 | Procedure Cancel;Virtual;
|
---|
543 | Procedure Insert;Virtual;
|
---|
544 | Procedure Append;Virtual;
|
---|
545 | Procedure Delete;Virtual;
|
---|
546 | Procedure GetFieldNames(List:TStrings);
|
---|
547 | Procedure GetDataSources(List:TStrings);Virtual;
|
---|
548 | Procedure GetStoredProcNames(List:TStrings);Virtual;
|
---|
549 | Procedure RefreshTable;Virtual;
|
---|
550 | Procedure AppendRecord(Const values:Array Of Const);
|
---|
551 | Procedure SetFields(Const values:Array Of Const);
|
---|
552 | Procedure InsertRecord(Const Values:Array Of Const);Virtual;
|
---|
553 | Function FieldByName(Const FieldName:String):TField;
|
---|
554 | Function FindField(Const FieldName:String):TField;
|
---|
555 | Function FindFirst: Boolean;
|
---|
556 | Function FindLast: Boolean;
|
---|
557 | Function FindNext: Boolean;
|
---|
558 | Function FindPrior: Boolean;
|
---|
559 | Procedure GetFieldList(List:TList;Const FieldNames:String);
|
---|
560 | Function Locate(Const KeyFields:String;Const KeyValues:Array Of Const;
|
---|
561 | Options:TLocateOptions):Boolean;Virtual;
|
---|
562 | Public
|
---|
563 | Property Bof:Boolean Read GetBOF;
|
---|
564 | Property Eof:Boolean Read GetEOF;
|
---|
565 | Property FieldCount:LongInt Read GetFieldCount;
|
---|
566 | Property Fields[Index:LongInt]:TField Read GetField;
|
---|
567 | Property FieldDefs:TFieldDefs read FFieldDefs write SetFieldDefs;
|
---|
568 | Property FieldNames[Index:LongInt]:String Read GetFieldName;
|
---|
569 | Property FieldTypes[Index:LongInt]:TFieldType Read GetFieldType;
|
---|
570 | Property CurrentField:LongInt Read FCurrentField Write SetCurrentField;
|
---|
571 | Property CurrentRow:LongInt Read FCurrentRow Write SetCurrentRow;
|
---|
572 | Property RowInserted:Boolean Read FRowIsInserted write FRowIsInserted;
|
---|
573 | Property FieldFromColumnName[ColumnName:String]:TField Read GetFieldFromColumnName;
|
---|
574 | Property DataChangeLock:Boolean Read FDataChangeLock Write FDataChangeLock;
|
---|
575 | Property MaxRows:LongInt read GetMaxRows;
|
---|
576 | Property RecordCount:Longint read GetMaxRows;
|
---|
577 | Property RecNo:Longint read FCurrentRow;
|
---|
578 | Property DataBaseName:String Read GetDataBaseName Write SetDataBaseName;
|
---|
579 | Published
|
---|
580 | Property Active:Boolean Read FActive Write SetActive;
|
---|
581 | Property Server:String Read GetServer Write SetServer;
|
---|
582 | Property DataBase:String Read GetDataBaseName Write SetDataBaseName;
|
---|
583 | Property ReadOnly:Boolean read FReadOnly write FReadOnly;
|
---|
584 | Property BeforeOpen:TDataSetNotifyEvent Read FBeforeOpen Write FBeforeOpen;
|
---|
585 | Property AfterOpen:TDataSetNotifyEvent Read FAfterOpen Write FAfterOpen;
|
---|
586 | Property BeforeClose:TDataSetNotifyEvent Read FBeforeClose Write FBeforeClose;
|
---|
587 | Property AfterClose:TDataSetNotifyEvent Read FAfterClose Write FAfterClose;
|
---|
588 | Property BeforeInsert:TDataSetNotifyEvent Read FBeforeInsert Write FBeforeInsert;
|
---|
589 | Property AfterInsert:TDataSetNotifyEvent Read FAfterInsert Write FAfterInsert;
|
---|
590 | Property BeforePost:TDataSetNotifyEvent Read FBeforePost Write FBeforePost;
|
---|
591 | Property AfterPost:TDataSetNotifyEvent Read FAfterPost Write FAfterPost;
|
---|
592 | Property BeforeCancel:TDataSetNotifyEvent Read FBeforeCancel Write FBeforeCancel;
|
---|
593 | Property AfterCancel:TDataSetNotifyEvent Read FAfterCancel Write FAfterCancel;
|
---|
594 | Property BeforeDelete:TDataSetNotifyEvent Read FBeforeDelete Write FBeforeDelete;
|
---|
595 | Property AfterDelete:TDataSetNotifyEvent Read FAfterDelete Write FAfterDelete;
|
---|
596 | End;
|
---|
597 |
|
---|
598 | TLockType=(ltReadLock,ltWriteLock);
|
---|
599 |
|
---|
600 | TIndexDefs=Class;
|
---|
601 |
|
---|
602 | TIndexDef=Class
|
---|
603 | Private
|
---|
604 | FOwner: TIndexDefs;
|
---|
605 | FName:PString;
|
---|
606 | FFields:PString;
|
---|
607 | FOptions:TIndexOptions;
|
---|
608 | Function GetFields:String;
|
---|
609 | Function GetName:String;
|
---|
610 | Public
|
---|
611 | Constructor Create(Owner:TIndexDefs;Const Name, Fields:String;
|
---|
612 | Options:TIndexOptions);
|
---|
613 | Destructor Destroy; override;
|
---|
614 | Public
|
---|
615 | Property Fields:String read GetFields;
|
---|
616 | Property Name:String read GetName;
|
---|
617 | Property Options: TIndexOptions read FOptions;
|
---|
618 | End;
|
---|
619 |
|
---|
620 | TIndexDefs=Class
|
---|
621 | Private
|
---|
622 | FDataSet:TDataSet;
|
---|
623 | FItems:TList;
|
---|
624 | FUpdated: Boolean;
|
---|
625 | Function GetCount:LongInt;
|
---|
626 | Function GetItem(Index:LongInt): TIndexDef;
|
---|
627 | Public
|
---|
628 | Constructor Create(DataSet:TDataSet);
|
---|
629 | Destructor Destroy;Override;
|
---|
630 | Function Add(Const Name,Fields:String;Options:TIndexOptions):TIndexDef;
|
---|
631 | Procedure Assign(IndexDefs:TIndexDefs);
|
---|
632 | Procedure Clear;
|
---|
633 | Function FindIndexForFields(Const Fields:String):TIndexDef;
|
---|
634 | Function GetIndexForFields(Const Fields:String;CaseInsensitive:Boolean):TIndexDef;
|
---|
635 | Function IndexOf(Const Name:String):LongInt;
|
---|
636 | Procedure Update;
|
---|
637 | Public
|
---|
638 | Property Count:LongInt read GetCount;
|
---|
639 | Property Items[Index:LongInt]:TIndexDef read GetItem;default;
|
---|
640 | Property Updated:Boolean read FUpdated write FUpdated;
|
---|
641 | End;
|
---|
642 |
|
---|
643 | TTable=Class(TDataSet)
|
---|
644 | Private
|
---|
645 | FTableName:PString;
|
---|
646 | FMasterSource:TDataSource;
|
---|
647 | FTempMasterSource:TDataSource;
|
---|
648 | FMasterFields:PString;
|
---|
649 | FServants:TList; //Servants that are connected With This
|
---|
650 | FDataTypes:TStringList;
|
---|
651 | FIndexDefs:TIndexDefs;
|
---|
652 | FIndexFieldMap:TList;
|
---|
653 | Private
|
---|
654 | Function GetPassword:String;
|
---|
655 | Function GetUserId:String;
|
---|
656 | Procedure SetPassword(NewValue:String);
|
---|
657 | Procedure SetUserId(NewValue:String);
|
---|
658 | Procedure SetTableName(NewValue:String);
|
---|
659 | Function GetTableName:String;
|
---|
660 | Procedure SetTableLock(LockType:TLockType;Lock:Boolean);
|
---|
661 | Procedure SetMasterSource(NewValue:TDataSource);
|
---|
662 | Function GetMasterFields:String;
|
---|
663 | Procedure SetMasterFields(Const NewValue:String);
|
---|
664 | Procedure ConnectServant(Servant:TTable;Connect:Boolean);
|
---|
665 | Procedure CloseStmt;
|
---|
666 | Procedure GetNames(List:TStrings;Const Name:String);
|
---|
667 | Procedure GetKeys(List:TStrings;Primary:Boolean);
|
---|
668 | Function GetIndexFieldCount:LongInt;
|
---|
669 | Function GetIndexField(Index:LongInt):TField;
|
---|
670 | Procedure SetIndexField(Index:LongInt;NewValue:TField);
|
---|
671 | Function GetIndexDefs:TIndexDefs;
|
---|
672 | Protected
|
---|
673 | Procedure SetupComponent;Override;
|
---|
674 | Procedure SetActive(NewValue:Boolean);Override;
|
---|
675 | Function GetResultColRow(Col,Row:LongInt):TField;Override;
|
---|
676 | Procedure CommitInsert(Commit:Boolean);Override;
|
---|
677 | Function UpdateFieldSelect(Field:TField):Boolean;Override;
|
---|
678 | Procedure DataChange(event:TDataChange);Override;
|
---|
679 | Procedure QueryTable;Override;
|
---|
680 | Procedure DoOpen;Override;
|
---|
681 | Procedure DoClose;Override;
|
---|
682 | Procedure DoDelete;Override;
|
---|
683 | Procedure DoCancel;Override;
|
---|
684 | Procedure DoPost;Override;
|
---|
685 | Procedure Loaded;Override;
|
---|
686 | Procedure UpdateLinkList(Const PropertyName:String;LinkList:TList);Override;
|
---|
687 | Public
|
---|
688 | Procedure UpdateIndexDefs;Virtual;
|
---|
689 | Procedure UpdateFieldDefs;
|
---|
690 | Destructor Destroy;Override;
|
---|
691 | Procedure RefreshTable;Override;
|
---|
692 | Function WriteSCUResource(Stream:TResourceStream):Boolean;Override;
|
---|
693 | Procedure ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);Override;
|
---|
694 | Procedure GetDataSources(List:TStrings);Override;
|
---|
695 | Procedure GetStoredProcNames(List:TStrings);Override;
|
---|
696 | Procedure LockTable(LockType:TLockType);Virtual;
|
---|
697 | Procedure UnlockTable(LockType:TLockType);Virtual;
|
---|
698 | Procedure GetPrimaryKeys(List:TStrings);Virtual;
|
---|
699 | Procedure GetTableNames(List:TStrings);Virtual;
|
---|
700 | Procedure AddIndex(Const Name:String;Fields:String;Options:TIndexOptions);Virtual;
|
---|
701 | Procedure DeleteIndex(Const Name: string);Virtual;
|
---|
702 | Procedure CreateTable;Virtual;
|
---|
703 | Procedure DeleteTable;Virtual;
|
---|
704 | Procedure EmptyTable;Virtual;
|
---|
705 | Function FindKey(Const KeyValues:Array of Const):Boolean;Virtual;
|
---|
706 | Procedure GetIndexNames(List: TStrings);Virtual;
|
---|
707 | Procedure RenameTable(NewTableName:String);Virtual;
|
---|
708 | Procedure GetViewNames(List:TStrings);Virtual;
|
---|
709 | Procedure GetSystemTableNames(List:TStrings);Virtual;
|
---|
710 | Procedure GetSynonymNames(List:TStrings);Virtual;
|
---|
711 | Procedure GetDataTypes(List:TStrings);Virtual;
|
---|
712 | Procedure GetForeignKeys(List:TStrings);Virtual;
|
---|
713 | Function DataType2Name(DataType:TFieldType):String;
|
---|
714 | Public
|
---|
715 | Property IndexDefs:TIndexDefs read GetIndexDefs;
|
---|
716 | Property IndexFieldCount:LongInt read GetIndexFieldCount;
|
---|
717 | Property IndexFields[Index:LongInt]:TField read GetIndexField write SetIndexField;
|
---|
718 | Published
|
---|
719 | Property TableName:String Read GetTableName Write SetTableName;
|
---|
720 | Property Password:String Read GetPassword Write SetPassword;
|
---|
721 | Property UserId:String Read GetUserId Write SetUserId;
|
---|
722 | Property MasterSource:TDataSource Read FMasterSource Write SetMasterSource;
|
---|
723 | Property MasterFields:String Read GetMasterFields Write SetMasterFields;
|
---|
724 | End;
|
---|
725 |
|
---|
726 |
|
---|
727 | TQuery=Class(TTable)
|
---|
728 | Private
|
---|
729 | Property TableName;
|
---|
730 | Property MasterFields;
|
---|
731 | Property MasterSource;
|
---|
732 | Property ReadOnly;
|
---|
733 | Procedure SetSQL(NewValue:TStrings);
|
---|
734 | Protected
|
---|
735 | Procedure SetupComponent;Override;
|
---|
736 | Public
|
---|
737 | Procedure RefreshTable;Override;
|
---|
738 | Function WriteSCUResource(Stream:TResourceStream):Boolean;Override;
|
---|
739 | Procedure ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);Override;
|
---|
740 | Published
|
---|
741 | Property SQL:TStrings Read FSelect Write SetSQL;
|
---|
742 | End;
|
---|
743 |
|
---|
744 | TParams = Class;
|
---|
745 |
|
---|
746 | TParamType = (ptUnknown, ptInput, ptOutput, ptInputOutput, ptResult, ptResultSet);
|
---|
747 |
|
---|
748 | TParam = Class
|
---|
749 | Private
|
---|
750 | FParamList: TParams;
|
---|
751 | FData: Variant;
|
---|
752 | FName:PString;
|
---|
753 | FDataType: TFieldType;
|
---|
754 | FNull: Boolean;
|
---|
755 | FBound: Boolean;
|
---|
756 | FParamType: TParamType;
|
---|
757 | FResultNTS:CString;
|
---|
758 | FResultLongInt:LongInt;
|
---|
759 | FResultSmallInt:SmallInt;
|
---|
760 | FResultExtended:Extended;
|
---|
761 | FResultDate:Record
|
---|
762 | Year:Word;
|
---|
763 | Month:Word;
|
---|
764 | Day:Word;
|
---|
765 | End;
|
---|
766 | FResultTime:Record
|
---|
767 | Hour:WORD;
|
---|
768 | Minute:WORD;
|
---|
769 | Second:WORD;
|
---|
770 | End;
|
---|
771 | FResultDateTime:Record
|
---|
772 | Year:Word;
|
---|
773 | Month:Word;
|
---|
774 | Day:Word;
|
---|
775 | Hour:WORD;
|
---|
776 | Minute:WORD;
|
---|
777 | Second:WORD;
|
---|
778 | Fraction:LongWord;
|
---|
779 | End;
|
---|
780 | FOutLen:SQLINTEGER;
|
---|
781 | Private
|
---|
782 | Procedure SetAsBCD(Value: Currency);
|
---|
783 | Procedure SetAsBoolean(Value: Boolean);
|
---|
784 | Procedure SetAsCurrency(Value:Extended);
|
---|
785 | Procedure SetAsDate(Value: TDateTime);
|
---|
786 | Procedure SetAsDateTime(Value: TDateTime);
|
---|
787 | Procedure SetAsFloat(Const Value:Extended);
|
---|
788 | Procedure SetAsInteger(Value: Longint);
|
---|
789 | Procedure SetAsString(const Value: string);
|
---|
790 | Procedure SetAsSmallInt(Value: LongInt);
|
---|
791 | Procedure SetAsTime(Value: TDateTime);
|
---|
792 | Procedure SetAsVariant(Value: Variant);
|
---|
793 | Procedure SetAsWord(Value: LongInt);
|
---|
794 | Function GetName:String;
|
---|
795 | Procedure SetName(Const NewValue:String);
|
---|
796 | Protected
|
---|
797 | Function GetAsBCD: Currency;
|
---|
798 | Function GetAsBoolean: Boolean;
|
---|
799 | Function GetAsDateTime: TDateTime;
|
---|
800 | Function GetAsFloat:Extended;
|
---|
801 | Function GetAsInteger: Longint;
|
---|
802 | Function GetAsString: string;
|
---|
803 | Function GetAsVariant: Variant;
|
---|
804 | Function IsEqual(Value: TParam): Boolean;
|
---|
805 | Procedure SetDataType(Value: TFieldType);
|
---|
806 | Procedure SetText(Const Value:String);
|
---|
807 | Public
|
---|
808 | Constructor Create(AParamList: TParams; AParamType: TParamType);
|
---|
809 | Destructor Destroy;Override;
|
---|
810 | Procedure Assign(Param: TParam);
|
---|
811 | Procedure AssignField(Field: TField);
|
---|
812 | Procedure AssignFieldValue(Field:TField;Const Value: Variant);
|
---|
813 | Procedure Clear;
|
---|
814 | Public
|
---|
815 | Property AsBCD: Currency read GetAsBCD write SetAsBCD;
|
---|
816 | Property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
|
---|
817 | Property AsCurrency:Extended read GetAsFloat write SetAsCurrency;
|
---|
818 | Property AsDate: TDateTime read GetAsDateTime write SetAsDate;
|
---|
819 | Property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime;
|
---|
820 | Property AsFloat:Extended read GetAsFloat write SetAsFloat;
|
---|
821 | Property AsInteger: LongInt read GetAsInteger write SetAsInteger;
|
---|
822 | Property AsSmallInt: LongInt read GetAsInteger write SetAsSmallInt;
|
---|
823 | Property AsString:String read GetAsString write SetAsString;
|
---|
824 | Property AsTime: TDateTime read GetAsDateTime write SetAsTime;
|
---|
825 | Property AsWord: LongInt read GetAsInteger write SetAsWord;
|
---|
826 | Property Bound: Boolean read FBound write FBound;
|
---|
827 | Property DataType: TFieldType read FDataType write SetDataType;
|
---|
828 | Property IsNull: Boolean read FNull;
|
---|
829 | Property Name:String read GetName write SetName;
|
---|
830 | Property ParamType: TParamType read FParamType write FParamType;
|
---|
831 | Property Text:String read GetAsString write SetText;
|
---|
832 | Property Value: Variant read GetAsVariant write SetAsVariant;
|
---|
833 | End;
|
---|
834 |
|
---|
835 | TParams=Class
|
---|
836 | Private
|
---|
837 | FItems: TList;
|
---|
838 | Function GetParam(Index: Word): TParam;
|
---|
839 | Function GetParamValue(Const ParamName:String):Variant;
|
---|
840 | Procedure SetParamValue(Const ParamName:String;Const Value: Variant);
|
---|
841 | Public
|
---|
842 | Constructor Create;Virtual;
|
---|
843 | Destructor Destroy;Override;
|
---|
844 | Procedure AddParam(Value: TParam);
|
---|
845 | Procedure RemoveParam(Value: TParam);
|
---|
846 | Function CreateParam(FldType:TFieldType;Const ParamName:String;ParamType: TParamType): TParam;
|
---|
847 | Function Count:LongInt;
|
---|
848 | Procedure Clear;
|
---|
849 | Function IsEqual(Value:TParams): Boolean;
|
---|
850 | Function ParamByName(Const Value:String): TParam;
|
---|
851 | Property Items[Index: Word]: TParam read GetParam;default;
|
---|
852 | Property ParamValues[Const ParamName:String]: Variant read GetParamValue write SetParamValue;
|
---|
853 | End;
|
---|
854 |
|
---|
855 | TStoredProc=Class(TTable)
|
---|
856 | Private
|
---|
857 | FPrepared:Boolean;
|
---|
858 | FParams:TParams;
|
---|
859 | FProcName:String;
|
---|
860 | Function GetParamCount:Word;
|
---|
861 | Procedure SetPrepared(NewValue:Boolean);
|
---|
862 | Procedure SetParams(NewValue:TParams);
|
---|
863 | Procedure SetStoredProcName(NewValue:String);
|
---|
864 | Property TableName;
|
---|
865 | Property MasterSource;
|
---|
866 | Property MasterFields;
|
---|
867 | Property ReadOnly;
|
---|
868 | Protected
|
---|
869 | Procedure Loaded;Override;
|
---|
870 | Procedure DoOpen;Override;
|
---|
871 | Procedure DoClose;Override;
|
---|
872 | Function UpdateFieldSelect(field:TField):Boolean;Override;
|
---|
873 | Public
|
---|
874 | Constructor Create(AOwner: TComponent);Override;
|
---|
875 | Destructor Destroy;Override;
|
---|
876 | Procedure Insert;Override;
|
---|
877 | Procedure Delete;Override;
|
---|
878 | Procedure InsertRecord(Const Values:Array Of Const);Override;
|
---|
879 | Procedure CopyParams(Value:TParams);
|
---|
880 | Procedure ExecProc;
|
---|
881 | Function ParamByName(Const Value:String):TParam;
|
---|
882 | Procedure Prepare;
|
---|
883 | Procedure UnPrepare;
|
---|
884 | Procedure SetDefaultParams;
|
---|
885 | Property ParamCount:Word read GetParamCount;
|
---|
886 | Property StmtHandle:SQLHStmt read FDBProcs.ahstmt;
|
---|
887 | Property Prepared: Boolean read FPrepared write SetPrepared;
|
---|
888 | Property Params:TParams read FParams write SetParams;
|
---|
889 | Published
|
---|
890 | Property StoredProcName:String read FProcName write SetStoredProcName;
|
---|
891 | End;
|
---|
892 |
|
---|
893 |
|
---|
894 | Function Field2String(field:TField):String;
|
---|
895 | Function ExtractFieldName(Const Fields:String;Var Pos:LongInt):String;
|
---|
896 |
|
---|
897 | Procedure DatabaseError(Const Message:String);
|
---|
898 | Procedure SQLError(Const Message:String);
|
---|
899 |
|
---|
900 |
|
---|
901 |
|
---|
902 | Implementation
|
---|
903 |
|
---|
904 | Type
|
---|
905 | TGraphicHeader=Record
|
---|
906 | Count:Word; { Fixed at 1 }
|
---|
907 | HType:Word; { Fixed at $0100 }
|
---|
908 | Size:Longint; { Size not including header }
|
---|
909 | End;
|
---|
910 |
|
---|
911 | Const SQLProcessCount:LongWord=0;
|
---|
912 |
|
---|
913 | Procedure EnterSQLProcessing;
|
---|
914 | Begin
|
---|
915 | Screen.Cursor:=crSQLWait;
|
---|
916 | inc(SQLProcessCount);
|
---|
917 | End;
|
---|
918 |
|
---|
919 | Procedure LeaveSQLProcessing;
|
---|
920 | Begin
|
---|
921 | If SQLProcessCount>0 Then dec(SQLProcessCount);
|
---|
922 | If SQLProcessCount=0 Then Screen.Cursor:=crDefault;
|
---|
923 | End;
|
---|
924 |
|
---|
925 | Procedure DatabaseError(Const Message:String);
|
---|
926 | Begin
|
---|
927 | SQLProcessCount:=0;
|
---|
928 | LeaveSQLProcessing;
|
---|
929 | Raise EDataBaseError.Create(Message);
|
---|
930 | End;
|
---|
931 |
|
---|
932 | Procedure SQLError(Const Message:String);
|
---|
933 | Begin
|
---|
934 | SQLProcessCount:=0;
|
---|
935 | LeaveSQLProcessing;
|
---|
936 | Raise ESQLError.Create(Message);
|
---|
937 | End;
|
---|
938 |
|
---|
939 | {
|
---|
940 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
941 | º º
|
---|
942 | º Speed-Pascal/2 Version 2.0 º
|
---|
943 | º º
|
---|
944 | º Speed-Pascal Component Classes (SPCC) º
|
---|
945 | º º
|
---|
946 | º This section: TDataLink Class Implementation º
|
---|
947 | º º
|
---|
948 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
949 | º º
|
---|
950 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
951 | }
|
---|
952 |
|
---|
953 | Procedure TDataLink.SetDataSource(NewValue:TDataSource);
|
---|
954 | Begin
|
---|
955 | If NewValue=FDataSource Then Exit;
|
---|
956 | If FDataSource<>Nil Then FDataSource.Notification(Self,opRemove);
|
---|
957 | FDataSource:=NewValue;
|
---|
958 | If FDataSource<>Nil Then FDataSource.FreeNotification(Self);
|
---|
959 | DataChange(deDataBaseChanged);
|
---|
960 | End;
|
---|
961 |
|
---|
962 | Procedure TDataLink.DataChange(event:TDataChange);
|
---|
963 | Begin
|
---|
964 | If OnDataChange<>Nil Then OnDataChange(Self,event);
|
---|
965 | End;
|
---|
966 |
|
---|
967 | Procedure TDataLink.Notification(AComponent:TComponent;Operation:TOperation);
|
---|
968 | Begin
|
---|
969 | Inherited Notification(AComponent,Operation);
|
---|
970 |
|
---|
971 | If AComponent=TComponent(FDataSource) Then If Operation=opRemove Then
|
---|
972 | Begin
|
---|
973 | FDataSource:=Nil;
|
---|
974 | DataChange(deDataBaseChanged);
|
---|
975 | End;
|
---|
976 | End;
|
---|
977 |
|
---|
978 | Destructor TDataLink.Destroy;
|
---|
979 | Begin
|
---|
980 | If FDataSource<>Nil Then FDataSource.Notification(Self,opRemove);
|
---|
981 | FDataSource:=Nil;
|
---|
982 | DataChange(deDataBaseChanged);
|
---|
983 | Inherited Destroy;
|
---|
984 | End;
|
---|
985 |
|
---|
986 | Procedure TDataLink.SetupComponent;
|
---|
987 | Begin
|
---|
988 | Inherited SetupComponent;
|
---|
989 |
|
---|
990 | Name:='DataLink';
|
---|
991 | If Owner<>Nil Then SetDesigning(Owner.Designed);
|
---|
992 | End;
|
---|
993 |
|
---|
994 | {
|
---|
995 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
996 | º º
|
---|
997 | º Speed-Pascal/2 Version 2.0 º
|
---|
998 | º º
|
---|
999 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1000 | º º
|
---|
1001 | º This section: TTableDataLink Class Implementation º
|
---|
1002 | º º
|
---|
1003 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1004 | º º
|
---|
1005 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1006 | }
|
---|
1007 |
|
---|
1008 | Function TTableDataLink.GetColRowField(Col,Row:LongInt):TField;
|
---|
1009 | Begin
|
---|
1010 | Result:=Nil;
|
---|
1011 | If ((FDataSource=Nil)Or(FDataSource.DataSet=Nil)) Then Exit;
|
---|
1012 | Result:=FDataSource.DataSet.GetResultColRow(Col,Row);
|
---|
1013 | End;
|
---|
1014 |
|
---|
1015 | Function TTableDataLink.GetNameRowField(Name:String;Row:LongInt):TField;
|
---|
1016 | Var Col:LongInt;
|
---|
1017 | S:String;
|
---|
1018 | T:LongInt;
|
---|
1019 | Label Ok;
|
---|
1020 | Begin
|
---|
1021 | Result:=Nil;
|
---|
1022 | If ((FDataSource=Nil)Or(FDataSource.DataSet=Nil)) Then Exit;
|
---|
1023 |
|
---|
1024 | UpcaseStr(Name);
|
---|
1025 | For T:=0 To FDataSource.DataSet.FieldCount-1 Do
|
---|
1026 | Begin
|
---|
1027 | S:=FDataSource.DataSet.FieldNames[T];
|
---|
1028 | UpcaseStr(S);
|
---|
1029 | If S=Name Then
|
---|
1030 | Begin
|
---|
1031 | Col:=T;
|
---|
1032 | Goto Ok;
|
---|
1033 | End;
|
---|
1034 | End;
|
---|
1035 | Exit;
|
---|
1036 | Ok:
|
---|
1037 | Result:=FDataSource.DataSet.GetResultColRow(Col,Row);
|
---|
1038 | End;
|
---|
1039 |
|
---|
1040 | Procedure TTableDataLink.SetupComponent;
|
---|
1041 | Begin
|
---|
1042 | Inherited SetupComponent;
|
---|
1043 | Name:='TableDataLink';
|
---|
1044 | End;
|
---|
1045 |
|
---|
1046 | Function TTableDataLink.GetFieldCount:LongInt;
|
---|
1047 | Begin
|
---|
1048 | Result:=0;
|
---|
1049 | If ((FDataSource=Nil)Or(FDataSource.DataSet=Nil)) Then Exit;
|
---|
1050 | Result:=FDataSource.DataSet.FieldCount;
|
---|
1051 | End;
|
---|
1052 |
|
---|
1053 | Function TTableDataLink.GetFieldName(Index:LongInt):String;
|
---|
1054 | Begin
|
---|
1055 | Result:='';
|
---|
1056 | If ((FDataSource=Nil)Or(FDataSource.DataSet=Nil)) Then Exit;
|
---|
1057 | Result:=FDataSource.DataSet.FieldNames[Index];
|
---|
1058 | End;
|
---|
1059 |
|
---|
1060 | {
|
---|
1061 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1062 | º º
|
---|
1063 | º Speed-Pascal/2 Version 2.0 º
|
---|
1064 | º º
|
---|
1065 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1066 | º º
|
---|
1067 | º This section: TFieldDataLink Class Implementation º
|
---|
1068 | º º
|
---|
1069 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1070 | º º
|
---|
1071 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1072 | }
|
---|
1073 |
|
---|
1074 | Procedure TFieldDataLink.SetFieldName(Const NewValue:String);
|
---|
1075 | Begin
|
---|
1076 | If GetFieldName=NewValue Then exit;
|
---|
1077 |
|
---|
1078 | AssignStr(FFieldName,NewValue);
|
---|
1079 | DataChange(deDataBaseChanged);
|
---|
1080 | End;
|
---|
1081 |
|
---|
1082 | Function TFieldDataLink.GetFieldName:String;
|
---|
1083 | Begin
|
---|
1084 | Result:=FFieldName^;
|
---|
1085 | End;
|
---|
1086 |
|
---|
1087 | Procedure TFieldDataLink.SetupComponent;
|
---|
1088 | Begin
|
---|
1089 | AssignStr(FFieldName,'');
|
---|
1090 |
|
---|
1091 | Inherited SetupComponent;
|
---|
1092 |
|
---|
1093 | Name:='FieldDataLink';
|
---|
1094 | End;
|
---|
1095 |
|
---|
1096 | Function TFieldDataLink.GetField:TField;
|
---|
1097 | Var T:LongInt;
|
---|
1098 | S,s1:String;
|
---|
1099 | Begin
|
---|
1100 | Result:=Nil;
|
---|
1101 | S:=GetFieldName;
|
---|
1102 | If ((FDataSource=Nil)Or(FDataSource.DataSet=Nil)Or(S='')) Then Exit;
|
---|
1103 | UpcaseStr(S);
|
---|
1104 | For T:=0 To FDataSource.DataSet.FieldCount-1 Do
|
---|
1105 | Begin
|
---|
1106 | s1:=FDataSource.DataSet.FieldNames[T];
|
---|
1107 | UpcaseStr(s1);
|
---|
1108 | If S=s1 Then
|
---|
1109 | Begin
|
---|
1110 | Result:=FDataSource.DataSet.Fields[T];
|
---|
1111 | Exit;
|
---|
1112 | End;
|
---|
1113 | End;
|
---|
1114 | End;
|
---|
1115 |
|
---|
1116 | Destructor TFieldDataLink.Destroy;
|
---|
1117 | Begin
|
---|
1118 | AssignStr(FFieldName,'');
|
---|
1119 |
|
---|
1120 | Inherited Destroy;
|
---|
1121 | End;
|
---|
1122 |
|
---|
1123 | {
|
---|
1124 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1125 | º º
|
---|
1126 | º Speed-Pascal/2 Version 2.0 º
|
---|
1127 | º º
|
---|
1128 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1129 | º º
|
---|
1130 | º This section: TDataSource Class Implementation º
|
---|
1131 | º º
|
---|
1132 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1133 | º º
|
---|
1134 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1135 | }
|
---|
1136 |
|
---|
1137 | //This tables DataSource changes, notify All Servants linked With MasterSource
|
---|
1138 | Procedure NotifyServants(Table:TTable);
|
---|
1139 | Var T:LongInt;
|
---|
1140 | Servant:TTable;
|
---|
1141 | Begin
|
---|
1142 | If Table.FServants<>Nil Then
|
---|
1143 | Begin
|
---|
1144 | //notify All Servants that their MasterSource Is invalid
|
---|
1145 | For T:=0 To Table.FServants.Count-1 Do
|
---|
1146 | Begin
|
---|
1147 | Servant:=Table.FServants[T];
|
---|
1148 | Servant.FMasterSource:=Nil;
|
---|
1149 | If ((Servant.ComponentState*[csReading]=[])And(Not Servant.FDataSetLocked)) Then
|
---|
1150 | Servant.RefreshTable;
|
---|
1151 | End;
|
---|
1152 | Table.FServants.Clear;
|
---|
1153 | End;
|
---|
1154 | End;
|
---|
1155 |
|
---|
1156 | Procedure TDataSource.SetDataSet(NewValue:TDataSet);
|
---|
1157 | Var Table,Servant:TTable;
|
---|
1158 | T:LongInt;
|
---|
1159 | Begin
|
---|
1160 | If FDataSet<>Nil Then
|
---|
1161 | Begin
|
---|
1162 | If FDataSet Is TTable Then
|
---|
1163 | Begin
|
---|
1164 | If Not (NewValue Is TTable) Then NotifyServants(TTable(FDataSet))
|
---|
1165 | Else If NewValue<>FDataSet Then
|
---|
1166 | Begin
|
---|
1167 | //New DataSet Is also A Table
|
---|
1168 | //Link All Servants Of This Table To the New one
|
---|
1169 | Table:=TTable(FDataSet);
|
---|
1170 | If Table.FServants<>Nil Then
|
---|
1171 | Begin
|
---|
1172 | For T:=0 To Table.FServants.Count-1 Do
|
---|
1173 | Begin
|
---|
1174 | Servant:=Table.FServants[T];
|
---|
1175 | TTable(NewValue).ConnectServant(Servant,True);
|
---|
1176 | End;
|
---|
1177 | Table.FServants.Clear;
|
---|
1178 | End;
|
---|
1179 | End;
|
---|
1180 | End;
|
---|
1181 |
|
---|
1182 | FDataSet.Notification(Self,opRemove);
|
---|
1183 | End;
|
---|
1184 | FDataSet:=NewValue;
|
---|
1185 | If FDataSet<>Nil Then FDataSet.FreeNotification(Self);
|
---|
1186 | DataChange(deDataBaseChanged);
|
---|
1187 | End;
|
---|
1188 |
|
---|
1189 | Destructor TDataSource.Destroy;
|
---|
1190 | Begin
|
---|
1191 | If FDataSet Is TTable Then NotifyServants(TTable(FDataSet));
|
---|
1192 | If FDataSet<>Nil Then FDataSet.Notification(Self,opRemove);
|
---|
1193 | FDataSet:=Nil;
|
---|
1194 | Inherited Destroy;
|
---|
1195 | End;
|
---|
1196 |
|
---|
1197 | Procedure TDataSource.SetupComponent;
|
---|
1198 | Begin
|
---|
1199 | Include(ComponentState, csHandleLinks);
|
---|
1200 | Inherited SetupComponent;
|
---|
1201 |
|
---|
1202 | // Include(DesignerState,dsDetail);
|
---|
1203 | Name:='DataSource';
|
---|
1204 | End;
|
---|
1205 |
|
---|
1206 | Procedure TDataSource.DataChange(event:TDataChange);
|
---|
1207 | Var T:LongInt;
|
---|
1208 | Link:TDataLink;
|
---|
1209 | FLinkList:TList;
|
---|
1210 | Begin
|
---|
1211 | FLinkList:=FreeNotifyList;
|
---|
1212 | If FLinkList<>Nil Then For T:=0 To FLinkList.Count-1 Do
|
---|
1213 | Begin
|
---|
1214 | Link:=FLinkList.Items[T];
|
---|
1215 | If Link Is TDataLink Then Link.DataChange(event);
|
---|
1216 | End;
|
---|
1217 | End;
|
---|
1218 |
|
---|
1219 | Procedure TDataSource.Notification(AComponent:TComponent;Operation:TOperation);
|
---|
1220 | Begin
|
---|
1221 | Inherited Notification(AComponent,Operation);
|
---|
1222 |
|
---|
1223 | If AComponent=TComponent(FDataSet) Then If Operation=opRemove Then
|
---|
1224 | Begin
|
---|
1225 | FDataSet:=Nil;
|
---|
1226 | DataChange(deDataBaseChanged);
|
---|
1227 | If OnDataChange<>Nil Then OnDataChange(Self,deDataBaseChanged);
|
---|
1228 | End;
|
---|
1229 | End;
|
---|
1230 |
|
---|
1231 | {
|
---|
1232 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1233 | º º
|
---|
1234 | º Speed-Pascal/2 Version 2.0 º
|
---|
1235 | º º
|
---|
1236 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1237 | º º
|
---|
1238 | º This section: TField Class Implementation º
|
---|
1239 | º º
|
---|
1240 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1241 | º º
|
---|
1242 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1243 | }
|
---|
1244 |
|
---|
1245 | Function TField.GetIsIndexField:Boolean;
|
---|
1246 | Var s,s1,s2:String;
|
---|
1247 | t:LongInt;
|
---|
1248 | IndexDef:TIndexDef;
|
---|
1249 | Begin
|
---|
1250 | Result:=False;
|
---|
1251 | If not (FDataSet Is TTable) Then exit;
|
---|
1252 | s:=FieldName;
|
---|
1253 | UpcaseStr(s);
|
---|
1254 | For t:=0 To TTable(FDataSet).IndexDefs.Count-1 Do
|
---|
1255 | Begin
|
---|
1256 | IndexDef:=TTable(FDataSet).IndexDefs[t];
|
---|
1257 | s1:=IndexDef.Fields;
|
---|
1258 | UpcaseStr(s1);
|
---|
1259 | While pos(';',s1)<>0 Do
|
---|
1260 | Begin
|
---|
1261 | s2:=Copy(s1,1,pos(';',s1)-1);
|
---|
1262 | Delete(s1,1,pos(';',s1));
|
---|
1263 | If s=s2 Then
|
---|
1264 | Begin
|
---|
1265 | Result:=True;
|
---|
1266 | exit;
|
---|
1267 | End;
|
---|
1268 | End;
|
---|
1269 | If s=s1 Then Result:=True;
|
---|
1270 | End;
|
---|
1271 | End;
|
---|
1272 |
|
---|
1273 | Function TField.GetReadOnly:Boolean;
|
---|
1274 | Begin
|
---|
1275 | Result:=FReadOnly Or FDataSet.ReadOnly;
|
---|
1276 | End;
|
---|
1277 |
|
---|
1278 | Function TField.GetCanModify:Boolean;
|
---|
1279 | Begin
|
---|
1280 | Result:=not ReadOnly;
|
---|
1281 | End;
|
---|
1282 |
|
---|
1283 | Procedure TField.SetData(Buffer:Pointer);
|
---|
1284 | Begin
|
---|
1285 | If ReadOnly Then DataBaseError('Cannot modify a readonly field !');
|
---|
1286 |
|
---|
1287 | If FValueLen > 0 Then
|
---|
1288 | Begin
|
---|
1289 | If FValue<>Nil Then FreeMem(FValue,FValueLen);
|
---|
1290 | FValue:=Nil;
|
---|
1291 | If Buffer<>Nil Then
|
---|
1292 | Begin
|
---|
1293 | GetMem(FValue,FValueLen);
|
---|
1294 | Move(Buffer^,FValue^,FValueLen);
|
---|
1295 | End;
|
---|
1296 | End;
|
---|
1297 | End;
|
---|
1298 |
|
---|
1299 | Procedure TField.Assign(Field:TField);
|
---|
1300 | Begin
|
---|
1301 | If ReadOnly Then DataBaseError('Cannot modify a readonly field !');
|
---|
1302 |
|
---|
1303 | If Field=Nil Then
|
---|
1304 | Begin
|
---|
1305 | Clear;
|
---|
1306 | If FValueLen<>0 Then FreeMem(FValue,FValueLen);
|
---|
1307 | FValueLen:=0;
|
---|
1308 | FValue:=Nil;
|
---|
1309 | exit;
|
---|
1310 | End;
|
---|
1311 |
|
---|
1312 | Value:=Field.Value;
|
---|
1313 | End;
|
---|
1314 |
|
---|
1315 | Function TField.GetAsVariant:Variant;
|
---|
1316 | Begin
|
---|
1317 | AccessError('Variant');
|
---|
1318 | End;
|
---|
1319 |
|
---|
1320 | Procedure TField.SetAsVariant(NewValue:Variant);
|
---|
1321 | Begin
|
---|
1322 | AccessError('Variant');
|
---|
1323 | End;
|
---|
1324 |
|
---|
1325 | Function TField.GetFieldName:String;
|
---|
1326 | Begin
|
---|
1327 | If FFieldDef <> Nil Then Result := FFieldDef.Name
|
---|
1328 | Else Result:='';
|
---|
1329 | End;
|
---|
1330 |
|
---|
1331 | Function TField.GetIsNull:Boolean;
|
---|
1332 | Begin
|
---|
1333 | Result:=FValue=Nil;
|
---|
1334 | End;
|
---|
1335 |
|
---|
1336 | Destructor TField.Destroy;
|
---|
1337 | Begin
|
---|
1338 | If FValue<>Nil Then
|
---|
1339 | If FValueLen>0 Then FreeMem(FValue,FValueLen);
|
---|
1340 | FValueLen:=0;
|
---|
1341 | FValue:=Nil;
|
---|
1342 |
|
---|
1343 | Inherited Destroy;
|
---|
1344 | End;
|
---|
1345 |
|
---|
1346 | Procedure TField.Clear;
|
---|
1347 | Var OldValue:Pointer;
|
---|
1348 | OldValueLen:LongInt;
|
---|
1349 | Begin
|
---|
1350 | //SetNewValue(Nil,0);
|
---|
1351 |
|
---|
1352 | OldValue := FValue;
|
---|
1353 | OldValueLen := FValueLen;
|
---|
1354 | FValueLen := 0;
|
---|
1355 | FValue := Nil;
|
---|
1356 | FDataSet.UpdateField(Self,OldValue,OldValueLen);
|
---|
1357 | {wo wird der alte Speicher wieder freigegeben???}
|
---|
1358 | End;
|
---|
1359 |
|
---|
1360 |
|
---|
1361 | Procedure TField.FreeMemory;
|
---|
1362 | Begin
|
---|
1363 | If (FValue <> Nil) And (FValueLen > 0) Then FreeMem(FValue,FValueLen);
|
---|
1364 | FValueLen := 0;
|
---|
1365 | FValue := Nil;
|
---|
1366 | End;
|
---|
1367 |
|
---|
1368 | Procedure TField.GetMemory(Size:Longint);
|
---|
1369 | Begin
|
---|
1370 | FValueLen := Size;
|
---|
1371 | GetMem(FValue,FValueLen);
|
---|
1372 | End;
|
---|
1373 |
|
---|
1374 |
|
---|
1375 | Procedure TField.AccessError(Const TypeName:String);
|
---|
1376 | Begin
|
---|
1377 | DatabaseError('Invalid type conversion to '+TypeName+' in field: '+FieldName);
|
---|
1378 | End;
|
---|
1379 |
|
---|
1380 |
|
---|
1381 | Procedure TField.CheckInactive;
|
---|
1382 | Begin
|
---|
1383 | If FDataSet <> Nil Then FDataSet.CheckInactive;
|
---|
1384 | End;
|
---|
1385 |
|
---|
1386 |
|
---|
1387 | {$HINTS OFF}
|
---|
1388 | Procedure TField.SetAsValue(Var Value;Len:LongInt);
|
---|
1389 | Begin
|
---|
1390 | SetNewValue(Value,Len);
|
---|
1391 | End;
|
---|
1392 |
|
---|
1393 | Function TField.GetAsString:String;
|
---|
1394 | Begin
|
---|
1395 | AccessError('String');
|
---|
1396 | End;
|
---|
1397 |
|
---|
1398 | Procedure TField.SetAsString(Const NewValue:String);
|
---|
1399 | Begin
|
---|
1400 | AccessError('String');
|
---|
1401 | End;
|
---|
1402 |
|
---|
1403 | Function TField.GetAsAnsiString:AnsiString;
|
---|
1404 | Begin
|
---|
1405 | AccessError('AnsiString');
|
---|
1406 | End;
|
---|
1407 |
|
---|
1408 | Procedure TField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1409 | Begin
|
---|
1410 | AccessError('AnsiString');
|
---|
1411 | End;
|
---|
1412 |
|
---|
1413 | Function TField.GetAsBoolean:Boolean;
|
---|
1414 | Begin
|
---|
1415 | AccessError('Boolean');
|
---|
1416 | End;
|
---|
1417 |
|
---|
1418 | Procedure TField.SetAsBoolean(NewValue:Boolean);
|
---|
1419 | Begin
|
---|
1420 | AccessError('Boolean');
|
---|
1421 | End;
|
---|
1422 |
|
---|
1423 | Function TField.GetAsDateTime:TDateTime;
|
---|
1424 | Begin
|
---|
1425 | AccessError('DateTime');
|
---|
1426 | End;
|
---|
1427 |
|
---|
1428 | Procedure TField.SetAsDateTime(NewValue:TDateTime);
|
---|
1429 | Begin
|
---|
1430 | AccessError('DateTime');
|
---|
1431 | End;
|
---|
1432 |
|
---|
1433 | Function TField.GetAsFloat:Extended;
|
---|
1434 | Begin
|
---|
1435 | AccessError('Float');
|
---|
1436 | End;
|
---|
1437 |
|
---|
1438 | Procedure TField.SetAsFloat(Const NewValue:Extended);
|
---|
1439 | Begin
|
---|
1440 | AccessError('Float');
|
---|
1441 | End;
|
---|
1442 |
|
---|
1443 | Function TField.GetAsInteger:LongInt;
|
---|
1444 | Begin
|
---|
1445 | AccessError('Integer');
|
---|
1446 | End;
|
---|
1447 |
|
---|
1448 | Procedure TField.SetAsInteger(NewValue:LongInt);
|
---|
1449 | Begin
|
---|
1450 | AccessError('Integer');
|
---|
1451 | End;
|
---|
1452 | {$HINTS ON}
|
---|
1453 |
|
---|
1454 | Procedure TField.SetNewValue(Var NewValue;NewLen:LongInt);
|
---|
1455 | Var OldValue:Pointer;
|
---|
1456 | OldValueLen:LongInt;
|
---|
1457 | Begin
|
---|
1458 | If ReadOnly Then DataBaseError('Cannot modify a readonly field !');
|
---|
1459 |
|
---|
1460 | OldValue:=FValue;
|
---|
1461 | OldValueLen:=FValueLen;
|
---|
1462 | FValueLen:=NewLen;
|
---|
1463 | If FValueLen > 0 Then
|
---|
1464 | Begin
|
---|
1465 | GetMem(FValue,FValueLen);
|
---|
1466 | Move(NewValue,FValue^,FValueLen);
|
---|
1467 | End;
|
---|
1468 | FDataSet.UpdateField(Self,OldValue,OldValueLen);
|
---|
1469 | {wo wird der alte Speicher wieder freigegeben???}
|
---|
1470 | End;
|
---|
1471 |
|
---|
1472 | {
|
---|
1473 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1474 | º º
|
---|
1475 | º Speed-Pascal/2 Version 2.0 º
|
---|
1476 | º º
|
---|
1477 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1478 | º º
|
---|
1479 | º This section: TStringField Class Implementation º
|
---|
1480 | º º
|
---|
1481 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1482 | º º
|
---|
1483 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1484 | }
|
---|
1485 |
|
---|
1486 | Function TStringField.GetAsVariant:Variant;
|
---|
1487 | Begin
|
---|
1488 | Result:=GetAsString;
|
---|
1489 | End;
|
---|
1490 |
|
---|
1491 | Procedure TStringField.SetAsVariant(NewValue:Variant);
|
---|
1492 | Begin
|
---|
1493 | SetAsString(NewValue);
|
---|
1494 | End;
|
---|
1495 |
|
---|
1496 | Function TStringField.GetAsString:String;
|
---|
1497 | Begin
|
---|
1498 | If FValue <> Nil Then
|
---|
1499 | Begin
|
---|
1500 | Result[0] := Chr(FValueLen);
|
---|
1501 | Move(FValue^,Result[1],Ord(Result[0]));
|
---|
1502 | If Result[Length(Result)]=#0 Then
|
---|
1503 | If length(Result)>0 Then Dec(Result[0]);
|
---|
1504 | End
|
---|
1505 | //Else Result:='NULL';
|
---|
1506 | Else Result := '';
|
---|
1507 | End;
|
---|
1508 |
|
---|
1509 | Procedure TStringField.SetAsString(Const NewValue:String);
|
---|
1510 | Var C:CString;
|
---|
1511 | Begin
|
---|
1512 | If NewValue <> '' Then
|
---|
1513 | Begin
|
---|
1514 | C:=NewValue;
|
---|
1515 | SetNewValue(C,Length(NewValue)+1);
|
---|
1516 | End
|
---|
1517 | Else Clear;
|
---|
1518 | End;
|
---|
1519 |
|
---|
1520 | Function TStringField.GetAsAnsiString:AnsiString;
|
---|
1521 | Begin
|
---|
1522 | If FValue<>Nil Then Result:=PChar(Value)^
|
---|
1523 | Else Result:='';
|
---|
1524 | End;
|
---|
1525 |
|
---|
1526 | Procedure TStringField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1527 | Begin
|
---|
1528 | If PChar(NewValue) = Nil Then NewValue:=#0;
|
---|
1529 | SetNewValue(PChar(NewValue)^,length(PChar(NewValue)^)+1)
|
---|
1530 | End;
|
---|
1531 |
|
---|
1532 | Function TStringField.GetAsBoolean:Boolean;
|
---|
1533 | Var S:String;
|
---|
1534 | Begin
|
---|
1535 | S:=GetAsString;
|
---|
1536 | UpcaseStr(S);
|
---|
1537 | If ((S='TRUE')Or(S='YES')Or(S='1')) Then Result:=True
|
---|
1538 | Else Result:=False
|
---|
1539 | End;
|
---|
1540 |
|
---|
1541 | Procedure TStringField.SetAsBoolean(NewValue:Boolean);
|
---|
1542 | Var S:String;
|
---|
1543 | Begin
|
---|
1544 | If NewValue Then S:='True'
|
---|
1545 | Else S:='False';
|
---|
1546 | SetAsString(S);
|
---|
1547 | End;
|
---|
1548 |
|
---|
1549 | Function TStringField.GetAsDateTime:TDateTime;
|
---|
1550 | Begin
|
---|
1551 | Result:=StrToDateTime(GetAsString);
|
---|
1552 | End;
|
---|
1553 |
|
---|
1554 | Function TStringField.GetAsFloat:Extended;
|
---|
1555 | Begin
|
---|
1556 | Result:=StrToFloat(GetAsString);
|
---|
1557 | End;
|
---|
1558 |
|
---|
1559 | Procedure TStringField.SetAsFloat(Const NewValue:Extended);
|
---|
1560 | Begin
|
---|
1561 | SetAsString(FloatToStr(NewValue));
|
---|
1562 | End;
|
---|
1563 |
|
---|
1564 | Function TStringField.GetAsInteger:LongInt;
|
---|
1565 | Begin
|
---|
1566 | Result:=StrToInt(GetAsString);
|
---|
1567 | End;
|
---|
1568 |
|
---|
1569 | Procedure TStringField.SetAsInteger(NewValue:LongInt);
|
---|
1570 | Begin
|
---|
1571 | SetAsString(tostr(NewValue));
|
---|
1572 | End;
|
---|
1573 |
|
---|
1574 | {
|
---|
1575 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1576 | º º
|
---|
1577 | º Speed-Pascal/2 Version 2.0 º
|
---|
1578 | º º
|
---|
1579 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1580 | º º
|
---|
1581 | º This section: TSmallintField Class Implementation º
|
---|
1582 | º º
|
---|
1583 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1584 | º º
|
---|
1585 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1586 | }
|
---|
1587 |
|
---|
1588 | Function TSmallIntField.GetAsVariant:Variant;
|
---|
1589 | Begin
|
---|
1590 | Result:=GetAsSmallInt;
|
---|
1591 | End;
|
---|
1592 |
|
---|
1593 | Procedure TSmallIntField.SetAsVariant(NewValue:Variant);
|
---|
1594 | Begin
|
---|
1595 | SetAsSmallInt(NewValue);
|
---|
1596 | End;
|
---|
1597 |
|
---|
1598 |
|
---|
1599 | Function TSmallintField.GetAsString:String;
|
---|
1600 | Begin
|
---|
1601 | If FValue<>Nil Then Result:=tostr(Integer(FValue^))
|
---|
1602 | Else Result:='';
|
---|
1603 | End;
|
---|
1604 |
|
---|
1605 | Procedure TSmallintField.SetAsString(Const NewValue:String);
|
---|
1606 | Var I,C:Integer;
|
---|
1607 | Begin
|
---|
1608 | If NewValue <> '' Then
|
---|
1609 | Begin
|
---|
1610 | Val(NewValue,I,C);
|
---|
1611 | If C=0 Then SetNewValue(I,SizeOf(Integer));
|
---|
1612 | End
|
---|
1613 | Else Clear;
|
---|
1614 | End;
|
---|
1615 |
|
---|
1616 | Function TSmallintField.GetAsAnsiString:AnsiString;
|
---|
1617 | Begin
|
---|
1618 | Result:=GetAsString;
|
---|
1619 | End;
|
---|
1620 |
|
---|
1621 | Procedure TSmallintField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1622 | Begin
|
---|
1623 | SetAsString(NewValue);
|
---|
1624 | End;
|
---|
1625 |
|
---|
1626 | Function TSmallintField.GetAsBoolean:Boolean;
|
---|
1627 | Var I:Integer;
|
---|
1628 | Begin
|
---|
1629 | I:=GetAsInteger;
|
---|
1630 | Result:=I<>0;
|
---|
1631 | End;
|
---|
1632 |
|
---|
1633 | Procedure TSmallintField.SetAsBoolean(NewValue:Boolean);
|
---|
1634 | Begin
|
---|
1635 | If NewValue Then SetAsInteger(1)
|
---|
1636 | Else SetAsInteger(0);
|
---|
1637 | End;
|
---|
1638 |
|
---|
1639 | Function TSmallintField.GetAsSmallint:Integer;
|
---|
1640 | Begin
|
---|
1641 | If FValue<>Nil Then Result:=Integer(FValue^)
|
---|
1642 | Else AccessError('Smallint');
|
---|
1643 | End;
|
---|
1644 |
|
---|
1645 | Procedure TSmallintField.SetAsSmallInt(NewValue:Integer);
|
---|
1646 | Begin
|
---|
1647 | SetNewValue(NewValue,SizeOf(Integer));
|
---|
1648 | End;
|
---|
1649 |
|
---|
1650 | Function TSmallintField.GetAsFloat:Extended;
|
---|
1651 | Begin
|
---|
1652 | If FValue<>Nil Then Result:=Integer(FValue^)
|
---|
1653 | Else AccessError('Float');
|
---|
1654 | End;
|
---|
1655 |
|
---|
1656 | Procedure TSmallintField.SetAsFloat(Const NewValue:Extended);
|
---|
1657 | Begin
|
---|
1658 | SetAsSmallInt(Round(NewValue));
|
---|
1659 | End;
|
---|
1660 |
|
---|
1661 | Function TSmallintField.GetAsInteger:LongInt;
|
---|
1662 | Begin
|
---|
1663 | If FValue<>Nil Then Result:=Integer(FValue^)
|
---|
1664 | Else AccessError('Integer');
|
---|
1665 | End;
|
---|
1666 |
|
---|
1667 | Procedure TSmallintField.SetAsInteger(NewValue:LongInt);
|
---|
1668 | Begin
|
---|
1669 | SetAsSmallInt(NewValue);
|
---|
1670 | End;
|
---|
1671 |
|
---|
1672 | {
|
---|
1673 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1674 | º º
|
---|
1675 | º Speed-Pascal/2 Version 2.0 º
|
---|
1676 | º º
|
---|
1677 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1678 | º º
|
---|
1679 | º This section: TIntegerField Class Implementation º
|
---|
1680 | º º
|
---|
1681 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1682 | º º
|
---|
1683 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1684 | }
|
---|
1685 |
|
---|
1686 |
|
---|
1687 | Function TIntegerField.GetAsVariant:Variant;
|
---|
1688 | Begin
|
---|
1689 | Result:=GetAsInteger;
|
---|
1690 | End;
|
---|
1691 |
|
---|
1692 | Procedure TIntegerField.SetAsVariant(NewValue:Variant);
|
---|
1693 | Begin
|
---|
1694 | SetAsInteger(NewValue);
|
---|
1695 | End;
|
---|
1696 |
|
---|
1697 | Function TIntegerField.GetAsString:String;
|
---|
1698 | Begin
|
---|
1699 | If FValue<>Nil Then Result:=tostr(LongInt(FValue^))
|
---|
1700 | Else Result:='';
|
---|
1701 | End;
|
---|
1702 |
|
---|
1703 | Procedure TIntegerField.SetAsString(Const NewValue:String);
|
---|
1704 | Var I:LongInt;
|
---|
1705 | C:Integer;
|
---|
1706 | Begin
|
---|
1707 | If NewValue <> '' Then
|
---|
1708 | Begin
|
---|
1709 | Val(NewValue,I,C);
|
---|
1710 | If C=0 Then SetNewValue(I,SizeOf(LongInt))
|
---|
1711 | Else AccessError('String');
|
---|
1712 | End
|
---|
1713 | Else Clear;
|
---|
1714 | End;
|
---|
1715 |
|
---|
1716 | Function TIntegerField.GetAsAnsiString:AnsiString;
|
---|
1717 | Begin
|
---|
1718 | Result:=GetAsString;
|
---|
1719 | End;
|
---|
1720 |
|
---|
1721 | Procedure TIntegerField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1722 | Begin
|
---|
1723 | SetAsString(NewValue);
|
---|
1724 | End;
|
---|
1725 |
|
---|
1726 | Function TIntegerField.GetAsBoolean:Boolean;
|
---|
1727 | Var I:Integer;
|
---|
1728 | Begin
|
---|
1729 | I:=GetAsInteger;
|
---|
1730 | Result:=I<>0;
|
---|
1731 | End;
|
---|
1732 |
|
---|
1733 | Procedure TIntegerField.SetAsBoolean(NewValue:Boolean);
|
---|
1734 | Begin
|
---|
1735 | If NewValue Then SetAsInteger(1)
|
---|
1736 | Else SetAsInteger(0);
|
---|
1737 | End;
|
---|
1738 |
|
---|
1739 | Function TIntegerField.GetAsFloat:Extended;
|
---|
1740 | Begin
|
---|
1741 | If FValue<>Nil Then Result:=LongInt(FValue^)
|
---|
1742 | Else AccessError('Float');
|
---|
1743 | End;
|
---|
1744 |
|
---|
1745 | Procedure TIntegerField.SetAsFloat(Const NewValue:Extended);
|
---|
1746 | Begin
|
---|
1747 | SetAsInteger(Round(NewValue));
|
---|
1748 | End;
|
---|
1749 |
|
---|
1750 | Function TIntegerField.GetAsInteger:LongInt;
|
---|
1751 | Begin
|
---|
1752 | If FValue<>Nil Then Result:=LongInt(FValue^)
|
---|
1753 | Else AccessError('Integer');
|
---|
1754 | End;
|
---|
1755 |
|
---|
1756 | Procedure TIntegerField.SetAsInteger(NewValue:LongInt);
|
---|
1757 | Begin
|
---|
1758 | SetNewValue(NewValue,SizeOf(LongInt));
|
---|
1759 | End;
|
---|
1760 |
|
---|
1761 | {
|
---|
1762 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1763 | º º
|
---|
1764 | º Speed-Pascal/2 Version 2.0 º
|
---|
1765 | º º
|
---|
1766 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1767 | º º
|
---|
1768 | º This section: TBooleanField Class Implementation º
|
---|
1769 | º º
|
---|
1770 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1771 | º º
|
---|
1772 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1773 | }
|
---|
1774 |
|
---|
1775 | Function TBooleanField.GetAsVariant:Variant;
|
---|
1776 | Begin
|
---|
1777 | Result:=GetAsBoolean;
|
---|
1778 | End;
|
---|
1779 |
|
---|
1780 | Procedure TBooleanField.SetAsVariant(NewValue:Variant);
|
---|
1781 | Begin
|
---|
1782 | SetAsBoolean(NewValue);
|
---|
1783 | End;
|
---|
1784 |
|
---|
1785 |
|
---|
1786 | Function TBooleanField.GetAsString:String;
|
---|
1787 | Begin
|
---|
1788 | If FValue<>Nil Then
|
---|
1789 | Begin
|
---|
1790 | If Boolean(FValue^) Then Result:='True'
|
---|
1791 | Else Result:='False';
|
---|
1792 | End
|
---|
1793 | Else Result:='';
|
---|
1794 | End;
|
---|
1795 |
|
---|
1796 | Procedure TBooleanField.SetAsString(Const NewValue:String);
|
---|
1797 | Var s:String;
|
---|
1798 | Begin
|
---|
1799 | If NewValue <> '' Then
|
---|
1800 | Begin
|
---|
1801 | s:=NewValue;
|
---|
1802 | UpcaseStr(s);
|
---|
1803 |
|
---|
1804 | If ((s='TRUE')Or(s='YES')Or(s='T')Or(s='Y')Or(s='1')) Then SetAsBoolean(True)
|
---|
1805 | Else SetAsBoolean(False);
|
---|
1806 | End
|
---|
1807 | Else Clear;
|
---|
1808 | End;
|
---|
1809 |
|
---|
1810 | Function TBooleanField.GetAsAnsiString:AnsiString;
|
---|
1811 | Begin
|
---|
1812 | Result:=GetAsString;
|
---|
1813 | End;
|
---|
1814 |
|
---|
1815 | Procedure TBooleanField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1816 | Begin
|
---|
1817 | SetAsString(NewValue);
|
---|
1818 | End;
|
---|
1819 |
|
---|
1820 | Function TBooleanField.GetAsBoolean:Boolean;
|
---|
1821 | Begin
|
---|
1822 | If FValue<>Nil Then
|
---|
1823 | Begin
|
---|
1824 | Result := Boolean(FValue^);
|
---|
1825 | End
|
---|
1826 | Else Result:=False;
|
---|
1827 | End;
|
---|
1828 |
|
---|
1829 | Procedure TBooleanField.SetAsBoolean(NewValue:Boolean);
|
---|
1830 | Begin
|
---|
1831 | SetNewValue(NewValue,SizeOf(Boolean))
|
---|
1832 | End;
|
---|
1833 |
|
---|
1834 | Function TBooleanField.GetAsFloat:Extended;
|
---|
1835 | Begin
|
---|
1836 | If FValue<>Nil Then
|
---|
1837 | Begin
|
---|
1838 | If Boolean(FValue^) Then Result := 1
|
---|
1839 | Else Result := 0;
|
---|
1840 | End
|
---|
1841 | Else AccessError('Float');
|
---|
1842 | End;
|
---|
1843 |
|
---|
1844 | Procedure TBooleanField.SetAsFloat(Const NewValue:Extended);
|
---|
1845 | Begin
|
---|
1846 | SetAsInteger(round(NewValue));
|
---|
1847 | End;
|
---|
1848 |
|
---|
1849 | Function TBooleanField.GetAsInteger:LongInt;
|
---|
1850 | Begin
|
---|
1851 | If FValue<>Nil Then
|
---|
1852 | Begin
|
---|
1853 | If Boolean(FValue^) Then Result := 1
|
---|
1854 | Else Result := 0;
|
---|
1855 | End
|
---|
1856 | Else AccessError('Integer');
|
---|
1857 | End;
|
---|
1858 |
|
---|
1859 | Procedure TBooleanField.SetAsInteger(NewValue:LongInt);
|
---|
1860 | Begin
|
---|
1861 | If NewValue = 0 Then SetAsBoolean(False)
|
---|
1862 | Else SetAsBoolean(True);
|
---|
1863 | End;
|
---|
1864 |
|
---|
1865 |
|
---|
1866 | {
|
---|
1867 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
1868 | º º
|
---|
1869 | º Speed-Pascal/2 Version 2.0 º
|
---|
1870 | º º
|
---|
1871 | º Speed-Pascal Component Classes (SPCC) º
|
---|
1872 | º º
|
---|
1873 | º This section: TFloatField Class Implementation º
|
---|
1874 | º º
|
---|
1875 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
1876 | º º
|
---|
1877 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
1878 | }
|
---|
1879 |
|
---|
1880 | Constructor TFloatField.Create;
|
---|
1881 | Begin
|
---|
1882 | Inherited Create;
|
---|
1883 |
|
---|
1884 | FPrecision := -1;
|
---|
1885 | End;
|
---|
1886 |
|
---|
1887 | Function TFloatField.GetAsVariant:Variant;
|
---|
1888 | Begin
|
---|
1889 | Result:=GetAsFloat;
|
---|
1890 | End;
|
---|
1891 |
|
---|
1892 | Procedure TFloatField.SetAsVariant(NewValue:Variant);
|
---|
1893 | Begin
|
---|
1894 | SetAsFloat(NewValue);
|
---|
1895 | End;
|
---|
1896 |
|
---|
1897 |
|
---|
1898 | Procedure TFloatField.SetPrecision(Value:Longint);
|
---|
1899 | Begin
|
---|
1900 | //If Value < 2 Then Value := 2;
|
---|
1901 | If Value > 15 Then Value := 15;
|
---|
1902 | FPrecision := Value;
|
---|
1903 | End;
|
---|
1904 |
|
---|
1905 |
|
---|
1906 | Function TFloatField.GetAsString:String;
|
---|
1907 | Var E:Extended;
|
---|
1908 | Begin
|
---|
1909 | If FValue <> Nil Then
|
---|
1910 | Begin
|
---|
1911 | E := GetAsFloat;
|
---|
1912 |
|
---|
1913 | If Precision >= 0 Then
|
---|
1914 | Begin
|
---|
1915 | Result := Format('%.'+ tostr(Precision) +'f',[E]);
|
---|
1916 | If Precision = 0 Then
|
---|
1917 | If pos('.',Result) > 0 Then SubStr(Result,1,pos('.',Result)-1);
|
---|
1918 | End
|
---|
1919 | Else Result := FloatToStr(E);
|
---|
1920 | End
|
---|
1921 | Else Result := '';
|
---|
1922 | End;
|
---|
1923 |
|
---|
1924 |
|
---|
1925 | Procedure TFloatField.SetAsString(Const NewValue:String);
|
---|
1926 | Var E:Extended;
|
---|
1927 | C:Integer;
|
---|
1928 | p:Integer;
|
---|
1929 | aValue:String;
|
---|
1930 | Begin
|
---|
1931 | If NewValue <> '' Then
|
---|
1932 | Begin
|
---|
1933 | //replace , by .
|
---|
1934 | p := pos(',',NewValue);
|
---|
1935 | If p > 0 Then
|
---|
1936 | Begin
|
---|
1937 | aValue := NewValue;
|
---|
1938 | aValue[p] := '.';
|
---|
1939 | Val(aValue,E,C);
|
---|
1940 | End
|
---|
1941 | Else Val(NewValue,E,C);
|
---|
1942 |
|
---|
1943 | If C=0 Then SetAsFloat(E)
|
---|
1944 | Else AccessError('String');
|
---|
1945 | End
|
---|
1946 | Else Clear;
|
---|
1947 | End;
|
---|
1948 |
|
---|
1949 |
|
---|
1950 | Function TFloatField.GetAsAnsiString:AnsiString;
|
---|
1951 | Begin
|
---|
1952 | Result:=GetAsString;
|
---|
1953 | End;
|
---|
1954 |
|
---|
1955 | Procedure TFloatField.SetAsAnsiString(NewValue:AnsiString);
|
---|
1956 | Begin
|
---|
1957 | SetAsString(NewValue);
|
---|
1958 | End;
|
---|
1959 |
|
---|
1960 | Function TFloatField.GetAsFloat:Extended;
|
---|
1961 | Begin
|
---|
1962 | If FValue<>Nil Then
|
---|
1963 | Begin
|
---|
1964 | Case FSize Of
|
---|
1965 | 4:Result:=Single(FValue^);
|
---|
1966 | 8:Result:=Double(FValue^);
|
---|
1967 | 10:Result:=Extended(FValue^);
|
---|
1968 | Else AccessError('Float');
|
---|
1969 | End; {Case}
|
---|
1970 | End
|
---|
1971 | //Else AccessError('Float');
|
---|
1972 | Else Result := 0;
|
---|
1973 | End;
|
---|
1974 |
|
---|
1975 |
|
---|
1976 | Procedure TFloatField.SetAsFloat(Const NewValue:Extended);
|
---|
1977 | Var E:Extended;
|
---|
1978 | S:Single;
|
---|
1979 | D:Double;
|
---|
1980 | Begin
|
---|
1981 | Case FSize Of
|
---|
1982 | 4:
|
---|
1983 | Begin
|
---|
1984 | S:=NewValue;
|
---|
1985 | SetNewValue(S,SizeOf(Single));
|
---|
1986 | End;
|
---|
1987 | 8:
|
---|
1988 | Begin
|
---|
1989 | D:=NewValue;
|
---|
1990 | SetNewValue(D,SizeOf(Double));
|
---|
1991 | End;
|
---|
1992 | 10:
|
---|
1993 | Begin
|
---|
1994 | E:=NewValue;
|
---|
1995 | SetNewValue(E,SizeOf(Extended));
|
---|
1996 | End;
|
---|
1997 | End;
|
---|
1998 | End;
|
---|
1999 |
|
---|
2000 |
|
---|
2001 | Function TFloatField.GetAsInteger:LongInt;
|
---|
2002 | Begin
|
---|
2003 | Result := Round(GetAsFloat);
|
---|
2004 | End;
|
---|
2005 |
|
---|
2006 |
|
---|
2007 | Procedure TFloatField.SetAsInteger(NewValue:LongInt);
|
---|
2008 | Var E:Extended;
|
---|
2009 | Begin
|
---|
2010 | E := NewValue;
|
---|
2011 | SetAsFloat(E);
|
---|
2012 | End;
|
---|
2013 |
|
---|
2014 | {
|
---|
2015 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2016 | º º
|
---|
2017 | º Speed-Pascal/2 Version 2.0 º
|
---|
2018 | º º
|
---|
2019 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2020 | º º
|
---|
2021 | º This section: TCurrencyField Class Implementation º
|
---|
2022 | º º
|
---|
2023 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2024 | º º
|
---|
2025 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2026 | }
|
---|
2027 |
|
---|
2028 | Constructor TCurrencyField.Create;
|
---|
2029 | Begin
|
---|
2030 | Inherited Create;
|
---|
2031 |
|
---|
2032 | FPrecision := 2;
|
---|
2033 | End;
|
---|
2034 |
|
---|
2035 |
|
---|
2036 | {
|
---|
2037 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2038 | º º
|
---|
2039 | º Speed-Pascal/2 Version 2.0 º
|
---|
2040 | º º
|
---|
2041 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2042 | º º
|
---|
2043 | º This section: TDateField Class Implementation º
|
---|
2044 | º º
|
---|
2045 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2046 | º º
|
---|
2047 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2048 | }
|
---|
2049 |
|
---|
2050 | Function TDateField.GetAsString:String;
|
---|
2051 | Var date:TDateTime;
|
---|
2052 | Begin
|
---|
2053 | If FValue <> Nil Then
|
---|
2054 | Begin
|
---|
2055 | date := GetAsDateTime;
|
---|
2056 | DateTimeToString(result,DisplayFormat,date);
|
---|
2057 | End
|
---|
2058 | Else Result := '';
|
---|
2059 | End;
|
---|
2060 |
|
---|
2061 | Destructor TDateField.Destroy;
|
---|
2062 | Begin
|
---|
2063 | AssignStr(FDisplayFormat,'');
|
---|
2064 | Inherited Destroy;
|
---|
2065 | End;
|
---|
2066 |
|
---|
2067 | Function TDateField.GetDisplayFormat:String;
|
---|
2068 | Begin
|
---|
2069 | If FDisplayFormat=Nil Then Result:=ShortDateFormat
|
---|
2070 | Else Result:=FDisplayFormat^;
|
---|
2071 | End;
|
---|
2072 |
|
---|
2073 | Procedure TDateField.SetDisplayFormat(Const NewValue:String);
|
---|
2074 | Begin
|
---|
2075 | AssignStr(FDisplayFormat,NewValue);
|
---|
2076 | If FDataSet<>Nil Then FDataSet.DataChange(deDataBaseChanged);
|
---|
2077 | End;
|
---|
2078 |
|
---|
2079 | Function TDateField.GetAsVariant:Variant;
|
---|
2080 | Begin
|
---|
2081 | Result:=GetAsDateTime;
|
---|
2082 | End;
|
---|
2083 |
|
---|
2084 | Procedure TDateField.SetAsVariant(NewValue:Variant);
|
---|
2085 | Begin
|
---|
2086 | SetAsDateTime(NewValue);
|
---|
2087 | End;
|
---|
2088 |
|
---|
2089 |
|
---|
2090 | Procedure TDateField.SetAsString(Const NewValue:String);
|
---|
2091 | Var dt:TDateTime;
|
---|
2092 | Valid:Boolean;
|
---|
2093 | Begin
|
---|
2094 | If NewValue <> '' Then
|
---|
2095 | Begin
|
---|
2096 | Try
|
---|
2097 | dt:=StrToDate(NewValue);
|
---|
2098 | Valid:=True;
|
---|
2099 | Except
|
---|
2100 | Valid:=False;
|
---|
2101 | End;
|
---|
2102 | If Valid Then SetAsDateTime(dt);
|
---|
2103 | End
|
---|
2104 | Else Clear;
|
---|
2105 | End;
|
---|
2106 |
|
---|
2107 | Function TDateField.GetAsAnsiString:AnsiString;
|
---|
2108 | Begin
|
---|
2109 | Result:=GetAsString;
|
---|
2110 | End;
|
---|
2111 |
|
---|
2112 | Procedure TDateField.SetAsAnsiString(NewValue:AnsiString);
|
---|
2113 | Begin
|
---|
2114 | SetAsString(NewValue);
|
---|
2115 | End;
|
---|
2116 |
|
---|
2117 | Function TDateField.GetAsFloat:Extended;
|
---|
2118 | Begin
|
---|
2119 | If FValue<>Nil Then Result:=GetAsDateTime
|
---|
2120 | Else AccessError('Float');
|
---|
2121 | End;
|
---|
2122 |
|
---|
2123 |
|
---|
2124 | Function TDateField.GetAsDateTime:TDateTime;
|
---|
2125 | Var date:TODBCDate;
|
---|
2126 | Begin
|
---|
2127 | If FValue<>Nil Then
|
---|
2128 | Begin
|
---|
2129 | date:=TODBCDate(FValue^);
|
---|
2130 | Result:=EncodeDate(date.Year,date.Month,date.Day);
|
---|
2131 | End
|
---|
2132 | Else AccessError('DateTime');
|
---|
2133 | End;
|
---|
2134 |
|
---|
2135 | Procedure TDateField.SetAsDateTime(NewValue:TDateTime);
|
---|
2136 | Var R:TODBCDate;
|
---|
2137 | Begin
|
---|
2138 | DecodeDate(NewValue,R.Year,R.Month,R.Day);
|
---|
2139 | SetNewValue(R,SizeOf(R));
|
---|
2140 | End;
|
---|
2141 |
|
---|
2142 | {
|
---|
2143 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2144 | º º
|
---|
2145 | º Speed-Pascal/2 Version 2.0 º
|
---|
2146 | º º
|
---|
2147 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2148 | º º
|
---|
2149 | º This section: TTimeField Class Implementation º
|
---|
2150 | º º
|
---|
2151 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2152 | º º
|
---|
2153 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2154 | }
|
---|
2155 |
|
---|
2156 |
|
---|
2157 | Procedure RoundDecodeTime(Time: TDateTime; Var Hour, Min, Sec: Word);
|
---|
2158 | Var MSec:Word;
|
---|
2159 | Begin
|
---|
2160 | DecodeTime(Time, Hour, Min, Sec, MSec);
|
---|
2161 |
|
---|
2162 | If MSec > 500 Then
|
---|
2163 | Begin
|
---|
2164 | MSec := 0;
|
---|
2165 | inc(Sec);
|
---|
2166 | End;
|
---|
2167 | If Sec >= 60 Then
|
---|
2168 | Begin
|
---|
2169 | dec(Sec,60);
|
---|
2170 | inc(Min);
|
---|
2171 | End;
|
---|
2172 | If Min >= 60 Then
|
---|
2173 | Begin
|
---|
2174 | dec(Min,60);
|
---|
2175 | inc(Hour);
|
---|
2176 | End;
|
---|
2177 | End;
|
---|
2178 |
|
---|
2179 |
|
---|
2180 | Destructor TTimeField.Destroy;
|
---|
2181 | Begin
|
---|
2182 | AssignStr(FDisplayFormat,'');
|
---|
2183 | Inherited Destroy;
|
---|
2184 | End;
|
---|
2185 |
|
---|
2186 | Function TTimeField.GetDisplayFormat:String;
|
---|
2187 | Begin
|
---|
2188 | If FDisplayFormat=Nil Then Result:=LongTimeFormat
|
---|
2189 | Else Result:=FDisplayFormat^;
|
---|
2190 | End;
|
---|
2191 |
|
---|
2192 | Procedure TTimeField.SetDisplayFormat(Const NewValue:String);
|
---|
2193 | Begin
|
---|
2194 | AssignStr(FDisplayFormat,NewValue);
|
---|
2195 | If FDataSet<>Nil Then FDataSet.DataChange(deDataBaseChanged);
|
---|
2196 | End;
|
---|
2197 |
|
---|
2198 | Function TTimeField.GetAsVariant:Variant;
|
---|
2199 | Begin
|
---|
2200 | Result:=GetAsDateTime;
|
---|
2201 | End;
|
---|
2202 |
|
---|
2203 | Procedure TTimeField.SetAsVariant(NewValue:Variant);
|
---|
2204 | Begin
|
---|
2205 | SetAsDateTime(NewValue);
|
---|
2206 | End;
|
---|
2207 |
|
---|
2208 |
|
---|
2209 | Function TTimeField.GetAsString:String;
|
---|
2210 | Var Time:TDateTime;
|
---|
2211 | Begin
|
---|
2212 | If FValue<>Nil Then
|
---|
2213 | Begin
|
---|
2214 | Time:=GetAsDateTime;
|
---|
2215 | DateTimeToString(Result,DisplayFormat,Time);
|
---|
2216 | End
|
---|
2217 | Else Result:='';
|
---|
2218 | End;
|
---|
2219 |
|
---|
2220 | Procedure TTimeField.SetAsString(Const NewValue:String);
|
---|
2221 | Var dt:TDateTime;
|
---|
2222 | Valid:Boolean;
|
---|
2223 | Begin
|
---|
2224 | If NewValue <> '' Then
|
---|
2225 | Begin
|
---|
2226 | Try
|
---|
2227 | dt:=StrToTime(NewValue);
|
---|
2228 | Valid:=True;
|
---|
2229 | Except
|
---|
2230 | Valid:=False;
|
---|
2231 | End;
|
---|
2232 | If Valid Then SetAsDateTime(dt);
|
---|
2233 | End
|
---|
2234 | Else Clear;
|
---|
2235 | End;
|
---|
2236 |
|
---|
2237 | Function TTimeField.GetAsAnsiString:AnsiString;
|
---|
2238 | Begin
|
---|
2239 | Result:=GetAsString;
|
---|
2240 | End;
|
---|
2241 |
|
---|
2242 | Procedure TTimeField.SetAsAnsiString(NewValue:AnsiString);
|
---|
2243 | Begin
|
---|
2244 | SetAsString(NewValue);
|
---|
2245 | End;
|
---|
2246 |
|
---|
2247 | Function TTimeField.GetAsFloat:Extended;
|
---|
2248 | Begin
|
---|
2249 | If FValue<>Nil Then Result:=GetAsDateTime
|
---|
2250 | Else AccessError('Float');
|
---|
2251 | End;
|
---|
2252 |
|
---|
2253 |
|
---|
2254 | Function TTimeField.GetAsDateTime:TDateTime;
|
---|
2255 | Var Time:TODBCTime;
|
---|
2256 | Begin
|
---|
2257 | If FValue<>Nil Then
|
---|
2258 | Begin
|
---|
2259 | Time:=TODBCTime(FValue^);
|
---|
2260 | Result:=EncodeTime(Time.Hour,Time.Minute,Time.Second,0);
|
---|
2261 | End
|
---|
2262 | Else AccessError('DateTime');
|
---|
2263 | End;
|
---|
2264 |
|
---|
2265 | Procedure TTimeField.SetAsDateTime(NewValue:TDateTime);
|
---|
2266 | Var R:TODBCTime;
|
---|
2267 | Begin
|
---|
2268 | RoundDecodeTime(NewValue,R.Hour,R.Minute,R.Second);
|
---|
2269 | SetNewValue(R,SizeOf(R));
|
---|
2270 | End;
|
---|
2271 |
|
---|
2272 | {
|
---|
2273 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2274 | º º
|
---|
2275 | º Speed-Pascal/2 Version 2.0 º
|
---|
2276 | º º
|
---|
2277 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2278 | º º
|
---|
2279 | º This section: TDateTimeField Class Implementation º
|
---|
2280 | º º
|
---|
2281 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2282 | º º
|
---|
2283 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2284 | }
|
---|
2285 |
|
---|
2286 |
|
---|
2287 | Destructor TDateTimeField.Destroy;
|
---|
2288 | Begin
|
---|
2289 | AssignStr(FDisplayFormat,'');
|
---|
2290 | Inherited Destroy;
|
---|
2291 | End;
|
---|
2292 |
|
---|
2293 | Function TDateTimeField.GetDisplayFormat:String;
|
---|
2294 | Begin
|
---|
2295 | If FDisplayFormat=Nil Then Result:=ShortDateFormat+' '+LongTimeFormat
|
---|
2296 | Else Result:=FDisplayFormat^;
|
---|
2297 | End;
|
---|
2298 |
|
---|
2299 | Procedure TDateTimeField.SetDisplayFormat(Const NewValue:String);
|
---|
2300 | Begin
|
---|
2301 | AssignStr(FDisplayFormat,NewValue);
|
---|
2302 | If FDataSet<>Nil Then FDataSet.DataChange(deDataBaseChanged);
|
---|
2303 | End;
|
---|
2304 |
|
---|
2305 | Function TDateTimeField.GetAsVariant:Variant;
|
---|
2306 | Begin
|
---|
2307 | Result:=GetAsDateTime;
|
---|
2308 | End;
|
---|
2309 |
|
---|
2310 | Procedure TDateTimeField.SetAsVariant(NewValue:Variant);
|
---|
2311 | Begin
|
---|
2312 | SetAsDateTime(NewValue);
|
---|
2313 | End;
|
---|
2314 |
|
---|
2315 |
|
---|
2316 | Function TDateTimeField.GetAsString:String;
|
---|
2317 | Var DateTime:TDateTime;
|
---|
2318 | Begin
|
---|
2319 | If FValue<>Nil Then
|
---|
2320 | Begin
|
---|
2321 | DateTime:=GetAsDateTime;
|
---|
2322 | DateTimeToString(result,DisplayFormat,DateTime);
|
---|
2323 | End
|
---|
2324 | Else Result:='';
|
---|
2325 | End;
|
---|
2326 |
|
---|
2327 | Procedure TDateTimeField.SetAsString(Const NewValue:String);
|
---|
2328 | Var dt:TDateTime;
|
---|
2329 | Valid:Boolean;
|
---|
2330 | Begin
|
---|
2331 | If NewValue <> '' Then
|
---|
2332 | Begin
|
---|
2333 | Try
|
---|
2334 | dt:=StrToDateTime(NewValue);
|
---|
2335 | Valid:=True;
|
---|
2336 | Except
|
---|
2337 | Valid:=False;
|
---|
2338 | End;
|
---|
2339 | If Valid Then SetAsDateTime(dt);
|
---|
2340 | End
|
---|
2341 | Else Clear;
|
---|
2342 | End;
|
---|
2343 |
|
---|
2344 | Function TDateTimeField.GetAsAnsiString:AnsiString;
|
---|
2345 | Begin
|
---|
2346 | Result:=GetAsString;
|
---|
2347 | End;
|
---|
2348 |
|
---|
2349 | Procedure TDateTimeField.SetAsAnsiString(NewValue:AnsiString);
|
---|
2350 | Begin
|
---|
2351 | SetAsString(NewValue);
|
---|
2352 | End;
|
---|
2353 |
|
---|
2354 | Function TDateTimeField.GetAsFloat:Extended;
|
---|
2355 | Begin
|
---|
2356 | If FValue<>Nil Then Result:=GetAsDateTime
|
---|
2357 | Else AccessError('Float');
|
---|
2358 | End;
|
---|
2359 |
|
---|
2360 | Function TDateTimeField.GetAsDateTime:TDateTime;
|
---|
2361 | Var dt:TODBCDateTime;
|
---|
2362 | Begin
|
---|
2363 | If FValue<>Nil Then
|
---|
2364 | Begin
|
---|
2365 | dt:=TODBCDateTime(FValue^);
|
---|
2366 | Result:=EncodeDate(dt.Date.Year,dt.Date.Month,dt.Date.Day) +
|
---|
2367 | EncodeTime(dt.Time.Hour,dt.Time.Minute,dt.Time.Second,0);
|
---|
2368 | End
|
---|
2369 | Else AccessError('DateTime');
|
---|
2370 | End;
|
---|
2371 |
|
---|
2372 | Procedure TDateTimeField.SetAsDateTime(NewValue:TDateTime);
|
---|
2373 | Var R:TODBCDateTime;
|
---|
2374 | Begin
|
---|
2375 | DecodeDate(NewValue,R.Date.Year,R.Date.Month,R.Date.Day);
|
---|
2376 | RoundDecodeTime(NewValue,R.Time.Hour,R.Time.Minute,R.Time.Second);
|
---|
2377 | SetNewValue(R,SizeOf(R));
|
---|
2378 | End;
|
---|
2379 |
|
---|
2380 | {
|
---|
2381 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2382 | º º
|
---|
2383 | º Speed-Pascal/2 Version 2.0 º
|
---|
2384 | º º
|
---|
2385 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2386 | º º
|
---|
2387 | º This section: TBlobField Class Implementation º
|
---|
2388 | º º
|
---|
2389 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2390 | º º
|
---|
2391 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2392 | }
|
---|
2393 |
|
---|
2394 | Function TBlobField.GetAsString:String;
|
---|
2395 | Begin
|
---|
2396 | If FValue <> Nil Then Result := '[Blob]'
|
---|
2397 | Else Result := '[BLOB]';
|
---|
2398 | End;
|
---|
2399 |
|
---|
2400 | Function TBlobField.GetAsAnsiString:AnsiString;
|
---|
2401 | Begin
|
---|
2402 | Result := GetAsString;
|
---|
2403 | End;
|
---|
2404 |
|
---|
2405 | Procedure TBlobField.LoadFromStream(Stream:TStream);
|
---|
2406 | Var prec:^Byte;
|
---|
2407 | Begin
|
---|
2408 | If Stream Is TStream Then
|
---|
2409 | Begin
|
---|
2410 | GetMem(prec, Stream.Size);
|
---|
2411 | Stream.Position := 0;
|
---|
2412 | Stream.Read(prec^,Stream.Size);
|
---|
2413 | SetAsValue(prec^, Stream.Size);
|
---|
2414 | FreeMem(prec, Stream.Size);
|
---|
2415 | End;
|
---|
2416 | End;
|
---|
2417 |
|
---|
2418 | {
|
---|
2419 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2420 | º º
|
---|
2421 | º Speed-Pascal/2 Version 2.0 º
|
---|
2422 | º º
|
---|
2423 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2424 | º º
|
---|
2425 | º This section: TMemoField Class Implementation º
|
---|
2426 | º º
|
---|
2427 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2428 | º º
|
---|
2429 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2430 | }
|
---|
2431 |
|
---|
2432 | Function TMemoField.GetAsString:String;
|
---|
2433 | Begin
|
---|
2434 | If FValue <> Nil Then Result := '[Memo]'
|
---|
2435 | Else Result := '[MEMO]';
|
---|
2436 | End;
|
---|
2437 |
|
---|
2438 | Function TMemoField.GetAsAnsiString:AnsiString;
|
---|
2439 | Begin
|
---|
2440 | If FValue = Nil Then Result := ''
|
---|
2441 | Else Result := PChar(FValue)^;
|
---|
2442 | End;
|
---|
2443 |
|
---|
2444 | Procedure TMemoField.SetAsAnsiString(NewValue:AnsiString);
|
---|
2445 | Begin
|
---|
2446 | If NewValue <> '' Then
|
---|
2447 | Begin
|
---|
2448 | SetNewValue(PChar(NewValue)^,length(PChar(NewValue)^)+1);
|
---|
2449 | End
|
---|
2450 | Else Clear;
|
---|
2451 | End;
|
---|
2452 |
|
---|
2453 | {
|
---|
2454 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2455 | º º
|
---|
2456 | º Speed-Pascal/2 Version 2.0 º
|
---|
2457 | º º
|
---|
2458 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2459 | º º
|
---|
2460 | º This section: TGraphicField Class Implementation º
|
---|
2461 | º º
|
---|
2462 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2463 | º º
|
---|
2464 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2465 | }
|
---|
2466 |
|
---|
2467 | Function TGraphicField.GetAsString:String;
|
---|
2468 | Begin
|
---|
2469 | If FValue<>Nil Then Result:='[Graphic]'
|
---|
2470 | Else Result:='[GRAPHIC]';
|
---|
2471 | End;
|
---|
2472 |
|
---|
2473 | {
|
---|
2474 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2475 | º º
|
---|
2476 | º Speed-Pascal/2 Version 2.0 º
|
---|
2477 | º º
|
---|
2478 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2479 | º º
|
---|
2480 | º This section: TFieldList Class Implementation º
|
---|
2481 | º º
|
---|
2482 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2483 | º º
|
---|
2484 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2485 | }
|
---|
2486 |
|
---|
2487 | Procedure TFieldList.Clear;
|
---|
2488 | Var T:LongInt;
|
---|
2489 | field:TField;
|
---|
2490 | Begin
|
---|
2491 | For T:=0 To Count-1 Do
|
---|
2492 | Begin
|
---|
2493 | field:=Items[T];
|
---|
2494 | field.Destroy;
|
---|
2495 | End;
|
---|
2496 | Inherited Clear;
|
---|
2497 | End;
|
---|
2498 |
|
---|
2499 |
|
---|
2500 |
|
---|
2501 | {
|
---|
2502 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2503 | º º
|
---|
2504 | º Speed-Pascal/2 Version 2.0 º
|
---|
2505 | º º
|
---|
2506 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2507 | º º
|
---|
2508 | º This section: TIndexDef Class Implementation º
|
---|
2509 | º º
|
---|
2510 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2511 | º º
|
---|
2512 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2513 | }
|
---|
2514 |
|
---|
2515 | Function TIndexDef.GetName:String;
|
---|
2516 | Begin
|
---|
2517 | If FName<>Nil Then Result:=FName^
|
---|
2518 | Else Result:='';
|
---|
2519 | End;
|
---|
2520 |
|
---|
2521 | Function TIndexDef.GetFields:String;
|
---|
2522 | Begin
|
---|
2523 | If FFields<>Nil Then Result:=FFields^
|
---|
2524 | Else Result:='';
|
---|
2525 | End;
|
---|
2526 |
|
---|
2527 | Constructor TIndexDef.Create(Owner:TIndexDefs;Const Name, Fields:String;Options:TIndexOptions);
|
---|
2528 | Begin
|
---|
2529 | Inherited Create;
|
---|
2530 |
|
---|
2531 | If Owner <> Nil Then
|
---|
2532 | Begin
|
---|
2533 | Owner.FItems.Add(Self);
|
---|
2534 | FOwner:=Owner;
|
---|
2535 | End;
|
---|
2536 |
|
---|
2537 | AssignStr(FName,Name);
|
---|
2538 | AssignStr(FFields,Fields);
|
---|
2539 | FOptions:=Options;
|
---|
2540 | End;
|
---|
2541 |
|
---|
2542 | Destructor TIndexDef.Destroy;
|
---|
2543 | Begin
|
---|
2544 | If FOwner <> Nil Then FOwner.FItems.Remove(Self);
|
---|
2545 |
|
---|
2546 | AssignStr(FName,'');
|
---|
2547 | AssignStr(FFields,'');
|
---|
2548 |
|
---|
2549 | Inherited Destroy;
|
---|
2550 | End;
|
---|
2551 |
|
---|
2552 | {
|
---|
2553 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2554 | º º
|
---|
2555 | º Speed-Pascal/2 Version 2.0 º
|
---|
2556 | º º
|
---|
2557 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2558 | º º
|
---|
2559 | º This section: TIndexDefs Class Implementation º
|
---|
2560 | º º
|
---|
2561 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2562 | º º
|
---|
2563 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2564 | }
|
---|
2565 |
|
---|
2566 | Function TIndexDefs.GetCount:LongInt;
|
---|
2567 | Begin
|
---|
2568 | Result:=FItems.Count;
|
---|
2569 | End;
|
---|
2570 |
|
---|
2571 | Function TIndexDefs.GetItem(Index:LongInt):TIndexDef;
|
---|
2572 | Begin
|
---|
2573 | Result:=TIndexDef(FItems[Index]);
|
---|
2574 | End;
|
---|
2575 |
|
---|
2576 | Constructor TIndexDefs.Create(DataSet:TDataSet);
|
---|
2577 | Begin
|
---|
2578 | Inherited Create;
|
---|
2579 | FDataSet:=DataSet;
|
---|
2580 | FItems.Create;
|
---|
2581 | End;
|
---|
2582 |
|
---|
2583 | Destructor TIndexDefs.Destroy;
|
---|
2584 | Begin
|
---|
2585 | Clear;
|
---|
2586 | FItems.Destroy;
|
---|
2587 | Inherited Destroy;
|
---|
2588 | End;
|
---|
2589 |
|
---|
2590 | Procedure TIndexDefs.Clear;
|
---|
2591 | Var IndexDef:TIndexDef;
|
---|
2592 | Begin
|
---|
2593 | While FItems.Count > 0 Do
|
---|
2594 | Begin
|
---|
2595 | IndexDef := TIndexDef(FItems[0]);
|
---|
2596 | IndexDef.Destroy; // auto removing from FItems
|
---|
2597 | End;
|
---|
2598 | End;
|
---|
2599 |
|
---|
2600 | Function TIndexDefs.Add(Const Name,Fields:String;Options:TIndexOptions):TIndexDef;
|
---|
2601 | Begin
|
---|
2602 | //...check valid
|
---|
2603 | Result.Create(Self, Name, Fields,Options);
|
---|
2604 | End;
|
---|
2605 |
|
---|
2606 | Procedure TIndexDefs.Assign(IndexDefs: TIndexDefs);
|
---|
2607 | Var IndexDef:TIndexDef;
|
---|
2608 | t:LongInt;
|
---|
2609 | Begin
|
---|
2610 | Clear;
|
---|
2611 | For t:=0 To IndexDefs.Count-1 Do
|
---|
2612 | Begin
|
---|
2613 | IndexDef:=IndexDefs.Items[t];
|
---|
2614 | Add(IndexDef.Name,IndexDef.Fields,IndexDef.Options);
|
---|
2615 | End;
|
---|
2616 | End;
|
---|
2617 |
|
---|
2618 | Function TIndexDefs.FindIndexForFields(Const Fields:String):TIndexDef;
|
---|
2619 | Begin
|
---|
2620 | Result:=GetIndexForFields(Fields,False);
|
---|
2621 | If Result=Nil Then DataBaseError('No index for fields: '+Fields);
|
---|
2622 | End;
|
---|
2623 |
|
---|
2624 | Function TIndexDefs.GetIndexForFields(Const Fields:String;CaseInsensitive:Boolean):TIndexDef;
|
---|
2625 | Var t:LongInt;
|
---|
2626 | s,s1:String;
|
---|
2627 | Begin
|
---|
2628 | s:=Fields;
|
---|
2629 | If CaseInsensitive Then UpcaseStr(s);
|
---|
2630 | Result:=Nil;
|
---|
2631 | For t:=0 To Count-1 Do
|
---|
2632 | Begin
|
---|
2633 | s1:=Items[t].Fields;
|
---|
2634 | If CaseInsensitive Then UpcaseStr(s1);
|
---|
2635 | If s=s1 Then
|
---|
2636 | Begin
|
---|
2637 | Result:=Items[t];
|
---|
2638 | exit;
|
---|
2639 | End;
|
---|
2640 | End;
|
---|
2641 | End;
|
---|
2642 |
|
---|
2643 | Function TIndexDefs.IndexOf(Const Name:String):LongInt;
|
---|
2644 | Var t:LongInt;
|
---|
2645 | Begin
|
---|
2646 | Result:=-1;
|
---|
2647 | For t:=0 To Count-1 Do If Items[t].Name=Name Then
|
---|
2648 | Begin
|
---|
2649 | Result:=t;
|
---|
2650 | exit;
|
---|
2651 | End;
|
---|
2652 | End;
|
---|
2653 |
|
---|
2654 | Procedure TIndexDefs.Update;
|
---|
2655 | Begin
|
---|
2656 | TTable(FDataSet).UpdateIndexDefs;
|
---|
2657 | End;
|
---|
2658 |
|
---|
2659 | {
|
---|
2660 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2661 | º º
|
---|
2662 | º Speed-Pascal/2 Version 2.0 º
|
---|
2663 | º º
|
---|
2664 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2665 | º º
|
---|
2666 | º This section: TFieldDef Class Implementation º
|
---|
2667 | º º
|
---|
2668 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2669 | º º
|
---|
2670 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2671 | }
|
---|
2672 |
|
---|
2673 | Constructor TFieldDef.Create(aOwner:TFieldDefs; Const aName:String;
|
---|
2674 | aDataType:TFieldType; aSize:Longword; aRequired:Boolean; aFieldNo:Longint);
|
---|
2675 | Begin
|
---|
2676 | Inherited Create;
|
---|
2677 |
|
---|
2678 | If aOwner <> Nil Then
|
---|
2679 | Begin
|
---|
2680 | aFieldNo := aOwner.FItems.Add(Self);
|
---|
2681 | FOwner := aOwner;
|
---|
2682 | End;
|
---|
2683 |
|
---|
2684 | FName := aName;
|
---|
2685 | FDataType := aDataType;
|
---|
2686 | FSize := aSize;
|
---|
2687 | If aDataType = ftString Then Inc(FSize);
|
---|
2688 | FRequired := aRequired;
|
---|
2689 | FFieldNo := aFieldNo;
|
---|
2690 | FPrecision := -1;
|
---|
2691 | If FDataType In [ftWord,ftInteger,ftSmallInt] Then
|
---|
2692 | If not (FSize In [1,2,4]) Then FSize:=4; //LongInt
|
---|
2693 | If FDataType=ftFloat Then
|
---|
2694 | If not (FSize In [4,8,10]) Then FSize:=10; //Extended
|
---|
2695 | FFields.Create;
|
---|
2696 | End;
|
---|
2697 |
|
---|
2698 | Function TFieldDef.GetTypeName:String;
|
---|
2699 | Begin
|
---|
2700 | If FTypeName=Nil Then
|
---|
2701 | Begin
|
---|
2702 | Result:='';
|
---|
2703 | If FOwner.FDataSet Is TTable Then
|
---|
2704 | Result:=TTable(FOwner.FDataSet).DataType2Name(FDataType);
|
---|
2705 | End
|
---|
2706 | Else Result:=FTypeName^;
|
---|
2707 | End;
|
---|
2708 |
|
---|
2709 | Procedure TFieldDef.SetTypeName(Const NewValue:String);
|
---|
2710 | Begin
|
---|
2711 | AssignStr(FTypeName,NewValue);
|
---|
2712 | End;
|
---|
2713 |
|
---|
2714 | Destructor TFieldDef.Destroy;
|
---|
2715 | Var i:Longint;
|
---|
2716 | Field:TField;
|
---|
2717 | Begin
|
---|
2718 | If FOwner <> Nil Then FOwner.FItems.Remove(Self);
|
---|
2719 |
|
---|
2720 | If FFields <> Nil Then
|
---|
2721 | Begin
|
---|
2722 | For i := 0 To FFields.Count-1 Do
|
---|
2723 | Begin
|
---|
2724 | Field := TField(FFields[i]);
|
---|
2725 | If Field <> Nil Then Field.Destroy;
|
---|
2726 | End;
|
---|
2727 | End;
|
---|
2728 |
|
---|
2729 | AssignStr(FForeignKey,'');
|
---|
2730 | AssignStr(FTypeName,'');
|
---|
2731 |
|
---|
2732 | FFields.Destroy;
|
---|
2733 | FFields := Nil;
|
---|
2734 |
|
---|
2735 | Inherited Destroy;
|
---|
2736 | End;
|
---|
2737 |
|
---|
2738 |
|
---|
2739 | Function TFieldDef.CreateField(Owner:TComponent):TField;
|
---|
2740 | Var FieldClass:TFieldClass;
|
---|
2741 | Begin
|
---|
2742 | FieldClass := GetFieldClass;
|
---|
2743 | If FieldClass = Nil Then DatabaseError('Unknown field type "'+Name+'"');
|
---|
2744 |
|
---|
2745 | Result := FieldClass.Create;
|
---|
2746 | Try
|
---|
2747 | Result.FFieldDef := Self;
|
---|
2748 | Result.FRequired := Required;
|
---|
2749 | Result.FSize := Size;
|
---|
2750 | Result.FDataType := FDataType;
|
---|
2751 | If Result Is TFloatField Then
|
---|
2752 | Begin
|
---|
2753 | TFloatField(Result).FPrecision := Precision;
|
---|
2754 | If not (Size In [4,8]) Then
|
---|
2755 | Begin
|
---|
2756 | Size:=8;
|
---|
2757 | Result.FSize:=8;
|
---|
2758 | End;
|
---|
2759 | End;
|
---|
2760 | If FOwner <> Nil Then Result.FDataSet := FOwner.FDataSet;
|
---|
2761 | GetMem(Result.FValue,Size);
|
---|
2762 | Result.FValueLen := Size;
|
---|
2763 | Except;
|
---|
2764 | Result.Free;
|
---|
2765 | Raise;
|
---|
2766 | End;
|
---|
2767 | End;
|
---|
2768 |
|
---|
2769 |
|
---|
2770 | Function TFieldDef.GetFieldClass:TFieldClass;
|
---|
2771 | Begin
|
---|
2772 | Result := FOwner.FDataSet.GetFieldClass(FDataType);
|
---|
2773 | End;
|
---|
2774 |
|
---|
2775 |
|
---|
2776 | Function TFieldDef.GetPrimaryKey:Boolean;
|
---|
2777 | Var Keys:TStrings;
|
---|
2778 | t:LongInt;
|
---|
2779 | Begin
|
---|
2780 | If (Not (FOwner.FDataSet.IsTable)) Then
|
---|
2781 | DataBaseError('Cannot perform this action on a query or stored procedure');
|
---|
2782 |
|
---|
2783 | Result:=False;
|
---|
2784 | If FOwner.FDataSet.Active Then
|
---|
2785 | Begin
|
---|
2786 | Keys.Create;
|
---|
2787 | TTable(FOwner.FDataSet).GetPrimaryKeys(Keys);
|
---|
2788 | For t:=0 To Keys.Count-1 Do
|
---|
2789 | If Keys[t]=Name Then
|
---|
2790 | Begin
|
---|
2791 | Keys.Destroy;
|
---|
2792 | Result:=True;
|
---|
2793 | exit;
|
---|
2794 | End;
|
---|
2795 | Keys.Destroy;
|
---|
2796 | End
|
---|
2797 | Else Result:=FPrimaryKey;
|
---|
2798 | End;
|
---|
2799 |
|
---|
2800 | Procedure TFieldDef.SetPrimaryKey(NewValue:Boolean);
|
---|
2801 | Begin
|
---|
2802 | If (Not (FOwner.FDataSet.IsTable)) Then
|
---|
2803 | DataBaseError('Cannot perform this action on a query or stored procedure');
|
---|
2804 |
|
---|
2805 | FPrimaryKey:=NewValue;
|
---|
2806 | If FOwner.FDataSet.Active Then //Modify table definition
|
---|
2807 | Begin
|
---|
2808 | End;
|
---|
2809 | End;
|
---|
2810 |
|
---|
2811 | Function TFieldDef.GetForeignKey:String;
|
---|
2812 | Var Keys:TStrings;
|
---|
2813 | t:LongInt;
|
---|
2814 | s:String;
|
---|
2815 | Begin
|
---|
2816 | If (Not (FOwner.FDataSet.IsTable)) Then
|
---|
2817 | DataBaseError('Cannot perform this action on a query or stored procedure');
|
---|
2818 |
|
---|
2819 | If FOwner.FDataSet.Active Then
|
---|
2820 | Begin
|
---|
2821 | Keys.Create;
|
---|
2822 | TTable(FOwner.FDataSet).GetForeignKeys(Keys);
|
---|
2823 | For t:=0 To Keys.Count-1 Do
|
---|
2824 | Begin
|
---|
2825 | s:=Keys[t];
|
---|
2826 | If Pos('>',s)<>0 Then s[0]:=chr(pos('>',s)-1);
|
---|
2827 | If s=Name Then
|
---|
2828 | Begin
|
---|
2829 | Keys.Destroy;
|
---|
2830 | s:=Keys[t];
|
---|
2831 | Delete(s,1,pos('>',s));
|
---|
2832 | Result:=s;
|
---|
2833 | exit;
|
---|
2834 | End;
|
---|
2835 | End;
|
---|
2836 | Keys.Destroy;
|
---|
2837 | End
|
---|
2838 | Else
|
---|
2839 | Begin
|
---|
2840 | If FForeignKey<>Nil Then Result:=FForeignKey^
|
---|
2841 | Else Result:='';
|
---|
2842 | End;
|
---|
2843 | End;
|
---|
2844 |
|
---|
2845 | Procedure TFieldDef.SetForeignKey(Const NewValue:String);
|
---|
2846 | Begin
|
---|
2847 | If (Not (FOwner.FDataSet.IsTable)) Then
|
---|
2848 | DataBaseError('Cannot perform this action on a query or stored procedure');
|
---|
2849 |
|
---|
2850 | AssignStr(FForeignKey,NewValue);
|
---|
2851 | If FOwner.FDataSet.Active Then //modify table definition
|
---|
2852 | Begin
|
---|
2853 | End;
|
---|
2854 | End;
|
---|
2855 |
|
---|
2856 | {
|
---|
2857 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2858 | º º
|
---|
2859 | º Speed-Pascal/2 Version 2.0 º
|
---|
2860 | º º
|
---|
2861 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2862 | º º
|
---|
2863 | º This section: TFieldDefs Class Implementation º
|
---|
2864 | º º
|
---|
2865 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2866 | º º
|
---|
2867 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2868 | }
|
---|
2869 |
|
---|
2870 | Constructor TFieldDefs.Create(DataSet:TDataSet);
|
---|
2871 | Begin
|
---|
2872 | Inherited Create;
|
---|
2873 |
|
---|
2874 | FDataSet := DataSet;
|
---|
2875 | FItems.Create;
|
---|
2876 | End;
|
---|
2877 |
|
---|
2878 |
|
---|
2879 | Destructor TFieldDefs.Destroy;
|
---|
2880 | Begin
|
---|
2881 | Clear;
|
---|
2882 | FItems.Destroy;
|
---|
2883 |
|
---|
2884 | Inherited Destroy;
|
---|
2885 | End;
|
---|
2886 |
|
---|
2887 |
|
---|
2888 | Function TFieldDefs.Rows:LongInt;
|
---|
2889 | Var FieldDef:TFieldDef;
|
---|
2890 | Begin
|
---|
2891 | Result := 0;
|
---|
2892 | If Count = 0 Then Exit;
|
---|
2893 | FieldDef := Items[0];
|
---|
2894 | Result := FieldDef.Fields.Count;
|
---|
2895 | End;
|
---|
2896 |
|
---|
2897 |
|
---|
2898 | Procedure TFieldDefs.Clear;
|
---|
2899 | Var FieldDef:TFieldDef;
|
---|
2900 | Begin
|
---|
2901 | While FItems.Count > 0 Do
|
---|
2902 | Begin
|
---|
2903 | FieldDef := TFieldDef(FItems[0]);
|
---|
2904 | FieldDef.Destroy; // auto removing from FItems
|
---|
2905 | End;
|
---|
2906 | End;
|
---|
2907 |
|
---|
2908 |
|
---|
2909 | Function TFieldDefs.GetCount:Longint;
|
---|
2910 | Begin
|
---|
2911 | Result := FItems.Count;
|
---|
2912 | End;
|
---|
2913 |
|
---|
2914 |
|
---|
2915 | Function TFieldDefs.GetItem(Index:Longint):TFieldDef;
|
---|
2916 | Begin
|
---|
2917 | Result := FItems[Index];
|
---|
2918 | End;
|
---|
2919 |
|
---|
2920 |
|
---|
2921 | Function TFieldDefs.Add(Const Name:String; DataType:TFieldType; Size:Longint; Required:Boolean):TFieldDef;
|
---|
2922 | Begin
|
---|
2923 | //...check valid
|
---|
2924 | Result.Create(Self, Name, DataType, Size, Required, FItems.Count);
|
---|
2925 | End;
|
---|
2926 |
|
---|
2927 | Procedure TFieldDefs.Assign(FieldDefs: TFieldDefs);
|
---|
2928 | Var FieldDef:TFieldDef;
|
---|
2929 | t:LongInt;
|
---|
2930 | Begin
|
---|
2931 | Clear;
|
---|
2932 | For t:=0 To FieldDefs.Count-1 Do
|
---|
2933 | Begin
|
---|
2934 | FieldDef:=Items[t];
|
---|
2935 | Add(FieldDef.Name,FieldDef.DataType,FieldDef.Size,FieldDef.Required);
|
---|
2936 | End;
|
---|
2937 | End;
|
---|
2938 |
|
---|
2939 | Function TFieldDefs.Find(const Name: string): TFieldDef;
|
---|
2940 | Var Index:LongInt;
|
---|
2941 | Begin
|
---|
2942 | Index:=IndexOf(Name);
|
---|
2943 | If Index=-1 Then SQLError('Field not found: '+Name)
|
---|
2944 | Else Result:=Items[Index];
|
---|
2945 | End;
|
---|
2946 |
|
---|
2947 | Function TFieldDefs.IndexOf(const Name: string): LongInt;
|
---|
2948 | Var t:LongInt;
|
---|
2949 | Begin
|
---|
2950 | Result:=-1;
|
---|
2951 | For t:=0 To Count-1 Do If Items[t].Name=Name Then
|
---|
2952 | Begin
|
---|
2953 | Result:=t;
|
---|
2954 | exit;
|
---|
2955 | End;
|
---|
2956 | End;
|
---|
2957 |
|
---|
2958 | Procedure TFieldDefs.Update;
|
---|
2959 | Begin
|
---|
2960 | FDataSet.QueryTable;
|
---|
2961 | End;
|
---|
2962 |
|
---|
2963 | {
|
---|
2964 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
2965 | º º
|
---|
2966 | º Speed-Pascal/2 Version 2.0 º
|
---|
2967 | º º
|
---|
2968 | º Speed-Pascal Component Classes (SPCC) º
|
---|
2969 | º º
|
---|
2970 | º This section: TDataSet Class Implementation º
|
---|
2971 | º º
|
---|
2972 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
2973 | º º
|
---|
2974 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
2975 | }
|
---|
2976 |
|
---|
2977 | Const
|
---|
2978 | DefaultFieldClasses:Array[TFieldType] Of TFieldClass=
|
---|
2979 | (TBlobField, {ftUnknown}
|
---|
2980 | TStringField, {ftString}
|
---|
2981 | TSmallintField, {ftSmallInt}
|
---|
2982 | TIntegerField, {ftInteger}
|
---|
2983 | TBlobField, {ftWord}
|
---|
2984 | TBlobField, {ftBoolean}
|
---|
2985 | TFloatField, {ftFloat}
|
---|
2986 | TCurrencyField, {ftCurrency}
|
---|
2987 | TBlobField, {ftBCD}
|
---|
2988 | TDateField, {ftDate}
|
---|
2989 | TTimeField, {ftTime}
|
---|
2990 | TDateTimeField, {ftDateTime}
|
---|
2991 | TBlobField, {ftBytes}
|
---|
2992 | TBlobField, {ftVarBytes}
|
---|
2993 | TAutoIncField, {ftAutoInc}
|
---|
2994 | TBlobField, {ftBlob}
|
---|
2995 | TMemoField, {ftMemo}
|
---|
2996 | TGraphicField, {ftGraphic}
|
---|
2997 | TMemoField, {ftFmtMemo}
|
---|
2998 | TBlobField, {ftTypedBinary}
|
---|
2999 | TBlobField {ftOLE}
|
---|
3000 | );
|
---|
3001 |
|
---|
3002 |
|
---|
3003 | Procedure TDataSet.SetupComponent;
|
---|
3004 | Begin
|
---|
3005 | Include(ComponentState, csHandleLinks);
|
---|
3006 |
|
---|
3007 | AssignStr(FDataBase,'');
|
---|
3008 | AssignStr(FServer,'');
|
---|
3009 |
|
---|
3010 | Inherited SetupComponent;
|
---|
3011 |
|
---|
3012 | Name:='DataSet';
|
---|
3013 | FFieldDefs.Create(Self);
|
---|
3014 | FSelect:=TStringList.Create;
|
---|
3015 | FCurrentRow:=-1;
|
---|
3016 | FCurrentField:=0;
|
---|
3017 | End;
|
---|
3018 |
|
---|
3019 | Destructor TDataSet.Destroy;
|
---|
3020 | Begin
|
---|
3021 | FFieldDefs.Destroy;
|
---|
3022 | FFieldDefs:=Nil;
|
---|
3023 | AssignStr(FServer,'');
|
---|
3024 | AssignStr(FDataBase,'');
|
---|
3025 | FSelect.Destroy;
|
---|
3026 | FSelect:=Nil;
|
---|
3027 |
|
---|
3028 | Inherited Destroy;
|
---|
3029 | End;
|
---|
3030 |
|
---|
3031 |
|
---|
3032 | Function TDataSet.GetFieldClass(FieldType:TFieldType):TFieldClass;
|
---|
3033 | Begin
|
---|
3034 | Result := DefaultFieldClasses[FieldType];
|
---|
3035 | End;
|
---|
3036 |
|
---|
3037 |
|
---|
3038 | Procedure TDataSet.DesignerNotification(Var DNS:TDesignerNotifyStruct);
|
---|
3039 | Var AForm:TForm;
|
---|
3040 | Begin
|
---|
3041 | AForm := TForm(Owner);
|
---|
3042 | If AForm <> Nil Then
|
---|
3043 | Begin
|
---|
3044 | While (AForm.Designed) And (AForm.Owner <> Nil) Do
|
---|
3045 | Begin
|
---|
3046 | AForm := TForm(AForm.Owner);
|
---|
3047 | End;
|
---|
3048 | End;
|
---|
3049 | If AForm <> Nil Then
|
---|
3050 | If AForm Is TForm Then AForm.DesignerNotification(DNS);
|
---|
3051 | End;
|
---|
3052 |
|
---|
3053 |
|
---|
3054 | Function TDataSet.Locate(Const KeyFields:String;Const KeyValues:Array Of Const;
|
---|
3055 | Options:TLocateOptions):Boolean;
|
---|
3056 | Begin
|
---|
3057 | Result := False;
|
---|
3058 | //???
|
---|
3059 | End;
|
---|
3060 |
|
---|
3061 |
|
---|
3062 | Procedure TDataSet.SetFieldDefs(NewValue:TFieldDefs);
|
---|
3063 | Begin
|
---|
3064 | FFieldDefs.Assign(NewValue);
|
---|
3065 | End;
|
---|
3066 |
|
---|
3067 |
|
---|
3068 | Procedure TDataSet.GetStoredProcNames(List:TStrings);
|
---|
3069 | Begin
|
---|
3070 | List.Clear;
|
---|
3071 | End;
|
---|
3072 |
|
---|
3073 |
|
---|
3074 | Procedure TDataSet.Open;
|
---|
3075 | Begin
|
---|
3076 | Active := True;
|
---|
3077 | End;
|
---|
3078 |
|
---|
3079 |
|
---|
3080 | Procedure TDataSet.Close;
|
---|
3081 | Begin
|
---|
3082 | Active := False;
|
---|
3083 | End;
|
---|
3084 |
|
---|
3085 |
|
---|
3086 | Procedure TDataSet.SetActive(NewValue:Boolean);
|
---|
3087 | Begin
|
---|
3088 | If FActive <> NewValue Then
|
---|
3089 | Begin
|
---|
3090 | FActive := NewValue;
|
---|
3091 | DataChange(deDataBaseChanged);
|
---|
3092 | End;
|
---|
3093 | End;
|
---|
3094 |
|
---|
3095 |
|
---|
3096 | Procedure TDataSet.SetCurrentRow(NewValue:LongInt);
|
---|
3097 | Begin
|
---|
3098 | MoveBy(NewValue-FCurrentRow);
|
---|
3099 | End;
|
---|
3100 |
|
---|
3101 |
|
---|
3102 | Procedure TDataSet.SetCurrentField(NewValue:LongInt);
|
---|
3103 | Begin
|
---|
3104 | If NewValue<0 Then NewValue:=0;
|
---|
3105 | If NewValue>FieldCount-1 Then NewValue:=FieldCount-1;
|
---|
3106 | FCurrentField:=NewValue;
|
---|
3107 | End;
|
---|
3108 |
|
---|
3109 |
|
---|
3110 | Function TDataSet.GetEOF:Boolean;
|
---|
3111 | Begin
|
---|
3112 | Result := GetResultColRow(0,FCurrentRow+1) = Nil;
|
---|
3113 | End;
|
---|
3114 |
|
---|
3115 |
|
---|
3116 | Function TDataSet.GetBOF:Boolean;
|
---|
3117 | Begin
|
---|
3118 | Result := FCurrentRow <= 0;
|
---|
3119 | End;
|
---|
3120 |
|
---|
3121 |
|
---|
3122 | Function TDataSet.GetMaxRows:LongInt;
|
---|
3123 | Begin
|
---|
3124 | Result := FMaxRows;
|
---|
3125 | If RowInserted Then inc(Result);
|
---|
3126 | End;
|
---|
3127 |
|
---|
3128 |
|
---|
3129 | Procedure TDataSet.Refresh;
|
---|
3130 | Begin
|
---|
3131 | DataChange(deDataBaseChanged);
|
---|
3132 | End;
|
---|
3133 |
|
---|
3134 |
|
---|
3135 | Procedure TDataSet.DataChange(event:TDataChange);
|
---|
3136 | Var I:LongInt;
|
---|
3137 | Source:TDataSource;
|
---|
3138 | FLinkList:TList;
|
---|
3139 | Begin
|
---|
3140 | If FDataChangeLock Then Exit;
|
---|
3141 |
|
---|
3142 | FLinkList:=FreeNotifyList;
|
---|
3143 | If FLinkList<>Nil Then For I:=0 To FLinkList.Count-1 Do
|
---|
3144 | Begin
|
---|
3145 | Source:=FLinkList.Items[I];
|
---|
3146 | If Source Is TDataSource Then
|
---|
3147 | Begin
|
---|
3148 | Source.DataChange(event);
|
---|
3149 | If Source.OnDataChange<>Nil Then Source.OnDataChange(Source,event);
|
---|
3150 | End;
|
---|
3151 | End;
|
---|
3152 | End;
|
---|
3153 |
|
---|
3154 |
|
---|
3155 | Procedure TDataSet.First;
|
---|
3156 | Begin
|
---|
3157 | SetCurrentRow(0);
|
---|
3158 | End;
|
---|
3159 |
|
---|
3160 |
|
---|
3161 | Procedure TDataSet.Last;
|
---|
3162 | Begin
|
---|
3163 | SetCurrentRow(MaxRows-1);
|
---|
3164 | End;
|
---|
3165 |
|
---|
3166 |
|
---|
3167 | Procedure TDataSet.Next;
|
---|
3168 | Begin
|
---|
3169 | SetCurrentRow(FCurrentRow+1);
|
---|
3170 | End;
|
---|
3171 |
|
---|
3172 |
|
---|
3173 | Procedure TDataSet.Prior;
|
---|
3174 | Begin
|
---|
3175 | SetCurrentRow(FCurrentRow-1);
|
---|
3176 | End;
|
---|
3177 |
|
---|
3178 |
|
---|
3179 | Procedure TDataSet.MoveBy(Distance:LongInt);
|
---|
3180 | Var Field:TField;
|
---|
3181 | FieldDef:TFieldDef;
|
---|
3182 | Begin
|
---|
3183 | If Distance = 0 Then Exit;
|
---|
3184 | If FFieldDefs.Count = 0 Then exit;
|
---|
3185 |
|
---|
3186 | If FRowIsInserted Then CommitInsert(True);
|
---|
3187 |
|
---|
3188 | FCurrentRow := FCurrentRow + Distance;
|
---|
3189 | If FCurrentRow < 0 Then FCurrentRow := 0;
|
---|
3190 | If FCurrentRow >= MaxRows Then FCurrentRow := MaxRows-1;
|
---|
3191 |
|
---|
3192 | Field := GetResultColRow(0,FCurrentRow);
|
---|
3193 |
|
---|
3194 | FieldDef := FFieldDefs[0];
|
---|
3195 |
|
---|
3196 | If FieldDef <> Nil Then
|
---|
3197 | Begin
|
---|
3198 | If FCurrentRow > FieldDef.Fields.Count-1
|
---|
3199 | Then FCurrentRow := FieldDef.Fields.Count-1;
|
---|
3200 | If FCurrentRow < 0 Then FCurrentRow := 0;
|
---|
3201 | End;
|
---|
3202 |
|
---|
3203 | DataChange(dePositionChanged);
|
---|
3204 | End;
|
---|
3205 |
|
---|
3206 |
|
---|
3207 | Function TDataSet.WriteSCUResource(Stream:TResourceStream):Boolean;
|
---|
3208 | Var S:String;
|
---|
3209 | dll:String;
|
---|
3210 | P,p1:Pointer;
|
---|
3211 | len:LongInt;
|
---|
3212 | dbType:TDBTypes;
|
---|
3213 | dbOrd:LongInt;
|
---|
3214 | DriverName,Advanced,UID:String;
|
---|
3215 | Begin
|
---|
3216 | S:=Server;
|
---|
3217 | GetDBServerFromAlias(S,dll,dbType);
|
---|
3218 | dbOrd:=ord(dbType);
|
---|
3219 |
|
---|
3220 | len:=Length(S)+1+Length(dll)+1+4;
|
---|
3221 | GetMem(P,len);
|
---|
3222 | p1:=P;
|
---|
3223 | Move(S,p1^,Length(S)+1);
|
---|
3224 | Inc(p1,Length(S)+1);
|
---|
3225 | Move(dll,p1^,Length(dll)+1);
|
---|
3226 | inc(p1,length(dll)+1);
|
---|
3227 | Move(dbOrd,p1^,4);
|
---|
3228 | Result:=Stream.NewResourceEntry(rnDBServer,P^,len);
|
---|
3229 | FreeMem(P,len);
|
---|
3230 | If Not Result Then Exit;
|
---|
3231 |
|
---|
3232 | S:=DataBase;
|
---|
3233 | GetDBServerFromDBAlias(S,DriverName,Advanced,UID);
|
---|
3234 | len:=Length(S)+1+Length(Advanced)+1+length(UID)+1;
|
---|
3235 | GetMem(P,len);
|
---|
3236 | p1:=P;
|
---|
3237 | Move(S,p1^,Length(S)+1);
|
---|
3238 | Inc(p1,Length(S)+1);
|
---|
3239 | Move(Advanced,p1^,Length(Advanced)+1);
|
---|
3240 | Inc(p1,Length(Advanced)+1);
|
---|
3241 | Move(UID,p1^,Length(UID)+1);
|
---|
3242 | Result:=Stream.NewResourceEntry(rnDBDataBase,S,Length(S)+1);
|
---|
3243 | FreeMem(P,len);
|
---|
3244 | End;
|
---|
3245 |
|
---|
3246 |
|
---|
3247 | Procedure TDataSet.ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);
|
---|
3248 | Var
|
---|
3249 | S,dll:String;
|
---|
3250 | B:^Byte;
|
---|
3251 | dbType:TDBTypes;
|
---|
3252 | Advanced,UID:String;
|
---|
3253 | Begin
|
---|
3254 | If ResName = rnDBServer Then
|
---|
3255 | Begin
|
---|
3256 | dbType:=ODBC;
|
---|
3257 |
|
---|
3258 | B:=@Data;
|
---|
3259 | Move(B^,S,B^+1);
|
---|
3260 | Inc(B,B^+1);
|
---|
3261 | Move(B^,dll,B^+1);
|
---|
3262 |
|
---|
3263 | If DataLen>length(S)+1+length(dll)+1 Then //Sibyl FP3
|
---|
3264 | Begin
|
---|
3265 | inc(B,length(dll)+1);
|
---|
3266 | move(B^,dbType,sizeof(dbType));
|
---|
3267 | End;
|
---|
3268 |
|
---|
3269 | AddServerAlias(S,dll,dbType);
|
---|
3270 | Server:=S;
|
---|
3271 | End;
|
---|
3272 |
|
---|
3273 | If ResName = rnDBDataBase Then
|
---|
3274 | Begin
|
---|
3275 | Advanced:='';
|
---|
3276 | UID:='';
|
---|
3277 |
|
---|
3278 | B:=@Data;
|
---|
3279 | Move(B^,S,B^+1);
|
---|
3280 | Inc(B,B^+1);
|
---|
3281 | If DataLen>length(S)+1 Then //Sibyl FP3
|
---|
3282 | Begin
|
---|
3283 | Move(B^,Advanced,B^+1);
|
---|
3284 | Inc(B,B^+1);
|
---|
3285 | Move(B^,UID,B^+1);
|
---|
3286 | End;
|
---|
3287 |
|
---|
3288 | AddDataBaseAlias(S,Server,Advanced,UID);
|
---|
3289 | DataBase:=S;
|
---|
3290 | End;
|
---|
3291 | End;
|
---|
3292 |
|
---|
3293 |
|
---|
3294 | Function TDataSet.GetDataBaseName:String;
|
---|
3295 | Begin
|
---|
3296 | Result:=FDataBase^;
|
---|
3297 | End;
|
---|
3298 |
|
---|
3299 |
|
---|
3300 | Procedure TDataSet.SetDataBaseName(Const NewValue:String);
|
---|
3301 | Var Alias,Advanced,UID,DllName:String;
|
---|
3302 | DNS:TDesignerNotifyStruct;
|
---|
3303 | Begin
|
---|
3304 | If GetDataBaseName=NewValue Then Exit;
|
---|
3305 |
|
---|
3306 | If FOpened Then
|
---|
3307 | If GetDataBaseName<>'' Then
|
---|
3308 | Begin
|
---|
3309 | ErrorBox(LoadNLSStr(SCannotPerformDBAction));
|
---|
3310 | Exit;
|
---|
3311 | End;
|
---|
3312 |
|
---|
3313 | AssignStr(FDataBase,NewValue);
|
---|
3314 |
|
---|
3315 | FreeDBProcs(FDBProcs);
|
---|
3316 | FDBProcs.DataBase:=NewValue;
|
---|
3317 |
|
---|
3318 | GetDBServerFromDBAlias(NewValue,Alias,Advanced,UID);
|
---|
3319 | If Alias<>'' Then If Alias<>Server Then
|
---|
3320 | Begin
|
---|
3321 | AssignStr(FServer, Alias);
|
---|
3322 | FDBProcs.AliasName:=Alias;
|
---|
3323 | End;
|
---|
3324 | If ComponentState*[csReading]=[] Then FDBProcs.UID:=UID
|
---|
3325 | Else If FDBProcs.UID='' Then FDBProcs.UID:=UID;
|
---|
3326 | GetDBServerFromAlias(FDBProcs.AliasName,DllName,FDBProcs.DBType);
|
---|
3327 |
|
---|
3328 | Case FDBProcs.DBType Of
|
---|
3329 | Native_mSQL:
|
---|
3330 | Begin
|
---|
3331 | If ComponentState*[csReading]=[] Then FDBProcs.Host:=Advanced
|
---|
3332 | Else If FDBProcs.Host='' Then FDBProcs.Host:=Advanced;
|
---|
3333 | End;
|
---|
3334 | End;
|
---|
3335 |
|
---|
3336 | If Self Is TTable Then If ComponentState*[csReading]=[] Then
|
---|
3337 | Begin
|
---|
3338 | TTable(Self).TableName:='';
|
---|
3339 | TTable(Self).UserId:='';
|
---|
3340 | TTable(Self).Password:='';
|
---|
3341 | End;
|
---|
3342 |
|
---|
3343 | DNS.Sender := Self;
|
---|
3344 | DNS.Code := dncPropertyUpdate;
|
---|
3345 | DNS.return := 0;
|
---|
3346 | DesignerNotification(DNS);
|
---|
3347 | End;
|
---|
3348 |
|
---|
3349 |
|
---|
3350 | Function TDataSet.GetServer:String;
|
---|
3351 | Begin
|
---|
3352 | Result:=FServer^;
|
---|
3353 | End;
|
---|
3354 |
|
---|
3355 |
|
---|
3356 | Procedure TDataSet.SetServer(Const NewValue:String);
|
---|
3357 | Var WasLocked:Boolean;
|
---|
3358 | DllName:String;
|
---|
3359 | DNS:TDesignerNotifyStruct;
|
---|
3360 | Begin
|
---|
3361 | If GetServer=NewValue Then Exit;
|
---|
3362 |
|
---|
3363 | If FOpened Then
|
---|
3364 | Begin
|
---|
3365 | ErrorBox(LoadNLSStr(SCannotPerformDBAction));
|
---|
3366 | Exit;
|
---|
3367 | End;
|
---|
3368 |
|
---|
3369 | FreeDBProcs(FDBProcs);
|
---|
3370 |
|
---|
3371 | AssignStr(FServer,NewValue);
|
---|
3372 |
|
---|
3373 | FDBProcs.AliasName:=NewValue;
|
---|
3374 | GetDBServerFromAlias(FDBProcs.AliasName,DllName,FDBProcs.DBType);
|
---|
3375 |
|
---|
3376 | WasLocked:=FDataSetLocked;
|
---|
3377 | FDataSetLocked:=True;
|
---|
3378 |
|
---|
3379 | AssignStr(FDataBase,'');
|
---|
3380 |
|
---|
3381 | If Self Is TTable Then AssignStr(TTable(Self).FTableName,'');
|
---|
3382 |
|
---|
3383 | FDataSetLocked:=WasLocked;
|
---|
3384 |
|
---|
3385 | If ComponentState*[csReading]=[] Then
|
---|
3386 | Begin
|
---|
3387 | FDBProcs.UID:='';
|
---|
3388 | FDBProcs.Host:='';
|
---|
3389 | End;
|
---|
3390 | DNS.Sender := Self;
|
---|
3391 | DNS.Code := dncPropertyUpdate;
|
---|
3392 | DNS.return := 0;
|
---|
3393 | DesignerNotification(DNS);
|
---|
3394 | End;
|
---|
3395 |
|
---|
3396 |
|
---|
3397 | Function TDataSet.GetFieldCount:LongInt;
|
---|
3398 | Begin
|
---|
3399 | Result:=FFieldDefs.Count;
|
---|
3400 | End;
|
---|
3401 |
|
---|
3402 |
|
---|
3403 | Function TDataSet.GetFieldName(Index:LongInt):String;
|
---|
3404 | Var FieldDef:TFieldDef;
|
---|
3405 | Begin
|
---|
3406 | Result:='';
|
---|
3407 | If ((Index<0)Or(Index>FieldCount-1)) Then Exit;
|
---|
3408 | FieldDef:=FFieldDefs[Index];
|
---|
3409 | Result:=FieldDef.Name;
|
---|
3410 | End;
|
---|
3411 |
|
---|
3412 |
|
---|
3413 | Function TDataSet.GetFieldType(Index:LongInt):TFieldType;
|
---|
3414 | Var FieldDef:TFieldDef;
|
---|
3415 | Begin
|
---|
3416 | Result:=ftUnknown;
|
---|
3417 | If ((Index<0)Or(Index>FieldCount-1)) Then Exit;
|
---|
3418 | FieldDef:=FFieldDefs[Index];
|
---|
3419 | Result:=FieldDef.DataType;
|
---|
3420 | End;
|
---|
3421 |
|
---|
3422 |
|
---|
3423 | Function TDataSet.GetFieldFromColumnName(ColumnName:String):TField;
|
---|
3424 | Var Index:LongInt;
|
---|
3425 | T:LongInt;
|
---|
3426 | FieldDef:TFieldDef;
|
---|
3427 | S:String;
|
---|
3428 | Begin
|
---|
3429 | Result:=Nil;
|
---|
3430 | Index:=-1;
|
---|
3431 | UpcaseStr(ColumnName);
|
---|
3432 | For T:=0 To FFieldDefs.Count-1 Do
|
---|
3433 | Begin
|
---|
3434 | FieldDef:=FFieldDefs[T];
|
---|
3435 | S:=FieldDef.Name;
|
---|
3436 | UpcaseStr(S);
|
---|
3437 | If S=ColumnName Then
|
---|
3438 | Begin
|
---|
3439 | Index:=T;
|
---|
3440 | break;
|
---|
3441 | End;
|
---|
3442 | End;
|
---|
3443 |
|
---|
3444 | If Index<>-1 Then Result:=Fields[Index];
|
---|
3445 | End;
|
---|
3446 |
|
---|
3447 |
|
---|
3448 | Procedure TDataSet.CheckRequiredFields;
|
---|
3449 | Var Field:TField;
|
---|
3450 | i:Longint;
|
---|
3451 | Begin
|
---|
3452 | For i := 0 To FieldCount-1 Do
|
---|
3453 | Begin
|
---|
3454 | Field := GetResultColRow(i,FCurrentRow);
|
---|
3455 | If Field<>Nil Then
|
---|
3456 | If Field.Required And Field.IsNull Then
|
---|
3457 | Begin
|
---|
3458 | //Field.FocusControl;
|
---|
3459 | ErrorBox('Field '+ Field.FieldName +' is required');
|
---|
3460 | DatabaseError('Field '+ Field.FieldName +' is required');
|
---|
3461 | End;
|
---|
3462 | End;
|
---|
3463 | End;
|
---|
3464 |
|
---|
3465 |
|
---|
3466 | Function TDataSet.GetField(Index:LongInt):TField;
|
---|
3467 | Begin
|
---|
3468 | Result:=Nil;
|
---|
3469 | If ((Index<0)Or(Index>FieldCount-1)Or(FCurrentRow<0)) Then Exit;
|
---|
3470 | Result:=GetResultColRow(Index,FCurrentRow);
|
---|
3471 | End;
|
---|
3472 |
|
---|
3473 |
|
---|
3474 | Function TDataSet.GetResultColRow(Col,Row:LongInt):TField;
|
---|
3475 | Var FieldDef:TFieldDef;
|
---|
3476 | Begin
|
---|
3477 | Result := Nil;
|
---|
3478 | If Not FOpened Then Exit;
|
---|
3479 |
|
---|
3480 | If Row < 0 Then Exit; //Row does Not exist
|
---|
3481 | If Row >= GetMaxRows Then Exit; //Row does Not exist
|
---|
3482 | If (Col < 0) Or (Col >= FieldDefs.Count) Then Exit; {Column does Not exist}
|
---|
3483 |
|
---|
3484 | FieldDef := FieldDefs[Col];
|
---|
3485 | If Row <= FieldDef.Fields.Count-1
|
---|
3486 | Then Result := FieldDef.Fields.Items[Row];
|
---|
3487 | End;
|
---|
3488 |
|
---|
3489 |
|
---|
3490 | Procedure TDataSet.AppendRecord(Const values:Array Of Const);
|
---|
3491 | Begin
|
---|
3492 | InsertRecord(values);
|
---|
3493 | End;
|
---|
3494 |
|
---|
3495 |
|
---|
3496 | Procedure TDataSet.SetFields(Const values:Array Of Const);
|
---|
3497 | Var T:LongInt;
|
---|
3498 | rec:TVarRec;
|
---|
3499 | field:TField;
|
---|
3500 | Begin
|
---|
3501 | Try
|
---|
3502 | FDataChangeLock:=True;
|
---|
3503 | For T:=0 To High(values) Do
|
---|
3504 | Begin
|
---|
3505 | If T>FieldCount-1 Then Exit;
|
---|
3506 | Field:=Fields[T];
|
---|
3507 | If Field=Nil Then continue;
|
---|
3508 |
|
---|
3509 | rec:=TVarRec(values[T]);
|
---|
3510 | Case rec.VType Of
|
---|
3511 | vtInteger:field.AsInteger:=rec.VInteger;
|
---|
3512 | vtBoolean:field.AsBoolean:=rec.VBoolean;
|
---|
3513 | vtChar:field.AsString:=rec.VChar;
|
---|
3514 | vtExtended:field.AsFloat:=rec.VExtended^;
|
---|
3515 | vtString:field.AsString:=rec.VString^;
|
---|
3516 | vtPointer:;
|
---|
3517 | vtPChar:field.AsString:=rec.VPChar^;
|
---|
3518 | vtAnsiString:field.AsString:=AnsiString(rec.VAnsiString);
|
---|
3519 | End; {Case}
|
---|
3520 | End;
|
---|
3521 | Finally
|
---|
3522 | FDataChangeLock:=False;
|
---|
3523 | Post;
|
---|
3524 | End;
|
---|
3525 | End;
|
---|
3526 |
|
---|
3527 |
|
---|
3528 | Procedure TDataSet.InsertRecord(Const values:Array Of Const);
|
---|
3529 | Begin
|
---|
3530 | Try
|
---|
3531 | FDataChangeLock:=True;
|
---|
3532 | Insert;
|
---|
3533 | Finally
|
---|
3534 | FDataChangeLock:=False;
|
---|
3535 | End;
|
---|
3536 | SetFields(values);
|
---|
3537 | End;
|
---|
3538 |
|
---|
3539 |
|
---|
3540 | Function TDataSet.FieldByName(Const FieldName:String):TField;
|
---|
3541 | Begin
|
---|
3542 | Result:=FindField(FieldName);
|
---|
3543 | If Result=Nil Then DatabaseError('Field '+FieldName+' not found');
|
---|
3544 | End;
|
---|
3545 |
|
---|
3546 |
|
---|
3547 | Function TDataSet.FindFirst:Boolean;
|
---|
3548 | Begin
|
---|
3549 | Result:=BOF;
|
---|
3550 | End;
|
---|
3551 |
|
---|
3552 |
|
---|
3553 | Function TDataSet.FindLast:Boolean;
|
---|
3554 | Begin
|
---|
3555 | Result:=EOF;
|
---|
3556 | End;
|
---|
3557 |
|
---|
3558 |
|
---|
3559 | Function TDataSet.FindNext:Boolean;
|
---|
3560 | Begin
|
---|
3561 | Result:=not EOF;
|
---|
3562 | End;
|
---|
3563 |
|
---|
3564 |
|
---|
3565 | Function TDataSet.FindPrior:Boolean;
|
---|
3566 | Begin
|
---|
3567 | Result:=not BOF;
|
---|
3568 | End;
|
---|
3569 |
|
---|
3570 |
|
---|
3571 | Function ExtractFieldName(Const Fields:String;Var Pos:LongInt):String;
|
---|
3572 | Var t:LongInt;
|
---|
3573 | Begin
|
---|
3574 | t:=Pos;
|
---|
3575 | While (t<=Length(Fields))And(Fields[t]<>';') Do Inc(t);
|
---|
3576 | Result:=Copy(Fields,Pos,t-Pos);
|
---|
3577 | If (t<=Length(Fields))And(Fields[t]=';') Then Inc(t);
|
---|
3578 | Pos:=t;
|
---|
3579 | End;
|
---|
3580 |
|
---|
3581 |
|
---|
3582 | Procedure TDataSet.GetFieldList(List:TList; const FieldNames: string);
|
---|
3583 | Var t:LongInt;
|
---|
3584 | Begin
|
---|
3585 | t:=1;
|
---|
3586 | While t<=Length(FieldNames) Do
|
---|
3587 | List.Add(FieldByName(ExtractFieldName(FieldNames,t)));
|
---|
3588 | End;
|
---|
3589 |
|
---|
3590 |
|
---|
3591 | Function TDataSet.FindField(Const FieldName:String):TField;
|
---|
3592 | Var T:LongInt;
|
---|
3593 | S,s1:String;
|
---|
3594 | Begin
|
---|
3595 | Result:=Nil;
|
---|
3596 | S:=FieldName;
|
---|
3597 | UpcaseStr(S);
|
---|
3598 | For T:=0 To FieldCount-1 Do
|
---|
3599 | Begin
|
---|
3600 | s1:=FieldNames[T];
|
---|
3601 | UpcaseStr(s1);
|
---|
3602 | If S=s1 Then
|
---|
3603 | Begin
|
---|
3604 | Result:=Fields[T];
|
---|
3605 | Exit;
|
---|
3606 | End;
|
---|
3607 | End;
|
---|
3608 | End;
|
---|
3609 |
|
---|
3610 |
|
---|
3611 | Procedure TDataSet.DoOpen;
|
---|
3612 | Begin
|
---|
3613 | FOpened := True;
|
---|
3614 | End;
|
---|
3615 |
|
---|
3616 |
|
---|
3617 | Procedure TDataSet.DoClose;
|
---|
3618 | Begin
|
---|
3619 | If FRowIsInserted Then CommitInsert(True);
|
---|
3620 | FMaxRows:=0;
|
---|
3621 | FCurrentRow := -1;
|
---|
3622 |
|
---|
3623 | FOpened := False;
|
---|
3624 | End;
|
---|
3625 |
|
---|
3626 |
|
---|
3627 | Procedure TDataSet.RefreshTable;
|
---|
3628 | Begin
|
---|
3629 | End;
|
---|
3630 |
|
---|
3631 |
|
---|
3632 | Procedure TDataSet.GetDataSources(List:TStrings);
|
---|
3633 | Begin
|
---|
3634 | List.Clear;
|
---|
3635 | End;
|
---|
3636 |
|
---|
3637 |
|
---|
3638 | Procedure TDataSet.GetFieldNames(List:TStrings);
|
---|
3639 | Var T:LongInt;
|
---|
3640 | Begin
|
---|
3641 | List.Clear;
|
---|
3642 |
|
---|
3643 | If FieldCount=0 Then
|
---|
3644 | Begin
|
---|
3645 | If ((Designed)And(Not FOpened)) Then
|
---|
3646 | Begin
|
---|
3647 | FActive:=True;
|
---|
3648 | DoOpen;
|
---|
3649 | If Not FOpened Then FActive:=False
|
---|
3650 | Else RefreshTable;
|
---|
3651 | End
|
---|
3652 | Else RefreshTable;
|
---|
3653 | End;
|
---|
3654 |
|
---|
3655 | For T:=0 To FieldCount-1 Do List.Add(FieldNames[T]);
|
---|
3656 | End;
|
---|
3657 |
|
---|
3658 |
|
---|
3659 | Procedure TDataSet.Delete;
|
---|
3660 | Begin
|
---|
3661 | If Not FOpened Then Exit;
|
---|
3662 | If (CurrentRow < 0) Or (CurrentRow >= RecordCount) Then exit;
|
---|
3663 |
|
---|
3664 | Try
|
---|
3665 | If FBeforeDelete <> Nil Then FBeforeDelete(Self);
|
---|
3666 |
|
---|
3667 | If FRowIsInserted Then CommitInsert(False)
|
---|
3668 | Else DoDelete;
|
---|
3669 |
|
---|
3670 | DataChange(deDataBaseChanged);
|
---|
3671 |
|
---|
3672 | If FAfterDelete <> Nil Then FAfterDelete(Self);
|
---|
3673 | Except
|
---|
3674 | Raise;
|
---|
3675 | End;
|
---|
3676 | End;
|
---|
3677 |
|
---|
3678 |
|
---|
3679 | Procedure TDataSet.DoDelete;
|
---|
3680 | Begin
|
---|
3681 | RemoveCurrentFields;
|
---|
3682 | End;
|
---|
3683 |
|
---|
3684 |
|
---|
3685 | Procedure TDataSet.Append;
|
---|
3686 | Begin
|
---|
3687 | Insert;
|
---|
3688 | End;
|
---|
3689 |
|
---|
3690 |
|
---|
3691 | Procedure TDataSet.Insert;
|
---|
3692 | Begin
|
---|
3693 | If Not FOpened Then Exit;
|
---|
3694 |
|
---|
3695 | Try
|
---|
3696 | If FBeforeInsert <> Nil Then FBeforeInsert(Self);
|
---|
3697 |
|
---|
3698 | If FRowIsInserted Then CommitInsert(True);
|
---|
3699 |
|
---|
3700 | DoInsert;
|
---|
3701 |
|
---|
3702 | DataChange(deDataBaseChanged);
|
---|
3703 |
|
---|
3704 | If FAfterInsert <> Nil Then FAfterInsert(Self);
|
---|
3705 | Except
|
---|
3706 | Raise;
|
---|
3707 | End;
|
---|
3708 | End;
|
---|
3709 |
|
---|
3710 |
|
---|
3711 | Procedure TDataSet.DoInsert;
|
---|
3712 | Begin
|
---|
3713 | If FCurrentRow < 0 Then FCurrentRow := 0; //empty table
|
---|
3714 |
|
---|
3715 | InsertCurrentFields;
|
---|
3716 |
|
---|
3717 | FRowIsInserted := True;
|
---|
3718 | End;
|
---|
3719 |
|
---|
3720 |
|
---|
3721 | Procedure TDataSet.InsertCurrentFields;
|
---|
3722 | Var Col,Row:LongInt;
|
---|
3723 | FieldDef:TFieldDef;
|
---|
3724 | Field:TField;
|
---|
3725 | Begin
|
---|
3726 | For Col := 0 To FFieldDefs.Count-1 Do
|
---|
3727 | Begin
|
---|
3728 | FieldDef := FFieldDefs[Col];
|
---|
3729 | Field := FieldDef.CreateField(Nil);
|
---|
3730 | //Field.Clear;
|
---|
3731 | If Field.FValue<>Nil Then FreeMem(Field.FValue,Field.FValueLen);
|
---|
3732 | Field.FValue:=Nil;
|
---|
3733 | Field.FValueLen:=0;
|
---|
3734 | Field.FRow := FCurrentRow;
|
---|
3735 | Field.FCol := Col;
|
---|
3736 | FieldDef.Fields.Insert(FCurrentRow,Field);
|
---|
3737 |
|
---|
3738 | For Row := FCurrentRow+1 To FieldDef.Fields.Count-1 Do
|
---|
3739 | Begin
|
---|
3740 | Field := FieldDef.Fields[Row];
|
---|
3741 | If Field <> Nil Then Inc(Field.FRow);
|
---|
3742 | End;
|
---|
3743 | End;
|
---|
3744 | End;
|
---|
3745 |
|
---|
3746 |
|
---|
3747 | Const Months:Array[1..12] Of String[4]=('Jan','Feb','Mar','Apr','May','Jun','Jul',
|
---|
3748 | 'Aug','Sep','Oct','Nov','Dec');
|
---|
3749 |
|
---|
3750 | Function Field2String(field:TField):String;
|
---|
3751 | Var
|
---|
3752 | dt:TDateTime;
|
---|
3753 | Year,Month,Day,Hour,Min,Sec:Word;
|
---|
3754 | s,s1,s2:String;
|
---|
3755 | Begin
|
---|
3756 | If field.IsNull Then
|
---|
3757 | Begin
|
---|
3758 | Result:='NULL';
|
---|
3759 | Exit;
|
---|
3760 | End;
|
---|
3761 |
|
---|
3762 | Case field.DataType Of
|
---|
3763 | ftDate:
|
---|
3764 | Begin
|
---|
3765 | dt:=field.GetAsDateTime;
|
---|
3766 | DecodeDate(dt,Year,Month,Day);
|
---|
3767 | If Field.FDataSet.FDBProcs.DBType=Native_mSQL Then
|
---|
3768 | Result:=tostr(Day)+'-'+Months[Month]+'-'+tostr(Year)
|
---|
3769 | Else
|
---|
3770 | Result:=tostr(Year)+'-'+tostr(Month)+'-'+tostr(Day);
|
---|
3771 | End;
|
---|
3772 | ftTime:
|
---|
3773 | Begin
|
---|
3774 | dt:=field.GetAsDateTime;
|
---|
3775 | RoundDecodeTime(dt,Hour,Min,Sec);
|
---|
3776 | If Field.FDataSet.FDBProcs.DBType=Native_mSQL Then
|
---|
3777 | Result:=tostr(Hour)+':'+tostr(Min)+':'+tostr(Sec)
|
---|
3778 | Else
|
---|
3779 | Result:=tostr(Hour)+'.'+tostr(Min)+'.'+tostr(Sec);
|
---|
3780 | End;
|
---|
3781 | ftDateTime:
|
---|
3782 | Begin
|
---|
3783 | dt:=field.GetAsDateTime;
|
---|
3784 | DecodeDate(dt,Year,Month,Day);
|
---|
3785 | RoundDecodeTime(dt,Hour,Min,Sec);
|
---|
3786 | If Field.FDataSet.FDBProcs.DBType=Native_Oracle7 Then
|
---|
3787 | Begin
|
---|
3788 | s:=tostr(Year);
|
---|
3789 | While length(s)<4 Do s:='0'+s;
|
---|
3790 | s1:=tostr(Month);
|
---|
3791 | If length(s1)<2 Then s1:='0'+s1;
|
---|
3792 | s2:=tostr(Day);
|
---|
3793 | If length(s2)<2 Then s2:='0'+s2;
|
---|
3794 | Result:='TO_DATE('#39+s+'-'+s1+'-'+s2;
|
---|
3795 | s:=tostr(Hour);
|
---|
3796 | If length(s)<2 Then s:='0'+s;
|
---|
3797 | s1:=tostr(Min);
|
---|
3798 | If length(s1)<2 Then s1:='0'+s1;
|
---|
3799 | s2:=tostr(Sec);
|
---|
3800 | If length(s2)<2 Then s2:='0'+s2;
|
---|
3801 | Result:=Result+' '+s+'.'+s1+'.'+s2;
|
---|
3802 | Result:=Result+#39','#39'YYYY-MM-DD HH24.MI.SS'#39')';
|
---|
3803 | exit;
|
---|
3804 | End
|
---|
3805 | Else
|
---|
3806 | Begin
|
---|
3807 | Result:=tostr(Year)+'-'+tostr(Month)+'-'+tostr(Day);
|
---|
3808 | Result:=Result+'-'+tostr(Hour)+'.'+tostr(Min)+'.';
|
---|
3809 | Result:=Result+tostr(Sec)+'.00';
|
---|
3810 | End;
|
---|
3811 | End;
|
---|
3812 | ftMemo:
|
---|
3813 | Begin
|
---|
3814 | Result:=PChar(Field.FValue)^;
|
---|
3815 | End;
|
---|
3816 | ftFloat:
|
---|
3817 | Begin
|
---|
3818 | Result:=field.AsString;
|
---|
3819 | //eliminate decimal separator
|
---|
3820 | If pos(',',Result)<>0 Then Result[pos(',',Result)]:='.';
|
---|
3821 |
|
---|
3822 | End;
|
---|
3823 | Else Result:=field.AsString;
|
---|
3824 | End; {Case}
|
---|
3825 |
|
---|
3826 | If Not (field.DataType In [ftSmallInt,ftInteger,ftWord,ftFloat,ftCurrency]) Then
|
---|
3827 | Result:=#39+Result+#39;
|
---|
3828 | End;
|
---|
3829 |
|
---|
3830 |
|
---|
3831 | Procedure TDataSet.CommitInsert(Commit:Boolean);
|
---|
3832 | Begin
|
---|
3833 | End;
|
---|
3834 |
|
---|
3835 |
|
---|
3836 | Procedure TDataSet.RemoveCurrentFields;
|
---|
3837 | Var Col,Row:LongInt;
|
---|
3838 | Field:TField;
|
---|
3839 | FieldDef:TFieldDef;
|
---|
3840 | Begin
|
---|
3841 | FieldDef := Nil;
|
---|
3842 |
|
---|
3843 | For Col := 0 To FFieldDefs.Count-1 Do
|
---|
3844 | Begin
|
---|
3845 | FieldDef := FFieldDefs[Col];
|
---|
3846 | Field := FieldDef.Fields[FCurrentRow];
|
---|
3847 | If Field <> Nil Then
|
---|
3848 | Begin
|
---|
3849 | FieldDef.Fields.Remove(Field);
|
---|
3850 | Field.Destroy;
|
---|
3851 | End;
|
---|
3852 |
|
---|
3853 | For Row := FCurrentRow To FieldDef.Fields.Count-1 Do
|
---|
3854 | Begin
|
---|
3855 | Field := FieldDef.Fields[Row];
|
---|
3856 | If Field <> Nil Then Dec(Field.FRow);
|
---|
3857 | End;
|
---|
3858 | End;
|
---|
3859 |
|
---|
3860 | If FieldDef <> Nil Then
|
---|
3861 | If FCurrentRow >= FieldDef.Fields.Count
|
---|
3862 | Then FCurrentRow := FieldDef.Fields.Count-1;
|
---|
3863 | End;
|
---|
3864 |
|
---|
3865 |
|
---|
3866 | Function TDataSet.UpdateFieldSelect(Field:TField):Boolean;
|
---|
3867 | Begin
|
---|
3868 | Result:=False;
|
---|
3869 | End;
|
---|
3870 |
|
---|
3871 |
|
---|
3872 | Procedure TDataSet.UpdateField(field:TField;OldValue:Pointer;OldValueLen:LongInt);
|
---|
3873 | Begin
|
---|
3874 | If Not FOpened Then Exit;
|
---|
3875 | If FSelect.Count=0 Then Exit; //Nothing To Select
|
---|
3876 | Try
|
---|
3877 | If Not UpdateFieldSelect(field) Then
|
---|
3878 | Begin
|
---|
3879 | FreeMem(field.FValue,field.FValueLen);
|
---|
3880 | field.FValue:=OldValue;
|
---|
3881 | field.FValueLen:=OldValueLen;
|
---|
3882 | End
|
---|
3883 | Else FreeMem(OldValue,OldValueLen);
|
---|
3884 | Except
|
---|
3885 | FreeMem(field.FValue,field.FValueLen);
|
---|
3886 | field.FValue:=OldValue;
|
---|
3887 | field.FValueLen:=OldValueLen;
|
---|
3888 | Raise;
|
---|
3889 | End;
|
---|
3890 | End;
|
---|
3891 |
|
---|
3892 |
|
---|
3893 | Procedure TDataSet.Post;
|
---|
3894 | Begin
|
---|
3895 | If Not FOpened Then Exit;
|
---|
3896 | If (CurrentRow < 0) Or (CurrentRow >= RecordCount) Then exit;
|
---|
3897 |
|
---|
3898 | Try
|
---|
3899 | CheckRequiredFields;
|
---|
3900 |
|
---|
3901 | If FBeforePost <> Nil Then FBeforePost(Self);
|
---|
3902 |
|
---|
3903 | If FRowIsInserted Then CommitInsert(True)
|
---|
3904 | Else DoPost;
|
---|
3905 |
|
---|
3906 | DataChange(deDataBaseChanged);
|
---|
3907 |
|
---|
3908 | If FAfterPost <> Nil Then FAfterPost(Self);
|
---|
3909 | Except
|
---|
3910 | Raise;
|
---|
3911 | End;
|
---|
3912 | End;
|
---|
3913 |
|
---|
3914 |
|
---|
3915 | Procedure TDataSet.DoPost;
|
---|
3916 | Begin
|
---|
3917 | End;
|
---|
3918 |
|
---|
3919 |
|
---|
3920 | Procedure TDataSet.Cancel;
|
---|
3921 | Begin
|
---|
3922 | If Not FOpened Then Exit;
|
---|
3923 | If (CurrentRow < 0) Or (CurrentRow >= RecordCount) Then exit;
|
---|
3924 |
|
---|
3925 | Try
|
---|
3926 | If FBeforeCancel <> Nil Then FBeforeCancel(Self);
|
---|
3927 |
|
---|
3928 | If FRowIsInserted Then CommitInsert(False)
|
---|
3929 | Else DoCancel;
|
---|
3930 |
|
---|
3931 | DataChange(deDataBaseChanged);
|
---|
3932 |
|
---|
3933 | If FAfterCancel <> Nil Then FAfterCancel(Self);
|
---|
3934 | Except
|
---|
3935 | Raise;
|
---|
3936 | End;
|
---|
3937 | End;
|
---|
3938 |
|
---|
3939 |
|
---|
3940 | Procedure TDataSet.DoCancel;
|
---|
3941 | Begin
|
---|
3942 | End;
|
---|
3943 |
|
---|
3944 |
|
---|
3945 | Procedure TDataSet.QueryTable;
|
---|
3946 | Begin
|
---|
3947 | End;
|
---|
3948 |
|
---|
3949 |
|
---|
3950 | Procedure TDataSet.Loaded;
|
---|
3951 | Begin
|
---|
3952 | Inherited Loaded;
|
---|
3953 |
|
---|
3954 | If FRefreshOnLoad Then Active:=True;
|
---|
3955 | End;
|
---|
3956 |
|
---|
3957 |
|
---|
3958 | Procedure TDataSet.CheckInactive;
|
---|
3959 | Begin
|
---|
3960 | If Active Then
|
---|
3961 | Begin
|
---|
3962 | //Close;
|
---|
3963 | DatabaseError('Cannot perform this operation on active dataset !');
|
---|
3964 | End;
|
---|
3965 | End;
|
---|
3966 |
|
---|
3967 |
|
---|
3968 | Function TDataSet.IsTable:Boolean;
|
---|
3969 | Begin
|
---|
3970 | Result := (Self Is TTable) And (Not (Self Is TQuery)) And (Not (Self Is TStoredProc));
|
---|
3971 | End;
|
---|
3972 |
|
---|
3973 |
|
---|
3974 | {
|
---|
3975 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
3976 | º º
|
---|
3977 | º Speed-Pascal/2 Version 2.0 º
|
---|
3978 | º º
|
---|
3979 | º Speed-Pascal Component Classes (SPCC) º
|
---|
3980 | º º
|
---|
3981 | º This section: TTable Class Implementation º
|
---|
3982 | º º
|
---|
3983 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
3984 | º º
|
---|
3985 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
3986 | }
|
---|
3987 |
|
---|
3988 | Procedure TTable.GetPrimaryKeys(List:TStrings);
|
---|
3989 | Begin
|
---|
3990 | GetKeys(List,True);
|
---|
3991 | End;
|
---|
3992 |
|
---|
3993 | Function MapODBCType(colType:TFieldType):SQLSMALLINT;
|
---|
3994 | Begin
|
---|
3995 | Case colType Of
|
---|
3996 | ftString:Result:=SQL_VARCHAR;
|
---|
3997 | ftCurrency:Result:=SQL_NUMERIC;
|
---|
3998 | ftInteger:Result:=SQL_INTEGER;
|
---|
3999 | ftSmallInt:Result:=SQL_SMALLINT;
|
---|
4000 | ftFloat:Result:=SQL_DOUBLE;
|
---|
4001 | ftDate:Result:=SQL_DATE;
|
---|
4002 | ftTime:Result:=SQL_TIME;
|
---|
4003 | ftDateTime:Result:=SQL_TIMESTAMP;
|
---|
4004 | ftMemo:Result:=SQL_LONGVARCHAR;
|
---|
4005 | ftBlob:Result:=SQL_VARBINARY;
|
---|
4006 | ftGraphic:Result:=SQL_VARGRAPHIC;
|
---|
4007 | Else Result:=SQL_BLOB;
|
---|
4008 | End; {Case}
|
---|
4009 | End;
|
---|
4010 |
|
---|
4011 | Function TTable.DataType2Name(DataType:TFieldType):String;
|
---|
4012 | Var List:TStringList;
|
---|
4013 | t:LongInt;
|
---|
4014 | Begin
|
---|
4015 | Result:='';
|
---|
4016 |
|
---|
4017 | Case FDBProcs.DBType Of
|
---|
4018 | Native_Oracle7:
|
---|
4019 | Begin
|
---|
4020 | Case DataType Of
|
---|
4021 | ftString:Result:='VARCHAR2';
|
---|
4022 | ftSmallInt,ftInteger,ftWord:Result:='INT';
|
---|
4023 | ftBoolean:Result:='CHAR';
|
---|
4024 | ftFloat,ftCurrency:Result:='FLOAT';
|
---|
4025 | ftDate,ftTime,ftDateTime:Result:='DATE';
|
---|
4026 | ftBytes,ftBlob,ftMemo,ftGraphic,ftFmtMemo,
|
---|
4027 | ftTypedBinary:Result:='RAW';
|
---|
4028 | ftVarBytes:Result:='LONG RAW';
|
---|
4029 | End;
|
---|
4030 | End;
|
---|
4031 | Native_msql:
|
---|
4032 | Begin
|
---|
4033 | Case DataType Of
|
---|
4034 | ftString:Result:='CHAR';
|
---|
4035 | ftSmallInt,ftInteger,ftWord:Result:='INT';
|
---|
4036 | ftBoolean:Result:='CHAR';
|
---|
4037 | ftFloat,ftCurrency:Result:='REAL';
|
---|
4038 | ftDate:Result:='DATE';
|
---|
4039 | ftTime:Result:='TIME';
|
---|
4040 | ftMemo,ftFmtMemo:Result:='TEXT';
|
---|
4041 | End;
|
---|
4042 | End;
|
---|
4043 | Native_DBase:
|
---|
4044 | Begin
|
---|
4045 | Case DataType Of
|
---|
4046 | ftString: Result := 'CHAR';
|
---|
4047 | ftDate: Result := 'DATE';
|
---|
4048 | ftFloat,ftCurrency: Result := 'FLOAT';
|
---|
4049 | ftSmallInt,ftInteger,ftWord: Result := 'INT';
|
---|
4050 | ftBoolean: Result := 'BOOL';
|
---|
4051 | ftMemo: Result := 'TEXT';
|
---|
4052 | ftBlob: Result := 'BLOB';
|
---|
4053 | Else Result := '';
|
---|
4054 | End;
|
---|
4055 | End;
|
---|
4056 | Native_Paradox:
|
---|
4057 | Begin
|
---|
4058 | Case DataType Of
|
---|
4059 | ftString: Result := 'CHAR';
|
---|
4060 | ftDate: Result := 'DATE';
|
---|
4061 | ftSmallInt: Result := 'SINT';
|
---|
4062 | ftInteger: Result := 'INT';
|
---|
4063 | ftFloat: Result := 'FLOAT';
|
---|
4064 | ftCurrency: Result := 'MONEY';
|
---|
4065 | //ftInteger: Result := 'NUMBER';
|
---|
4066 | ftBoolean: Result := 'BOOL';
|
---|
4067 | ftMemo: Result := 'TEXT';
|
---|
4068 | ftBlob: Result := 'BLOB';
|
---|
4069 | ftFmtMemo: Result := 'FMTTEXT';
|
---|
4070 | ftTime: Result := 'TIME';
|
---|
4071 | ftDateTime: Result := 'DATETIME';
|
---|
4072 | ftAutoInc: Result := 'AUTOINC';
|
---|
4073 | ftBCD: Result := 'BCD';
|
---|
4074 | ftBytes: Result := 'BYTES';
|
---|
4075 | Else Result := '';
|
---|
4076 | End;
|
---|
4077 | End;
|
---|
4078 | Else
|
---|
4079 | Begin
|
---|
4080 | If FDataTypes=Nil Then
|
---|
4081 | Begin
|
---|
4082 | List.Create;
|
---|
4083 | GetDataTypes(List);
|
---|
4084 | List.Destroy;
|
---|
4085 | End;
|
---|
4086 |
|
---|
4087 | Result:='';
|
---|
4088 | If FDataTypes=Nil Then exit;
|
---|
4089 | For t:=0 To FDataTypes.Count-1 Do
|
---|
4090 | If TFieldType(FDataTypes.Objects[t])=DataType Then
|
---|
4091 | Begin
|
---|
4092 | Result:=FDataTypes[t];
|
---|
4093 | exit;
|
---|
4094 | End;
|
---|
4095 | End;
|
---|
4096 | End; //case
|
---|
4097 | End;
|
---|
4098 |
|
---|
4099 | Function TTable.GetIndexDefs:TIndexDefs;
|
---|
4100 | Begin
|
---|
4101 | If ((FIndexDefs=Nil)Or(FIndexDefs.Count=0)) Then UpdateIndexDefs;
|
---|
4102 | Result:=FIndexDefs;
|
---|
4103 | End;
|
---|
4104 |
|
---|
4105 | Procedure UpdateIndexFieldMap(Table:TTable);
|
---|
4106 | Var t,Index:LongInt;
|
---|
4107 | IndexDef:TIndexDef;
|
---|
4108 | s,s1:String;
|
---|
4109 | Begin
|
---|
4110 | If Table.FIndexFieldMap<>Nil Then Table.FIndexFieldMap.Clear
|
---|
4111 | Else Table.FIndexFieldMap.Create;
|
---|
4112 |
|
---|
4113 | For t:=0 To Table.IndexDefs.Count-1 Do
|
---|
4114 | Begin
|
---|
4115 | IndexDef:=Table.IndexDefs[t];
|
---|
4116 |
|
---|
4117 | s:=IndexDef.Fields;
|
---|
4118 | While pos(';',s)<>0 Do
|
---|
4119 | Begin
|
---|
4120 | s1:=Copy(s,1,pos(';',s)-1);
|
---|
4121 | System.Delete(s,1,pos(';',s));
|
---|
4122 |
|
---|
4123 | Index:=Table.FieldDefs.IndexOf(s1);
|
---|
4124 | If Index>=0 Then If Table.FIndexFieldMap.IndexOf(Pointer(Index))<0 Then
|
---|
4125 | Table.FIndexFieldMap.Add(Pointer(Index));
|
---|
4126 | End;
|
---|
4127 | If s<>'' Then
|
---|
4128 | Begin
|
---|
4129 | Index:=Table.FieldDefs.IndexOf(s);
|
---|
4130 | If Index>=0 Then If Table.FIndexFieldMap.IndexOf(Pointer(Index))<0 Then
|
---|
4131 | Table.FIndexFieldMap.Add(Pointer(Index));
|
---|
4132 | End;
|
---|
4133 | End;
|
---|
4134 | End;
|
---|
4135 |
|
---|
4136 | Function TTable.GetIndexFieldCount:LongInt;
|
---|
4137 | Begin
|
---|
4138 | If ((FIndexFieldMap=Nil)Or(FIndexFieldMap.Count=0)) Then UpdateIndexFieldMap(Self);
|
---|
4139 | Result:=FIndexFieldMap.Count
|
---|
4140 | End;
|
---|
4141 |
|
---|
4142 | Function TTable.GetIndexField(Index:LongInt):TField;
|
---|
4143 | Begin
|
---|
4144 | If ((FIndexFieldMap=Nil)Or(FIndexFieldMap.Count=0)) Then UpdateIndexFieldMap(Self);
|
---|
4145 | Result:=Fields[LongInt(FIndexFieldMap[Index])]
|
---|
4146 | End;
|
---|
4147 |
|
---|
4148 | Procedure TTable.SetIndexField(Index:LongInt;NewValue:TField);
|
---|
4149 | Begin
|
---|
4150 | GetIndexField(Index).Assign(NewValue);
|
---|
4151 | End;
|
---|
4152 |
|
---|
4153 | Procedure TTable.AddIndex(Const Name:String;Fields:String;Options:TIndexOptions);
|
---|
4154 | Var OldActive,OldOpen:Boolean;
|
---|
4155 | S1,s2:String;
|
---|
4156 | ahstmt:SQLHSTMT;
|
---|
4157 | Begin
|
---|
4158 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4159 |
|
---|
4160 | OldActive:=FActive;
|
---|
4161 | OldOpen:=FOpened;
|
---|
4162 | If Not FOpened Then
|
---|
4163 | Begin
|
---|
4164 | FActive:=True;
|
---|
4165 | DoOpen;
|
---|
4166 | If Not FOpened Then Active:=False;
|
---|
4167 | End;
|
---|
4168 |
|
---|
4169 | s1:='CREATE';
|
---|
4170 | If Options*[ixUnique]<>[] Then s1:=s1+' UNIQUE';
|
---|
4171 | s1:=s1+' INDEX '+Name+' ON '+TableName+'(';
|
---|
4172 | While pos(';',Fields)<>0 Do
|
---|
4173 | Begin
|
---|
4174 | s2:=Copy(Fields,1,pos(';',Fields)-1);
|
---|
4175 | System.Delete(Fields,1,pos(';',Fields));
|
---|
4176 | If s1[length(s1)]<>'(' Then s1:=s1+',';
|
---|
4177 | s1:=s1+s2;
|
---|
4178 | If FDBProcs.DBType<>Native_Msql Then
|
---|
4179 | Begin
|
---|
4180 | If Options*[ixDescending]<>[] Then s1:=s1+' DESC'
|
---|
4181 | Else s1:=s1+' ASC';
|
---|
4182 | End;
|
---|
4183 | End;
|
---|
4184 | If s1[length(s1)]<>'(' Then s1:=s1+',';
|
---|
4185 | s1:=s1+Fields;
|
---|
4186 | If FDBProcs.DBType<>Native_Msql Then
|
---|
4187 | Begin
|
---|
4188 | If Options*[ixDescending]<>[] Then s1:=s1+' DESC'
|
---|
4189 | Else s1:=s1+' ASC';
|
---|
4190 | End;
|
---|
4191 | s1:=s1+')';
|
---|
4192 |
|
---|
4193 | If FOpened Then
|
---|
4194 | Begin
|
---|
4195 | EnterSQLProcessing;
|
---|
4196 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4197 |
|
---|
4198 | If FDBProcs.SQLExecDirect(ahstmt,s1,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4199 | Begin
|
---|
4200 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4201 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4202 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4203 | End;
|
---|
4204 |
|
---|
4205 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4206 | LeaveSQLProcessing;
|
---|
4207 | End;
|
---|
4208 |
|
---|
4209 | DoPost;
|
---|
4210 | If not OldOpen Then DoClose;
|
---|
4211 | FActive:=OldActive;
|
---|
4212 | UpdateIndexDefs;
|
---|
4213 | End;
|
---|
4214 |
|
---|
4215 | Procedure TTable.DeleteIndex(Const Name: string);
|
---|
4216 | Var OldActive,OldOpen:Boolean;
|
---|
4217 | S1:String;
|
---|
4218 | ahstmt:SQLHSTMT;
|
---|
4219 | Begin
|
---|
4220 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4221 |
|
---|
4222 | OldActive:=FActive;
|
---|
4223 | OldOpen:=FOpened;
|
---|
4224 | If Not FOpened Then
|
---|
4225 | Begin
|
---|
4226 | FActive:=True;
|
---|
4227 | DoOpen;
|
---|
4228 | If Not FOpened Then Active:=False;
|
---|
4229 | End;
|
---|
4230 |
|
---|
4231 | If FOpened Then
|
---|
4232 | Begin
|
---|
4233 | EnterSQLProcessing;
|
---|
4234 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4235 |
|
---|
4236 | s1:='DROP INDEX '+Name;
|
---|
4237 | If FDBProcs.DBType=Native_msql Then s1:=s1+' FROM '+TableName;
|
---|
4238 | If FDBProcs.SQLExecDirect(ahstmt,s1,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4239 | Begin
|
---|
4240 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4241 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4242 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4243 | End;
|
---|
4244 |
|
---|
4245 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4246 | LeaveSQLProcessing;
|
---|
4247 | End;
|
---|
4248 |
|
---|
4249 | DoPost;
|
---|
4250 | If not OldOpen Then DoClose;
|
---|
4251 | FActive:=OldActive;
|
---|
4252 | UpdateIndexDefs;
|
---|
4253 | End;
|
---|
4254 |
|
---|
4255 |
|
---|
4256 | Procedure TTable.CreateTable;
|
---|
4257 | Var s:AnsiString;
|
---|
4258 | s1:String;
|
---|
4259 | ahstmt:SQLHSTMT;
|
---|
4260 | t:LongInt;
|
---|
4261 | FieldDef:TFieldDef;
|
---|
4262 | OldActive:Boolean;
|
---|
4263 | Begin
|
---|
4264 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4265 |
|
---|
4266 | CheckInactive;
|
---|
4267 |
|
---|
4268 | s:='CREATE TABLE '+TableName+'(';
|
---|
4269 |
|
---|
4270 | For t:=0 To FieldDefs.Count-1 Do
|
---|
4271 | Begin
|
---|
4272 | FieldDef:=FieldDefs[t];
|
---|
4273 | s1:=FieldDef.TypeName;
|
---|
4274 | s:=s+FieldDef.Name+' '+s1;
|
---|
4275 | If ((FieldDef.DataType=ftString)Or(s1='LONG RAW')) Then
|
---|
4276 | s:=s+'('+tostr(FieldDef.Size)+')';
|
---|
4277 | If FieldDef.Required then s:=s+' NOT NULL';
|
---|
4278 | If FieldDef.PrimaryKey Then s:=s+' PRIMARY KEY';
|
---|
4279 | If FieldDef.ForeignKey<>'' Then s:=s+' REFERENCES '+FieldDef.ForeignKey;
|
---|
4280 | If t<>FieldDefs.Count-1 Then s:=s+',';
|
---|
4281 | End;
|
---|
4282 |
|
---|
4283 | s:=s+')';
|
---|
4284 |
|
---|
4285 | OldActive:=FActive;
|
---|
4286 | If Not FOpened Then
|
---|
4287 | Begin
|
---|
4288 | FActive:=True;
|
---|
4289 | DoOpen;
|
---|
4290 | If Not FOpened Then Active:=False;
|
---|
4291 | End;
|
---|
4292 |
|
---|
4293 | If FOpened Then
|
---|
4294 | Begin
|
---|
4295 | EnterSQLProcessing;
|
---|
4296 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4297 |
|
---|
4298 | If FDBProcs.SQLExecDirect(ahstmt,PChar(s)^,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4299 | Begin
|
---|
4300 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4301 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4302 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4303 | End;
|
---|
4304 |
|
---|
4305 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4306 | LeaveSQLProcessing;
|
---|
4307 | End;
|
---|
4308 | DoClose;
|
---|
4309 | FActive:=OldActive;
|
---|
4310 | End;
|
---|
4311 |
|
---|
4312 |
|
---|
4313 | Procedure TTable.DeleteTable;
|
---|
4314 | Var s1:String;
|
---|
4315 | ahstmt:SQLHSTMT;
|
---|
4316 | Begin
|
---|
4317 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4318 | If Active Then DoClose;
|
---|
4319 |
|
---|
4320 | If Not FOpened Then
|
---|
4321 | Begin
|
---|
4322 | FActive:=True;
|
---|
4323 | DoOpen;
|
---|
4324 | If Not FOpened Then Active:=False;
|
---|
4325 | End;
|
---|
4326 |
|
---|
4327 | If FOpened Then
|
---|
4328 | Begin
|
---|
4329 | EnterSQLProcessing;
|
---|
4330 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4331 |
|
---|
4332 | If FDBProcs.SQLExecDirect(ahstmt,'DROP TABLE '+TableName,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4333 | Begin
|
---|
4334 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4335 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4336 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4337 | End;
|
---|
4338 |
|
---|
4339 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4340 | LeaveSQLProcessing;
|
---|
4341 | End;
|
---|
4342 |
|
---|
4343 | DoPost;
|
---|
4344 | DoClose;
|
---|
4345 | End;
|
---|
4346 |
|
---|
4347 |
|
---|
4348 | Procedure TTable.EmptyTable;
|
---|
4349 | Var OldActive,OldOpen:Boolean;
|
---|
4350 | S1:String;
|
---|
4351 | ahstmt:SQLHSTMT;
|
---|
4352 | Begin
|
---|
4353 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4354 |
|
---|
4355 | OldActive:=FActive;
|
---|
4356 | OldOpen:=FOpened;
|
---|
4357 | If Not FOpened Then
|
---|
4358 | Begin
|
---|
4359 | FActive:=True;
|
---|
4360 | DoOpen;
|
---|
4361 | If Not FOpened Then Active:=False;
|
---|
4362 | End;
|
---|
4363 |
|
---|
4364 | If FOpened Then
|
---|
4365 | Begin
|
---|
4366 | EnterSQLProcessing;
|
---|
4367 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4368 |
|
---|
4369 | If FDBProcs.SQLExecDirect(ahstmt,'DELETE * FROM '+TableName,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4370 | Begin
|
---|
4371 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4372 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4373 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4374 | End;
|
---|
4375 |
|
---|
4376 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4377 | LeaveSQLProcessing;
|
---|
4378 | End;
|
---|
4379 |
|
---|
4380 | DoPost;
|
---|
4381 | If not OldOpen Then DoClose;
|
---|
4382 | FActive:=OldActive;
|
---|
4383 | End;
|
---|
4384 |
|
---|
4385 |
|
---|
4386 | Function TTable.FindKey(Const KeyValues:Array of Const):Boolean;
|
---|
4387 | Begin
|
---|
4388 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4389 | Result:=False;
|
---|
4390 | //???
|
---|
4391 | End;
|
---|
4392 |
|
---|
4393 | Procedure TTable.GetIndexNames(List: TStrings);
|
---|
4394 | Var t:LongInt;
|
---|
4395 | Begin
|
---|
4396 | List.Clear;
|
---|
4397 | For t:=0 To IndexDefs.Count-1 Do List.Add(IndexDefs[t].Name);
|
---|
4398 | End;
|
---|
4399 |
|
---|
4400 | Procedure TTable.RenameTable(NewTableName:String);
|
---|
4401 | Var OldActive,OldOpen:Boolean;
|
---|
4402 | S1:String;
|
---|
4403 | ahstmt:SQLHSTMT;
|
---|
4404 | tn:String;
|
---|
4405 | Begin
|
---|
4406 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
4407 |
|
---|
4408 | OldActive:=FActive;
|
---|
4409 | OldOpen:=FOpened;
|
---|
4410 | If Not FOpened Then
|
---|
4411 | Begin
|
---|
4412 | FActive:=True;
|
---|
4413 | DoOpen;
|
---|
4414 | If Not FOpened Then Active:=False;
|
---|
4415 | End;
|
---|
4416 |
|
---|
4417 | If FOpened Then
|
---|
4418 | Begin
|
---|
4419 | EnterSQLProcessing;
|
---|
4420 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4421 |
|
---|
4422 | tn:=TableName;
|
---|
4423 | If FDBProcs.DBType=Native_Oracle7 Then //no qualifiers !
|
---|
4424 | Begin
|
---|
4425 | If pos('.',NewTableName)<>0 Then
|
---|
4426 | System.Delete(NewTableName,1,pos('.',NewTableName));
|
---|
4427 |
|
---|
4428 | If pos('.',tn)<>0 Then
|
---|
4429 | System.Delete(tn,1,pos('.',tn));
|
---|
4430 | End;
|
---|
4431 |
|
---|
4432 | If FDBProcs.DBType=Native_Oracle7 Then s1:='RENAME '+tn+' TO '+NewTableName
|
---|
4433 | Else s1:='ALTER TABLE '+TableName+' RENAME '+NewTableName;
|
---|
4434 | If FDBProcs.SQLExecDirect(ahstmt,s1,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4435 | Begin
|
---|
4436 | S1:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4437 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4438 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S1);
|
---|
4439 | End;
|
---|
4440 |
|
---|
4441 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4442 | LeaveSQLProcessing;
|
---|
4443 | End;
|
---|
4444 |
|
---|
4445 | DoPost;
|
---|
4446 | DoClose;
|
---|
4447 | TableName:=NewTableName;
|
---|
4448 | FActive:=OldActive;
|
---|
4449 | End;
|
---|
4450 |
|
---|
4451 |
|
---|
4452 | Procedure TTable.GetNames(List:TStrings;Const Name:String);
|
---|
4453 | Var
|
---|
4454 | ahstmt:SQLHSTMT;
|
---|
4455 | cols:SQLSMALLINT;
|
---|
4456 | I:LongInt;
|
---|
4457 | C:Array[0..4] Of cstring;
|
---|
4458 | OutLen:Array[0..4] Of SQLINTEGER;
|
---|
4459 | rc:SQLRETURN;
|
---|
4460 | S,S1:String;
|
---|
4461 | OldActive:Boolean;
|
---|
4462 | OldOpen:Boolean;
|
---|
4463 | Index:LongInt;
|
---|
4464 | Begin
|
---|
4465 | List.Clear;
|
---|
4466 |
|
---|
4467 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
4468 | Begin
|
---|
4469 | OldActive:=FActive;
|
---|
4470 | OldOpen:=FOpened;
|
---|
4471 | If Not FOpened Then
|
---|
4472 | Begin
|
---|
4473 | FActive:=True;
|
---|
4474 | DoOpen;
|
---|
4475 | If Not FOpened Then Active:=False;
|
---|
4476 | End;
|
---|
4477 |
|
---|
4478 | If FOpened Then
|
---|
4479 | Begin
|
---|
4480 | EnterSQLProcessing;
|
---|
4481 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4482 |
|
---|
4483 | If FDBProcs.SQLTables(ahstmt,Nil,0,Nil,0,Nil,0,Name,SQL_NTS)=SQL_SUCCESS Then
|
---|
4484 | Begin
|
---|
4485 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
4486 | If cols>5 Then cols:=5;
|
---|
4487 | For I := 0 To cols-1 Do
|
---|
4488 | FDBProcs.SQLBindCol(ahstmt, I + 1, SQL_C_CHAR, C[I], 255, OutLen[I]);
|
---|
4489 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
4490 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
4491 | Begin
|
---|
4492 | If Cols=1 Then Index:=0 //msql
|
---|
4493 | Else Index:=2;
|
---|
4494 |
|
---|
4495 | If OutLen[Index]<>SQL_NULL_DATA Then
|
---|
4496 | Begin
|
---|
4497 | Move(C[Index],S[1],OutLen[Index]);
|
---|
4498 | S[0]:=Chr(OutLen[Index]);
|
---|
4499 | If S[length(s)]=#0 Then
|
---|
4500 | If length(S)>0 Then dec(S[0]);
|
---|
4501 | If Cols>1 Then //get qualifier
|
---|
4502 | If OutLen[0]<>SQL_NULL_DATA Then
|
---|
4503 | Begin
|
---|
4504 | Move(C[0],S1[1],OutLen[0]);
|
---|
4505 | S1[0]:=Chr(OutLen[0]);
|
---|
4506 | If S1[length(S1)]=#0 Then
|
---|
4507 | If length(S1)>0 Then dec(S1[0]);
|
---|
4508 | If S1<>'' Then S:=S1+'.'+S;
|
---|
4509 | End;
|
---|
4510 | List.Add(S);
|
---|
4511 | End;
|
---|
4512 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
4513 | End;
|
---|
4514 | End;
|
---|
4515 |
|
---|
4516 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4517 | LeaveSQLProcessing;
|
---|
4518 | End;
|
---|
4519 |
|
---|
4520 | If Not OldOpen Then DoClose;
|
---|
4521 | FActive:=OldActive;
|
---|
4522 | End;
|
---|
4523 |
|
---|
4524 | End;
|
---|
4525 |
|
---|
4526 | Procedure TTable.GetViewNames(List:TStrings);
|
---|
4527 | Begin
|
---|
4528 | GetNames(List,'VIEW');
|
---|
4529 | End;
|
---|
4530 |
|
---|
4531 | Procedure TTable.GetSystemTableNames(List:TStrings);
|
---|
4532 | Begin
|
---|
4533 | GetNames(List,'SYSTEM TABLE');
|
---|
4534 | End;
|
---|
4535 |
|
---|
4536 | Procedure TTable.GetSynonymNames(List:TStrings);
|
---|
4537 | Begin
|
---|
4538 | GetNames(List,'SYNONYM');
|
---|
4539 | End;
|
---|
4540 |
|
---|
4541 | Function MapSQLType(colType:SQLSMALLINT):TFieldType;
|
---|
4542 | Begin
|
---|
4543 | Case colType Of
|
---|
4544 | SQL_CHAR:Result:=ftString;
|
---|
4545 | SQL_NUMERIC:Result:=ftFloat;
|
---|
4546 | SQL_DECIMAL:Result:=ftFloat;
|
---|
4547 | SQL_INTEGER:Result:=ftInteger;
|
---|
4548 | SQL_SMALLINT:Result:=ftSmallInt;
|
---|
4549 | SQL_FLOAT:Result:=ftFloat;
|
---|
4550 | SQL_REAL:Result:=ftFloat;
|
---|
4551 | SQL_DOUBLE:Result:=ftFloat;
|
---|
4552 | SQL_DATE:Result:=ftDate;
|
---|
4553 | SQL_TIME:Result:=ftTime;
|
---|
4554 | SQL_TIMESTAMP:Result:=ftDateTime;
|
---|
4555 | SQL_VARCHAR:Result:=ftString;
|
---|
4556 | SQL_LONGVARCHAR:Result:=ftMemo;
|
---|
4557 | SQL_BINARY:Result:=ftBlob;
|
---|
4558 | SQL_VARBINARY:Result:=ftBlob;
|
---|
4559 | SQL_LONGVARBINARY:Result:=ftBlob;
|
---|
4560 | {SQL_BIGINT =-5; /* Not supported */
|
---|
4561 | SQL_TINYINT =-6; /* Not supported */}
|
---|
4562 | SQL_BIT:Result:=ftBoolean;
|
---|
4563 | SQL_GRAPHIC:Result:=ftGraphic;
|
---|
4564 | SQL_VARGRAPHIC:Result:=ftGraphic;
|
---|
4565 | SQL_LONGVARGRAPHIC:Result:=ftGraphic;
|
---|
4566 | SQL_BLOB:Result:=ftBlob;
|
---|
4567 | SQL_CLOB:Result:=ftBlob;
|
---|
4568 | SQL_DBCLOB:Result:=ftBlob;
|
---|
4569 | Else Result:=ftUnknown;
|
---|
4570 | End; {Case}
|
---|
4571 | End;
|
---|
4572 |
|
---|
4573 |
|
---|
4574 | Procedure TTable.GetDataTypes(List:TStrings);
|
---|
4575 | Var
|
---|
4576 | OldActive:Boolean;
|
---|
4577 | OldOpen:Boolean;
|
---|
4578 | Index:LongInt;
|
---|
4579 |
|
---|
4580 | Procedure GetType(Typ:SQLSMALLINT);
|
---|
4581 | Var cols:SQLSMALLINT;
|
---|
4582 | I:LongInt;
|
---|
4583 | C:cstring;
|
---|
4584 | OutLen:SQLINTEGER;
|
---|
4585 | rc:SQLRETURN;
|
---|
4586 | S,S1:String;
|
---|
4587 | ahstmt:SQLHSTMT;
|
---|
4588 | Begin
|
---|
4589 | EnterSQLProcessing;
|
---|
4590 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4591 |
|
---|
4592 | If FDBProcs.SQLGetTypeInfo(ahstmt,Typ)=SQL_SUCCESS Then
|
---|
4593 | Begin
|
---|
4594 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
4595 | If cols=0 Then exit;
|
---|
4596 | FDBProcs.SQLBindCol(ahstmt, 1, SQL_C_CHAR, C, 255, OutLen);
|
---|
4597 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
4598 | If ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Then
|
---|
4599 | Begin
|
---|
4600 | If OutLen<>SQL_NULL_DATA Then
|
---|
4601 | Begin
|
---|
4602 | Move(C,S[1],OutLen);
|
---|
4603 | S[0]:=Chr(OutLen);
|
---|
4604 | If S[length(s)]=#0 Then
|
---|
4605 | If length(s)>0 Then dec(S[0]);
|
---|
4606 | UpcaseStr(S);
|
---|
4607 | If List.IndexOf(S)<0 Then List.AddObject(S,Pointer(MapSQLType(Typ)));
|
---|
4608 | End;
|
---|
4609 | End;
|
---|
4610 | End;
|
---|
4611 |
|
---|
4612 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4613 | LeaveSQLProcessing;
|
---|
4614 | End;
|
---|
4615 |
|
---|
4616 | Procedure ListAddObject(Const s:String;DataType:TFieldType);
|
---|
4617 | Begin
|
---|
4618 | List.AddObject(s,Pointer(DataType));
|
---|
4619 | End;
|
---|
4620 |
|
---|
4621 | Begin
|
---|
4622 | List.Clear;
|
---|
4623 | Case FDBProcs.DBType Of
|
---|
4624 | Native_Oracle7:
|
---|
4625 | Begin
|
---|
4626 | ListAddObject('CHAR',ftString);
|
---|
4627 | ListAddObject('VARCHAR2',ftString);
|
---|
4628 | ListAddObject('FLOAT',ftFloat);
|
---|
4629 | ListAddObject('INT',ftInteger);
|
---|
4630 | ListAddObject('DATE',ftDateTime);
|
---|
4631 | ListAddObject('RAW',ftBlob);
|
---|
4632 | ListAddObject('LONG RAW',ftBlob);
|
---|
4633 | End;
|
---|
4634 | Native_msql:
|
---|
4635 | Begin
|
---|
4636 | ListAddObject('CHAR',ftString);
|
---|
4637 | ListAddObject('INT',ftInteger);
|
---|
4638 | ListAddObject('UINT',ftInteger);
|
---|
4639 | ListAddObject('REAL',ftFloat);
|
---|
4640 | ListAddObject('TEXT',ftMemo);
|
---|
4641 | ListAddObject('DATE',ftDate);
|
---|
4642 | ListAddObject('TIME',ftTime);
|
---|
4643 | ListAddObject('MONEY',ftInteger);
|
---|
4644 | End;
|
---|
4645 | Native_DBase:
|
---|
4646 | Begin
|
---|
4647 | ListAddObject('CHAR',ftString);
|
---|
4648 | ListAddObject('INT',ftInteger);
|
---|
4649 | ListAddObject('FLOAT',ftFloat);
|
---|
4650 | ListAddObject('TEXT',ftMemo);
|
---|
4651 | ListAddObject('DATE',ftDate);
|
---|
4652 | ListAddObject('BOOL',ftBoolean);
|
---|
4653 | ListAddObject('BLOB',ftBlob);
|
---|
4654 | End;
|
---|
4655 | Native_Paradox:
|
---|
4656 | Begin
|
---|
4657 | ListAddObject('CHAR',ftString);
|
---|
4658 | ListAddObject('DATE',ftDate);
|
---|
4659 | ListAddObject('SINT',ftSmallInt);
|
---|
4660 | ListAddObject('INT',ftInteger);
|
---|
4661 | ListAddObject('FLOAT',ftFloat);
|
---|
4662 | ListAddObject('MONEY',ftCurrency);
|
---|
4663 | ListAddObject('NUMBER',ftInteger);
|
---|
4664 | ListAddObject('BOOL',ftBoolean);
|
---|
4665 | ListAddObject('TEXT',ftMemo);
|
---|
4666 | ListAddObject('BLOB',ftBlob);
|
---|
4667 | ListAddObject('FMTTEXT',ftFmtMemo);
|
---|
4668 | ListAddObject('TIME',ftTime);
|
---|
4669 | ListAddObject('DATETIME',ftDateTime);
|
---|
4670 | ListAddObject('AUTOINC',ftAutoInc);
|
---|
4671 | ListAddObject('BCD',ftBCD);
|
---|
4672 | ListAddObject('BYTES',ftBytes);
|
---|
4673 | End;
|
---|
4674 | Else
|
---|
4675 | Begin
|
---|
4676 | If FDataTypes<>Nil Then
|
---|
4677 | Begin
|
---|
4678 | List.Assign(FDataTypes);
|
---|
4679 | exit;
|
---|
4680 | End;
|
---|
4681 |
|
---|
4682 | If @FDBProcs.SQLGetTypeInfo=Nil Then exit;
|
---|
4683 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
4684 | Begin
|
---|
4685 | OldActive:=FActive;
|
---|
4686 | OldOpen:=FOpened;
|
---|
4687 | If Not FOpened Then
|
---|
4688 | Begin
|
---|
4689 | FActive:=True;
|
---|
4690 | DoOpen;
|
---|
4691 | If Not FOpened Then Active:=False;
|
---|
4692 | End;
|
---|
4693 |
|
---|
4694 | If FOpened Then
|
---|
4695 | Begin
|
---|
4696 | GetType(SQL_BIGINT);
|
---|
4697 | GetType(SQL_BINARY);
|
---|
4698 | GetType(SQL_BIT);
|
---|
4699 | GetType(SQL_CHAR);
|
---|
4700 | GetType(SQL_DATE);
|
---|
4701 | GetType(SQL_DECIMAL);
|
---|
4702 | GetType(SQL_DOUBLE);
|
---|
4703 | GetType(SQL_FLOAT);
|
---|
4704 | GetType(SQL_INTEGER);
|
---|
4705 | GetType(SQL_LONGVARBINARY);
|
---|
4706 | GetType(SQL_LONGVARCHAR);
|
---|
4707 | GetType(SQL_NUMERIC);
|
---|
4708 | GetType(SQL_REAL);
|
---|
4709 | GetType(SQL_SMALLINT);
|
---|
4710 | GetType(SQL_TIME);
|
---|
4711 | GetType(SQL_TIMESTAMP);
|
---|
4712 | GetType(SQL_TINYINT);
|
---|
4713 | GetType(SQL_VARBINARY);
|
---|
4714 | GetType(SQL_VARCHAR);
|
---|
4715 | End;
|
---|
4716 |
|
---|
4717 | If Not OldOpen Then DoClose;
|
---|
4718 | FActive:=OldActive;
|
---|
4719 |
|
---|
4720 | If FDataTypes=Nil Then If List.Count>0 Then
|
---|
4721 | Begin
|
---|
4722 | FDataTypes.Create;
|
---|
4723 | FDataTypes.Assign(List);
|
---|
4724 | End;
|
---|
4725 | End;
|
---|
4726 | End;
|
---|
4727 | End;
|
---|
4728 | End;
|
---|
4729 |
|
---|
4730 |
|
---|
4731 | Procedure TTable.GetForeignKeys(List:TStrings);
|
---|
4732 | Begin
|
---|
4733 | GetKeys(List,False);
|
---|
4734 | End;
|
---|
4735 |
|
---|
4736 |
|
---|
4737 | Procedure TTable.GetTableNames(List:TStrings);
|
---|
4738 | Begin
|
---|
4739 | GetNames(List,'TABLE');
|
---|
4740 | End;
|
---|
4741 |
|
---|
4742 |
|
---|
4743 | Procedure TTable.SetTableLock(LockType:TLockType;Lock:Boolean);
|
---|
4744 | Var C:cstring;
|
---|
4745 | ahstmt:SQLHSTMT;
|
---|
4746 | S:String;
|
---|
4747 | Begin
|
---|
4748 | If Lock Then
|
---|
4749 | Begin
|
---|
4750 | C:='LOCK TABLE '+TableName+' IN ';
|
---|
4751 | If LockType=ltReadLock Then C:=C+'EXCLUSIVE'
|
---|
4752 | Else C:=C+'SHARE';
|
---|
4753 | C:=C+' MODE';
|
---|
4754 | End
|
---|
4755 | Else C:='ROLLBACK';
|
---|
4756 |
|
---|
4757 | EnterSQLProcessing;
|
---|
4758 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
4759 |
|
---|
4760 | If FDBProcs.SQLExecDirect(ahstmt,C,SQL_NTS)<>SQL_SUCCESS Then
|
---|
4761 | Begin
|
---|
4762 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
4763 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4764 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S);
|
---|
4765 | End;
|
---|
4766 |
|
---|
4767 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
4768 | LeaveSQLProcessing;
|
---|
4769 | End;
|
---|
4770 |
|
---|
4771 | Procedure TTable.LockTable(LockType:TLockType);
|
---|
4772 | Begin
|
---|
4773 | SetTableLock(LockType,True);
|
---|
4774 | End;
|
---|
4775 |
|
---|
4776 | Procedure TTable.UnlockTable(LockType:TLockType);
|
---|
4777 | Begin
|
---|
4778 | SetTableLock(LockType,False);
|
---|
4779 | End;
|
---|
4780 |
|
---|
4781 |
|
---|
4782 | Procedure TTable.ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);
|
---|
4783 | Var S:String;
|
---|
4784 | Begin
|
---|
4785 | If ResName = rnDBTable Then
|
---|
4786 | Begin
|
---|
4787 | Move(Data,S,DataLen);
|
---|
4788 | TableName:=S;
|
---|
4789 | End
|
---|
4790 | Else Inherited ReadSCUResource(ResName,Data,DataLen);
|
---|
4791 | End;
|
---|
4792 |
|
---|
4793 |
|
---|
4794 | Function TTable.WriteSCUResource(Stream:TResourceStream):Boolean;
|
---|
4795 | Var S:String;
|
---|
4796 | Begin
|
---|
4797 | Result := False;
|
---|
4798 | If Inherited WriteSCUResource(Stream) Then
|
---|
4799 | Begin
|
---|
4800 | S:=TableName;
|
---|
4801 | Result:=Stream.NewResourceEntry(rnDBTable,S,Length(S)+1);
|
---|
4802 | End;
|
---|
4803 | End;
|
---|
4804 |
|
---|
4805 |
|
---|
4806 | Function TTable.GetTableName:String;
|
---|
4807 | Begin
|
---|
4808 | Result:=FTableName^;
|
---|
4809 | End;
|
---|
4810 |
|
---|
4811 |
|
---|
4812 | Procedure TTable.SetupComponent;
|
---|
4813 | Begin
|
---|
4814 | AssignStr(FTableName,'');
|
---|
4815 | AssignStr(FMasterFields,'');
|
---|
4816 |
|
---|
4817 | Inherited SetupComponent;
|
---|
4818 |
|
---|
4819 | Name:='Table';
|
---|
4820 | End;
|
---|
4821 |
|
---|
4822 |
|
---|
4823 | Procedure TTable.SetActive(NewValue:Boolean);
|
---|
4824 | Begin
|
---|
4825 | If FActive = NewValue Then exit;
|
---|
4826 |
|
---|
4827 | Inherited SetActive(NewValue);
|
---|
4828 |
|
---|
4829 | If FActive Then
|
---|
4830 | Begin
|
---|
4831 | RefreshTable;
|
---|
4832 | FActive := FOpened;
|
---|
4833 | End
|
---|
4834 | Else DoClose;
|
---|
4835 | End;
|
---|
4836 |
|
---|
4837 |
|
---|
4838 | Procedure TTable.RefreshTable;
|
---|
4839 | Begin
|
---|
4840 | If ((csReading In ComponentState) Or (FDataSetLocked)) Then
|
---|
4841 | Begin
|
---|
4842 | FRefreshOnLoad := FActive;
|
---|
4843 | Exit;
|
---|
4844 | End;
|
---|
4845 | DoOpen;
|
---|
4846 | If Not FOpened Then Exit;
|
---|
4847 | If TableName <> '' Then QueryTable;
|
---|
4848 | End;
|
---|
4849 |
|
---|
4850 |
|
---|
4851 | Procedure TTable.SetTableName(NewValue:String);
|
---|
4852 | Begin
|
---|
4853 | If GetTableName=NewValue Then Exit;
|
---|
4854 |
|
---|
4855 | If FIndexDefs<>Nil Then FIndexDefs.Clear;
|
---|
4856 | AssignStr(FTableName,NewValue);
|
---|
4857 |
|
---|
4858 | FSelect.Clear;
|
---|
4859 | NewValue:='SELECT * FROM '+ NewValue;
|
---|
4860 | FSelect.Add(NewValue);
|
---|
4861 |
|
---|
4862 | If FActive Then
|
---|
4863 | Begin
|
---|
4864 | RefreshTable;
|
---|
4865 |
|
---|
4866 | DataChange(deTableNameChanged);
|
---|
4867 | End;
|
---|
4868 | End;
|
---|
4869 |
|
---|
4870 | Function TTable.GetPassword:String;
|
---|
4871 | Begin
|
---|
4872 | Result:=FDBProcs.pwd;
|
---|
4873 | End;
|
---|
4874 |
|
---|
4875 | Function TTable.GetUserId:String;
|
---|
4876 | Begin
|
---|
4877 | Result:=FDBProcs.uid;
|
---|
4878 | End;
|
---|
4879 |
|
---|
4880 | Procedure TTable.SetPassword(NewValue:String);
|
---|
4881 | Begin
|
---|
4882 | If FOpened Then
|
---|
4883 | Begin
|
---|
4884 | ErrorBox(LoadNLSStr(SCannotPerformDBAction));
|
---|
4885 | Exit;
|
---|
4886 | End;
|
---|
4887 | FDBProcs.pwd:=NewValue;
|
---|
4888 | End;
|
---|
4889 |
|
---|
4890 | Procedure TTable.SetUserId(NewValue:String);
|
---|
4891 | Begin
|
---|
4892 | If FOpened Then
|
---|
4893 | Begin
|
---|
4894 | ErrorBox(LoadNLSStr(SCannotPerformDBAction));
|
---|
4895 | Exit;
|
---|
4896 | End;
|
---|
4897 | FDBProcs.uid:=NewValue;
|
---|
4898 | End;
|
---|
4899 |
|
---|
4900 | Destructor TTable.Destroy;
|
---|
4901 | Begin
|
---|
4902 | DoClose;
|
---|
4903 | FreeDBProcs(FDBProcs);
|
---|
4904 | AssignStr(FTableName,'');
|
---|
4905 | If FServants<>Nil Then
|
---|
4906 | Begin
|
---|
4907 | NotifyServants(Self);
|
---|
4908 | FServants.Destroy;
|
---|
4909 | End;
|
---|
4910 | FServants:=Nil;
|
---|
4911 | If FDataTypes<>Nil Then
|
---|
4912 | Begin
|
---|
4913 | FDataTypes.Destroy;
|
---|
4914 | FDataTypes:=Nil;
|
---|
4915 | End;
|
---|
4916 | If FIndexDefs<>Nil Then
|
---|
4917 | Begin
|
---|
4918 | FIndexDefs.Destroy;
|
---|
4919 | FIndexDefs:=Nil;
|
---|
4920 | End;
|
---|
4921 | If FIndexFieldMap<>Nil Then
|
---|
4922 | Begin
|
---|
4923 | FIndexFieldMap.Destroy;
|
---|
4924 | FIndexFieldMap:=Nil;
|
---|
4925 | End;
|
---|
4926 | If FMasterSource<>Nil Then
|
---|
4927 | If FMasterSource.DataSet Is TTable Then
|
---|
4928 | TTable(FMasterSource.DataSet).ConnectServant(Self,False);
|
---|
4929 | AssignStr(FMasterFields,'');
|
---|
4930 |
|
---|
4931 | Inherited Destroy;
|
---|
4932 | End;
|
---|
4933 |
|
---|
4934 | Procedure TTable.Loaded;
|
---|
4935 | Begin
|
---|
4936 | If FTempMasterSource<>Nil Then
|
---|
4937 | If FTempMasterSource.DataSet Is TTable Then
|
---|
4938 | If FMasterSource=Nil Then MasterSource:=FTempMasterSource;
|
---|
4939 | Inherited Loaded;
|
---|
4940 | End;
|
---|
4941 |
|
---|
4942 | {$HINTS OFF}
|
---|
4943 | Procedure TTable.UpdateLinkList(Const PropertyName:String;LinkList:TList);
|
---|
4944 | Var T:LongInt;
|
---|
4945 | DataSource:TDataSource;
|
---|
4946 | Begin
|
---|
4947 | For T:=LinkList.Count-1 DownTo 0 Do
|
---|
4948 | Begin
|
---|
4949 | DataSource:=TDataSource(LinkList[T]);
|
---|
4950 | If DataSource Is TDataSource Then
|
---|
4951 | Begin
|
---|
4952 | If DataSource.DataSet Is TTable Then
|
---|
4953 | Begin
|
---|
4954 | //no recursive elements !!
|
---|
4955 | If TTable(DataSource.DataSet)=Self Then LinkList.Remove(DataSource);
|
---|
4956 | End
|
---|
4957 | Else
|
---|
4958 | Begin
|
---|
4959 | //no DataSources that are Not linked To tables !
|
---|
4960 | LinkList.Remove(DataSource);
|
---|
4961 | End;
|
---|
4962 | End;
|
---|
4963 | End;
|
---|
4964 | End;
|
---|
4965 | {$HINTS ON}
|
---|
4966 |
|
---|
4967 | Procedure TTable.SetMasterSource(NewValue:TDataSource);
|
---|
4968 | Var OldLocked:Boolean;
|
---|
4969 | IsLoaded:Boolean;
|
---|
4970 | Begin
|
---|
4971 | If NewValue=FMasterSource Then Exit;
|
---|
4972 | If NewValue<>Nil Then
|
---|
4973 | Begin
|
---|
4974 | If Not (NewValue.DataSet Is TTable) Then
|
---|
4975 | Begin
|
---|
4976 | IsLoaded:=((ComponentState*[csReading]=[])And(Not FDataSetLocked));
|
---|
4977 | If ((NewValue.DataSet=Nil)And(Not IsLoaded)) Then FTempMasterSource:=NewValue
|
---|
4978 | Else If ComponentState*[csDesigning]<>[] Then ErrorBox(LoadNLSStr(SDataSourceLinkError));
|
---|
4979 | Exit;
|
---|
4980 | End;
|
---|
4981 | If TTable(NewValue.DataSet)=Self Then
|
---|
4982 | Begin
|
---|
4983 | If ComponentState*[csDesigning]<>[] Then ErrorBox('Illegal recursive DataSource link');
|
---|
4984 | Exit;
|
---|
4985 | End;
|
---|
4986 | If ((FServants<>Nil)And(FServants.IndexOf(NewValue.DataSet)>=0)) Then
|
---|
4987 | Begin
|
---|
4988 | If ComponentState*[csDesigning]<>[] Then ErrorBox('Illegal circular DataSource link');
|
---|
4989 | Exit;
|
---|
4990 | End;
|
---|
4991 |
|
---|
4992 | End;
|
---|
4993 |
|
---|
4994 | //prevent call Of RefreshTable In ConnectServant
|
---|
4995 | OldLocked:=FDataSetLocked;
|
---|
4996 | FDataSetLocked:=True;
|
---|
4997 | If FMasterSource<>Nil Then
|
---|
4998 | If FMasterSource.DataSet Is TTable Then
|
---|
4999 | TTable(FMasterSource.DataSet).ConnectServant(Self,False);
|
---|
5000 | FMasterSource:=NewValue;
|
---|
5001 | FDataSetLocked:=OldLocked;
|
---|
5002 | If FMasterSource<>Nil Then
|
---|
5003 | Begin
|
---|
5004 | If FMasterSource.DataSet Is TTable Then
|
---|
5005 | TTable(FMasterSource.DataSet).ConnectServant(Self,True)
|
---|
5006 | Else If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then RefreshTable;
|
---|
5007 | End
|
---|
5008 | Else If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then RefreshTable;
|
---|
5009 | End;
|
---|
5010 |
|
---|
5011 | Function TTable.GetMasterFields:String;
|
---|
5012 | Begin
|
---|
5013 | Result:=FMasterFields^;
|
---|
5014 | End;
|
---|
5015 |
|
---|
5016 | Procedure TTable.SetMasterFields(Const NewValue:String);
|
---|
5017 | Begin
|
---|
5018 | If GetMasterFields=NewValue Then exit;
|
---|
5019 |
|
---|
5020 | AssignStr(FMasterFields,NewValue);
|
---|
5021 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then RefreshTable;
|
---|
5022 | End;
|
---|
5023 |
|
---|
5024 | Procedure TTable.ConnectServant(Servant:TTable;Connect:Boolean);
|
---|
5025 | Begin
|
---|
5026 | If Connect Then
|
---|
5027 | Begin
|
---|
5028 | If FServants=Nil Then FServants.Create;
|
---|
5029 | FServants.Add(Servant);
|
---|
5030 | End
|
---|
5031 | Else If FServants<>Nil Then
|
---|
5032 | Begin
|
---|
5033 | If FServants.IndexOf(Servant)>=0 Then FServants.Remove(Servant);
|
---|
5034 | End;
|
---|
5035 |
|
---|
5036 | If ((Servant.ComponentState*[csReading]=[])And(Not Servant.FDataSetLocked)) Then
|
---|
5037 | Servant.RefreshTable;
|
---|
5038 | End;
|
---|
5039 |
|
---|
5040 | Procedure TTable.DataChange(event:TDataChange);
|
---|
5041 | Var T:LongInt;
|
---|
5042 | Servant:TTable;
|
---|
5043 | Begin
|
---|
5044 | If FServants<>Nil Then For T:=0 To FServants.Count-1 Do
|
---|
5045 | Begin
|
---|
5046 | Servant:=FServants[T];
|
---|
5047 | If ((Servant.ComponentState*[csReading]=[])And(Not Servant.FDataSetLocked)) Then
|
---|
5048 | Servant.RefreshTable;
|
---|
5049 | End;
|
---|
5050 |
|
---|
5051 | Inherited DataChange(event);
|
---|
5052 | End;
|
---|
5053 |
|
---|
5054 |
|
---|
5055 | Function TTable.GetResultColRow(Col,Row:LongInt):TField;
|
---|
5056 | Var FieldDef:TFieldDef;
|
---|
5057 | I,t:LongInt;
|
---|
5058 | field:TField;
|
---|
5059 | rc:SQLRETURN;
|
---|
5060 | OutLen:LongInt;
|
---|
5061 | Temp:Pointer;
|
---|
5062 | NewLen:LongInt;
|
---|
5063 | MapType:LongInt;
|
---|
5064 | S:String;
|
---|
5065 | ActRows:LongWord;
|
---|
5066 | RowStatus:Word;
|
---|
5067 | ExtFetchOk:Boolean;
|
---|
5068 | e:Extended;
|
---|
5069 | Header:TGraphicHeader;
|
---|
5070 | Label again,err;
|
---|
5071 | Begin
|
---|
5072 | Result := Nil;
|
---|
5073 | If Not FOpened Then Exit;
|
---|
5074 |
|
---|
5075 | Result := Inherited GetResultColRow(Col,Row);
|
---|
5076 | If Result <> Nil Then exit;
|
---|
5077 |
|
---|
5078 | If FDBProcs.ahstmt=0 Then Exit; {no previous Select Command Or no more Rows}
|
---|
5079 |
|
---|
5080 | /* Store Result Row(S) */
|
---|
5081 | again:
|
---|
5082 | //Try if we are able to retrieve cursored rows !
|
---|
5083 | If Self Is TStoredProc Then //due to "Function sequence error"
|
---|
5084 | Begin
|
---|
5085 | rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
5086 | ExtFetchOk:=False;
|
---|
5087 | End
|
---|
5088 | Else
|
---|
5089 | Begin
|
---|
5090 | rc:=FDBProcs.SQLExtendedFetch(FDBProcs.ahstmt,SQL_FETCH_ABSOLUTE,
|
---|
5091 | Row+1,ActRows,RowStatus);
|
---|
5092 | ExtFetchOk:=rc<>SQL_ERROR;
|
---|
5093 | If not ExtFetchOk Then rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt); //Driver not capable (DB2 !)
|
---|
5094 | End;
|
---|
5095 |
|
---|
5096 | FieldDef:=FFieldDefs[0];
|
---|
5097 |
|
---|
5098 | If ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Then
|
---|
5099 | Begin
|
---|
5100 | For I:=0 To FFieldDefs.Count-1 Do
|
---|
5101 | Begin
|
---|
5102 | FieldDef:=FFieldDefs[I];
|
---|
5103 | {Create Row}
|
---|
5104 | Field := FieldDef.CreateField(Nil);
|
---|
5105 | If ExtFetchOk Then Field.FRow:=Row+1
|
---|
5106 | Else Field.FRow:=FieldDef.Fields.Count;
|
---|
5107 | Field.FCol:=I;
|
---|
5108 |
|
---|
5109 | Case FieldDef.DataType Of
|
---|
5110 | ftBytes,ftVarBytes,ftBlob,ftMemo,ftGraphic,
|
---|
5111 | ftFmtMemo,ftTypedBinary:MapType:=SQL_C_BINARY;
|
---|
5112 | ftFloat:
|
---|
5113 | Begin
|
---|
5114 | Case FieldDef.Size Of
|
---|
5115 | 4:MapType:=SQL_C_FLOAT;
|
---|
5116 | Else MapType:=SQL_C_DOUBLE;
|
---|
5117 | End; //case
|
---|
5118 | End;
|
---|
5119 | Else MapType:=SQL_C_DEFAULT;
|
---|
5120 | End;
|
---|
5121 |
|
---|
5122 | rc:=FDBProcs.SQLGetData(FDBProcs.ahstmt,I+1,MapType,field.FValue^,
|
---|
5123 | FieldDef.Size,OutLen);
|
---|
5124 | If rc<>SQL_ERROR Then
|
---|
5125 | Begin
|
---|
5126 | If ((rc=SQL_SUCCESS_WITH_INFO)And(OutLen>field.FValueLen)And
|
---|
5127 | (MapType=SQL_C_BINARY)) Then
|
---|
5128 | Begin
|
---|
5129 | NewLen:=OutLen-field.FValueLen;
|
---|
5130 | GetMem(Temp,OutLen);
|
---|
5131 | Move(Field.FValue^,Temp^,Field.FValueLen);
|
---|
5132 | FreeMem(Field.FValue,Field.FValueLen);
|
---|
5133 | Field.FValue:=Temp;
|
---|
5134 | Inc(Temp,field.FValueLen);
|
---|
5135 | Field.FValueLen:=OutLen;
|
---|
5136 | rc:=FDBProcs.SQLGetData(FDBProcs.ahstmt,I+1,MapType,Temp^,
|
---|
5137 | NewLen,OutLen);
|
---|
5138 | If rc=SQL_ERROR Then
|
---|
5139 | Begin
|
---|
5140 | Field.Destroy;
|
---|
5141 | Goto err;
|
---|
5142 | End;
|
---|
5143 | OutLen:=Field.FValueLen+1;
|
---|
5144 | End;
|
---|
5145 |
|
---|
5146 | If OutLen=SQL_NULL_DATA Then
|
---|
5147 | Begin
|
---|
5148 | Field.FreeMemory; //TOM TEST
|
---|
5149 | End
|
---|
5150 | Else
|
---|
5151 | Begin
|
---|
5152 | If OutLen<=field.FValueLen Then
|
---|
5153 | Begin
|
---|
5154 | GetMem(Temp,OutLen);
|
---|
5155 | Move(Field.FValue^,Temp^,OutLen);
|
---|
5156 | FreeMem(Field.FValue,Field.FValueLen);
|
---|
5157 | Field.FValue:=Temp;
|
---|
5158 | Field.FValueLen:=OutLen;
|
---|
5159 | End;
|
---|
5160 | End;
|
---|
5161 |
|
---|
5162 | If ExtFetchOk Then
|
---|
5163 | Begin
|
---|
5164 | If Row<=FieldDef.Fields.Count-1 Then
|
---|
5165 | Begin
|
---|
5166 | FieldDef.Fields[Row]:=Field;
|
---|
5167 | End
|
---|
5168 | Else
|
---|
5169 | Begin
|
---|
5170 | For t:=FieldDef.Fields.Count+1 To Row Do
|
---|
5171 | FieldDef.Fields.Add(Nil);
|
---|
5172 | FieldDef.Fields.Add(Field);
|
---|
5173 | End;
|
---|
5174 | End
|
---|
5175 | Else FieldDef.Fields.Add(Field);
|
---|
5176 | End
|
---|
5177 | Else
|
---|
5178 | Begin
|
---|
5179 | Field.Destroy;
|
---|
5180 | Goto err;
|
---|
5181 | End;
|
---|
5182 |
|
---|
5183 | If Field Is TBlobField Then // check graphic header
|
---|
5184 | Begin
|
---|
5185 | If Field.FValueLen >= SizeOf(TGraphicHeader) Then
|
---|
5186 | Begin
|
---|
5187 | move(Field.FValue^, Header, SizeOf(TGraphicHeader));
|
---|
5188 | If (Header.Count = 1) And (Header.HType = $0100) And
|
---|
5189 | (Header.Size = Field.FValueLen - SizeOf(TGraphicHeader)) Then
|
---|
5190 | Begin
|
---|
5191 | GetMem(Temp, Header.Size);
|
---|
5192 | inc(Field.FValue, SizeOf(TGraphicHeader));
|
---|
5193 | Move(Field.FValue^,Temp^, Header.Size);
|
---|
5194 | dec(Field.FValue, SizeOf(TGraphicHeader));
|
---|
5195 | FreeMem(Field.FValue, Field.FValueLen);
|
---|
5196 | Field.FValue := Temp;
|
---|
5197 | Field.FValueLen := Header.Size;
|
---|
5198 | //Field.FBlobType := ftGraphic;
|
---|
5199 | End;
|
---|
5200 | End;
|
---|
5201 | End;
|
---|
5202 | End;
|
---|
5203 |
|
---|
5204 | FieldDef:=FFieldDefs[Col];
|
---|
5205 |
|
---|
5206 | If ((ExtFetchOk)Or(Row=FieldDef.Fields.Count-1)) Then
|
---|
5207 | Begin
|
---|
5208 | {result found}
|
---|
5209 | Result:=FieldDef.Fields.Items[Row];
|
---|
5210 | exit;
|
---|
5211 | End;
|
---|
5212 |
|
---|
5213 | Goto again; {fetch Next Row}
|
---|
5214 | End
|
---|
5215 | Else
|
---|
5216 | Begin
|
---|
5217 | {no more Rows}
|
---|
5218 | If rc=SQL_ERROR Then
|
---|
5219 | Begin
|
---|
5220 | err:
|
---|
5221 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
5222 | CloseStmt;
|
---|
5223 | SQLError('Error fetching result row '+FieldDef.Name+#13#10+S);
|
---|
5224 | End;
|
---|
5225 |
|
---|
5226 | CloseStmt;
|
---|
5227 | End;
|
---|
5228 | End;
|
---|
5229 |
|
---|
5230 |
|
---|
5231 | Procedure TTable.GetKeys(List:TStrings;Primary:Boolean);
|
---|
5232 | Var ahstmt:SQLHSTMT;
|
---|
5233 | cols:SQLSMALLINT;
|
---|
5234 | C:Array[0..8] Of cstring;
|
---|
5235 | cc:cstring;
|
---|
5236 | S,S1:String;
|
---|
5237 | I:LongInt;
|
---|
5238 | OutLen:Array[0..8] Of SQLINTEGER;
|
---|
5239 | rc:SQLRETURN;
|
---|
5240 | Offset,Offset1:LongInt;
|
---|
5241 | Begin
|
---|
5242 | If Primary Then
|
---|
5243 | Begin
|
---|
5244 | Offset:=0;
|
---|
5245 | Offset1:=0;
|
---|
5246 | End
|
---|
5247 | Else
|
---|
5248 | Begin
|
---|
5249 | Offset:=4;
|
---|
5250 | Offset1:=-4;
|
---|
5251 | End;
|
---|
5252 |
|
---|
5253 | EnterSQLProcessing;
|
---|
5254 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5255 |
|
---|
5256 | cc:=TableName;
|
---|
5257 | Try //Some DB2 Servers return a GPF here ...
|
---|
5258 | rc:=SQL_ERROR;
|
---|
5259 | If TableName<>'' Then
|
---|
5260 | Begin
|
---|
5261 | If Primary Then
|
---|
5262 | rc:=FDBProcs.SQLPrimaryKeys(ahstmt,Nil,0,Nil,0,cc,SQL_NTS)
|
---|
5263 | Else If @FDBProcs.SQLForeignKeys<>Nil Then
|
---|
5264 | rc:=FDBProcs.SQLForeignKeys(ahstmt,Nil,0,Nil,0,Nil,0,Nil,0,Nil,0,cc,SQL_NTS);
|
---|
5265 | End
|
---|
5266 | Else
|
---|
5267 | Begin
|
---|
5268 | If Primary Then
|
---|
5269 | rc:=FDBProcs.SQLPrimaryKeys(ahstmt,Nil,0,Nil,0,Nil,0)
|
---|
5270 | Else If @FDBProcs.SQLForeignKeys<>Nil Then
|
---|
5271 | rc:=FDBProcs.SQLForeignKeys(ahstmt,Nil,0,Nil,0,Nil,0,Nil,0,Nil,0,Nil,0);
|
---|
5272 | End;
|
---|
5273 |
|
---|
5274 | If rc=SQL_SUCCESS Then
|
---|
5275 | Begin
|
---|
5276 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
5277 | If cols>8 Then cols:=8;
|
---|
5278 | For I := 0 To cols-1 Do
|
---|
5279 | FDBProcs.SQLBindCol(ahstmt, I + 1, SQL_C_CHAR, C[I], 255, OutLen[I]);
|
---|
5280 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5281 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
5282 | Begin
|
---|
5283 | If OutLen[3+Offset]<>SQL_NULL_DATA Then
|
---|
5284 | Begin
|
---|
5285 | Move(C[3+Offset],S[1],OutLen[3+Offset]);
|
---|
5286 | S[0]:=Chr(OutLen[3+Offset]);
|
---|
5287 | If S[Length(S)]=#0 Then
|
---|
5288 | If length(S)>0 Then dec(S[0]);
|
---|
5289 | If ((TableName='')Or(Not Primary)) Then
|
---|
5290 | Begin
|
---|
5291 | If OutLen[2+Offset+Offset1]<>SQL_NULL_DATA Then
|
---|
5292 | Begin
|
---|
5293 | Move(C[2+Offset+Offset1],S1[1],OutLen[2+Offset+Offset1]);
|
---|
5294 | S1[0]:=Chr(OutLen[2+Offset+Offset1]);
|
---|
5295 | If S1[Length(S1)]=#0 Then
|
---|
5296 | If length(S1)>0 Then dec(S1[0]);
|
---|
5297 | If not Primary Then
|
---|
5298 | Begin
|
---|
5299 | S:=S+'>'+S1;
|
---|
5300 | If OutLen[2+Offset+Offset1+1]<>SQL_NULL_DATA Then
|
---|
5301 | Begin
|
---|
5302 | Move(C[2+Offset+Offset1+1],S1[1],OutLen[2+Offset+Offset1+1]);
|
---|
5303 | S1[0]:=Chr(OutLen[2+Offset+Offset1+1]);
|
---|
5304 | If S1[Length(S1)]=#0 Then
|
---|
5305 | If length(S1)>0 Then dec(S1[0]);
|
---|
5306 | S:=S+'.'+S1;
|
---|
5307 | End;
|
---|
5308 | End
|
---|
5309 | Else S:=S1+'.'+S;
|
---|
5310 | End;
|
---|
5311 | End;
|
---|
5312 | List.Add(S);
|
---|
5313 | End;
|
---|
5314 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5315 | End;
|
---|
5316 | End;
|
---|
5317 | Except
|
---|
5318 | List.Clear;
|
---|
5319 | End;
|
---|
5320 |
|
---|
5321 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5322 | LeaveSQLProcessing;
|
---|
5323 | End;
|
---|
5324 |
|
---|
5325 |
|
---|
5326 | Procedure TTable.DoOpen;
|
---|
5327 | Var rc:SQLRETURN;
|
---|
5328 | s:String;
|
---|
5329 | fmode:Longword;
|
---|
5330 | Begin
|
---|
5331 | If Not FActive Then Exit;
|
---|
5332 |
|
---|
5333 | If Not FillDBProcs(FDBProcs) Then
|
---|
5334 | Begin
|
---|
5335 | LeaveSQLProcessing;
|
---|
5336 | ErrorBox(LoadNLSStr(SErrLoadingDB));
|
---|
5337 | Active:=False;
|
---|
5338 | Exit; {Error}
|
---|
5339 | End;
|
---|
5340 |
|
---|
5341 | If Not FOpened Then
|
---|
5342 | Begin
|
---|
5343 | EnterSQLProcessing;
|
---|
5344 |
|
---|
5345 | Try
|
---|
5346 | If FBeforeOpen<>Nil Then FBeforeOpen(Self);
|
---|
5347 |
|
---|
5348 | FDBProcs.ahstmt:=0;
|
---|
5349 | FDBProcs.ahenv:=0;
|
---|
5350 | If AllocateDBEnvironment(FDBProcs)<>SQL_SUCCESS Then
|
---|
5351 | Begin
|
---|
5352 | LeaveSQLProcessing;
|
---|
5353 | ErrorBox(LoadNLSStr(SErrAllocDBEnv)+'.'+
|
---|
5354 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
5355 | Active:=False;
|
---|
5356 | Exit;
|
---|
5357 | End;
|
---|
5358 |
|
---|
5359 | {Connect To Server}
|
---|
5360 | FDBProcs.ahdbc:=0;
|
---|
5361 | If FDBProcs.SQLAllocConnect(FDBProcs.ahenv,FDBProcs.ahdbc)<>SQL_SUCCESS Then
|
---|
5362 | Begin
|
---|
5363 | LeaveSQLProcessing;
|
---|
5364 | ErrorBox(LoadNLSStr(SErrAllocDBConnect)+'.'+
|
---|
5365 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
5366 | DoClose;
|
---|
5367 | Exit;
|
---|
5368 | End;
|
---|
5369 |
|
---|
5370 | {Set autocommit OFF}
|
---|
5371 | If FDBProcs.SQLSetConnectOption(FDBProcs.ahdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)<>SQL_SUCCESS Then
|
---|
5372 | Begin
|
---|
5373 | LeaveSQLProcessing;
|
---|
5374 | ErrorBox(LoadNLSStr(SErrSettingDBOpts)+'.'+
|
---|
5375 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
5376 | DoClose;
|
---|
5377 | Exit;
|
---|
5378 | End;
|
---|
5379 |
|
---|
5380 | {Connect}
|
---|
5381 | Try
|
---|
5382 | If FDBProcs.uid='' Then
|
---|
5383 | Begin
|
---|
5384 | If FDBProcs.pwd='' Then
|
---|
5385 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
5386 | Nil,0,Nil,0)
|
---|
5387 | Else
|
---|
5388 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
5389 | Nil,0,FDBProcs.pwd,SQL_NTS);
|
---|
5390 | End
|
---|
5391 | Else If FDBProcs.pwd='' Then
|
---|
5392 | Begin
|
---|
5393 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
5394 | FDBProcs.uid,SQL_NTS,Nil,0);
|
---|
5395 | End
|
---|
5396 | Else rc:= FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
5397 | FDBProcs.uid,SQL_NTS,FDBProcs.pwd,SQL_NTS);
|
---|
5398 | If rc<>SQL_SUCCESS Then
|
---|
5399 | Begin
|
---|
5400 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0);
|
---|
5401 | DoClose;
|
---|
5402 | SQLError(LoadNLSStr(SErrorDBConnecting)+' "'+DataBase+'".'+#13#10+S);
|
---|
5403 | End;
|
---|
5404 | Except
|
---|
5405 | ON E:ESQLError Do
|
---|
5406 | Begin
|
---|
5407 | LeaveSQLProcessing;
|
---|
5408 | ErrorBox(E.Message);
|
---|
5409 | Exit;
|
---|
5410 | End;
|
---|
5411 | Else Raise;
|
---|
5412 | End;
|
---|
5413 |
|
---|
5414 | FOpened:=True;
|
---|
5415 |
|
---|
5416 | LeaveSQLProcessing;
|
---|
5417 | If FAfterOpen<>Nil Then AfterOpen(Self);
|
---|
5418 | Except
|
---|
5419 | LeaveSQLProcessing;
|
---|
5420 | Raise;
|
---|
5421 | End;
|
---|
5422 | End;
|
---|
5423 | End;
|
---|
5424 |
|
---|
5425 |
|
---|
5426 | Procedure TTable.DoClose;
|
---|
5427 | Begin
|
---|
5428 | Try
|
---|
5429 | If FBeforeClose<>Nil Then FBeforeClose(Self);
|
---|
5430 |
|
---|
5431 | If FOpened Then
|
---|
5432 | Begin
|
---|
5433 | CloseStmt;
|
---|
5434 | Post; //Commit All transactions
|
---|
5435 | End;
|
---|
5436 |
|
---|
5437 | FActive:=False;
|
---|
5438 | FDataSetLocked:=True;
|
---|
5439 | FFieldDefs.Clear;
|
---|
5440 | FDataSetLocked:=False;
|
---|
5441 |
|
---|
5442 | If FDBProcs.ahdbc <> 0 Then
|
---|
5443 | Begin
|
---|
5444 | If FOpened Then
|
---|
5445 | If FDBProcs.SQLDisconnect(FDBProcs.ahdbc) <> SQL_SUCCESS Then
|
---|
5446 | ErrorBox('Disconnect error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
5447 | If FDBProcs.SQLFreeConnect(FDBProcs.ahdbc) <> SQL_SUCCESS Then
|
---|
5448 | ErrorBox('FreeConnect error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
5449 | FDBProcs.ahdbc := 0;
|
---|
5450 | End;
|
---|
5451 |
|
---|
5452 | If FDBProcs.ahenv <> 0 Then
|
---|
5453 | Begin
|
---|
5454 | If FDBProcs.SQLFreeEnv(FDBProcs.ahenv) <> SQL_SUCCESS Then
|
---|
5455 | ErrorBox('FreeEnv error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
5456 | FDBProcs.ahenv := 0;
|
---|
5457 | End;
|
---|
5458 |
|
---|
5459 | Inherited DoClose;
|
---|
5460 |
|
---|
5461 | DataChange(deDataBaseChanged);
|
---|
5462 |
|
---|
5463 | If FAfterClose<>Nil Then FAfterClose(Self);
|
---|
5464 | Except
|
---|
5465 | Raise;
|
---|
5466 | End;
|
---|
5467 | End;
|
---|
5468 |
|
---|
5469 |
|
---|
5470 | Procedure TTable.GetStoredProcNames(List:TStrings);
|
---|
5471 | Var
|
---|
5472 | ahstmt:SQLHSTMT;
|
---|
5473 | cols:SQLSMALLINT;
|
---|
5474 | I:LongInt;
|
---|
5475 | C:Array[0..4] Of cstring;
|
---|
5476 | OutLen:Array[0..4] Of SQLINTEGER;
|
---|
5477 | rc:SQLRETURN;
|
---|
5478 | S,S1:String;
|
---|
5479 | OldActive:Boolean;
|
---|
5480 | OldOpen:Boolean;
|
---|
5481 | Begin
|
---|
5482 | Inherited GetStoredProcNames(List);
|
---|
5483 |
|
---|
5484 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
5485 | Begin
|
---|
5486 | OldActive:=FActive;
|
---|
5487 | OldOpen:=FOpened;
|
---|
5488 | If Designed Then
|
---|
5489 | If Not FOpened Then
|
---|
5490 | Begin
|
---|
5491 | FActive:=True;
|
---|
5492 | DoOpen;
|
---|
5493 | If Not FOpened Then Active:=False;
|
---|
5494 | End;
|
---|
5495 |
|
---|
5496 | If FOpened Then
|
---|
5497 | Begin
|
---|
5498 | EnterSQLProcessing;
|
---|
5499 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5500 |
|
---|
5501 | If FDBProcs.SQLProcedures(ahstmt,Nil,0,Nil,0,Nil,0)=SQL_SUCCESS Then
|
---|
5502 | Begin
|
---|
5503 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
5504 | If cols>3 Then cols:=3;
|
---|
5505 | For I := 0 To cols-1 Do
|
---|
5506 | FDBProcs.SQLBindCol(ahstmt, I + 1, SQL_C_CHAR, C[I], 255, OutLen[I]);
|
---|
5507 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5508 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
5509 | Begin
|
---|
5510 | If OutLen[2]<>SQL_NULL_DATA Then
|
---|
5511 | Begin
|
---|
5512 | Move(C[2],S[1],OutLen[2]);
|
---|
5513 | S[0]:=Chr(OutLen[2]);
|
---|
5514 | If S[length(S)]=#0 Then
|
---|
5515 | If length(S)>0 Then dec(S[0]);
|
---|
5516 | If OutLen[0]<>SQL_NULL_DATA Then
|
---|
5517 | Begin
|
---|
5518 | Move(C[0],S1[1],OutLen[0]);
|
---|
5519 | S1[0]:=Chr(OutLen[0]);
|
---|
5520 | If S1[length(S1)]=#0 Then
|
---|
5521 | If length(S1)>0 Then dec(S1[0]);
|
---|
5522 | If S1<>'' Then S:=S1+'.'+S;
|
---|
5523 | End;
|
---|
5524 | List.Add(S);
|
---|
5525 | End;
|
---|
5526 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5527 | End;
|
---|
5528 | End
|
---|
5529 | Else List.Clear;
|
---|
5530 |
|
---|
5531 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5532 | LeaveSQLProcessing;
|
---|
5533 | End;
|
---|
5534 |
|
---|
5535 | If Designed Then
|
---|
5536 | Begin
|
---|
5537 | If Not OldOpen Then DoClose;
|
---|
5538 | FActive:=OldActive;
|
---|
5539 | End;
|
---|
5540 | End;
|
---|
5541 | End;
|
---|
5542 |
|
---|
5543 |
|
---|
5544 | Procedure TTable.GetDataSources(List:TStrings);
|
---|
5545 | Var
|
---|
5546 | AliasName,DriverName,Advanced,UID:String;
|
---|
5547 | t,Count:LongInt;
|
---|
5548 | Begin
|
---|
5549 | List.Clear;
|
---|
5550 |
|
---|
5551 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
5552 | Begin
|
---|
5553 | Count:=GetDbAliasNamesCount;
|
---|
5554 | For t:=0 To Count-1 Do
|
---|
5555 | Begin
|
---|
5556 | GetDBAlias(t,AliasName,DriverName,Advanced,UID);
|
---|
5557 | List.Add(AliasName);
|
---|
5558 | End;
|
---|
5559 | End;
|
---|
5560 | End;
|
---|
5561 |
|
---|
5562 |
|
---|
5563 | Procedure TTable.DoDelete;
|
---|
5564 | Var C,c1:cstring;
|
---|
5565 | ahstmt,ahstmt1:SQLHSTMT;
|
---|
5566 | S:String;
|
---|
5567 | resultCols:SQLSMALLINT;
|
---|
5568 | rc:SQLRETURN;
|
---|
5569 | T:LongInt;
|
---|
5570 | T1,RowId:LongInt;
|
---|
5571 | Res:SQLINTEGER;
|
---|
5572 | OracleRowId:CString;
|
---|
5573 | Begin
|
---|
5574 | If ReadOnly Then SQLError('Cannot modify a readonly dataset!');
|
---|
5575 |
|
---|
5576 | If (Not IsTable) Then exit; //cannot update this result set...
|
---|
5577 |
|
---|
5578 | EnterSQLProcessing;
|
---|
5579 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5580 |
|
---|
5581 | Case FDBProcs.DBType Of
|
---|
5582 | Native_mSQL: C:='SELECT _rowid,'+Fields[0].FieldName+' FROM '+TableName;
|
---|
5583 | Native_Oracle7: C:='SELECT ROWID,'+Fields[0].FieldName+' FROM '+TableName+' FOR UPDATE'
|
---|
5584 | Else C:='SELECT * FROM '+TableName+' FOR UPDATE';
|
---|
5585 | End;
|
---|
5586 |
|
---|
5587 | If FDBProcs.SQLExecDirect(ahstmt,C,SQL_NTS)<>SQL_SUCCESS Then
|
---|
5588 | Begin
|
---|
5589 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5590 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5591 | SQLError('Error executing SELECT SQL statement: '+S);
|
---|
5592 | End;
|
---|
5593 |
|
---|
5594 | FDBProcs.SQLNumResultCols(ahstmt,resultCols);
|
---|
5595 | If resultCols=0 Then //Not A Select statement
|
---|
5596 | Begin
|
---|
5597 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5598 | LeaveSQLProcessing;
|
---|
5599 | Exit;
|
---|
5600 | End;
|
---|
5601 |
|
---|
5602 | If FDBProcs.DBType=Native_mSQL Then T1:=Fields[0].FRow-1
|
---|
5603 | Else T1:=Fields[0].FRow;
|
---|
5604 |
|
---|
5605 | For T:=0 To T1 Do
|
---|
5606 | Begin
|
---|
5607 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5608 | If ((rc=SQL_NO_DATA_FOUND)Or(rc=SQL_ERROR)) Then
|
---|
5609 | Begin
|
---|
5610 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5611 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5612 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5613 | End;
|
---|
5614 | End;
|
---|
5615 |
|
---|
5616 | If FDBProcs.DBType=Native_mSQL Then
|
---|
5617 | Begin
|
---|
5618 | If FDBProcs.SQLGetData(ahstmt,1,SQL_INTEGER,RowId,4,Res)<>SQL_SUCCESS Then
|
---|
5619 | Begin
|
---|
5620 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5621 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5622 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5623 | End;
|
---|
5624 | End;
|
---|
5625 |
|
---|
5626 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
5627 | Begin
|
---|
5628 | If FDBProcs.SQLGetData(ahstmt,1,SQL_C_CHAR,OracleRowId,255,Res)<>SQL_SUCCESS Then
|
---|
5629 | Begin
|
---|
5630 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5631 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5632 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5633 | End;
|
---|
5634 | End;
|
---|
5635 |
|
---|
5636 | FillChar(c1,255,0);
|
---|
5637 | If FDBProcs.SQLGetCursorName(ahstmt,c1,255,resultCols)<>SQL_SUCCESS Then
|
---|
5638 | Begin
|
---|
5639 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5640 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5641 | SQLError('Error executing SQLGetCursorName statement: '+S);
|
---|
5642 | End;
|
---|
5643 |
|
---|
5644 | If FDBProcs.DBType=Native_Oracle7 Then ahstmt1:=ahstmt
|
---|
5645 | Else
|
---|
5646 | Begin
|
---|
5647 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5648 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt1);
|
---|
5649 | End;
|
---|
5650 | S:='DELETE FROM '+TableName;
|
---|
5651 | Case FDBProcs.DBType Of
|
---|
5652 | Native_mSQL: S:=S+' WHERE _rowid='+tostr(RowId);
|
---|
5653 | Native_Oracle7: S:=S+' WHERE ROWID='+#39+OracleRowId+#39;
|
---|
5654 | Else S:=S+' WHERE CURRENT OF '+c1;
|
---|
5655 | End;
|
---|
5656 | C:=S;
|
---|
5657 |
|
---|
5658 | If FDBProcs.SQLExecDirect(ahstmt1,C,SQL_NTS)<>SQL_SUCCESS Then
|
---|
5659 | Begin
|
---|
5660 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt1);
|
---|
5661 | FDBProcs.SQLFreeStmt(ahstmt1,SQL_DROP);
|
---|
5662 | SQLError('Error executing SQL DELETE statement: '+S);
|
---|
5663 | End;
|
---|
5664 |
|
---|
5665 | FDBProcs.SQLFreeStmt(ahstmt1,SQL_DROP);
|
---|
5666 | LeaveSQLProcessing;
|
---|
5667 |
|
---|
5668 | Inherited DoDelete;
|
---|
5669 | End;
|
---|
5670 |
|
---|
5671 |
|
---|
5672 | Procedure TTable.CommitInsert(Commit:Boolean);
|
---|
5673 | Var ahstmt:SQLHSTMT;
|
---|
5674 | Ansi:AnsiString;
|
---|
5675 | S:String;
|
---|
5676 | T:LongInt;
|
---|
5677 | Field:TField;
|
---|
5678 | i:LongInt;
|
---|
5679 | Begin
|
---|
5680 | Inherited CommitInsert(Commit);
|
---|
5681 |
|
---|
5682 | If ReadOnly Then SQLError('Cannot modify a readonly dataset!');
|
---|
5683 |
|
---|
5684 | If Commit Then
|
---|
5685 | Begin
|
---|
5686 | EnterSQLProcessing;
|
---|
5687 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5688 |
|
---|
5689 | Ansi:='INSERT INTO '+TableName+' (';
|
---|
5690 | For T:=0 To FieldCount-1 Do
|
---|
5691 | Begin
|
---|
5692 | Ansi:=Ansi+FieldNames[T];
|
---|
5693 | If T<>FieldCount-1 Then Ansi:=Ansi+',';
|
---|
5694 | End;
|
---|
5695 |
|
---|
5696 | Ansi:=Ansi+') VALUES(';
|
---|
5697 | For T:=0 To FieldCount-1 Do
|
---|
5698 | Begin
|
---|
5699 | Field:=Fields[T];
|
---|
5700 | If Field.DataType=ftMemo Then Ansi:=Ansi+#39+PChar(Field.FValue)^+#39
|
---|
5701 | Else
|
---|
5702 | Begin
|
---|
5703 | S:=Field2String(field);
|
---|
5704 | Ansi:=Ansi+S;
|
---|
5705 | End;
|
---|
5706 | If T<>FieldCount-1 Then Ansi:=Ansi+',';
|
---|
5707 | End;
|
---|
5708 | Ansi:=Ansi+')';
|
---|
5709 |
|
---|
5710 | //ErrorBox2(PChar(Ansi)^);
|
---|
5711 | If FDBProcs.SQLExecDirect(ahstmt,PChar(Ansi)^,SQL_NTS)<>SQL_SUCCESS Then
|
---|
5712 | Begin
|
---|
5713 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5714 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5715 | SQLError('Error executing INSERT SQL statement: '+S);
|
---|
5716 | End;
|
---|
5717 |
|
---|
5718 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5719 | LeaveSQLProcessing;
|
---|
5720 |
|
---|
5721 | FRowIsInserted:=False;
|
---|
5722 | QueryTable;
|
---|
5723 | End
|
---|
5724 | Else
|
---|
5725 | Begin
|
---|
5726 | RemoveCurrentFields;
|
---|
5727 |
|
---|
5728 | RowInserted := False;
|
---|
5729 | End;
|
---|
5730 | End;
|
---|
5731 |
|
---|
5732 |
|
---|
5733 | Function TTable.UpdateFieldSelect(Field:TField):Boolean;
|
---|
5734 | Var ahstmt,ahstmt1:SQLHSTMT;
|
---|
5735 | resultCols:SQLSMALLINT;
|
---|
5736 | C,c1:cstring;
|
---|
5737 | rc:SQLRETURN;
|
---|
5738 | S:String;
|
---|
5739 | T,T1,RowId:LongInt;
|
---|
5740 | Res:SQLINTEGER;
|
---|
5741 | Ansi:AnsiString;
|
---|
5742 | OracleRowId:CString;
|
---|
5743 | Begin
|
---|
5744 | Result:=False;
|
---|
5745 | If Not FOpened Then Exit;
|
---|
5746 | If ((field=Nil)Or(FSelect.Count=0)) Then Exit;
|
---|
5747 | If FRowIsInserted Then
|
---|
5748 | Begin
|
---|
5749 | Result:=True;
|
---|
5750 | Exit;
|
---|
5751 | End;
|
---|
5752 |
|
---|
5753 | If ReadOnly Then SQLError('Cannot modify a readonly dataset!');
|
---|
5754 | If (Not IsTable) Then exit; //cannot update this result set...
|
---|
5755 |
|
---|
5756 | EnterSQLProcessing;
|
---|
5757 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5758 |
|
---|
5759 | Case FDBProcs.DBType Of
|
---|
5760 | Native_mSQL: C:='SELECT _rowid,'+Field.FieldName+' FROM '+TableName;
|
---|
5761 | Native_Oracle7: C:='SELECT ROWID,'+Field.FieldName+' FROM '+TableName+' FOR UPDATE';
|
---|
5762 | Else C:='SELECT * FROM '+TableName+' FOR UPDATE';
|
---|
5763 | End;
|
---|
5764 |
|
---|
5765 | If FDBProcs.SQLExecDirect(ahstmt,C,SQL_NTS)<>SQL_SUCCESS Then
|
---|
5766 | Begin
|
---|
5767 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5768 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5769 | SQLError('Error executing SELECT SQL statement: '+S);
|
---|
5770 | End;
|
---|
5771 |
|
---|
5772 | FDBProcs.SQLNumResultCols(ahstmt,resultCols);
|
---|
5773 | If resultCols=0 Then //Not A Select statement
|
---|
5774 | Begin
|
---|
5775 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5776 | LeaveSQLProcessing;
|
---|
5777 | Exit;
|
---|
5778 | End;
|
---|
5779 |
|
---|
5780 | If FDBProcs.DBType=Native_mSQL Then T1:=Field.FRow-1
|
---|
5781 | Else T1:=Field.FRow;
|
---|
5782 |
|
---|
5783 | For T:=0 To T1 Do
|
---|
5784 | Begin
|
---|
5785 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5786 | If ((rc=SQL_NO_DATA_FOUND)Or(rc=SQL_ERROR)) Then
|
---|
5787 | Begin
|
---|
5788 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5789 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5790 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5791 | End;
|
---|
5792 | End;
|
---|
5793 |
|
---|
5794 | If FDBProcs.DBType=Native_mSQL Then
|
---|
5795 | Begin
|
---|
5796 | If FDBProcs.SQLGetData(ahstmt,1,SQL_INTEGER,RowId,4,Res)<>SQL_SUCCESS Then
|
---|
5797 | Begin
|
---|
5798 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5799 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5800 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5801 | End;
|
---|
5802 | End;
|
---|
5803 |
|
---|
5804 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
5805 | Begin
|
---|
5806 | If FDBProcs.SQLGetData(ahstmt,1,SQL_C_CHAR,OracleRowId,255,Res)<>SQL_SUCCESS Then
|
---|
5807 | Begin
|
---|
5808 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5809 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5810 | SQLError(LoadNLSStr(SErrorFetchingSQLStatement)+': '+S);
|
---|
5811 | End;
|
---|
5812 | End;
|
---|
5813 |
|
---|
5814 | FillChar(c1,255,0);
|
---|
5815 | If FDBProcs.SQLGetCursorName(ahstmt,c1,255,resultCols)<>SQL_SUCCESS Then
|
---|
5816 | Begin
|
---|
5817 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5818 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5819 | SQLError('Error executing SQLGetCursorName statement: '+S);
|
---|
5820 | End;
|
---|
5821 |
|
---|
5822 | If FDBProcs.DBType=Native_Oracle7 Then ahstmt1:=ahstmt
|
---|
5823 | Else
|
---|
5824 | Begin
|
---|
5825 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5826 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt1);
|
---|
5827 | End;
|
---|
5828 |
|
---|
5829 | Ansi:='UPDATE '+TableName+' SET '+field.FieldName+'=';
|
---|
5830 | If Field.DataType=ftMemo Then Ansi:=Ansi+#39+PChar(Field.FValue)^+#39
|
---|
5831 | Else Ansi:=Ansi+Field2String(field);
|
---|
5832 |
|
---|
5833 | Case FDBProcs.DBType Of
|
---|
5834 | Native_mSQL: Ansi:=Ansi+' WHERE _rowid='+tostr(RowId);
|
---|
5835 | Native_Oracle7: Ansi:=Ansi+' WHERE ROWID='+#39+OracleRowId+#39;
|
---|
5836 | Else Ansi:=Ansi+' WHERE CURRENT OF '+c1;
|
---|
5837 | End;
|
---|
5838 |
|
---|
5839 | If FDBProcs.SQLExecDirect(ahstmt1,PChar(Ansi)^,SQL_NTS)<>SQL_SUCCESS Then
|
---|
5840 | Begin
|
---|
5841 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt1);
|
---|
5842 | FDBProcs.SQLFreeStmt(ahstmt1,SQL_DROP);
|
---|
5843 | SQLError('Error executing SQL UPDATE statement: '+S);
|
---|
5844 | End;
|
---|
5845 |
|
---|
5846 | FDBProcs.SQLFreeStmt(ahstmt1,SQL_DROP);
|
---|
5847 | LeaveSQLProcessing;
|
---|
5848 | Result:=True;
|
---|
5849 | End;
|
---|
5850 |
|
---|
5851 |
|
---|
5852 | Procedure TTable.DoCancel;
|
---|
5853 | Begin
|
---|
5854 | FDBProcs.SQLTransact(FDBProcs.ahenv,FDBProcs.ahdbc,SQL_ROLLBACK);
|
---|
5855 | End;
|
---|
5856 |
|
---|
5857 |
|
---|
5858 | Procedure TTable.DoPost;
|
---|
5859 | Begin
|
---|
5860 | FDBProcs.SQLTransact(FDBProcs.ahenv,FDBProcs.ahdbc,SQL_COMMIT);
|
---|
5861 | End;
|
---|
5862 |
|
---|
5863 |
|
---|
5864 | Procedure TTable.CloseStmt;
|
---|
5865 | Var I:LongInt;
|
---|
5866 | Begin
|
---|
5867 | If Not FOpened Then Exit;
|
---|
5868 |
|
---|
5869 | {Free statement Handle}
|
---|
5870 | If FDBProcs.ahstmt<>0 Then
|
---|
5871 | Begin
|
---|
5872 | FDBProcs.SQLFreeStmt(FDBProcs.ahstmt,SQL_DROP);
|
---|
5873 | FDBProcs.ahstmt:=0;
|
---|
5874 | End;
|
---|
5875 | End;
|
---|
5876 |
|
---|
5877 |
|
---|
5878 | Procedure TTable.UpdateIndexDefs;
|
---|
5879 | Var
|
---|
5880 | ahstmt:SQLHSTMT;
|
---|
5881 | cols:SQLSMALLINT;
|
---|
5882 | I:LongInt;
|
---|
5883 | C:Array[0..9] Of cstring;
|
---|
5884 | OutLen:Array[0..9] Of SQLINTEGER;
|
---|
5885 | rc:SQLRETURN;
|
---|
5886 | S,S1,Fields:String;
|
---|
5887 | OldActive:Boolean;
|
---|
5888 | OldOpen:Boolean;
|
---|
5889 | IndexDef:TIndexDef;
|
---|
5890 | Begin
|
---|
5891 | If FIndexDefs<>Nil Then FIndexDefs.Clear
|
---|
5892 | Else FIndexDefs.Create(Self);
|
---|
5893 | If FIndexFieldMap<>Nil Then FIndexFieldMap.Clear;
|
---|
5894 |
|
---|
5895 | If (Not IsTable) Then SQLError('Illegal operation');
|
---|
5896 |
|
---|
5897 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
5898 | Begin
|
---|
5899 | OldActive:=FActive;
|
---|
5900 | OldOpen:=FOpened;
|
---|
5901 | If Not FOpened Then
|
---|
5902 | Begin
|
---|
5903 | FActive:=True;
|
---|
5904 | DoOpen;
|
---|
5905 | If Not FOpened Then Active:=False;
|
---|
5906 | End;
|
---|
5907 |
|
---|
5908 | If FOpened Then
|
---|
5909 | If @FDBProcs.SQLStatistics<>Nil Then
|
---|
5910 | Begin
|
---|
5911 | EnterSQLProcessing;
|
---|
5912 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
5913 |
|
---|
5914 | If FDBProcs.SQLStatistics(ahstmt,Nil,0,Nil,0,TableName,SQL_NTS,SQL_INDEX_ALL,SQL_ENSURE)=SQL_SUCCESS Then
|
---|
5915 | Begin
|
---|
5916 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
5917 | If cols>9 Then cols:=9;
|
---|
5918 | For I := 0 To cols-1 Do
|
---|
5919 | FDBProcs.SQLBindCol(ahstmt, I + 1, SQL_C_CHAR, C[I], 255, OutLen[I]);
|
---|
5920 |
|
---|
5921 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5922 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
5923 | Begin
|
---|
5924 | If OutLen[5]<>SQL_NULL_DATA Then
|
---|
5925 | Begin
|
---|
5926 | Move(C[5],S[1],OutLen[5]);
|
---|
5927 | S[0]:=Chr(OutLen[5]);
|
---|
5928 | If S[length(s)]=#0 Then
|
---|
5929 | If length(S)>0 Then dec(S[0]);
|
---|
5930 | If OutLen[4]<>SQL_NULL_DATA Then
|
---|
5931 | Begin
|
---|
5932 | Move(C[4],S1[1],OutLen[4]);
|
---|
5933 | S1[0]:=Chr(OutLen[4]);
|
---|
5934 | If S1[length(S1)]=#0 Then
|
---|
5935 | If length(S1)>0 Then dec(S1[0]);
|
---|
5936 | If S1<>'' Then S:=S1+'.'+S;
|
---|
5937 | End;
|
---|
5938 |
|
---|
5939 | //get column name
|
---|
5940 | If OutLen[8]<>SQL_NULL_DATA Then
|
---|
5941 | Begin
|
---|
5942 | Move(C[8],Fields[1],OutLen[8]);
|
---|
5943 | Fields[0]:=Chr(OutLen[8]);
|
---|
5944 | If Fields[length(Fields)]=#0 Then
|
---|
5945 | If length(Fields)>0 Then dec(Fields[0]);
|
---|
5946 | End;
|
---|
5947 |
|
---|
5948 | If ((s<>'')And(Fields<>'')) Then
|
---|
5949 | Begin
|
---|
5950 | If FIndexDefs.IndexOf(s)>=0 Then
|
---|
5951 | Begin
|
---|
5952 | IndexDef:=FIndexDefs.Items[FIndexDefs.IndexOf(s)];
|
---|
5953 | AssignStr(IndexDef.FFields,IndexDef.Fields+';'+Fields);
|
---|
5954 | End
|
---|
5955 | Else FIndexDefs.Add(s,Fields,[]);
|
---|
5956 | End;
|
---|
5957 | End;
|
---|
5958 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
5959 | End;
|
---|
5960 | End
|
---|
5961 | Else
|
---|
5962 | Begin
|
---|
5963 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,ahstmt);
|
---|
5964 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5965 | DataBaseError(s);
|
---|
5966 | End;
|
---|
5967 |
|
---|
5968 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
5969 | LeaveSQLProcessing;
|
---|
5970 | End;
|
---|
5971 |
|
---|
5972 | If Not OldOpen Then DoClose;
|
---|
5973 | FActive:=OldActive;
|
---|
5974 | End;
|
---|
5975 | End;
|
---|
5976 |
|
---|
5977 | Procedure TTable.UpdateFieldDefs;
|
---|
5978 | Begin
|
---|
5979 | QueryTable;
|
---|
5980 | End;
|
---|
5981 |
|
---|
5982 | Procedure TTable.QueryTable;
|
---|
5983 | Var
|
---|
5984 | resultCols:SQLSMALLINT;
|
---|
5985 | colName:cstring;
|
---|
5986 | colNameLen:SQLSMALLINT;
|
---|
5987 | colType:SQLSMALLINT;
|
---|
5988 | Size:SQLUINTEGER;
|
---|
5989 | Scale:SQLSMALLINT;
|
---|
5990 | I:LongInt;
|
---|
5991 | S:String;
|
---|
5992 | Select:PChar;
|
---|
5993 | Temp:TStringList;
|
---|
5994 | t2:String;
|
---|
5995 | J,j1:String;
|
---|
5996 | First:Boolean;
|
---|
5997 | B:Byte;
|
---|
5998 | field:TField;
|
---|
5999 | MasterTable:TTable;
|
---|
6000 | rc:SQLRETURN;
|
---|
6001 | pfNullable:SQLSMALLINT;
|
---|
6002 | FieldDef:TFieldDef;
|
---|
6003 | Label lll;
|
---|
6004 | Begin
|
---|
6005 | If Not FOpened Then Exit;
|
---|
6006 |
|
---|
6007 | //Erase All tables And Reset Object
|
---|
6008 | CloseStmt;
|
---|
6009 | FFieldDefs.Clear;
|
---|
6010 | FCurrentRow:=-1;
|
---|
6011 | FCurrentField:=0;
|
---|
6012 |
|
---|
6013 | If ((Self Is TTable)And(TTable(Self).FMasterSource<>Nil)And
|
---|
6014 | (TTable(Self).FMasterSource.DataSet Is TTable)) Then
|
---|
6015 | Begin
|
---|
6016 | Temp.Create;
|
---|
6017 |
|
---|
6018 | t2:=TTable(TTable(Self).FMasterSource.DataSet).TableName;
|
---|
6019 | Temp.Add('SELECT * FROM '+TableName);
|
---|
6020 |
|
---|
6021 | S:=TTable(Self).MasterFields;
|
---|
6022 | First:=True;
|
---|
6023 | MasterTable:=TTable(TTable(Self).FMasterSource.DataSet);
|
---|
6024 | While S<>'' Do
|
---|
6025 | Begin
|
---|
6026 | B:=Pos(';',S);
|
---|
6027 | If B<>0 Then
|
---|
6028 | Begin
|
---|
6029 | J:=Copy(S,1,B-1);
|
---|
6030 | System.Delete(S,1,B);
|
---|
6031 | End
|
---|
6032 | Else
|
---|
6033 | Begin
|
---|
6034 | J:=S;
|
---|
6035 | S:='';
|
---|
6036 | End;
|
---|
6037 |
|
---|
6038 | B:=Pos('=',J);
|
---|
6039 | If B<>0 Then
|
---|
6040 | Begin
|
---|
6041 | j1:=System.Copy(J,B+1,255);
|
---|
6042 | J[0]:=Chr(B-1);
|
---|
6043 | End
|
---|
6044 | Else j1:=J;
|
---|
6045 |
|
---|
6046 | field:=MasterTable.FieldFromColumnName[j1];
|
---|
6047 | If field=Nil Then
|
---|
6048 | Begin
|
---|
6049 | Temp.Destroy;
|
---|
6050 | Goto lll;
|
---|
6051 | End;
|
---|
6052 |
|
---|
6053 | j1:=Field2String(field);
|
---|
6054 |
|
---|
6055 | If First Then Temp.Add('WHERE '+J+'='+j1)
|
---|
6056 | Else Temp.Add('AND '+J+'='+j1);
|
---|
6057 | First:=False;
|
---|
6058 | End;
|
---|
6059 | Select:=Temp.GetText;
|
---|
6060 |
|
---|
6061 | Temp.Destroy;
|
---|
6062 | End
|
---|
6063 | Else
|
---|
6064 | Begin
|
---|
6065 | lll:
|
---|
6066 | Select:=FSelect.GetText;
|
---|
6067 | End;
|
---|
6068 |
|
---|
6069 | If Select=Nil Then
|
---|
6070 | Begin
|
---|
6071 | DoClose;
|
---|
6072 | Exit;
|
---|
6073 | End;
|
---|
6074 |
|
---|
6075 | While ((Select^<>'')And(Select^[length(Select^)-1] In [#13,#10])) Do
|
---|
6076 | Select^[length(Select^)-1]:=#0;
|
---|
6077 |
|
---|
6078 | EnterSQLProcessing;
|
---|
6079 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6080 |
|
---|
6081 | Try
|
---|
6082 | If FDBProcs.SQLExecDirect(FDBProcs.ahstmt,Select^,SQL_NTS)<>SQL_SUCCESS Then
|
---|
6083 | Begin
|
---|
6084 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6085 | CloseStmt;
|
---|
6086 | DoClose;
|
---|
6087 | SQLError('Error executing SELECT statement: '+S);
|
---|
6088 | End;
|
---|
6089 |
|
---|
6090 | {The driver determines the number of rows in the result set}
|
---|
6091 | rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
6092 | FMaxRows:=0;
|
---|
6093 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
6094 | Begin
|
---|
6095 | inc(FMaxRows);
|
---|
6096 | rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
6097 | End;
|
---|
6098 | FDBProcs.SQLFreeStmt(FDBProcs.ahstmt,SQL_DROP);
|
---|
6099 | FDBProcs.ahstmt:=0;
|
---|
6100 |
|
---|
6101 | {The driver recreates the result set}
|
---|
6102 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6103 | FDBProcs.SQLSetStmtOption(FDBProcs.ahstmt,SQL_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN);
|
---|
6104 | If FDBProcs.SQLExecDirect(FDBProcs.ahstmt,Select^,SQL_NTS)<>SQL_SUCCESS Then
|
---|
6105 | Begin
|
---|
6106 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6107 | CloseStmt;
|
---|
6108 | DoClose;
|
---|
6109 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S);
|
---|
6110 | End;
|
---|
6111 |
|
---|
6112 | {The driver determines the result set columns}
|
---|
6113 | FDBProcs.SQLNumResultCols(FDBProcs.ahstmt,resultCols);
|
---|
6114 | If resultCols=0 Then //Not A Select statement
|
---|
6115 | Begin
|
---|
6116 | CloseStmt;
|
---|
6117 | SQLError(LoadNLSStr(SEmptyResultSet));
|
---|
6118 | End
|
---|
6119 | Else
|
---|
6120 | Begin
|
---|
6121 | {Store Result Columns}
|
---|
6122 | For I := 0 To resultCols-1 Do
|
---|
6123 | Begin
|
---|
6124 | Size:=0;
|
---|
6125 | FDBProcs.SQLDescribeCol(FDBProcs.ahstmt, I + 1, colName,
|
---|
6126 | SizeOf(colName), colNameLen, colType, Size, Scale, pfNullable);
|
---|
6127 | If Size>65535 Then Size:=4096;
|
---|
6128 | S:=colName;
|
---|
6129 |
|
---|
6130 | Case ColType Of
|
---|
6131 | SQL_REAL:Size:=4;
|
---|
6132 | SQL_FLOAT,SQL_DOUBLE,SQL_NUMERIC:Size:=8;
|
---|
6133 | End; //case
|
---|
6134 |
|
---|
6135 | FFieldDefs.Add(S, MapSQLType(colType), Size, pfNullable=SQL_NO_NULLS);
|
---|
6136 |
|
---|
6137 | FieldDef := FFieldDefs[I];
|
---|
6138 | FieldDef.Precision := Scale;
|
---|
6139 | End;
|
---|
6140 |
|
---|
6141 | FCurrentRow:=0; {First Row}
|
---|
6142 | FCurrentField:=0; {First field}
|
---|
6143 | End;
|
---|
6144 |
|
---|
6145 | Post; //Commit All transactions Until here
|
---|
6146 | StrDispose(Select);
|
---|
6147 | LeaveSQLProcessing;
|
---|
6148 | Except
|
---|
6149 | ON E:ESQLError Do
|
---|
6150 | Begin
|
---|
6151 | StrDispose(Select);
|
---|
6152 | CloseStmt;
|
---|
6153 | LeaveSQLProcessing;
|
---|
6154 | ErrorBox(E.Message);
|
---|
6155 | End;
|
---|
6156 | Else
|
---|
6157 | Begin
|
---|
6158 | StrDispose(Select);
|
---|
6159 | CloseStmt;
|
---|
6160 | LeaveSQLProcessing;
|
---|
6161 | Raise;
|
---|
6162 | End;
|
---|
6163 | End;
|
---|
6164 |
|
---|
6165 | DataChange(deDataBaseChanged);
|
---|
6166 | End;
|
---|
6167 |
|
---|
6168 |
|
---|
6169 | {
|
---|
6170 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
6171 | º º
|
---|
6172 | º Speed-Pascal/2 Version 2.0 º
|
---|
6173 | º º
|
---|
6174 | º Speed-Pascal Component Classes (SPCC) º
|
---|
6175 | º º
|
---|
6176 | º This section: TQuery Class Implementation º
|
---|
6177 | º º
|
---|
6178 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
6179 | º º
|
---|
6180 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
6181 | }
|
---|
6182 |
|
---|
6183 | Procedure TQuery.RefreshTable;
|
---|
6184 | Begin
|
---|
6185 | If ((ComponentState*[csReading]<>[])Or(FDataSetLocked)) Then
|
---|
6186 | Begin
|
---|
6187 | FRefreshOnLoad:=FActive;
|
---|
6188 | Exit;
|
---|
6189 | End;
|
---|
6190 | DoOpen;
|
---|
6191 | If Not FOpened Then Exit;
|
---|
6192 | If FSelect.Count<>0 Then QueryTable;
|
---|
6193 | End;
|
---|
6194 |
|
---|
6195 | Procedure TQuery.SetSQL(NewValue:TStrings);
|
---|
6196 | Begin
|
---|
6197 | If ((NewValue=FSelect)Or(NewValue.Equals(FSelect))) Then Exit; {!}
|
---|
6198 | FSelect.Assign(NewValue);
|
---|
6199 | If FActive Then RefreshTable;
|
---|
6200 | End;
|
---|
6201 |
|
---|
6202 | Procedure TQuery.SetupComponent;
|
---|
6203 | Begin
|
---|
6204 | Inherited SetupComponent;
|
---|
6205 | ReadOnly:=True;
|
---|
6206 | Name:='Query';
|
---|
6207 | End;
|
---|
6208 |
|
---|
6209 | Function TQuery.WriteSCUResource(Stream:TResourceStream):Boolean;
|
---|
6210 | Var aText:PChar;
|
---|
6211 | Begin
|
---|
6212 | Result:=Inherited WriteSCUResource(Stream);
|
---|
6213 | If Result=False Then Exit;
|
---|
6214 | aText:=FSelect.GetText;
|
---|
6215 | If aText<>Nil Then
|
---|
6216 | Begin
|
---|
6217 | Result:=Stream.NewResourceEntry(rnDBQuery,aText^,Length(aText^)+1);
|
---|
6218 | StrDispose(aText);
|
---|
6219 | End;
|
---|
6220 | End;
|
---|
6221 |
|
---|
6222 | Procedure TQuery.ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);
|
---|
6223 | Var aText:PChar;
|
---|
6224 | Begin
|
---|
6225 | If ResName = rnDBQuery Then
|
---|
6226 | Begin
|
---|
6227 | aText:=@Data;
|
---|
6228 | FSelect.SetText(aText);
|
---|
6229 | End
|
---|
6230 | Else Inherited ReadSCUResource(ResName,Data,DataLen)
|
---|
6231 | End;
|
---|
6232 |
|
---|
6233 | {
|
---|
6234 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
6235 | º º
|
---|
6236 | º Speed-Pascal/2 Version 2.0 º
|
---|
6237 | º º
|
---|
6238 | º Speed-Pascal Component Classes (SPCC) º
|
---|
6239 | º º
|
---|
6240 | º This section: TParam Class Implementation º
|
---|
6241 | º º
|
---|
6242 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
6243 | º º
|
---|
6244 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
6245 | }
|
---|
6246 |
|
---|
6247 | Procedure TParam.SetAsBCD(Value: Currency);
|
---|
6248 | Begin
|
---|
6249 | FNull := False;
|
---|
6250 | FBound := True;
|
---|
6251 | FData:=Value;
|
---|
6252 | End;
|
---|
6253 |
|
---|
6254 | Procedure TParam.SetAsBoolean(Value: Boolean);
|
---|
6255 | Begin
|
---|
6256 | FNull := False;
|
---|
6257 | FBound := True;
|
---|
6258 | FData:=Value;
|
---|
6259 | End;
|
---|
6260 |
|
---|
6261 | Procedure TParam.SetAsCurrency(Value:Extended);
|
---|
6262 | Begin
|
---|
6263 | FNull := False;
|
---|
6264 | FBound := True;
|
---|
6265 | FData:=Value;
|
---|
6266 | End;
|
---|
6267 |
|
---|
6268 | Procedure TParam.SetAsDate(Value: TDateTime);
|
---|
6269 | Begin
|
---|
6270 | FNull := False;
|
---|
6271 | FBound := True;
|
---|
6272 | FData:=Value;
|
---|
6273 | End;
|
---|
6274 |
|
---|
6275 | Procedure TParam.SetAsDateTime(Value: TDateTime);
|
---|
6276 | Begin
|
---|
6277 | FNull := False;
|
---|
6278 | FBound := True;
|
---|
6279 | FData:=Value;
|
---|
6280 | End;
|
---|
6281 |
|
---|
6282 | Procedure TParam.SetAsFloat(Const Value:Extended);
|
---|
6283 | Begin
|
---|
6284 | FNull := False;
|
---|
6285 | FBound := True;
|
---|
6286 | FData:=Value;
|
---|
6287 | End;
|
---|
6288 |
|
---|
6289 | Procedure TParam.SetAsInteger(Value: Longint);
|
---|
6290 | Begin
|
---|
6291 | FNull := False;
|
---|
6292 | FBound := True;
|
---|
6293 | FData:=Value;
|
---|
6294 | End;
|
---|
6295 |
|
---|
6296 | Procedure TParam.SetAsString(Const Value:String);
|
---|
6297 | Begin
|
---|
6298 | FNull := False;
|
---|
6299 | FBound := True;
|
---|
6300 | FData:=Value;
|
---|
6301 | End;
|
---|
6302 |
|
---|
6303 | Procedure TParam.SetAsSmallInt(Value: LongInt);
|
---|
6304 | Begin
|
---|
6305 | FNull := False;
|
---|
6306 | FBound := True;
|
---|
6307 | FData:=Value;
|
---|
6308 | End;
|
---|
6309 |
|
---|
6310 | Procedure TParam.SetAsTime(Value: TDateTime);
|
---|
6311 | Begin
|
---|
6312 | FNull := False;
|
---|
6313 | FBound := True;
|
---|
6314 | FData:=Value;
|
---|
6315 | End;
|
---|
6316 |
|
---|
6317 | Procedure TParam.SetAsVariant(Value: Variant);
|
---|
6318 | Begin
|
---|
6319 | FNull := False;
|
---|
6320 | FBound := True;
|
---|
6321 | Case VarType(Value) Of
|
---|
6322 | varByte,varSmallint:DataType:=ftSmallInt;
|
---|
6323 | varInteger,varLongInt,varLongWord:DataType:=ftInteger;
|
---|
6324 | varCurrency:DataType:=ftBCD;
|
---|
6325 | varSingle,varDouble,varExtended:DataType:=ftFloat;
|
---|
6326 | varBoolean:DataType:=ftBoolean;
|
---|
6327 | varString:DataType:=ftString;
|
---|
6328 | Else DataType := ftUnknown;
|
---|
6329 | End;
|
---|
6330 | FData := Value;
|
---|
6331 | End;
|
---|
6332 |
|
---|
6333 | Procedure TParam.SetAsWord(Value: LongInt);
|
---|
6334 | Begin
|
---|
6335 | FNull := False;
|
---|
6336 | FBound := True;
|
---|
6337 | FData:=Value;
|
---|
6338 | End;
|
---|
6339 |
|
---|
6340 | Function TParam.GetAsBCD: Currency;
|
---|
6341 | Begin
|
---|
6342 | Result:=FData;
|
---|
6343 | End;
|
---|
6344 |
|
---|
6345 | Function TParam.GetAsBoolean: Boolean;
|
---|
6346 | Begin
|
---|
6347 | Result:=FData;
|
---|
6348 | End;
|
---|
6349 |
|
---|
6350 | Function TParam.GetAsDateTime: TDateTime;
|
---|
6351 | Begin
|
---|
6352 | Result:=FData;
|
---|
6353 | End;
|
---|
6354 |
|
---|
6355 | Function TParam.GetAsFloat:Extended;
|
---|
6356 | Begin
|
---|
6357 | Result:=FData;
|
---|
6358 | End;
|
---|
6359 |
|
---|
6360 | Function TParam.GetAsInteger: Longint;
|
---|
6361 | Begin
|
---|
6362 | Result:=FData;
|
---|
6363 | End;
|
---|
6364 |
|
---|
6365 | Function TParam.GetAsString:String;
|
---|
6366 | Begin
|
---|
6367 | Result:=FData;
|
---|
6368 | End;
|
---|
6369 |
|
---|
6370 | Function TParam.GetAsVariant: Variant;
|
---|
6371 | Begin
|
---|
6372 | Result:=FData;
|
---|
6373 | End;
|
---|
6374 |
|
---|
6375 | Function TParam.IsEqual(Value: TParam): Boolean;
|
---|
6376 | Begin
|
---|
6377 | result:=False;
|
---|
6378 | If ParamType=Value.ParamType Then
|
---|
6379 | If Bound=Value.Bound Then
|
---|
6380 | If VarType(FData)=VarType(Value.FData) Then
|
---|
6381 | If Name=Value.Name Then
|
---|
6382 | If FData=Value.FData Then result:=True;
|
---|
6383 | End;
|
---|
6384 |
|
---|
6385 | Procedure TParam.SetDataType(Value: TFieldType);
|
---|
6386 | Begin
|
---|
6387 | FData := 0;
|
---|
6388 | FDataType := Value;
|
---|
6389 | End;
|
---|
6390 |
|
---|
6391 | Procedure TParam.SetText(Const Value:String);
|
---|
6392 | Begin
|
---|
6393 | FNull := False;
|
---|
6394 | FBound := True;
|
---|
6395 | If FDataType=ftUnknown Then DataType:=ftString;
|
---|
6396 | FData := Value;
|
---|
6397 | Case DataType of
|
---|
6398 | ftBoolean:FData:=Boolean(FData);
|
---|
6399 | ftInteger,ftSmallInt,ftWord: FData := Integer(FData);
|
---|
6400 | ftDateTime,ftTime,ftDate:FData:=Extended(FData);
|
---|
6401 | ftBCD:FData:=Currency(FData);
|
---|
6402 | ftCurrency,ftFloat:FData:=Extended(FData);
|
---|
6403 | End;
|
---|
6404 | End;
|
---|
6405 |
|
---|
6406 | Constructor TParam.Create(AParamList:TParams;AParamType: TParamType);
|
---|
6407 | Begin
|
---|
6408 | FParamList:=AParamList;
|
---|
6409 | If FParamList<>Nil Then FParamList.AddParam(Self);
|
---|
6410 | FParamType := AParamType;
|
---|
6411 | DataType := ftUnknown;
|
---|
6412 | FBound := False;
|
---|
6413 | End;
|
---|
6414 |
|
---|
6415 | Destructor TParam.Destroy;
|
---|
6416 | Begin
|
---|
6417 | If FParamList<>Nil Then FParamList.RemoveParam(Self);
|
---|
6418 | If FName<>Nil Then FreeMem(FName,length(FName^)+1);
|
---|
6419 | Inherited Destroy;
|
---|
6420 | End;
|
---|
6421 |
|
---|
6422 | Function TParam.GetName:String;
|
---|
6423 | Begin
|
---|
6424 | If FName=Nil Then result:=''
|
---|
6425 | Else Result:=FName^;
|
---|
6426 | End;
|
---|
6427 |
|
---|
6428 | Procedure TParam.SetName(Const NewValue:String);
|
---|
6429 | Begin
|
---|
6430 | If FName<>Nil Then FreeMem(FName,length(FName^)+1);
|
---|
6431 | GetMem(FName,length(NewValue)+1);
|
---|
6432 | FName^:=NewValue;
|
---|
6433 | End;
|
---|
6434 |
|
---|
6435 | Procedure TParam.Assign(Param: TParam);
|
---|
6436 | Begin
|
---|
6437 | If Param=Nil Then exit;
|
---|
6438 | DataType:=Param.DataType;
|
---|
6439 | If not Param.IsNull Then
|
---|
6440 | Begin
|
---|
6441 | FNull := False;
|
---|
6442 | FBound := True;
|
---|
6443 | FData := Param.FData;
|
---|
6444 | End
|
---|
6445 | Else Clear;
|
---|
6446 | Name:=Param.Name;
|
---|
6447 | FBound:=Param.Bound;
|
---|
6448 | If FParamType=ptUnknown Then FParamType:=Param.ParamType;
|
---|
6449 | End;
|
---|
6450 |
|
---|
6451 | Procedure TParam.AssignField(Field: TField);
|
---|
6452 | Begin
|
---|
6453 | If Field=Nil Then exit;
|
---|
6454 | DataType:=Field.DataType;
|
---|
6455 | If not Field.IsNull Then
|
---|
6456 | Begin
|
---|
6457 | FNull := False;
|
---|
6458 | FBound := True;
|
---|
6459 | FData := Field.AsString;
|
---|
6460 | End
|
---|
6461 | Else Clear;
|
---|
6462 | Name:=Field.FieldName;
|
---|
6463 | FBound:=True;
|
---|
6464 | End;
|
---|
6465 |
|
---|
6466 | Procedure TParam.AssignFieldValue(Field:TField;Const Value: Variant);
|
---|
6467 | Begin
|
---|
6468 | If Field=Nil Then exit;
|
---|
6469 | DataType := Field.DataType;
|
---|
6470 | If VarIsNull(Value) Then Clear
|
---|
6471 | Else
|
---|
6472 | Begin
|
---|
6473 | FNull := False;
|
---|
6474 | FBound := True;
|
---|
6475 | FData := Value;
|
---|
6476 | End;
|
---|
6477 | FBound := True;
|
---|
6478 | End;
|
---|
6479 |
|
---|
6480 | Procedure TParam.Clear;
|
---|
6481 | Begin
|
---|
6482 | FData:=0;
|
---|
6483 | FNull:=True;
|
---|
6484 | End;
|
---|
6485 |
|
---|
6486 | {
|
---|
6487 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
6488 | º º
|
---|
6489 | º Speed-Pascal/2 Version 2.0 º
|
---|
6490 | º º
|
---|
6491 | º Speed-Pascal Component Classes (SPCC) º
|
---|
6492 | º º
|
---|
6493 | º This section: TParams Class Implementation º
|
---|
6494 | º º
|
---|
6495 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
6496 | º º
|
---|
6497 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
6498 | }
|
---|
6499 |
|
---|
6500 | Function TParams.GetParam(Index: Word): TParam;
|
---|
6501 | Begin
|
---|
6502 | result:=FItems[Index];
|
---|
6503 | End;
|
---|
6504 |
|
---|
6505 | Function TParams.GetParamValue(Const ParamName:String): Variant;
|
---|
6506 | Var Param:TParam;
|
---|
6507 | Begin
|
---|
6508 | Param:=ParamByName(ParamName);
|
---|
6509 | If Param<>Nil Then Result:=Param.Value;
|
---|
6510 | End;
|
---|
6511 |
|
---|
6512 | Procedure TParams.SetParamValue(Const ParamName:String;Const Value: Variant);
|
---|
6513 | Var Param:TParam;
|
---|
6514 | Begin
|
---|
6515 | Param:=ParamByName(ParamName);
|
---|
6516 | If Param<>Nil Then Param.Value:=Value;
|
---|
6517 | End;
|
---|
6518 |
|
---|
6519 | Constructor TParams.Create;
|
---|
6520 | Begin
|
---|
6521 | Inherited Create;
|
---|
6522 | FItems.Create;
|
---|
6523 | End;
|
---|
6524 |
|
---|
6525 | Destructor TParams.Destroy;
|
---|
6526 | Begin
|
---|
6527 | Clear;
|
---|
6528 | FItems.Destroy;
|
---|
6529 | Inherited Destroy;
|
---|
6530 | End;
|
---|
6531 |
|
---|
6532 | Procedure TParams.AddParam(Value: TParam);
|
---|
6533 | Begin
|
---|
6534 | FItems.Add(Value);
|
---|
6535 | End;
|
---|
6536 |
|
---|
6537 | Procedure TParams.RemoveParam(Value: TParam);
|
---|
6538 | Begin
|
---|
6539 | FItems.Remove(Value);
|
---|
6540 | If Value.FParamList=Self Then Value.FParamList:=Nil;
|
---|
6541 | End;
|
---|
6542 |
|
---|
6543 | Function TParams.CreateParam(FldType:TFieldType;Const ParamName:String;ParamType: TParamType): TParam;
|
---|
6544 | Begin
|
---|
6545 | Result.Create(Self,ParamType);
|
---|
6546 | Result.Name:=ParamName;
|
---|
6547 | Result.DataType := FldType;
|
---|
6548 | End;
|
---|
6549 |
|
---|
6550 | Function TParams.Count:LongInt;
|
---|
6551 | Begin
|
---|
6552 | Result:=FItems.Count;
|
---|
6553 | End;
|
---|
6554 |
|
---|
6555 | Procedure TParams.Clear;
|
---|
6556 | Var t:LongInt;
|
---|
6557 | Param:TParam;
|
---|
6558 | Begin
|
---|
6559 | For t:=FItems.Count-1 DownTo 0 Do
|
---|
6560 | Begin
|
---|
6561 | Param:=FItems[t];
|
---|
6562 | Param.Destroy;
|
---|
6563 | End;
|
---|
6564 | End;
|
---|
6565 |
|
---|
6566 | Function TParams.IsEqual(Value:TParams): Boolean;
|
---|
6567 | Var t:LongInt;
|
---|
6568 | Begin
|
---|
6569 | Result:=False;
|
---|
6570 | If FItems.Count=Value.Count Then
|
---|
6571 | For t:=0 To FItems.Count-1 Do If not Items[t].IsEqual(Value.Items[t]) Then exit;
|
---|
6572 | End;
|
---|
6573 |
|
---|
6574 | Function TParams.ParamByName(Const Value:String):TParam;
|
---|
6575 | Var t:LongInt;
|
---|
6576 | Begin
|
---|
6577 | For t:=0 To FItems.Count - 1 Do
|
---|
6578 | Begin
|
---|
6579 | Result:=FItems[t];
|
---|
6580 | If Result.Name=Value Then Exit;
|
---|
6581 | End;
|
---|
6582 | DatabaseError('Invalid stored procedure parameter name: '+Value);
|
---|
6583 | End;
|
---|
6584 |
|
---|
6585 |
|
---|
6586 | {
|
---|
6587 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
6588 | º º
|
---|
6589 | º Speed-Pascal/2 Version 2.0 º
|
---|
6590 | º º
|
---|
6591 | º Speed-Pascal Component Classes (SPCC) º
|
---|
6592 | º º
|
---|
6593 | º This section: TStoredProc Class Implementation º
|
---|
6594 | º º
|
---|
6595 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
6596 | º º
|
---|
6597 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
6598 | }
|
---|
6599 |
|
---|
6600 | Function TStoredProc.GetParamCount:Word;
|
---|
6601 | Begin
|
---|
6602 | Result:=FParams.Count;
|
---|
6603 | End;
|
---|
6604 |
|
---|
6605 | Procedure TStoredProc.SetDefaultParams;
|
---|
6606 | Var
|
---|
6607 | ahstmt:SQLHSTMT;
|
---|
6608 | cols:SQLSMALLINT;
|
---|
6609 | I,t:LongInt;
|
---|
6610 | C:Array[0..12] Of cstring;
|
---|
6611 | OutLen:Array[0..12] Of SQLINTEGER;
|
---|
6612 | si:SQLSMALLINT;
|
---|
6613 | rc:SQLRETURN;
|
---|
6614 | S:String;
|
---|
6615 | Cs:CString;
|
---|
6616 | OldActive:Boolean;
|
---|
6617 | OldOpen:Boolean;
|
---|
6618 | pt:TParamType;
|
---|
6619 | ft:TFieldType;
|
---|
6620 | cc:Integer;
|
---|
6621 | Names:TStringList;
|
---|
6622 | Types,Modes:TList;
|
---|
6623 | Label weiter;
|
---|
6624 | Begin
|
---|
6625 | //determine parameter from driver
|
---|
6626 | FParams.Clear;
|
---|
6627 |
|
---|
6628 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then
|
---|
6629 | If StoredProcName<>'' Then
|
---|
6630 | Begin
|
---|
6631 | OldActive:=FActive;
|
---|
6632 | OldOpen:=FOpened;
|
---|
6633 | If Designed Then
|
---|
6634 | If Not FOpened Then
|
---|
6635 | Begin
|
---|
6636 | FActive:=True;
|
---|
6637 | DoOpen;
|
---|
6638 | If Not FOpened Then Active:=False;
|
---|
6639 | End;
|
---|
6640 |
|
---|
6641 | If FOpened Then
|
---|
6642 | Begin
|
---|
6643 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
6644 | Begin
|
---|
6645 | Names.Create;
|
---|
6646 | Types.Create;
|
---|
6647 | Modes.Create;
|
---|
6648 | If not FDBProcs.Oracle7GetProcParams(FProcName,@FDBProcs,Names,Types,Modes) Then
|
---|
6649 | Begin
|
---|
6650 | ErrorBox(SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt));
|
---|
6651 | End
|
---|
6652 | Else
|
---|
6653 | Begin
|
---|
6654 | For t:=0 To Names.Count-1 Do
|
---|
6655 | Begin
|
---|
6656 | i:=LongInt(Types[t]);
|
---|
6657 | ft:=MapSQLType(i);
|
---|
6658 | i:=LongInt(Modes[t]);
|
---|
6659 | If i>=16 Then pt:=ptResult
|
---|
6660 | Else Case i Of
|
---|
6661 | 0:pt:=ptInput;
|
---|
6662 | 1:pt:=ptOutput;
|
---|
6663 | Else pt:=ptInputOutput;
|
---|
6664 | End; //case
|
---|
6665 | FParams.CreateParam(ft,Names[t],pt);
|
---|
6666 | End;
|
---|
6667 | End;
|
---|
6668 | Names.Destroy;
|
---|
6669 | Types.Destroy;
|
---|
6670 | Modes.Destroy;
|
---|
6671 | End
|
---|
6672 | Else
|
---|
6673 | Begin
|
---|
6674 | EnterSQLProcessing;
|
---|
6675 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,ahstmt);
|
---|
6676 |
|
---|
6677 | Cs:=FProcName;
|
---|
6678 | If FDBProcs.SQLProcedureColumns(ahstmt,Nil,0,Nil,0,Cs,length(FProcName),Nil,0)=SQL_SUCCESS Then
|
---|
6679 | Begin
|
---|
6680 | FDBProcs.SQLNumResultCols(ahstmt,cols);
|
---|
6681 | If cols>13 Then cols:=13;
|
---|
6682 | For I := 0 To cols-1 Do
|
---|
6683 | FDBProcs.SQLBindCol(ahstmt, I + 1, SQL_C_CHAR, C[I], 255, OutLen[I]);
|
---|
6684 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
6685 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
6686 | Begin
|
---|
6687 | If OutLen[3]<>SQL_NULL_DATA Then //Parameter name
|
---|
6688 | Begin
|
---|
6689 | Move(C[4],S[1],OutLen[4]); //Parameter type
|
---|
6690 | S[0]:=Chr(OutLen[4]);
|
---|
6691 | Val(S,si,cc);
|
---|
6692 | If cc<>0 Then goto weiter; //illegal
|
---|
6693 |
|
---|
6694 | Case si Of
|
---|
6695 | SQL_PARAM_INPUT:pt:=ptInput;
|
---|
6696 | SQL_PARAM_OUTPUT:pt:=ptOutput;
|
---|
6697 | SQL_PARAM_INPUT_OUTPUT:pt:=ptInputOutput;
|
---|
6698 | SQL_RETURN_VALUE:pt:=ptResult;
|
---|
6699 | SQL_RESULT_COL:pt:=ptResultSet;
|
---|
6700 | Else pt:=ptUnknown;
|
---|
6701 | End;
|
---|
6702 |
|
---|
6703 | Move(C[5],S[1],OutLen[5]); //Parameter data type
|
---|
6704 | S[0]:=Chr(OutLen[5]);
|
---|
6705 | Val(S,si,cc);
|
---|
6706 | If cc<>0 Then goto weiter; //illegal
|
---|
6707 |
|
---|
6708 | ft:=MapSQLType(si);
|
---|
6709 |
|
---|
6710 | Move(C[3],S[1],OutLen[3]);
|
---|
6711 | S[0]:=Chr(OutLen[3]);
|
---|
6712 |
|
---|
6713 | FParams.CreateParam(ft,S,pt);
|
---|
6714 | End;
|
---|
6715 | weiter:
|
---|
6716 | rc:=FDBProcs.SQLFetch(ahstmt);
|
---|
6717 | End;
|
---|
6718 | End;
|
---|
6719 |
|
---|
6720 | FDBProcs.SQLFreeStmt(ahstmt,SQL_DROP);
|
---|
6721 | LeaveSQLProcessing;
|
---|
6722 | End;
|
---|
6723 | End;
|
---|
6724 |
|
---|
6725 | If Designed Then
|
---|
6726 | Begin
|
---|
6727 | If Not OldOpen Then DoClose;
|
---|
6728 | FActive:=OldActive;
|
---|
6729 | End;
|
---|
6730 | End;
|
---|
6731 | End;
|
---|
6732 |
|
---|
6733 | Procedure TStoredProc.SetPrepared(NewValue:Boolean);
|
---|
6734 | Begin
|
---|
6735 | If not NewValue Then
|
---|
6736 | Begin
|
---|
6737 | FPrepared:=False;
|
---|
6738 | exit;
|
---|
6739 | End;
|
---|
6740 |
|
---|
6741 | If ((ComponentState*[csReading]=[])And(Not FDataSetLocked)) Then DoOpen;
|
---|
6742 |
|
---|
6743 | If FOpened Then FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6744 |
|
---|
6745 | FPrepared:=True;
|
---|
6746 | End;
|
---|
6747 |
|
---|
6748 | Procedure TStoredProc.SetParams(NewValue:TParams);
|
---|
6749 | Var t:LongInt;
|
---|
6750 | Begin
|
---|
6751 | FParams.Clear;
|
---|
6752 | For t:=0 To NewValue.Count-1 Do
|
---|
6753 | FParams.CreateParam(NewValue[t].DataType,NewValue[t].Name,NewValue[t].ParamType);
|
---|
6754 | End;
|
---|
6755 |
|
---|
6756 | Procedure TStoredProc.SetStoredProcName(NewValue:String);
|
---|
6757 | Begin
|
---|
6758 | CheckInactive;
|
---|
6759 | FProcName:=NewValue;
|
---|
6760 | FParams.Clear;
|
---|
6761 | End;
|
---|
6762 |
|
---|
6763 | Constructor TStoredProc.Create(AOwner: TComponent);
|
---|
6764 | Begin
|
---|
6765 | Inherited Create(AOwner);
|
---|
6766 | ReadOnly:=True;
|
---|
6767 | Name:='StoredProc';
|
---|
6768 | FParams.Create;
|
---|
6769 | End;
|
---|
6770 |
|
---|
6771 | Destructor TStoredProc.Destroy;
|
---|
6772 | Begin
|
---|
6773 | FParams.Destroy;
|
---|
6774 | Inherited Destroy;
|
---|
6775 | End;
|
---|
6776 |
|
---|
6777 | Procedure TStoredProc.CopyParams(Value:TParams);
|
---|
6778 | Begin
|
---|
6779 | Params:=Value;
|
---|
6780 | End;
|
---|
6781 |
|
---|
6782 | Procedure TStoredProc.ExecProc;
|
---|
6783 | Var rc:SQLRETURN;
|
---|
6784 | ReturnsResultSet:Boolean;
|
---|
6785 | t:LongInt;
|
---|
6786 | Param:TParam;
|
---|
6787 | s:String;
|
---|
6788 | c:CString;
|
---|
6789 | resultCols:SQLSMALLINT;
|
---|
6790 | I:LongInt;
|
---|
6791 | Size:SQLUINTEGER;
|
---|
6792 | colName:CString;
|
---|
6793 | colNameLen:SQLSMALLINT;
|
---|
6794 | colType:SQLSMALLINT;
|
---|
6795 | Scale:SQLSMALLINT;
|
---|
6796 | FieldDef:TFieldDef;
|
---|
6797 |
|
---|
6798 | ptsql,ctype,sqltype,Len:SQLSMALLINT;
|
---|
6799 | p:Pointer;
|
---|
6800 |
|
---|
6801 | Function ExecSQL:SQLRETURN;
|
---|
6802 | Var s:String;
|
---|
6803 | c:CString;
|
---|
6804 | t:LongInt;
|
---|
6805 | Begin
|
---|
6806 | If FDBProcs.DBType=Native_Oracle7 Then s:=StoredProcName+'('
|
---|
6807 | Else s:='call '+StoredProcName+'(';
|
---|
6808 | For t:=0 To FParams.Count-1 Do
|
---|
6809 | Begin
|
---|
6810 | Param:=FParams[t];
|
---|
6811 | If Param.ParamType=ptResultSet Then
|
---|
6812 | Begin
|
---|
6813 | ReturnsResultSet:=True;
|
---|
6814 | continue;
|
---|
6815 | End;
|
---|
6816 |
|
---|
6817 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
6818 | Begin
|
---|
6819 | If ((Param.ParamType=ptResult)And(s[1]<>':')) Then s:=':p0='+s
|
---|
6820 | Else
|
---|
6821 | Begin
|
---|
6822 | If s[length(s)]<>'(' Then s:=s+',';
|
---|
6823 | s:=s+':p'+tostr(t+1);
|
---|
6824 | End;
|
---|
6825 | End
|
---|
6826 | Else
|
---|
6827 | Begin
|
---|
6828 | If ((Param.ParamType=ptResult)And(s[1]<>'?')) Then s:='?='+s
|
---|
6829 | Else
|
---|
6830 | Begin
|
---|
6831 | If s[length(s)]<>'(' Then s:=s+',';
|
---|
6832 | s:=s+'?';
|
---|
6833 | End;
|
---|
6834 | End;
|
---|
6835 | End;
|
---|
6836 |
|
---|
6837 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
6838 | s:='BEGIN'+#10+s+');'#10+'END;'
|
---|
6839 | Else
|
---|
6840 | s:='{'+s+')}';
|
---|
6841 | c:=s;
|
---|
6842 | Result:=FDBProcs.SQLExecDirect(FDBProcs.ahstmt,c,SQL_NTS);
|
---|
6843 | End;
|
---|
6844 |
|
---|
6845 | Procedure BindParameters;
|
---|
6846 | Var i:LongInt;
|
---|
6847 | Param:TParam;
|
---|
6848 | Begin
|
---|
6849 | For i:=0 To FParams.Count-1 Do
|
---|
6850 | Begin
|
---|
6851 | Param:=FParams[i];
|
---|
6852 |
|
---|
6853 | Case Param.ParamType Of
|
---|
6854 | ptInput:ptsql:=SQL_PARAM_INPUT;
|
---|
6855 | ptOutput:ptsql:=SQL_PARAM_OUTPUT;
|
---|
6856 | ptResult:
|
---|
6857 | Begin
|
---|
6858 | If FDBProcs.DBType=Native_Oracle7 Then ptsql:=SQL_PARAM_RESULT
|
---|
6859 | Else ptsql:=SQL_PARAM_OUTPUT;
|
---|
6860 | End;
|
---|
6861 | ptInputOutput:ptsql:=SQL_PARAM_INPUT_OUTPUT;
|
---|
6862 | Else Continue; //Next Parameter
|
---|
6863 | End;
|
---|
6864 |
|
---|
6865 | Case Param.DataType Of
|
---|
6866 | ftString:
|
---|
6867 | Begin
|
---|
6868 | sqlType:=SQL_CHAR;
|
---|
6869 | cType:=SQL_C_CHAR;
|
---|
6870 | p:=@Param.FResultNTS;
|
---|
6871 | Param.FResultNTS:=Param.AsString;
|
---|
6872 | Len:=Length(Param.FResultNTS);
|
---|
6873 | Param.FOutLen:=SQL_NTS;
|
---|
6874 | End;
|
---|
6875 | ftCurrency:
|
---|
6876 | Begin
|
---|
6877 | sqlType:=SQL_NUMERIC;
|
---|
6878 | cType:=SQL_C_FLOAT;
|
---|
6879 | Len:=10;
|
---|
6880 | p:=@Param.FResultExtended;
|
---|
6881 | Param.FResultExtended:=Param.AsFloat;
|
---|
6882 | Param.FOutLen:=10;
|
---|
6883 | End;
|
---|
6884 | ftInteger:
|
---|
6885 | Begin
|
---|
6886 | sqlType:=SQL_INTEGER;
|
---|
6887 | cType:=SQL_C_LONG;
|
---|
6888 | Len:=4;
|
---|
6889 | p:=@Param.FResultLongInt;
|
---|
6890 | Param.FResultLongInt:=Param.AsInteger;
|
---|
6891 | Param.FOutLen:=4;
|
---|
6892 | End;
|
---|
6893 | ftSmallInt:
|
---|
6894 | Begin
|
---|
6895 | sqlType:=SQL_SMALLINT;
|
---|
6896 | cType:=SQL_C_SHORT;
|
---|
6897 | Len:=2;
|
---|
6898 | p:=@Param.FResultSmallInt;
|
---|
6899 | Param.FResultSmallInt:=Param.AsSmallInt;
|
---|
6900 | Param.FOutLen:=2;
|
---|
6901 | End;
|
---|
6902 | ftFloat:
|
---|
6903 | Begin
|
---|
6904 | sqlType:=SQL_FLOAT;
|
---|
6905 | cType:=SQL_C_FLOAT;
|
---|
6906 | Len:=10;
|
---|
6907 | p:=@Param.FResultExtended;
|
---|
6908 | Param.FResultExtended:=Param.AsFloat;
|
---|
6909 | Param.FOutLen:=10;
|
---|
6910 | End;
|
---|
6911 | ftDate:
|
---|
6912 | Begin
|
---|
6913 | sqlType:=SQL_DATE;
|
---|
6914 | cType:=SQL_C_DATE;
|
---|
6915 | Len:=sizeof(Param.FResultDate);
|
---|
6916 | p:=@Param.FResultDate;
|
---|
6917 | DecodeDate(Param.AsDate,Param.FResultDate.Year,Param.FResultDate.Month,Param.FResultDate.Day);
|
---|
6918 | Param.FOutLen:=sizeof(Param.FResultDate);
|
---|
6919 | End;
|
---|
6920 | ftTime:
|
---|
6921 | Begin
|
---|
6922 | sqlType:=SQL_TIME;
|
---|
6923 | cType:=SQL_C_TIME;
|
---|
6924 | Len:=sizeof(Param.FResultTime);
|
---|
6925 | p:=@Param.FResultTime;
|
---|
6926 | RoundDecodeTime(Param.AsTime,Param.FResultTime.Hour,Param.FResultTime.Minute,Param.FResultTime.Second);
|
---|
6927 | Param.FOutLen:=sizeof(Param.FResultTime);
|
---|
6928 | End;
|
---|
6929 | ftDateTime:
|
---|
6930 | Begin
|
---|
6931 | sqlType:=SQL_TIMESTAMP;
|
---|
6932 | cType:=SQL_C_TIMESTAMP;
|
---|
6933 | Len:=sizeof(Param.FResultDateTime);
|
---|
6934 | p:=@Param.FResultDateTime;
|
---|
6935 | DecodeDate(Param.AsDate,Param.FResultDateTime.Year,Param.FResultDateTime.Month,Param.FResultDateTime.Day);
|
---|
6936 | RoundDecodeTime(Param.AsTime,Param.FResultDateTime.Hour,Param.FResultDateTime.Minute,Param.FResultDateTime.Second);
|
---|
6937 | Param.FOutLen:=sizeof(Param.FResultDateTime);
|
---|
6938 | End;
|
---|
6939 | ftMemo:
|
---|
6940 | Begin
|
---|
6941 | sqlType:=SQL_LONGVARCHAR;
|
---|
6942 | cType:=SQL_C_CHAR;
|
---|
6943 | Len:=0; //??
|
---|
6944 | p:=Nil; //???
|
---|
6945 | Param.FOutLen:=0; //?? current len
|
---|
6946 | End;
|
---|
6947 | ftBlob:
|
---|
6948 | Begin
|
---|
6949 | sqlType:=SQL_VARBINARY;
|
---|
6950 | cType:=SQL_C_BINARY;
|
---|
6951 | Len:=0; //??
|
---|
6952 | p:=Nil; //???
|
---|
6953 | Param.FOutLen:=0; //?? current len
|
---|
6954 | End;
|
---|
6955 | ftGraphic:
|
---|
6956 | Begin
|
---|
6957 | sqlType:=SQL_VARGRAPHIC;
|
---|
6958 | cType:=SQL_C_BINARY;
|
---|
6959 | Len:=0; //??
|
---|
6960 | p:=Nil; //???
|
---|
6961 | Param.FOutLen:=0; //?? current len
|
---|
6962 | End;
|
---|
6963 | End; //case
|
---|
6964 |
|
---|
6965 | Try
|
---|
6966 | rc:=FDBProcs.SQLBindParameter(FDBProcs.ahstmt,i+1,ptsql,ctype,sqltype,Len,0,p^,Len,Param.FOutLen);
|
---|
6967 | If rc=SQL_ERROR Then
|
---|
6968 | Begin
|
---|
6969 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
6970 | CloseStmt;
|
---|
6971 | DoClose;
|
---|
6972 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S);
|
---|
6973 | End;
|
---|
6974 |
|
---|
6975 | Except
|
---|
6976 | ON E:ESQLError Do
|
---|
6977 | Begin
|
---|
6978 | CloseStmt;
|
---|
6979 | ErrorBox(E.Message);
|
---|
6980 | End;
|
---|
6981 | Else
|
---|
6982 | Begin
|
---|
6983 | CloseStmt;
|
---|
6984 | Raise;
|
---|
6985 | End;
|
---|
6986 | End;
|
---|
6987 | If FDBProcs.ahstmt=0 Then
|
---|
6988 | Begin
|
---|
6989 | DoClose;
|
---|
6990 | exit;
|
---|
6991 | End;
|
---|
6992 | End;
|
---|
6993 | End;
|
---|
6994 | Label err;
|
---|
6995 | Begin
|
---|
6996 | If not Prepared Then Prepare;
|
---|
6997 |
|
---|
6998 | CloseStmt; //if previous proc returned a result set...
|
---|
6999 | FMaxRows:=0;
|
---|
7000 | If not FOpened Then DoOpen;
|
---|
7001 |
|
---|
7002 | If FOpened Then
|
---|
7003 | Begin
|
---|
7004 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
7005 | If FDBProcs.SQLSetStmtOption(FDBProcs.ahstmt,SQL_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN)=SQL_ERROR THEN
|
---|
7006 | Begin
|
---|
7007 | //S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
7008 | //ErrorBox(S);
|
---|
7009 | End;
|
---|
7010 | End
|
---|
7011 | Else exit;
|
---|
7012 |
|
---|
7013 | If FDBProcs.DBType=Native_Oracle7 Then
|
---|
7014 | Begin
|
---|
7015 | rc:=ExecSQL;
|
---|
7016 | If rc=SQL_ERROR Then goto err;
|
---|
7017 | End;
|
---|
7018 |
|
---|
7019 | //Bind Parameters
|
---|
7020 | BindParameters;
|
---|
7021 | If FDBProcs.ahstmt=0 Then
|
---|
7022 | Begin
|
---|
7023 | DoClose;
|
---|
7024 | exit;
|
---|
7025 | End;
|
---|
7026 |
|
---|
7027 | FFieldDefs.Clear;
|
---|
7028 | FCurrentRow:=-1;
|
---|
7029 | FCurrentField:=0;
|
---|
7030 |
|
---|
7031 | ReturnsResultSet:=False;
|
---|
7032 |
|
---|
7033 | EnterSQLProcessing;
|
---|
7034 | If FDBProcs.DBType<>Native_Oracle7 Then rc:=ExecSQL
|
---|
7035 | Else rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
7036 |
|
---|
7037 | If rc<>SQL_ERROR Then
|
---|
7038 | Begin
|
---|
7039 | For i:=0 To FParams.Count-1 Do
|
---|
7040 | Begin
|
---|
7041 | Param:=FParams[i];
|
---|
7042 |
|
---|
7043 | If Param.ParamType<>ptOutput Then
|
---|
7044 | If Param.ParamType<>ptInputOutput Then
|
---|
7045 | If Param.ParamType<>ptResult Then continue;
|
---|
7046 |
|
---|
7047 | Case Param.DataType Of
|
---|
7048 | ftString:
|
---|
7049 | Begin
|
---|
7050 | Param.AsString:=Param.FResultNTS;
|
---|
7051 | End;
|
---|
7052 | ftCurrency:
|
---|
7053 | Begin
|
---|
7054 | Param.AsFloat:=Param.FResultExtended;
|
---|
7055 | End;
|
---|
7056 | ftInteger:
|
---|
7057 | Begin
|
---|
7058 | Param.AsInteger:=Param.FResultLongInt;
|
---|
7059 | End;
|
---|
7060 | ftSmallInt:
|
---|
7061 | Begin
|
---|
7062 | Param.AsSmallInt:=Param.FResultSmallInt;
|
---|
7063 | End;
|
---|
7064 | ftFloat:
|
---|
7065 | Begin
|
---|
7066 | Param.AsFloat:=Param.FResultExtended;
|
---|
7067 | End;
|
---|
7068 | ftDate:
|
---|
7069 | Begin
|
---|
7070 | Param.AsDate:=EncodeDate(Param.FResultDate.Year,Param.FResultDate.Month,Param.FResultDate.Day);
|
---|
7071 | End;
|
---|
7072 | ftTime:
|
---|
7073 | Begin
|
---|
7074 | Param.AsTime:=EncodeTime(Param.FResultTime.Hour,Param.FResultTime.Minute,Param.FResultTime.Second,0);
|
---|
7075 | End;
|
---|
7076 | ftDateTime:
|
---|
7077 | Begin
|
---|
7078 | Param.AsDateTime:=EncodeDate(Param.FResultDateTime.Year,Param.FResultDateTime.Month,Param.FResultDateTime.Day) +
|
---|
7079 | EncodeTime(Param.FResultDateTime.Hour,Param.FResultDateTime.Minute,Param.FResultDateTime.Second, 0);
|
---|
7080 | End;
|
---|
7081 | ftMemo:
|
---|
7082 | Begin
|
---|
7083 | End;
|
---|
7084 | ftBlob:
|
---|
7085 | Begin
|
---|
7086 | End;
|
---|
7087 | ftGraphic:
|
---|
7088 | Begin
|
---|
7089 | End;
|
---|
7090 | End; //case
|
---|
7091 | End; //for
|
---|
7092 |
|
---|
7093 | If ReturnsResultSet Then
|
---|
7094 | Begin
|
---|
7095 | {The driver determines the number of rows in the result set}
|
---|
7096 | rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
7097 | FMaxRows:=0;
|
---|
7098 | While ((rc<>SQL_NO_DATA_FOUND)And(rc<>SQL_ERROR)) Do
|
---|
7099 | Begin
|
---|
7100 | inc(FMaxRows);
|
---|
7101 | rc:=FDBProcs.SQLFetch(FDBProcs.ahstmt);
|
---|
7102 | End;
|
---|
7103 | FDBProcs.SQLFreeStmt(FDBProcs.ahstmt,SQL_DROP);
|
---|
7104 | FDBProcs.ahstmt:=0;
|
---|
7105 |
|
---|
7106 | {The driver recreates the result set}
|
---|
7107 | FDBProcs.SQLAllocStmt(FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
7108 | If FDBProcs.SQLSetStmtOption(FDBProcs.ahstmt,SQL_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN)=SQL_ERROR THEN
|
---|
7109 | Begin
|
---|
7110 | //S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
7111 | //ErrorBox(S);
|
---|
7112 | End;
|
---|
7113 | BindParameters;
|
---|
7114 | If FDBProcs.ahstmt=0 Then
|
---|
7115 | Begin
|
---|
7116 | DoClose;
|
---|
7117 | LeaveSQLProcessing;
|
---|
7118 | exit;
|
---|
7119 | End;
|
---|
7120 |
|
---|
7121 | rc:=FDBProcs.SQLExecDirect(FDBProcs.ahstmt,c,SQL_NTS);
|
---|
7122 | If rc=SQL_ERROR Then goto err;
|
---|
7123 |
|
---|
7124 | Try
|
---|
7125 | FDBProcs.SQLNumResultCols(FDBProcs.ahstmt,resultCols);
|
---|
7126 | If resultCols=0 Then //Not A Select statement
|
---|
7127 | Begin
|
---|
7128 | CloseStmt;
|
---|
7129 | SQLError(LoadNLSStr(SEmptyResultSet));
|
---|
7130 | End
|
---|
7131 | Else
|
---|
7132 | Begin
|
---|
7133 | {Store Result Columns}
|
---|
7134 | For I := 0 To resultCols-1 Do
|
---|
7135 | Begin
|
---|
7136 | Size:=0;
|
---|
7137 | FDBProcs.SQLDescribeCol(FDBProcs.ahstmt, I + 1, colName,
|
---|
7138 | SizeOf(colName), colNameLen, colType, Size, Scale, Nil);
|
---|
7139 | If Size>65535 Then Size:=4096;
|
---|
7140 | S:=colName;
|
---|
7141 |
|
---|
7142 | Case ColType Of
|
---|
7143 | SQL_REAL:Size:=4;
|
---|
7144 | SQL_FLOAT,SQL_DOUBLE,SQL_NUMERIC:Size:=8;
|
---|
7145 | End; //case
|
---|
7146 |
|
---|
7147 | FFieldDefs.Add(S, MapSQLType(colType), Size, False);
|
---|
7148 |
|
---|
7149 | FieldDef := FFieldDefs[I];
|
---|
7150 | FieldDef.Precision := Scale;
|
---|
7151 | End;
|
---|
7152 |
|
---|
7153 | FCurrentRow:=0; {First Row}
|
---|
7154 | FCurrentField:=0; {First field}
|
---|
7155 | End;
|
---|
7156 |
|
---|
7157 | Post; //Commit All transactions Until here
|
---|
7158 | DataChange(deDataBaseChanged);
|
---|
7159 | Except
|
---|
7160 | ON E:ESQLError Do
|
---|
7161 | Begin
|
---|
7162 | CloseStmt;
|
---|
7163 | LeaveSQLProcessing;
|
---|
7164 | ErrorBox(E.Message);
|
---|
7165 | End;
|
---|
7166 | Else
|
---|
7167 | Begin
|
---|
7168 | CloseStmt;
|
---|
7169 | LeaveSQLProcessing;
|
---|
7170 | Raise;
|
---|
7171 | End;
|
---|
7172 | End;
|
---|
7173 |
|
---|
7174 | //for result sets the statement must remain open...
|
---|
7175 | End
|
---|
7176 | Else CloseStmt;
|
---|
7177 |
|
---|
7178 | LeaveSQLProcessing;
|
---|
7179 | End
|
---|
7180 | Else
|
---|
7181 | Begin
|
---|
7182 | err:
|
---|
7183 | LeaveSQLProcessing;
|
---|
7184 | Try
|
---|
7185 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,FDBProcs.ahstmt);
|
---|
7186 | CloseStmt;
|
---|
7187 | SQLError(LoadNLSStr(SErrorExecutingSQLStatement)+': '+S);
|
---|
7188 | Except
|
---|
7189 | ON E:ESQLError Do
|
---|
7190 | Begin
|
---|
7191 | CloseStmt;
|
---|
7192 | ErrorBox(E.Message);
|
---|
7193 | End;
|
---|
7194 | Else
|
---|
7195 | Begin
|
---|
7196 | CloseStmt;
|
---|
7197 | Raise;
|
---|
7198 | End;
|
---|
7199 | End;
|
---|
7200 | End;
|
---|
7201 | End;
|
---|
7202 |
|
---|
7203 | Function TStoredProc.ParamByName(Const Value:String):TParam;
|
---|
7204 | Begin
|
---|
7205 | Result := FParams.ParamByName(Value);
|
---|
7206 | End;
|
---|
7207 |
|
---|
7208 | Procedure TStoredProc.Prepare;
|
---|
7209 | Begin
|
---|
7210 | If FParams.Count=0 Then SetDefaultParams;
|
---|
7211 | Prepared:=True;
|
---|
7212 | End;
|
---|
7213 |
|
---|
7214 |
|
---|
7215 | Procedure TStoredProc.UnPrepare;
|
---|
7216 | Begin
|
---|
7217 | Prepared:=False;
|
---|
7218 | End;
|
---|
7219 |
|
---|
7220 |
|
---|
7221 | Procedure TStoredProc.DoOpen;
|
---|
7222 | Var rc:SQLRETURN;
|
---|
7223 | S:String;
|
---|
7224 | Begin
|
---|
7225 | If Not FActive Then Exit;
|
---|
7226 |
|
---|
7227 | If Not FillDBProcs(FDBProcs) Then
|
---|
7228 | Begin
|
---|
7229 | ErrorBox(LoadNLSStr(SErrLoadingDB));
|
---|
7230 | Active:=False;
|
---|
7231 | Exit; {Error}
|
---|
7232 | End;
|
---|
7233 | FDBProcs.IsStoredProc:=True;
|
---|
7234 |
|
---|
7235 | If Not FOpened Then
|
---|
7236 | Begin
|
---|
7237 | Try
|
---|
7238 | If FBeforeOpen<>Nil Then FBeforeOpen(Self);
|
---|
7239 |
|
---|
7240 | FDBProcs.ahstmt:=0;
|
---|
7241 | FDBProcs.ahenv:=0;
|
---|
7242 | If AllocateDBEnvironment(FDBProcs)<>SQL_SUCCESS Then
|
---|
7243 | Begin
|
---|
7244 | ErrorBox(LoadNLSStr(SErrAllocDBEnv)+'.'+
|
---|
7245 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
7246 | Active:=False;
|
---|
7247 | Exit;
|
---|
7248 | End;
|
---|
7249 |
|
---|
7250 | {Connect To Server}
|
---|
7251 | FDBProcs.ahdbc:=0;
|
---|
7252 | If FDBProcs.SQLAllocConnect(FDBProcs.ahenv,FDBProcs.ahdbc)<>SQL_SUCCESS Then
|
---|
7253 | Begin
|
---|
7254 | ErrorBox(LoadNLSStr(SErrAllocDBConnect)+'.'+
|
---|
7255 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
7256 | DoClose;
|
---|
7257 | Exit;
|
---|
7258 | End;
|
---|
7259 |
|
---|
7260 | {Set autocommit OFF}
|
---|
7261 | If FDBProcs.SQLSetConnectOption(FDBProcs.ahdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF)<>SQL_SUCCESS Then
|
---|
7262 | Begin
|
---|
7263 | ErrorBox(LoadNLSStr(SErrSettingDBOpts)+'.'+
|
---|
7264 | SQLErrorText(FDBProcs,FDBProcs.ahenv,0,0));
|
---|
7265 | DoClose;
|
---|
7266 | Exit;
|
---|
7267 | End;
|
---|
7268 |
|
---|
7269 | {Connect}
|
---|
7270 | Try
|
---|
7271 | If FDBProcs.uid='' Then
|
---|
7272 | Begin
|
---|
7273 | If FDBProcs.pwd='' Then
|
---|
7274 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
7275 | Nil,0,Nil,0)
|
---|
7276 | Else
|
---|
7277 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
7278 | Nil,0,FDBProcs.pwd,SQL_NTS);
|
---|
7279 | End
|
---|
7280 | Else If FDBProcs.pwd='' Then
|
---|
7281 | Begin
|
---|
7282 | rc:=FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
7283 | FDBProcs.uid,SQL_NTS,Nil,0);
|
---|
7284 | End
|
---|
7285 | Else rc:= FDBProcs.SqlConnect(FDBProcs.ahdbc,FDBProcs.DataBase,SQL_NTS,
|
---|
7286 | FDBProcs.uid,SQL_NTS,FDBProcs.pwd,SQL_NTS);
|
---|
7287 | If rc<>SQL_SUCCESS Then
|
---|
7288 | Begin
|
---|
7289 | S:=SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0);
|
---|
7290 | DoClose;
|
---|
7291 | SQLError(LoadNLSStr(SErrorDBConnecting)+' "'+DataBase+'".'+#13#10+S);
|
---|
7292 | End;
|
---|
7293 | Except
|
---|
7294 | ON E:ESQLError Do
|
---|
7295 | Begin
|
---|
7296 | ErrorBox(E.Message);
|
---|
7297 | Exit;
|
---|
7298 | End;
|
---|
7299 | Else Raise;
|
---|
7300 | End;
|
---|
7301 |
|
---|
7302 | FOpened:=True;
|
---|
7303 | If FAfterOpen<>Nil Then AfterOpen(Self);
|
---|
7304 |
|
---|
7305 | If FParams.Count=0 Then SetDefaultParams;
|
---|
7306 | Except
|
---|
7307 | Raise;
|
---|
7308 | End;
|
---|
7309 | End;
|
---|
7310 | End;
|
---|
7311 |
|
---|
7312 |
|
---|
7313 | Procedure TStoredProc.DoClose;
|
---|
7314 | Var OldOpened:Boolean;
|
---|
7315 | Begin
|
---|
7316 | Try
|
---|
7317 | If FBeforeClose<>Nil Then FBeforeClose(Self);
|
---|
7318 |
|
---|
7319 | OldOpened:=FOpened;
|
---|
7320 | TDataSet.DoClose;
|
---|
7321 | FOpened:=OldOpened;
|
---|
7322 |
|
---|
7323 | If FOpened Then
|
---|
7324 | Begin
|
---|
7325 | CloseStmt;
|
---|
7326 | Post; //Commit All transactions
|
---|
7327 | End;
|
---|
7328 |
|
---|
7329 | FActive:=False;
|
---|
7330 | FDataSetLocked:=True;
|
---|
7331 | FFieldDefs.Clear;
|
---|
7332 |
|
---|
7333 | FDataSetLocked:=False;
|
---|
7334 |
|
---|
7335 | If FDBProcs.ahdbc<>0 Then
|
---|
7336 | Begin
|
---|
7337 | If FOpened Then
|
---|
7338 | If FDBProcs.SQLDisconnect(FDBProcs.ahdbc)<>SQL_SUCCESS Then
|
---|
7339 | ErrorBox('Disconnect error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
7340 | If FDBProcs.SQLFreeConnect(FDBProcs.ahdbc)<>SQL_SUCCESS Then
|
---|
7341 | ErrorBox('FreeConnect error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
7342 | FDBProcs.ahdbc:=0;
|
---|
7343 | End;
|
---|
7344 |
|
---|
7345 | If FDBProcs.ahenv<>0 Then
|
---|
7346 | Begin
|
---|
7347 | If FDBProcs.SQLFreeEnv(FDBProcs.ahenv)<>SQL_SUCCESS Then
|
---|
7348 | ErrorBox('FreeEnv error '+SQLErrorText(FDBProcs,FDBProcs.ahenv,FDBProcs.ahdbc,0));
|
---|
7349 | FDBProcs.ahenv:=0;
|
---|
7350 | End;
|
---|
7351 |
|
---|
7352 | FOpened:=False;
|
---|
7353 | DataChange(deDataBaseChanged);
|
---|
7354 |
|
---|
7355 | If FAfterClose<>Nil Then FAfterClose(Self);
|
---|
7356 | Except
|
---|
7357 | Raise;
|
---|
7358 | End;
|
---|
7359 | End;
|
---|
7360 |
|
---|
7361 |
|
---|
7362 | Procedure TStoredProc.Loaded;
|
---|
7363 | Var OldOpen,OldActive:Boolean;
|
---|
7364 | Begin
|
---|
7365 | Inherited Loaded;
|
---|
7366 |
|
---|
7367 | OldOpen:=FOpened;
|
---|
7368 | OldActive:=FActive;
|
---|
7369 | FActive:=True;
|
---|
7370 | DoOpen;
|
---|
7371 | If not OldOpen Then DoClose;
|
---|
7372 | FActive:=OldActive;
|
---|
7373 | End;
|
---|
7374 |
|
---|
7375 |
|
---|
7376 | Procedure TStoredProc.Delete;
|
---|
7377 | Begin
|
---|
7378 | End;
|
---|
7379 |
|
---|
7380 |
|
---|
7381 | Procedure TStoredProc.Insert;
|
---|
7382 | Begin
|
---|
7383 | End;
|
---|
7384 |
|
---|
7385 |
|
---|
7386 | Procedure TStoredProc.InsertRecord(Const values:Array Of Const);
|
---|
7387 | Begin
|
---|
7388 | Try
|
---|
7389 | FDataChangeLock:=True;
|
---|
7390 | Insert;
|
---|
7391 | Finally
|
---|
7392 | FDataChangeLock:=False;
|
---|
7393 | End;
|
---|
7394 | SetFields(values);
|
---|
7395 | End;
|
---|
7396 |
|
---|
7397 |
|
---|
7398 | Function TStoredProc.UpdateFieldSelect(field:TField):Boolean;
|
---|
7399 | Begin
|
---|
7400 | Result:=False;
|
---|
7401 | End;
|
---|
7402 |
|
---|
7403 |
|
---|
7404 |
|
---|
7405 | Begin
|
---|
7406 | End.
|
---|
7407 |
|
---|