Fragezeichen statt Umlaute
Re: Fragezeichen statt Umlaute
natürlich in Connect
Re: Fragezeichen statt Umlaute
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
Im Moment bin ich so weit:
@ConvertiereText sieht so aus:
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
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;
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;
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;
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
Grund: Bitte richtigen Highlighter nutzen
Re: Fragezeichen statt Umlaute
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
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
Re: Fragezeichen statt Umlaute
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
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
Re: Fragezeichen statt Umlaute
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
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
-
- 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
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.
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/
Re: Fragezeichen statt Umlaute
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.
DBGrid1.DataSource.DataSet.OnCalcFields:=@ConvertiereText;
Ich brauche hierbei wirklich eure Hilfe
Gruß
Laines
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
....
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;
Gruß
Laines
Zuletzt geändert von Lori am So 25. Sep 2011, 17:45, insgesamt 1-mal geändert.
Grund: Bitte richtigen Highlighter nutzen
Grund: Bitte richtigen Highlighter nutzen
Re: Fragezeichen statt Umlaute
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
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
Re: Fragezeichen statt Umlaute
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
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
Re: Fragezeichen statt Umlaute
Hallo hde
hast du mir ein Beispiel?
hast du mir ein Beispiel?

Re: Fragezeichen statt Umlaute
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
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
Re: Fragezeichen statt Umlaute
So Liebe Mitstreiter !!
Das Ihr seht, dass ich nicht untätig war. SOOOOOOO EIINNFFAACCHH kann die Lösung sein.
Trotzdem Danke. Ich werde euch noch öfter brauchen.
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;
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
Grund: Bitte den richtigen Highlighter benutzen
-
- 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
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/
Re: Fragezeichen statt Umlaute
Hallo ChristianChristian 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.
Ja ich weiss

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


-
- 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
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/