Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Status von 12 DBCheckboxen abspeichern in einer Datenbank (https://www.delphipraxis.net/169106-status-von-12-dbcheckboxen-abspeichern-einer-datenbank.html)

RWarnecke 28. Jun 2012 19:28

Datenbank: egal • Version: egal • Zugriff über: egal

Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Hallo zusammen,

ich muss in einer Anwendung 12 DBCheckboxen (Januar - Dezember) einfügen. Eine Umstellung auf normale Checkboxen wird sehr schwierig, da die ganze Anwendung auf die DB-Komponenten ausgelegt ist. Wie kann ich die Werte der DBCheckboxen am geschicktesten in einem Feld in einer Datenbanktabelle abspeichern ? Als Ergebnis sollte folgendes rauskommen :
Zitat:

011110000111
Der Grund für das Ergebnis ist eine vereinfachte Abfrage für die Monate. So könnte ich bei dem Ergebnis hergehen und einfach folgendes abfragen :
Delphi-Quellcode:
procedure TForm6.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to Length(DBFeldMonate) do
  begin
    case StrToInt(DBFeldMonate[i]) of
      0 : // Aktion für False
      1 : // Aktion für True
    end;
  end;
end;
DBFeldMonate enthält zum Beispiel das Ergebnis aus dem Zitat als String. Wie bekomme ich die Werte der 12 DBCheckboxen in so ein Ergebnis ?

himitsu 28. Jun 2012 19:36

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
DB-Komponenten sind nunmal dafür ausgelegt, daß sie ihre Werte selbständig aus einem DataSet einer DataSource holen.

Da würde es sich einfach mit Nicht-DB-Komponenten machen, welche mam manuell auslesen und befüllen könnte.
Aber notfalls kannst'e dir ja eine TDateSource und ein TClientDataSet, TMemDataSet oder Dergleichen als Zwischenspeicher benutzen.



Wenn es nur ums Anzeigen ginge, dann könntest du beim Abrufen mehrere "Felder" aus diesem einem Feld erzeugen, wo dann die jeweiligen Komponenten drangehangen werden.
SQL-Code:
SELECT (substr(deinfeld, 1, 1) = '1') AS feld1, (substr(deinfeld, 2, 1) = '1') AS feld2, ...
, oder so.
Alternativ eben auch über CalcFields.

haentschman 28. Jun 2012 19:38

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Hallo...
Zitat:

Wie kann ich die Werte der DBCheckboxen am geschicktesten in einem Feld
...gar nicht, da jede DBCheckBox ein eigenes Feld verlangt. Die Variante mit den normalen Checkboxen und den "Wert" zusammenzusetzen ist eher die Wahl.

RWarnecke 28. Jun 2012 20:46

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Zitat:

Zitat von haentschman (Beitrag 1172898)
Hallo...
Zitat:

Wie kann ich die Werte der DBCheckboxen am geschicktesten in einem Feld
...gar nicht, da jede DBCheckBox ein eigenes Feld verlangt. Die Variante mit den normalen Checkboxen und den "Wert" zusammenzusetzen ist eher die Wahl.

Das habe ich schon fast vermutet. Dann muss ich wohl über ein DBEdit den Wert in der Datenbank speichern und dieses DBEdit von den normalen Checkboxen füllen lassen. Das halte ich aber für sehr unsauber. Hättet Ihr noch eine anderen Vorschlag, wie ich das realisieren kann ?

himitsu 28. Jun 2012 21:15

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Unsauber:
Warum ein (unsichtbares) DBEdit, wo man auch direkt an das DataSet rankommt?

Das ist ja wie ein TMemo, welches man als TStringList mißbraucht. :stupid:

Furtbichler 28. Jun 2012 22:42

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Du musst doch nur auf einen Recordwechsel reagieren und beim Clicken die Bits setzen. Falls das Dataset noch nicht im Editmodus ist, rufst Du einfach DataSet.Edit auf.

sx2008 28. Jun 2012 23:13

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Control TDBBitwiseCheckBox kann man mit einem Integerfeld in einem Dataset verbinden und so bis zu 32 Checkboxen mit einem Feld verknüpfen.

RWarnecke 29. Jun 2012 06:35

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Hallo zusammen,

danke für Eure Antworten. Ich habe jetzt nochmal eine Nacht drüber geschlafen und werde es jetzt folgendermaßen machen. Die Zustände der 12 DBCheckboxen werden jeweils einzeln in einem Feld in der Datenbanktabelle gespeichert. Wenn ich auf die Werte zugreifen möchte, werden diese im SQL-Befehl zu dem Ergebnis aus meinem Zitat im ersten Beitrag zusammengebaut, so das der SQL-Befehl mir ein Feld mit dem Ergebnis ausgibt und nicht 12 Felder.

Zitat:

Zitat von sx2008 (Beitrag 1172919)
Das Control TDBBitwiseCheckBox kann man mit einem Integerfeld in einem Dataset verbinden und so bis zu 32 Checkboxen mit einem Feld verknüpfen.

Ein Integerfeld gibt in einer Datenbank aber keine führenden Nullen aus oder irre ich mich da ? Oder kommt das wiederum auf den Typ Datenbank an ?

Bummi 29. Jun 2012 07:04

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
ist doch nur eine Frage der Darstellung
5 = 101 = 00000000000000000000000000000101 = 000000000101

Furtbichler 29. Jun 2012 07:17

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Du musst ja deine 12 Monate nicht als String verpacken. So ginge es ja auch:

Delphi-Quellcode:
For Monat :=1 to 12 do
  if (1 shl Monat) and DatenbankFeldDasDieMonateAlsBitsSpeichert <> 0 then
    // Aktion für 'Monat ist angekreuzt'
  else
    // Aktion für 'Monat ist nicht angekreuzt'
Das klingt mir alles sehr nach 'von Hinten durch die Brust ins Auge'. Was willst Du denn mit den angekreuzten Monaten anfangen?

RWarnecke 29. Jun 2012 07:30

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Zitat:

Zitat von Furtbichler (Beitrag 1172928)
Das klingt mir alles sehr nach 'von Hinten durch die Brust ins Auge'. Was willst Du denn mit den angekreuzten Monaten anfangen?

Ich will damit die Lohnabrechnung steuern. Es soll einfach beim Erstellen der Gehaltsabrechnungen geprüft werden, hat der Mitarbeiter diesen Monat gearbeitet oder nicht. Wenn nein (kein Haken gesetzt in der Checkbox), dann soll die Gehaltsabrechnung nicht erstellt werden. Ist der Haken gesetzt, soll die Gehaltsabrechnung erstellt werden.

DeddyH 29. Jun 2012 07:48

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Delphi-Quellcode:
type
  TWorkMonth = (wmJanuary, wmFebruary, wmMarch, wmApril, wmMay, wmJune, wmJuly,
    wmAugust, wmSeptember, wmOctober, wmNovember, wmDecember);

function WorkedThatMonth(aMonth: TWorkMonth; aBitmask: word): Boolean;
begin
  Result := aBitmask and (1 shl Ord(aMonth)) <> 0;
end;

procedure TFormDings.ButtonBumsClick(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 12 do
    TCheckBox(FindComponent('Checkbox' + IntToStr(i))).Checked :=
      WorkedThatMonth(TWorkMonth(i - 1), 10);
end;

Bummi 29. Jun 2012 08:40

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Das schreit nach einer 1:n Struktur... (denk nur mal an die Folgejahre)

RWarnecke 29. Jun 2012 17:57

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Zitat:

Zitat von Bummi (Beitrag 1172935)
Das schreit nach einer 1:n Struktur... (denk nur mal an die Folgejahre)

Ich verstehe gerade nur Bahnhof. Wieso an die folge Jahre ? Wieso schreit das nach einer 1:n Struktur ? Habe ich da noch einen Denkfehler gemacht für die Lohnabrechung ?

Bummi 29. Jun 2012 18:41

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Ich habe möglicherweise falsche Vorstellungen von Deinen Daten und dem was Du tust.
-Erfasst Ihr die Arbeitszeiten oder Tage pro Mitarbeiter? (dann wären die Checkboxen hinfällig)
-Wird die Abrechnung monatlich durchgeführt? (dann gäbe es eine Tabelle mit MA,Abrechnungsdatum,Betrag etc.)
-wo und wie werden die Daten der Abrechnungen über die Jahre gespeichert?

möglicherweise habe ich ein zu komplexes Bild von der Datenbank ...

Furtbichler 30. Jun 2012 09:10

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Ich kenne das so:
In einer Tabelle stehen Leistungen, also z.B. für jeden Tag ein Eintrag (Mitarbeiter, Datum,Kommen-Zeit, Gehen-Zeit, Pause etc.)
Am Monatsende werden aus der Leistungstabelle alle noch nicht in Rechnung gestellten Einträge extrahiert und daraus pro Mitarbeiter eine Rechnung erstellt.

Fertig.

Die Information, ob ein Mitarbeiter im Juni gearbeitet hat (Juni 2012) ergibt sich aus der Frage, ob es in der Leistungstabelle einen Eintrag gibt, dessen 'Datum'-Feld zwischen dem 1.6. und 31.6 liegt.

jobo 30. Jun 2012 19:38

AW: Status von 12 DBCheckboxen abspeichern in einer Datenbank
 
Am 31.6. sollte es schon mal keine Einträge geben.
;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 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