Zum Hauptinhalt springen
Unlisted page
This page is unlisted. Search engines will not index it, and only users having a direct link can access it.

Beispiel - Verknüpfungen

Beispiel - Verknüpfungen Löschen eines Datensatzes und aller verknüpfter Datensätze

@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);
}