Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi kbmMemTable index with negativ Values not working (https://www.delphipraxis.net/209361-kbmmemtable-index-negativ-values-not-working.html)

Dieter.Soergel 26. Nov 2021 11:59

Datenbank: kbmMemtable • Version: 5.52 • Zugriff über: direct

kbmMemTable index with negativ Values not working
 
Hello,
I still use Delphi 7 and kbmMemTable V5.52.

I tried an Index on Column with this values:

MyCSVMEmTable.AddIndex('PK', 'MyFloats');

natural:
MyFloats
2.17332172393799
-2.54788446426392
22.841100692749
-2.18307662010193
-21.6549758911133


After Index:
MyFloats
2.17332172393799
-2.18307662010193
-2.54788446426392
-21.6549758911133
22.841100692749

Any ideas how to have an Index, which properly sorts Floatvalues?

Thank you
Dieter

Delphi.Narium 26. Nov 2021 12:31

AW: kbmMemTable index with negativ Values not working
 
Liste der Anhänge anzeigen (Anzahl: 2)
Delphi 7, kbmMemTable V5.72.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  for i := 100 downto -100 do begin
    tb.Append;
    if i mod 2 = 0 then begin
      tb.Fields[0].AsFloat := i / 42;
    end else begin
      tb.Fields[0].AsFloat := i / 42 * -1;
    end;
    tb.Post;
  end;
  tb.First;
  tb.PersistentFile := 'c:\temp\test_unsorted.kbmt';
  tb.Persistent := true;
  tb.PersistentSaved := false;
  tb.SavePersistent;
  tb.IndexName := 'Float';
  tb.First;
  tb.PersistentFile := 'c:\temp\test_sorted.kbmt';
  tb.Persistent := true;
  tb.PersistentSaved := false;
  tb.SavePersistent;
end;
Delphi-Quellcode:
  object tb: TkbmMemTable
    Active = True
    DesignActivation = True
    AttachedAutoRefresh = True
    AttachMaxCount = 1
    FieldDefs = <
      item
        Name = 'Float'
        DataType = ftFloat
      end>
    IndexDefs = <
      item
        Name = 'Float'
        Fields = 'Float'
      end>
    SortOptions = []
    PersistentBackup = False
    ProgressFlags = [mtpcLoad, mtpcSave, mtpcCopy]
    LoadedCompletely = False
    SavedCompletely = False
    FilterOptions = []
    Version = '5.72'
    LanguageID = 0
    SortID = 0
    SubLanguageID = 1
    LocaleID = 1024
    PersistentFormat = csv
    AllDataFormat = csv
  end
  object csv: TkbmCSVStreamFormat
    CommentChar = #0
    EscapeChar = '%'
    DefaultStringFieldSize = 255
    CSVQuote = '"'
    CSVFieldDelimiter = ','
    CSVRecordDelimiter = ','
    CSVTrueString = 'True'
    CSVFalseString = 'False'
    sfLocalFormat = []
    sfQuoteOnlyStrings = []
    sfNoHeader = []
    Version = '3.10'
    sfData = [sfSaveData, sfLoadData]
    sfCalculated = []
    sfLookup = []
    sfNonVisible = [sfSaveNonVisible, sfLoadNonVisible]
    sfBlobs = [sfSaveBlobs, sfLoadBlobs]
    sfDef = [sfSaveDef, sfLoadDef]
    sfIndexDef = [sfSaveIndexDef, sfLoadIndexDef]
    sfPlaceHolders = []
    sfFiltered = [sfSaveFiltered]
    sfIgnoreRange = [sfSaveIgnoreRange]
    sfIgnoreMasterDetail = [sfSaveIgnoreMasterDetail]
    sfDeltas = []
    sfDontFilterDeltas = []
    sfAppend = []
    sfFieldKind = [sfSaveFieldKind]
    sfFromStart = [sfLoadFromStart]
  end
Unsortiertes Ergebnis siehe Datei test_unseorted.kbmt.txt

Sortiertes Ergebnis siehe Datei test_sorted.kbmt.txt

Scheint korrekt zu funktionieren.


Translation per https://www.deepl.com/translator#de/en/

Unsorted result see file test_unseorted.kbmt.txt

Sorted result see file test_sorted.kbmt.txt

Seems to work correctly.

Sinspin 28. Nov 2021 09:42

AW: kbmMemTable index with negativ Values not working
 
Hi. Index means not sorting. To sort the data of the memtable, you need to call the methode SortOn(FieldNames: String).
FieldNames is then the field(s) where you want sort for.

An index is used to increase the speed of filter and sorting opertions but it does no automatically sorting (at the TKbmMemTable).

Delphi.Narium 28. Nov 2021 10:51

AW: kbmMemTable index with negativ Values not working
 
Sorry, aber das stimmt bei kbmMemTable nicht.

Wenn Du im Attribut IndexDef einen Index definiert hast, so kannst Du den Namen des Index zur Laufzeit mit Attribut
Delphi-Quellcode:
.IndexName := 'NameDesInIndexDefDefinirtenIndex'
setzen und der Inhalt der Tabelle wird entsprechend sortiert angezeigt.

Das funktioniert analog zu vielen anderen Datenbankkomponenten, bei denen Du die Sortierung durch Angabe des Indexnamens im Attribut IndexName festlegen kannst.

Dieter.Soergel 1. Dez 2021 10:48

AW: kbmMemTable index with negativ Values not working
 
Danke erstmal.
Hilft mir momentan leider noch nicht wirklich weiter.
Ich lese eine CSVDatei ein, habe also nur String-Felder (ftString).
Wie kann ich zur Laufzeit den Feldtyp ändern?

Gehen wir bei dem einfachen Beispiel davon aus, dass ich weiß welches Feld die Floats enthält.

Dieter

Delphi.Narium 1. Dez 2021 13:04

AW: kbmMemTable index with negativ Values not working
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Ich lese eine CSVDatei ein, habe also nur String-Felder (ftString).
Das ist ein Trugschluss. CSV heißt nicht zwingend: Das sind nur Zeichenfolgen. In der CSV stehen genau die Datentypen, die Du da reininterpretierst. Wenn Du definierst, dass eine Spalte vom Typ ftFloat ist, dann ist sie vom Typ ftFloat. Einzige Bedingung: Der Inhalt dieser Spalte muss konsequent und ausschließlich aus Daten vom Typ ftFloat sein.

Zeig' bitte mal ein Beispiel Deiner CSV-Datei, damit man sieht, um was es sich genau handelt.

Wenn Du weißt, wie der Aufbau der Tabelle in der Datei ist, dann definiere bitte die Felder in den FieldDefs der kbmMemTable im Objektinspektor entsprechend.

Anhängendes Projekt sollte Deine Beispieldaten korrekt aus einer CSV-Datei lesen und richtig sortiert anzeigen. Ist nur ein Schnellschuß ohne jeglichen Anspruch auf Schönheit ... ;-)

Dieter.Soergel 2. Dez 2021 09:09

AW: kbmMemTable index with negativ Values not working
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1498505)
Zitat:

Ich lese eine CSVDatei ein, habe also nur String-Felder (ftString).
..
Zeig' bitte mal ein Beispiel Deiner CSV-Datei, damit man sieht, um was es sich genau handelt.


DANKE!

Die Datei sieht so aus (hat also einen Header)

MyFloats
2.17332172393799
-2.54788446426392
22.841100692749
-2.18307662010193
-21.6549758911133

Wir können auch gerne zwei Spalten verwenden, Separator kann ; oder auch , sein.
(Sollte aber für die Lösung relativ unwichtig sein.)

AString;MyFloats
Hans;2.17332172393799
Peter;-2.54788446426392
Claudia;22.841100692749
Erwin;-2.18307662010193
Manuela;-21.6549758911133

Delphi.Narium 2. Dez 2021 10:00

AW: kbmMemTable index with negativ Values not working
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anhängend eine neue Version.

Habe lediglich die Feld- und Indexdefinitionen angepasst und in der CSV-Komponenten bei der Eigenschaft sfNoHeader sfSaveNoHeader und sfLoadNoHeader auf False gesetzt.

Dieter.Soergel 2. Dez 2021 17:21

AW: kbmMemTable index with negativ Values not working
 
Alles klar.
Danke für die Mühe.


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