Hallo Leute.
Ich habe derzeit ein kleines Problem mit Word und Delphi 7. Ich möchte über meine Delphiapplikation einen Datenbankquery (ich verwende die MyComponents) machen und das Ergebnis davon als Adressetiketten in Word ausgeben.
Das ganze funktioniert zwar, aber nur ziiiiemlich langsam. Im Endeffekt sollen immer so ca. 9000 Etiketten ausgegeben werden, dass würde dann in etwa 1 Stunde dauern bis alles im Worddokument drinnen ist.
Das ganze sieht so aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
FileName, ov : OleVariant;
AdrStr : String;
Counter,Anzahl : Integer;
begin
with MySQLDataset1 do begin
ClearMacros;
TableName := 'adr_adressen';
MacroByName('JOIN').AsString := 'INNER JOIN adr_countries ON (adr_adressen.adr_cou_id = adr_countries.cou_id)';
MacroByName('WHERE').AsString := 'WHERE adr_kat1_id like "%bc%"';
MacroByName('ORDER').AsString := 'order by adr_countries.cou_name, adr_adressen.adr_plz';
open;
end;
Anzahl := MySQLServer1.DatasetFrom('Select count(*) as MyMenCount from adr_adressen WHERE adr_kat1_id like "%bc%"','MyCount').FieldByName('MyMenCount').AsInteger;
MySQLServer1.FreeDataset('MyMenCount');
Progressbar1.Max := Anzahl;
Progressbar1.Step := 1;
if OpenDialog1.Execute then
FileName:=OpenDialog1.FileName
else
exit;
WordApplication1.Connect;
WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
Counter := 1;
WordApplication1.Visible := true;
while not MySQLDataset1.Eof do begin
AdrStr := MySQLDataset1.FieldByName('adr_anrede').AsString + ' ' + MySQLDataset1.FieldByName('adr_titel').AsString + Chr(13);
if (MySQLDataset1.FieldByName('adr_vorname').AsString = '') and (MySQLDataset1.FieldByName('adr_nachname').AsString = '') then
AdrStr := AdrStr + MySQLDataset1.FieldByName('adr_institut').AsString + Chr(13)
else
AdrStr := AdrStr + MySQLDataset1.FieldByName('adr_vorname').AsString + ' ' + MySQLDataset1.FieldByName('adr_nachname').AsString + Chr(13);
AdrStr := AdrStr +
MySQLDataset1.FieldByName('adr_strasse').AsString + Chr(13) +
MySQLDataset1.FieldByName('adr_plz').AsString + ' ' + MySQLDataset1.FieldByName('adr_ort').AsString;
WordApplication1.Selection.TypeText(AdrStr);
if MySQLDataset1.FieldByName('adr_cou_id').AsInteger <> 153 then
begin
AdrStr := Chr(13) + MySQLDataset1.FieldByName('cou_name').AsString;
WordApplication1.Selection.Font.Bold := integer(True);
WordApplication1.Selection.TypeText(AdrStr);
WordApplication1.Selection.Font.Bold := integer(False);
end;
If counter <> 3 then
WordApplication1.Selection.Cells.Item(1).Next.Select;
If Counter = 3 then
begin
ov := 1;
WordApplication1.Selection.InsertRowsBelow(ov);
Counter := 0;
end;
MySQLDataset1.Next;
Counter := Counter + 1;
Progressbar1.StepIt;
end;
WordApplication1.Disconnect;
MySQLDataset1.Close;
end;
Hat jemand von euch eine schnellere Lösung für mich bzw. einen Tipp was ich da machen könnte?
Vielen Dank und Grüße aus Wien
Christian.
BTW: Happy Birthday Daniel