Servizi informatici per le aziende

Definizione di procedure standard

Sezioni:

Esempi di codice

Creazione form
  • Creazione di form MDI: Il codice seguente prende in considerazione la possibilità che la finestra esista già. In tal caso essa viene riportata in primo piano ed aperta, se ridotta ad icona. Se non esiste, si verifica un'eccezione e la finestra viene creata. Questo sistema garantisce la creazione di una sola istanza dell'oggetto in questione.

Es.

try
Frm_ElencoBolle.BringToFront;
Frm_ElencoBolle.WindowState := wsNormal;
except
Frm_ElencoBolle := TFrm_ElencoBolle.Create(Self);
end;


Per avere più form della stessa classe si consideri il seguente codice:

with Frm_ElencoBolle do
begin
Frm_ElencoBolle := TFrm_ElencoBolle.Create(Self);
try
//codice di inizializzazione delle proprietà dell'oggetto Frm_ElencoBolle
[…]
except
// se si verifica un' eccezione durante l'inizializzazione, faccio il free dell'oggetto
Free;
end; // except
end; // with

  • Creazione di form modali (dialog box): La form viene creata, aperta e poi disallocata quando l'utente preme il tasto di chiusura. Nel caso in cui durante la visualizzazione si verifica un'eccezione la form viene comunque deallocata. L' uso di questo costrutto rende preferibile legare il codice di inizializzazione della form all'evento OnShow della form piuttosto che all'evento OnCreate.

Es.

with TAboutFrm.Create(Self) do
begin
try
ShowModal;
finally
Free;
end;
end;

Apertura tabella

Le tabelle vengono aperte meditante l'impostazione della proprietà Active a TRUE. Analogamente per la chiusura.

Apertura query

Le query vengono aperte meditante l'impostazione della proprietà Active a TRUE. Analogamente per la chiusura.

Nel caso di query che non contengono istruzioni di SELECT si deve usare il metodo ExecSQL.

Assegnazione parametri query

I parametri vengono assegnati mediante il metodo ParamByName. Se però la query contiene un solo parametro utilizzare Params[0]. In tal modo si capisce subito che la query è monoparametrica.

Applicazione di filtri a dataset

Prima di applicare i filtri impostare sempre la proprietà Filtered a FALSE e dopo l'applicazione del filtro a TRUE. Questo a meno che non ci si trovi nelle righe successive alla prima apertura della tabella o della query.

Creazione di un alias run-time

In questo esempio contab è il nome dell'alias, sDBPath contiene il percorso in cui è situato il database, GetCurrentDir restituisce la directory corrente di esecuzione del programma. L'uso del metodo SaveConfigFile rende l'alias permanente.

Es.

with ssLocSession do
begin
Active := FALSE;
NetFileDir := sDBPath;
PrivateDir := GetCurrentDir;
Active := TRUE;
try
AddStandardAlias('contab', sDBPath, 'Paradox');
SaveConfigFile;
except;
end;
end; //with

Creazione tabella

In generale, la generazione di una tabella tramite codice richiede i passi seguenti:

  • Creare un Alias BDE per il database.
  • Creare un oggetto TTable.
  • Aggiungere le definizioni dei campi alla proprietà FieldDefs.
  • Aggiungere le definizioni degli indici alla proprietà IndexDefs (se la tabella contiene indici).
  • Creare la tabella vera e propria con il metodo CreateTable.

L'esempio che segue crea dapprima un oggetto TTable; la proprietà DatabaseName viene impostata all'alias 'Basic' già esistente, mentre la proprietà TableName viene impostata al nome della nuova tabella che si sta creando. A questo punto l'oggetto TTable è stato creato, ma la tabella non esiste ancora su disco.

Il passo successivo consiste nella creazione delle definizioni dei campi per la tabella; la definizione di un campo contiene il suo nome, il suo tipo, la sua dimensione (se possibile) e se è un campo necessario. La definizione di un campo viene creata usando il metodo Add della classe TFieldDefs.

Se la tabella è indicizzata, è necessario aggiungere anche una o più definizioni di indici, operazione simile all'aggiunta delle definizioni dei campi; la proprietà IndexDefs di TTable contiene le definizioni degli indici. Per aggiungere una nuova definizione si deve chiamare il metodo Add di TIndexDefs (il primo parametro del metodo Add viene utilizzato per indicare il nome dell'indice: se si sta crendo un indice primario non è necessario indicarlo; il secondo parametro viene usato per indicare il campo o i campi sui quali compiere l'indicizzazione, ognuno separato da un punto e virgola; l'ultimo parametro viene utilizzato per indicare il tipo dell'indice).

Dopo aver aggiunto tutte le definizioni di campi e degli indici della tabella, è necessario crearla mediante il metodo CreateTable; quest'ultimo prende il contenuto delle proprietà FieldDefs e IndexDefs e crea la struttura della tabella sulla base di esse.

Infine, essendo la tabella in questione un oggetto creato run-time, prima di chiudere la procedura, è necessario rilasciarla dalla memoria mediante il metodo Free.

Es.

var
tAnagrafica: TTable;
Save_Cursor: TCursor;
[…]
begin
Save_Cursor := Screen.Cursor;
Screen.Cursor := crHourglass;
tAnagrafica := TTable.Create(Self);
try
with tAnagrafica do
begin
DatabaseName :='Basic';
TableName := 'Anagrafica';
// Aggiunge le definizioni di campo per la tabella tblAnagrafica
with FieldDefs do
begin
Clear;
Add('iID', ftAutoInc, 1, True);
Add('iPIVA', ftInteger, 0, True);
Add('sRAGSOC', ftString, 90, False);
Add('sINDIRIZZO', ftString, 64, False);
Add('sFRAZIONE', ftString, 64, False);
Add('sCOMUNE', ftString, 30, False);
Add('sREGIONE', ftString, 14, False);
Add('sCAP', ftString, 06, False);
Add('sPROV', ftString, 02, False);
Add('sTELEFONO', ftString, 14, False);
Add('sFAX', ftString, 14, False);
Add('sOGGSOC', ftString, 128, False);
end; //with
// Aggiunge la definizione di indice per la chiave primaria
with IndexDefs do
begin
Clear;
Add('ixP', 'iID;iPIVA', [ixPrimary, ixUnique]);
Add('ixS', 'iPIVA', [ixDescending]);
end; //with
// Creazione effettiva della tabella, dopo le impostazioni
CreateTable;
end; //with
except
MessageDlg('Errore nella creazione della tabella Anagrafica', mtError, [mbOK], 0);
Screen.Cursor := Save_Cursor;
tAnagrafica.Free;
Exit;
end; //try
tAnagrafica.Free;
Screen.Cursor := Save_Cursor;
// Fa sapere all'utente che la tabella Anagrafica è stata creata correttamente
MessageDlg('Creazione della tabella Anagrafica avvenuta con successo', mtInformation, [mbOK], 0);
end;

Importazione file di testo

Per quanto riguarda l'importazione di un file di testo di dimensioni ridotte, si può usare l'oggetto TstringList che memorizza il file di testo in una lista di stringhe.

Il programma dell'esempio seguente sistema in una tabella creata precedentemente i dati presenti nel file di testo 'customer.txt', i cui campi sono separati da una virgola.

Es.

var
tTable : TTable;
Lines : TStringList;
Save_Cursor : TCursor;
sRecord, sCampo : String;
i, iPos : Integer;
[…]
begin
Save_Cursor := Screen.Cursor;
Screen.Cursor := crHourglass;
tTable := TTable.Create(Self);
tTable.DatabaseName := 'Basic';
tTable.TableName := 'Anagrafica';
tTable.Active := TRUE;
Lines := TStringList.Create;
Lines.LoadFromFile('customer.txt');
for i := 1 to Pred(Lines.Count) do
begin
tTable.Append;
// Analizza la stringa e prende il primo valore
sRecord := Lines[i];
iPos := Pos(',', sRecord);
sCampo := Copy(sRecord, 1, iPos - 1);
Delete(sRecord, 1, iPos);
// Scrive il valore nel campo sPIVA
tTable.FieldByName('iPIVA').Value := StrToInt(sCampo);
// Continua in questo modo per ognuno dei campi
iPos := Pos(',', sRecord);
sCampo := Copy(sRecord, 1, iPos - 1);
Delete(sRecord, 1, iPos);
tTable.FieldByName('sRAGSOC').Value := sCampo;
[…]
try
tTable.Post;
except
on EDBEngineError do
begin
MessageBox(Handle, 'Duplicazione di chiave primaria', 'Errore', 0);
tTable.Cancel;
Continue;
end; //on
end; //try
end; //for
tTable.Active := FALSE;
tTable.Free;
Lines.Free;
Screen.Cursor := Save_Cursor;
end;

L'esempio che segue usa invece la procedura Reset per aprire il file di testo, di cui si suppone di conoscere la lunghezza dei campi; la procedura ReadLn legge invece una riga di testo e porta il cursore sulla riga seguente. A differenza del metodo precedente, questo metodo non memorizza l'intero file e permette quindi l'importazione di grandi quantità di dati.

Es.

var
tTable : TTable;
Save_Cursor : TCursor;
sRecord, sCampo, sRagsoc, sIndirizzo […] : String;
iPiva : Integer;
txtflRecord : TextFile;
[…]
begin
Save_Cursor := Screen.Cursor;
Screen.Cursor := crHourglass;
tTable := TTable.Create(Self);
tTable.DatabaseName := 'Basic';
tTable.TableName := 'Anagrafica';
tTable.Active := TRUE;
AssignFile(txtflRecord, 'customer.txt');
Reset(txtflRecord);
try
while not Eof(txtflRecord) do
begin
ReadLn(txtflRecord, sRecord);
iPiva := StrToInt(Copy(sRecord, 1, 16));
sRagSoc := Copy(sRecord, 17, 90);
sIndirizzo := Copy(sRecord, 107, 64);
[…]
tTable.Append;
tTable.FieldByName('iPIVA').Value := sPiva;
tTable.FieldByName('sRAGSOC').Value := sRagSoc;
tTable.FieldByName('sINDIRIZZO').Value := sIndirizzo;
[…]
tTable.Post;
end; //while
except
MessageDlg('Errore nell''importazione del file di testo per la tabella fornitori', mtError, [mbOK], 0);
Screen.Cursor := Save_Cursor;
CloseFile(txtflRecord);
tTable.Active := FALSE;
Exit;
end; //try
CloseFile(txtflRecord);
Screen.Cursor := Save_Cursor;
tTable.Active := FALSE;
tTable.Free;
end;

Creazione tabelle per Microsoft SQL Server

La creazione di una tabella che contiene un campo autoincrementale in MsSQL necessita l'uso di una query. L'esempio seguente ricrea la tabella precedente nel caso specificato.

Es.

CREATE TABLE owner.Anagrafica
(
iID int IDENTITY(1,1),
iPIVA int NULL,
sRAGSOC varchar(90) NOT NULL,
sINDIRIZZO varchar(64) NULL,
sFRAZIONE varchar(64) NULL,
sCOMUNE varchar(30) NULL,
sREGIONE varchar(14) NULL,
sCAP varchar(6) NULL,
sPROV varchar(2) NULL,
sTELEFONO varchar(14) NULL,
sFAX varchar(14) NULL,
OGGSOC varchar(128) NULL
)
CREATE CLUSTERED INDEX
ixP
ON owner.Anagrafica (iID, iPIVA)

Owner indica il possessore del database. Se per creare le tabelle ci si logga al DBMS con l'utente standard sa il nome dell'owner è dbo.