AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Daten bitweise in Feld ablegen und später aggregieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Daten bitweise in Feld ablegen und später aggregieren?

Ein Thema von Shivan · begonnen am 14. Jul 2006 · letzter Beitrag vom 8. Aug 2006
Antwort Antwort
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#1

Daten bitweise in Feld ablegen und später aggregieren?

  Alt 14. Jul 2006, 11:53
Datenbank: MSSQL • Version: 2000 • Zugriff über: BDE
Ich suche nach einer Möglichkeit, Daten bitweise in einen Datensatz zu schreiben.

Bisher kam mir nur die Idee, einen 64bit integer zu nehmen, womit ich jedoch nur 64 bits setzen kann.
Mehrere Integer-Felder verwenden ist auch nicht sonderlich schön. Optimal wäre 1440 Bit in einem Datensatz ablegen zu können (optimalerweise in einem Feld).

Eine andere Idee wäre, das ganze in einem VarChar zu "codieren". Jedoch gibt es spätestens dann ein Problem mit dem Aggregieren der Bits mittels bitweisem "AND". Auch mit Integern ist ein bitweises And-Aggregat nicht sonderlich einfach.

Eine Hilfslösung wäre, den SQL-Server-Funktionsumfang mit einer DLL zu erweitern, so dass dieser vielleicht bitweise mit VarChars hantieren könnte...

Vielleicht hat ja einer von euch noch eine bessere/einfacherere Lösung?
Markus Stein
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Daten bitweise in Feld ablegen und später aggregieren?

  Alt 14. Jul 2006, 12:02
Hallo Markus,

warum greifst du mittels BDE auf einen MS SQL Server zu? Ist 1440 nur zufällig 24 * 60?

Das Speichern von bitcodierten Feldern kann dir niemand verbieten, aber da du später bestimmte Bits aggregieren möchtest sind deine Daten natürlich nicht normalisiert. Du kannst die fehlenden Operatoren als UDF implementieren - ganz ohne DLL, aber vielleicht gibt es eine deinem Problem angemessenere Lösung, wenn du etwas über die Natur deiner Daten und die benötigten Operatoren mitteilst.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Daten bitweise in Feld ablegen und später aggregieren?

  Alt 14. Jul 2006, 12:36
BDE leider aufgrund des verwendeten Frameworks... aber es ist bereits ein Umstieg auf ADO angedacht... Ich weiss, sogar Borland ratet eigentlich von der Verwendung der BDE mittlerweile ab...

Yep, 24 Std. * 60 Min = 1440 Min.
Es geht dabei um die minutenbasierte Verplanung eines Tages.
Bitweise deswegen, weil ich denke dass damit ein einfacheres übereinanderlegen von Zeitleisten mit bitweisem AND möglich ist, um somit herauszufinden, ob in diesem Zeitraum eine Überlappung existiert.

Bsp:
Delphi-Quellcode:
0 0 0 1 1 1 1
0 1 1 1 1 0 0
-------------
0 0 0 1 1 0 0
Das ganze sollte eben performant sein, und deswegen mengenorientiert, so dass die Datenbank dabei möglichst die Arbeit erledigen kann und nicht alles auf Clientseite einzelsatzorientiert abläuft.

UDF kenne ich bisher noch nicht... werd ich mir mal genauer anschaun.
Markus Stein
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Daten bitweise in Feld ablegen und später aggregieren?

  Alt 14. Jul 2006, 20:45
Hallo Markus,

Zitat von Shivan:
Das ganze sollte eben performant sein, und deswegen mengenorientiert, so dass die Datenbank dabei möglichst die Arbeit erledigen kann und nicht alles auf Clientseite einzelsatzorientiert abläuft.
deine Motive sind gut und richtig, aber die Folgerung ist nicht zwingend. Einzelsatzverarbeitung im Client darf man nicht pauschal verurteilen - teuer wird es nur wenn für jeden Satz eine Anfrage an den Server gerichtet wird.

Deine Zeitleisten kannst du auch als Zeitintervalle begreifen. Nehmen wir an die Tabelle "Zeiten" hat die Spalten "Start" und "Ende". Beide Spalten sind vom Typ float (smalldatetime kann für Zeitarithmetik als Float-Wert interpretiert werden). Deine Schnittmenge mit dem rechts offenen Intervall [pstart, pende) ergibt sich dann etwa so:

SQL-Code:
/* p-code */

select
  MaxFloat(pstart, start) as cstart,
  MinFloat(pende, ende) as cende
from zeiten
where MinFloat(pende, ende) >= MaxFloat(pstart, start)
Dabei kann die Schnittmenge eine Menge von Intervallen sein. Eine passende UDF könnte so aussehen:

SQL-Code:
CREATE FUNCTION dbo.MaxFloat (
  @value1 as float,
  @value2 as float
)
RETURNS float
AS
BEGIN
  DECLARE @result AS float
  IF (@value1 > @value2)
    set @result = @value1
  ELSE
    set @result = @value2
  return @result
END
Grüße

marabu
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Daten bitweise in Feld ablegen und später aggregieren?

  Alt 8. Aug 2006, 03:15
Hallo Marabu,

mit Hilfe deiner Idee, sowie einigen Erweiterungen:
- Erweiterung der Funktion auf 3 Werte (für 3 Dimensionen)
- direkter Vergleich von "datetime" anstatt float
- bei der Ermittlung die Verwendung eines Inner Joins unter Herausfilterung der Termine, welche sich erst garnicht berühren können

...bin ich nun ziemlich weit gekommen.

Danke!
Markus Stein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz