Fragezeichen statt Umlaute

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

natürlich in Connect

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Guten Morgen hde

Ich benutze noch die SQLdb (mit Zeos stehe ich noch auf Kriegsfuß. Da bekomme ich keine Verbindung zur DB)

Diese Fehlermeldung bekomme ich derzeit
hauptfenster.pas(240,32) Fehler: Bezeichener verweist nicht auf ein Element: OnGetText

Code: Alles auswählen

DBGrid1.DataSource.DataSet.OnGetText:= @ConvertiereText;
Im Moment bin ich so weit:

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  OnGetText: Pointer;
begin
    suchen:='';
    jahr:=Combobox1.Items[ComboBox1.ItemIndex];
    EditSuchen.Visible:=True;
    EditSuchen.Text:='';
    ButtonSuchen.Visible:=True;
    //Erst mal Verbindungen schliessen
    SQLQuery1.Active:=False;
    Datasource1.Enabled:=True;
    // SQLQuery1 leeren
    SQLQuery1.SQL.Clear;
    strQuery := Format('SUM( CASE WHEN YEAR(tz.dDatum) = %s THEN tz.fBetrag ELSE 0 END) [%s] ', [jahr, jahr]);
    SQLQuery1.SQL.ADD(Format(sqlQuery, [strQuery, jahr]));
 
 //Hier wird der Combobox Eintrag der gewählt wurde eingetragen
    //Eintrag Betrag ändern Verbindungen wieder öffnen
 
    DBGrid1.COLUMNS.Items[8].Title.Caption := '*Umsatz bezahlt '+ jahr;
    DBGrid1.COLUMNS.Items[8].FieldName := jahr;
 
      begin
  IF (jahr = 'Gesamt') Then
begin
    //Erst mal Verbindungen schliessen
    SQLQuery1.Active:=False;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.ADD(Format(sqlQuery, ['SUM(tz.fBetrag) AS [Gesamt]', 'Gesamt']));
  end;
  SQLQuery1.Active:= True;
 
    DBGrid1.DataSource.DataSet.OnGetText:= @ConvertiereText;
end;
 
     // Jahres Gesamtumsatz berechnen
  // Verhindern, dass die Anzeige ständig aktualisiert wird:
  SQLQuery1.DisableControls;
  SQLQuery1.first;
  summe:=0;
  while NOT SQLQuery1.eof do
  begin
      summe:=summe+SQLQuery1.FieldByName(jahr).AsFloat;
    SQLQuery1.next;
  end;
  begin
  SQLQuery1.EnableControls;
  SQLQuery1.first;
  Label3.Caption:= 'Umsatz für: ' +jahr;
  EditGesUmsatz.Text:=FloatToStrF(summe, ffCurrency, 8, 2);
  summeKunden:=0;
  summeKunden:=SQLQuery1.RecordCount;
  Label1.Caption:= 'Kunden Gesamt: '+IntToStr(summeKunden);
  end;
  end;
@ConvertiereText sieht so aus:

Code: Alles auswählen

procedure TForm1.ConvertiereText(DataSet: TDataSet);
var
 umlaut : Integer;
begin
 
   //Disable Screen UPDATE
   DBGrid1.DataSource.DataSet.DisableControls;
   DBGrid1.DataSource.DataSet.First;
 
   While NOT (DBGrid1.DataSource.DataSet.Eof) Do
   Begin
     FOR umlaut := 0 TO DBGrid1.COLUMNS.Count -1 Do
     Begin
       DBGrid1.COLUMNS[umlaut].FIELD.Value := AnsiToUTF8(DBGrid1.COLUMNS[umlaut].FIELD.AsString);
     End;
     DBGrid1.DataSource.DataSet.Next;
   End;
 
   DBGrid1.DataSource.DataSet.First;
 
   //Enable Screen UPDATE
   DBGrid1.DataSource.DataSet.EnableControls;
end;
Und Danke dass du mir nicht vorwirfst zu Faul zum suchen zu sein. Ich stehe halt ganz am Anfang vom Programmieren und Google mich so durch.
Ich hab es ja schon dank socke und DiBo33 geschafft meine Statistik bis hier her zu Programmieren.
Außerdem sind doch Foren da zum Fragen ???

Habe auch die 2 Bücher: Lazarus UND Free Pascal 2, aber irgend wie komme ich hier nicht weiter.

EDIT: Sorry !! ich habe vielleicht vergessen zu sagen, dass die Querys zur Laufzeit erstellt werden. Ich habe also keine Params und somit auch kein OnGetText.
Ich versuche gerade das Ganze mit OnCalcFields aber so wie es aussieht ignoriert er das bzw. macht Gar nichts.

Gruß
Laines
Zuletzt geändert von Lori am So 25. Sep 2011, 17:44, insgesamt 2-mal geändert.
Grund: Bitte richtigen Highlighter nutzen

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Hallo Laines,
ich bin zwar ein uralter IT.Opa aber mit Lazarus befasse ich mich bisher nur nebenbei und erst seit kurzem. Mit SQLdb hab ich noch nichts gemacht weil Zeos einfacher ist. Die Umwandlung utf8-ansii macht Zeos z.B. automatisch wenn du es einmal pro Verbindung im Connect angibst.

Dein Prog sieht mir auf den ersten Blick so aus als könnte man's viel einfacher machen, hab aber keine Zeit mich reinzudenken. Dass du die SQL-Abfrage dynamisch erstellst besagt nicht, dass du kein Queryobjekt hast. Allerdings kennt auch dies keinen Event OnGetText, sondern den gibt's bei TFields. Wenn du schon so programmierst, warum läufst du das Grid nicht einfach nach seiner Füllung durch? (alle Rows, Columns)

mfg hde

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Hallo hde

Wie ich bereits erwähnte bin ich absoluter Neuling. Das mit dem Einfacher machen kommt später.
Ich würde ja gerne ZEOSLIB nehmen aber ich bekomme keine Verbindung.

Fehlermeldung: None of ... ntwdblib.dll

Hab bereits herausgefunden, dass die DLL von win 7 64BIT nicht unterstützt wird.
Und ADO von dem hier im Forum immer die Rede ist, ist nicht in der Auswahl.

Mein System:
Windows 7 64BIT
Windows Server 2008 mit einer MSSQL 2008 DB

Kannst du mir BITTE ! BITTE (leienhaft) erklären, wie ich eine Verbindung über ZEOS bekomme.

Gruß und Danke nochmal
Laines

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Wenn du es mit SQLdb hinbekommst ist's doch auch ok. Versuch es mit nem Loop je Row und Column. Unter Windows sollte AnsiToUTF8 funktionieren. Für den Ausstausch zwischen word:mac und Lazarus unter OS X 10.6.8 musste ich von selbst programmieren (etwas kompliziert weil die Umlaute 2 Byte brauchen)

ADO und ODBC wird bei Zeos nicht angeboten, obwohl es eigentlich gehen müsste weil die Sourcen da sind. Zeos geht lieber den direkten Weg, finde ich auch besser.

Nachteil: man braucht die Client.dll der entsprechenden Datenbankserver. MSSQL setze ich nie ein, weil sie nur unter Windows läuft. Ich weiss also nicht, welche DLL du brauchst.

Zeos will eine ntwdblib.dll

Such ob du die hast oder bekommst. Kopier dies nach SysWOW64 bzw. System32.

Falls du das hast und es geht immer noch nicht, lade aus dem Zeos-Ordner/src/plain die Datei ZPlainDbLibMsSql7.pas. Suche

const
WINDOWS_DLL_LOCATION = 'ntwdblib.dll';

dies ist die Stelle wo Zeos die DLL sucht. Setze den Pfad (mit Datei) komplett ein, speicher die Datei zurück und kompiliere Lazarus neu. Falls Zeos mit deiner Version der Datenbank klar kommt, müsste es dann gehn.

mfg hde

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Christian »

hde, diene Tipps sind teilweise unnütz weil mssql kein UTF8 unterstützt. Solche Settings wie in den Parametern werden rein gar nichts nützen. Der Tipp mit der ntwdblib stimmt aber, sie ist im Setup zum SQL Server 2000 enthalten man kann sie aber auch an diversten Stellen im Netz direkt runterladen.
Um ANSI wirst du aber mit MSSQL nicht rum kommen jedenfalls solang du richtige Sortierung brauchst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Danke für eure Antworten.
Aber nun zurück zum Thema
Ich habe mich entschieden, bei SQLdb zu bleiben und nicht auf ZEOSLib umzusteigen. Also brauch ich eure Hilfe wie ich aus meinem DBGrid diese blöden ? (Fragezeichen) in die passenden Umlaute umwandeln kann.

Hier hab ich mal diesen Lösungsansatz versucht , aber jede mir bekannte Konstellation brachte gar nichts.

DBGrid1.DataSource.DataSet.OnCalcFields:=@ConvertiereText; wird komplett ignoriert.

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
    suchen:='';
    jahr:=Combobox1.Items[ComboBox1.ItemIndex];
    EditSuchen.Visible:=True;
    EditSuchen.Text:='';
    ButtonSuchen.Visible:=True;
    //Erst mal Verbindungen schliessen
    SQLQuery1.Active:=False;
    Datasource1.Enabled:=True;
    // SQLQuery1 leeren
    SQLQuery1.SQL.Clear;
    strQuery := Format('SUM( CASE WHEN YEAR(tz.dDatum) = %s THEN tz.fBetrag ELSE 0 END) [%s] ', [jahr, jahr]);
    SQLQuery1.SQL.ADD(Format(sqlQuery, [strQuery, jahr]));
 
 //Hier wird der Combobox Eintrag der gewählt wurde eingetragen
    //Eintrag Betrag ändern Verbindungen wieder öffnen
 
    DBGrid1.COLUMNS.Items[8].Title.Caption := '*Umsatz bezahlt '+ jahr;
    DBGrid1.COLUMNS.Items[8].FieldName := jahr;
 
      begin
  IF (jahr = 'Gesamt') Then
begin
    //Erst mal Verbindungen schliessen
    SQLQuery1.Active:=False;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.ADD(Format(sqlQuery, ['SUM(tz.fBetrag) AS [Gesamt]', 'Gesamt']));
  end;
  DBGrid1.COLUMNS.Items[8].DisplayFormat:= '##,###,##0.00 €';
  SQLQuery1.Active:= True;
  DBGrid1.DataSource.DataSet.OnCalcFields:=@ConvertiereText;
end;
 
     // Jahres Gesamtumsatz berechnen
  // Verhindern, dass die Anzeige ständig aktualisiert wird:
  SQLQuery1.DisableControls;
 
USW 
....
DBGrid1.DataSource.DataSet.OnCalcFields:=@ConvertiereText;

Code: Alles auswählen

procedure TForm1.ConvertiereText(DataSet: TDataSet);
var
  umlaut : INTEGER;
begin
  //Disable Screen UPDATE
   DBGrid1.DataSource.DataSet.DisableControls;
   DBGrid1.DataSource.DataSet.First;
 
   While NOT (DBGrid1.DataSource.DataSet.Eof) Do
   Begin
     FOR umlaut := 0 TO DBGrid1.COLUMNS.Count -1 Do
     begin
       DBGrid1.COLUMNS[umlaut].FIELD.Value := AnsiToUTF8(DBGrid1.COLUMNS[umlaut].FIELD.Value);
     end;
     DBGrid1.DataSource.DataSet.Next;
   end;
   DBGrid1.DataSource.DataSet.First;
   //Enable Screen UPDATE
   DBGrid1.DataSource.DataSet.EnableControls;
end;
Ich brauche hierbei wirklich eure Hilfe

Gruß
Laines
Zuletzt geändert von Lori am So 25. Sep 2011, 17:45, insgesamt 1-mal geändert.
Grund: Bitte richtigen Highlighter nutzen

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Hallo Christian,
ich denke, da ist was zu korrigieren. Die Umwandlung Utf8 <-> Ansii dient ja genau dazu, in der Datenbank Ansii zu haben obwohl Lazarus Utf8 braucht. Man braucht diese Umwandlung immer, wenn man mit alten Datenbanken arbeiten muss, deren Daten Ansii sind oder wenn von diveresn Programmen darauf zugegriffen wird. Bei meinen bisherigen Tests macht Zeos das ganz komfortabel.
mfg hde

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Hallo Laines,
wieso sollte der Event "OnCalcFields" denn auch aktiv werden? Es geht doch nicht um zu kalkulierende Felder, also logisch dass da nichts passiert. Versuch's doch einfach mit nem schlichten loop?
mfg hde

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Hallo hde

hast du mir ein Beispiel? :oops:

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Hallo laines,
du iterierst doch schon über die columns, erweitere das um die rows und setze es nach dem Aufbau des Grids.
Aber denke dran, wenn du Eingaben machst müssen die vor dem schreiben in die DB auch umgewandelt werden.
mfg hde

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

So Liebe Mitstreiter !!

Das Ihr seht, dass ich nicht untätig war. SOOOOOOO EIINNFFAACCHH kann die Lösung sein.

Code: Alles auswählen

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
   var
      i : Integer;
   begin
     FOR i:=0 TO DataSet.FIELDS.Count-1 do
  begin
    IF DataSet.FIELDS.FIELDS[i].DataType=ftstring then
    begin
      DataSet.FIELDS.FIELDS[i].OnGetText:= @MyGetText;
    end;
  end;
   end;
Trotzdem Danke. Ich werde euch noch öfter brauchen.

Code: Alles auswählen

procedure TForm1.MyGetText(Sender: TField; var aText: string; DisplayText: BOOLEAN);
   begin
      aText := ANSIToUTF8(Sender.AsString);
   end;
Zuletzt geändert von Lori am Di 4. Okt 2011, 20:41, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter benutzen

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Christian »

Das hab ich dir 20/9/2011, 16:34 geschrieben, musst nur auf die vorherige Seite schaun ;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Christian hat geschrieben:MSSQL interessiert es recht wenig in welchem Format die Daten in und aus der DB kommen.
Du scheinst mit einem anderen Programm die Daten in ANSI in die DB zu werfen, SQLdb (und auch Zeos) erwarten hier UTF-8.
Du müsstest in TFIeld.OnGetText und OnSetText die Konvertierung vornehmen.
Hallo Christian

Ja ich weiss :oops: ABER ich brauch ein CODE Beispiel. Ich bin noch absolut am Anfang und ich hoffe du weißt noch aus eigener Erfahrung wie schwer man sich da tut bis man drin ist.

Dafür funktioniert mir seid ich das hin bekommen habe, meine Suche und mein sortieren nicht mehr. :cry: :x

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Christian »

Dazu kann man schwer was sagen, wenn man nicht weiss wie du das gemacht hast.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten