Datenbank sortieren: Datentyp-Fehler

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

Hallo,

bin gerade dabei meine Dbase Datebank zu sortieren. Funktioniert auch ganz gut. Will ich jetzt aber zwei Spalten gleichzeitig sortieren
bekomme ich ein Problem mit den Datentypen....

Code: Alles auswählen

 
Dbf1.AddIndex('Reihenfolge1', 'Startuhrzeit+Starttermin', []);   
Dbf1.IndexName:='Reihenfolge1';
 


Code: Alles auswählen

 
   Add('Starttermin',ftDate,10,True);
   Add('Startuhrzeit',ftString,10,True);
 


Mache ich beim erstellen der Datenbank bei Starttermin ein ftString draus, funktioniert das sortieren wie gewünscht aber halt einfach falsch, da quasi nur auf Tag und nicht
den Monat sortiert wird....


Fehler: Invalid index type: can only be string or float.

Kennt jemand eine Lösung??

Danke vorab!

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

Keiner eine Idee?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von Michl »

Sollte so gehen:

Code: Alles auswählen

Dbf1.AddIndex('Reihenfolge1', 'DTOS(Startuhrzeit)+Starttermin', []); 
Siehe http://wiki.freepascal.org/Lazarus_Tdbf ... Ffunctions

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

Guten Morgen,

vielen Dank für die Antwort. Allerdings bekomme ich die folgende Fehlermeldung:

Code: Alles auswählen

 
 
Projekt hat Exception-Klasse >>EParserException<< ausgelöst mit der Meldung:
Argument type mismatch
Bei Adresse 67782F.
 


Ignoriere ich den Fehler funktioniert der Index aber wie gewollt....An was könnte das liegen?

Außerdem habe ich mittlerweile noch ein weiteres Problem.
Ich möchte eine bestimmte Zelle in meinem Worksheet suchen. In der Zeile wo sich die gesuchte Zelle befindet soll dann in einer bestimmten Zelle etwas geschrieben werden.
Woher bekomme ich den Wert in welcher Zeile sich die gesuchte Zelle befindet?

Ich hab das so probiert, funktioniert allerdings nicht da er immer in die erste Zeile der Excel-Datei schreibt (bzw. diese aktiv ist).

Code: Alles auswählen

 
 MyWorksheet.FindCell(Panel_AP1_Auftrag.Caption);
 MyWorksheet.WriteCellValueAsString(MyWorksheet.ActiveCellRow,15,'X');
 


Vielen Dank für die Hilfe vorab!

Grüße l0lhaxx

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von wp_xyz »

Schau dir das an: http://wiki.lazarus.freepascal.org/FPSp ... _replacing - hier wird beschrieben, wie du eine bestimmte Zelle suchen kannst.

l0lhaxx hat geschrieben:

Code: Alles auswählen

 
  MyWorksheet.FindCell(Panel_AP1_Auftrag.Caption);
 


FindCell ist dafür da, die Zelle aus den Spalten/Zeilen-Indices zu ermitteln. So wie du das schreibst, kann das nicht gehen, weil zwei Integer-Parameter erwartet werden, du aber einen String-Parameter übergibst. Außerdem verwirfst du das Suchergebnis.

l0lhaxx hat geschrieben:

Code: Alles auswählen

 
 MyWorksheet.WriteCellValueAsString(MyWorksheet.ActiveCellRow,15,'X');
 


ActiveCellRow wurde eingeführt, damit das Worksheet besser mit dem WorksheetGrid zusammenarbeiten kann, und bezeichnet die Zeile derjenigen Zelle, die per "SelectCell" angewählt wurde. Der Wert wird durch normale Lese/Schreib-Operationen im Worksheet nicht verändert.

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

wp_xyz hat geschrieben:Schau dir das an: http://wiki.lazarus.freepascal.org/FPSp ... _replacing - hier wird beschrieben, wie du eine bestimmte Zelle suchen kannst.


Das habe ich bereits versucht. Problem ist nur das er die Unit nicht finden kann. Den Grund kenne ich leider nicht...

Code: Alles auswählen

 
Projekt kompilieren, Ziel: project1.exe: Exit code 1, Fehler: 2
unit1.pas(129,19) Error: Identifier not found "TsSearchParams"
unit1.pas(129,33) Error: Error in type definition
 


Code: Alles auswählen

 
var
  Form1: TForm1;
  MyWorkbook: TsWorkbook;
  MyWorksheet: TsWorksheet;
  MySearchParams: TsSearchParams;
 

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von wp_xyz »

l0lhaxx hat geschrieben:Das habe ich bereits versucht. Problem ist nur das er die Unit nicht finden kann. Den Grund kenne ich leider nicht...

Code: Alles auswählen

 
Projekt kompilieren, Ziel: project1.exe: Exit code 1, Fehler: 2
unit1.pas(129,19) Error: Identifier not found "TsSearchParams"
unit1.pas(129,33) Error: Error in type definition
 

Ist das Package laz_fpspreadsheet als für das Projekt benötigtes Package eingetragen (Projekt-Inspektor > "Benötigte Packages", Rechtsklick, "Hinzufügen", "Package-Name" laz_fpspreadsheet)? Damit findet das Projekt alles, was zu fpspreadsheet gehört (aber nicht die visuellen Komponenten). Und die Unit fpsSearch muss natürlich unter "uses" augeführt sein

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von Michl »

l0lhaxx hat geschrieben:Ignoriere ich den Fehler funktioniert der Index aber wie gewollt....An was könnte das liegen?
Wie hast du denn deine Felder definiert? So wie du im Eingangspost geschrieben hattest? Dann sollte es eigentlich funktionieren.

Habe es eben getestet, bei mir geht das hier:

Code: Alles auswählen

    Dbf.FieldDefs.Add('DATE', ftDate);
    Dbf.FieldDefs.Add('TIME', ftString, 5);   
... 
  DataModule1.Dbf.AddIndex('Test', 'DTOS(DATE)+TIME', []);
  DataModule1.Dbf.IndexName := 'Test';       

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

Ist das Package laz_fpspreadsheet als für das Projekt benötigtes Package eingetragen (Projekt-Inspektor > "Benötigte Packages", Rechtsklick, "Hinzufügen", "Package-Name" laz_fpspreadsheet)? Damit findet das Projekt alles, was zu fpspreadsheet gehört (aber nicht die visuellen Komponenten). Und die Unit fpsSearch muss natürlich unter "uses" augeführt sein


Ist alles vorhanden. Aber funktioniert wie gesagt trotzdem nicht...


@Michl: Exakt so habe ich es auch gemacht. Funktionieren tut es ja eigentlich auch, nur die Fehlermeldung kommt immer nach dem Programmstart.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von wp_xyz »

Ah, dann nimmst du vielleicht die Version 1.6.2 - seh gerade, dass das Suchen da noch nicht implementiert ist, im Trunk dagegen schon.

Falls du bei 1.6.2 bleiben willst, musst du die betreffenden Zellen durchlaufen und prüfen, ob der Zellinhalt dem Suchtext entspricht. Etwa so:

Code: Alles auswählen

function SucheZelle(Inhalt: String; out GefundenInZeile, GefundenInSpalte: Cardincal): Boolean;
var
  sheet: TsWorksheet;
begin
  Result := true;
  for GefundenInZelle := 0 to sheet.GetLastRowIndex(true) do
    for GefundenInSpalte := 0 to sheet.GetLastcolIndex(true) do
      if sheet.ReadCellAsText(GefundenInZeile, GefundenInSpalte) = Inhalt then
        exit;
  GefundenInSpalte := Cardinal(-1);
  GefundenInZeile := Cardinal(-1);
  Result := false;
end;

Achtung: Das ist nicht getestet, weil ich mir gestern mein fpspreadsheet "zer-bessert" habe und sourceforge mal wieder down ist, so dass ich mir die Version vom Netz nicht laden kann.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von Michl »

l0lhaxx hat geschrieben:Exakt so habe ich es auch gemacht. Funktionieren tut es ja eigentlich auch, nur die Fehlermeldung kommt immer nach dem Programmstart.
Ich habe das nochmal hier probiert. Den oben genannten Fehler bekomme ich nur, wenn ich das Datum nicht im Format ftDate erstelle.

Möglicherweise liegt das aber auch daran, dass wir unterschiedliche Voraussetzungen haben. Getestet habe ich: Windows 7, 32bit Lazarus Trunk/FPC Trunk und auch 32bit Lazarus 1.6/FPC 3.0.0. Im Testprojekt nutze ich TableLevel 7: http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial#Choosing_a_TableLevel

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von l0lhaxx »

wp_xyz hat geschrieben:Ah, dann nimmst du vielleicht die Version 1.6.2 - seh gerade, dass das Suchen da noch nicht implementiert ist, im Trunk dagegen schon.

Falls du bei 1.6.2 bleiben willst, musst du die betreffenden Zellen durchlaufen und prüfen, ob der Zellinhalt dem Suchtext entspricht. Etwa so:

Code: Alles auswählen

function SucheZelle(Inhalt: String; out GefundenInZeile, GefundenInSpalte: Cardincal): Boolean;
var
  sheet: TsWorksheet;
begin
  Result := true;
  for GefundenInZelle := 0 to sheet.GetLastRowIndex(true) do
    for GefundenInSpalte := 0 to sheet.GetLastcolIndex(true) do
      if sheet.ReadCellAsText(GefundenInZeile, GefundenInSpalte) = Inhalt then
        exit;
  GefundenInSpalte := Cardinal(-1);
  GefundenInZeile := Cardinal(-1);
  Result := false;
end;

Achtung: Das ist nicht getestet, weil ich mir gestern mein fpspreadsheet "zer-bessert" habe und sourceforge mal wieder down ist, so dass ich mir die Version vom Netz nicht laden kann.


Darauf muss man auch erstmal kommen. Ich hab jetzt aber keine Lust wieder mit den Package mist mich rum zu ärgern. Hab es jetzt so ähnlich gelöst wie von dir Vorgeschlagen. Funktioniert soweit auch, nur ist es halt nichts ganz so hübsch.
Dank dir!

Michl hat geschrieben:Ich habe das nochmal hier probiert. Den oben genannten Fehler bekomme ich nur, wenn ich das Datum nicht im Format ftDate erstelle.

Möglicherweise liegt das aber auch daran, dass wir unterschiedliche Voraussetzungen haben. Getestet habe ich: Windows 7, 32bit Lazarus Trunk/FPC Trunk und auch 32bit Lazarus 1.6/FPC 3.0.0. Im Testprojekt nutze ich TableLevel 7: http://wiki.freepascal.org/Lazarus_Tdbf_Tutorial#Choosing_a_TableLevel


Wirklich komisch, bei mir scheint alles etwas verrückt zu spielen :)
Ich probier mich später nochmal daran. Vielleicht hab ich ja etwas übersehen. Auch dir schon mal besten Danke!

Zwei Fragen hätte ich jetzt aber noch :)

1. Ich versuche mehrere Strings miteinander zu verknüpfen und diese in ein Feld in der Excel-Datei zu schreiben. Dazu nutze ich folgenden Code:

Code: Alles auswählen

 
MyWorksheet.WriteCellValueAsString(5,16,'-'+Panel_AP1_Zeit.caption+Panel_AP1_Zeit1.caption+Panel_AP1_Zeit2.caption);
 


Als Ergebnis wird in die Excel-Datei aber immer nur das Minus ausgegeben. Der String wird einfach nicht verknüpft?
Was mache ich falsch?

2. Ich kann keine .xlsm Dateien einlesen. Wenn ich diese Excel-Datei im Format .xls abspeicher funktioniert aber das einlesen.

Code: Alles auswählen

 
uses
  Classes, SysUtils, dbf, db, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Menus, DbCtrls, DBGrids, ComCtrls, Calendar, LazUTF8,
  fpsTypes, fpspreadsheet, xlsbiff8, fpsutils, fpsallformats, DateTimePicker;
 
type
  TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
  sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser);
 


Habe aber eigentlich die fpsallformats mit angefügt. Wo liegt hier mein Fehler?

Danke euch!

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von wp_xyz »

l0lhaxx hat geschrieben:Zwei Fragen hätte ich jetzt aber noch :)

1. Ich versuche mehrere Strings miteinander zu verknüpfen und diese in ein Feld in der Excel-Datei zu schreiben. Dazu nutze ich folgenden Code:

Code: Alles auswählen

 
MyWorksheet.WriteCellValueAsString(5,16,'-'+Panel_AP1_Zeit.caption+Panel_AP1_Zeit1.caption+Panel_AP1_Zeit2.caption);
 


Als Ergebnis wird in die Excel-Datei aber immer nur das Minus ausgegeben. Der String wird einfach nicht verknüpft?
Was mache ich falsch?

2. Ich kann keine .xlsm Dateien einlesen. Wenn ich diese Excel-Datei im Format .xls abspeicher funktioniert aber das einlesen.

Code: Alles auswählen

 
uses
  Classes, SysUtils, dbf, db, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Menus, DbCtrls, DBGrids, ComCtrls, Calendar, LazUTF8,
  fpsTypes, fpspreadsheet, xlsbiff8, fpsutils, fpsallformats, DateTimePicker;
 
type
  TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
  sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser);
 


Habe aber eigentlich die fpsallformats mit angefügt. Wo liegt hier mein Fehler?


Zu (1): Das kann ich nicht reproduzieren. Sind die Panel.captions evtl. LeerStrings? Ich mache das standardmäßig, weil ich die Captions auf den Panels nicht sehen will.

Zu (2): fpsAllFormats klingt nach "alle Formate, die es gibt", es meint aber "alle Formate, die unterstützt werden". Und xlsm wird nicht unterstützt. Allerdings ist mein Eindruck, dass xlsm identisch ist mit xlsx. Daher müsste man dem xlsx-Reader nur beibringen, auch die Endung xlsm zu akzeptieren. Ich kann mir das ja mal bei Gelegenheit ansehen...

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datenbank sortieren: Datentyp-Fehler

Beitrag von wp_xyz »

OK, fpspreadsheet trunk kann nun auch xlsm-Dateien lesen und schreiben. Lt http://www.askingbox.de/frage/excel-unt ... m-und-xlsb sind xlsx und xlsm Dateien tatsächlich identisch (bis auf Makro-Unterstützung bei xlsm (m = macro), und das kann fpspreadsheet eh' nicht).

Antworten