AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi kbmMemTable index with negativ Values not working
Thema durchsuchen
Ansicht
Themen-Optionen

kbmMemTable index with negativ Values not working

Ein Thema von Dieter.Soergel · begonnen am 26. Nov 2021 · letzter Beitrag vom 2. Dez 2021
Antwort Antwort
Dieter.Soergel

Registriert seit: 27. Aug 2008
7 Beiträge
 
#1

kbmMemTable index with negativ Values not working

  Alt 26. Nov 2021, 11:59
Datenbank: kbmMemtable • Version: 5.52 • Zugriff über: direct
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#2

AW: kbmMemTable index with negativ Values not working

  Alt 26. Nov 2021, 12:31
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.
Angehängte Dateien
Dateityp: txt test_unsorted.kbmt.txt (4,4 KB, 0x aufgerufen)
Dateityp: txt test_sorted.kbmt.txt (4,4 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
618 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: kbmMemTable index with negativ Values not working

  Alt 28. Nov 2021, 09:42
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).
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#4

AW: kbmMemTable index with negativ Values not working

  Alt 28. Nov 2021, 10:51
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 .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.
  Mit Zitat antworten Zitat
Dieter.Soergel

Registriert seit: 27. Aug 2008
7 Beiträge
 
#5

AW: kbmMemTable index with negativ Values not working

  Alt 1. Dez 2021, 10:48
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#6

AW: kbmMemTable index with negativ Values not working

  Alt 1. Dez 2021, 13:04
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 ...
Angehängte Dateien
Dateityp: zip Test.zip (5,2 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Dieter.Soergel

Registriert seit: 27. Aug 2008
7 Beiträge
 
#7

AW: kbmMemTable index with negativ Values not working

  Alt 2. Dez 2021, 09:09
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#8

AW: kbmMemTable index with negativ Values not working

  Alt 2. Dez 2021, 10:00
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.
Angehängte Dateien
Dateityp: zip _Test.zip (4,9 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Dieter.Soergel

Registriert seit: 27. Aug 2008
7 Beiträge
 
#9

AW: kbmMemTable index with negativ Values not working

  Alt 2. Dez 2021, 17:21
Alles klar.
Danke für die Mühe.
  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 06:49 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