Beispiel - Verknüpfungen
Beispiel - Verknüpfungen Löschen eines Datensatzes und aller verknüpfter Datensätze
- Siehe:
RecLink (),FileInfo (),LinkInfo (), Beispiel mit Beschreibung
@A+
@C+
// Diese Funktion löscht einen Datensatz aus der angegebenen Datei
// und alle verknüpften Datensätze.
// Rückgabewerte: _ErrFileInvalid - ungültige Datei übergeben
// Alle weiteren Rückgabewerte entsprechen denen von RecDelete()
// Die Funktion bricht ab, sobald ein Datensatz nicht gelöscht werden konnte.
sub DeleteRec
(
aFileNo : int; // Dateinummer
) : int;
local
{
tLinkNo : int;
tLinkFileNo : int;
tErg : int;
tRecBuffer : handle;
}
{
// Überprüfung der Übergabeparameter
if (FileInfo(aFileNo, _FileExists) = 0)
{
return(_ErrFileInvalid);
}
// Datensatz löschen
tErg # RecDelete(aFileNo, 0);
if (tErg != _rOk)
{
return(tErg);
}
// Existiert in dieser Datei eine Verknüpfung?
for tLinkNo # 1;
loop Inc(tLinkNo);
while (tLinkNo <= FileInfo(aFileNo, _FileLinkCount))
{
// Nummer der Zieldatei ermitteln
tLinkFileNo # LinkInfo(aFileNo, tLinkNo, _LinkDestFileNumber);
// Puffer der Zieldatei retten
tRecBuffer # RecBufCreate(tLinkFileNo);
RecBufCopy(tLinkFileNo, tRecBuffer);
// Verknüpften Datensatz lesen
tErg # RecLink(tLinkFileNo, aFileNo, tLinkNo, _RecLast);
while ((tErg = _rOk) or (tErg = _rLocked))
{
// Verknüpften Datensatz löschen
tErg # DeleteRec(tLinkFileNo);
if (tErg != _rOk)
{
tErg # 1000 + tErg;
}
else
{
tErg # RecLink(tLinkFileNo, aFileNo, tLinkNo, _RecLast);
}
}
// Puffer der Zieldatei wieder herstellen
tRecBuffer->RecBufCopy(tLinkFileNo);
tRecBuffer->RecBufDestroy();
// Funktion beenden, wenn ein Datensatz nicht gelöscht werden konnte
if (tErg > 1000)
{
return(tErg - 1000);
}
}
return(_rOk);
}
// Diese Funktion umschließt das Löschen der Datensätze mit einer
// Transaktion. Kann auch nur einer der Datensätze nicht gelöscht
// werden, erfolgt keine Änderung in der Datenbank.
sub Delete
(
aFileNo : int; // Dateinummer
) : int
local
{
tErg : int;
}
{
DtaBegin();
tErg # DeleteRec(aFileNo);
if (tErg != _rOk)
{
DtaRollback(false);
}
else
{
DtaCommit();
}
return(tErg);
}