![]() |
Datenbank: Access • Version: .mdb • Zugriff über: Delphi 6 ; ADO
Access mit Delphi 6 per ADO - Tipps?
Guten Tag ihr Delphiprofis...
Nach meinen Taschenrechner-programmen hatte ich mir ein weitaus größeres Ziel gesetzt und stecke wie das zu erwarten war fest... Mein Ziel: Aus einer Accessdatenbank Einträge "auswählen" und diese dann irgendwann später als Tabelle ausdrucken. Bisheriger Fortschritt: Access-Datenbank erstellt, mich in Datasource, AdoTable, AdoConnection etc eingearbeitet... (Auch in SQL etwas, aber das half mir nicht sonderlich weiter...) Problem: Ich habe meine Einträge durch Eingabe des 'Barcode' in ein Editfeld ausgewählt und die 'Menge' auf 1 gesetzt. Dann nach Menge = 1 gefiltert. :?:Jetzt möchte ich das per Delphi ausdrucken - geht das gefiltert oder muss ich die ausgewählten Datensätze anstatt per 'Menge:=1' lieber in eine neue Datenbank kopieren, die sich dann beim Drucken löscht und leer neu erstellt? :?:Um die 'Menge' wieder zurückzusetzen fehlt mir leider ein Befehl um die ganze Spalte zurückzusetzen... Also hab ich das mit meinen Bauer-Methoden probiert:
Delphi-Quellcode:
Mein Problem daran: Es klappt bis zum letzten Durchlauf, dann bearbeitet er den letzten Datensatz, bring allerdings beim Ausschalten des Filteres am Ende einen EoF / BoF - Fehler. Er setzt aber alles auf 0 (Code funktioniert...), um den Fehler zu umgehen habe ich den recordcount am Ende reingemacht , damit speichert er allerdings nun den letzten Reset nichtmehr...Zum verzweifeln:evil: label Gotolabel; begin ADOTable1.Edit; i:= 0; //Nur ein Counter für die Druchläufe ADOTable1.Filter := 'Menge = ' + Quotedstr('1'); Adotable1.Filtered := True ; Gotolabel: ADOTable1.Filter := 'Menge = ' + Quotedstr('1'); Adotable1.Filtered := True ; If Adotable1.FieldByName('Menge').AsString = '1' then begin ADOTable1.Edit; ADOTable1.FieldByName('Menge').AsString := '0'; Anzahl := ADOTable1.recordcount; ADOTable1.Filter := 'Menge = ' + Quotedstr('0'); i:= i+1; Edit2.Text := Inttostr(i); ADOTable1.open; AdoTable1.Post; Anzahl := ADOTable1.recordcount; If Anzahl > 1 then begin Adotable1.Filtered := False; //BUGGT end; Goto Gotolabel end else Showmessage ('Auswahl zurückgesetzt') ; Kann mir bitte jemand eine bessere, einfachere, elegantere Lösung für mein Problem geben?:) Ganze Spalte bearbeiten oder neue Datenbank erstellen und mit den Datensätzen füllen? Vielen Vielen Dank für's Lesen und helfen - Hab mich durch 8 Tutorials auf delphi.about.com zu den Datenbanken geschlagen, aber naja...ganz allein gehts scheinbar doch nicht:? |
AW: Access mit Delphi 6 per ADO - Tipps?
Also Du solltest Dir vielleicht zunächst mal Grundlagen aneignen bevor Du Dich an Datenbanken wagst. Und wenn Du dort angelangt bist, auch dort Grundlagen.
Die einfachste Methode wäre die Verwendung einer TAdoQuery und dann mit der Eigenschaft SQL arbeiten:
Delphi-Quellcode:
Willst Du bei einer Schleife bleiben, solltest Du von GOTO absehen und das evtl. in etwa so machen:
ADOQuery1.SQL.Text := 'UPDATE Barcodes SET Menge = 0 where Menge = 1';
ADOQuery1.ExecSQL;
Delphi-Quellcode:
ADOTable1.Open;
while not ADOTable1.Eof do begin If Adotable1.FieldByName('Menge').AsInteger = 1 then begin ADOTable1.Edit; ADOTable1.FieldByName('Menge').AsInteger := 0; ADOTable1.Post; end; ADOTable1.Next; end; Showmessage ('Auswahl zurückgesetzt'); |
AW: Access mit Delphi 6 per ADO - Tipps?
Ich hab mir auf
![]() Zum Problem: Die SQL-Lösung brachte bei mir den Fehler "Datentypen im Kriterienausdruck unverträglich", den Ausdruck 'Barcodes' hab ich durch den Namen der Datenbank ersetzt, 'Barcode' ist nur eine Spalte wie 'Menge'... Allerdings funktionierte die Schleifenlösung wunderbar, nachdem ich vor der Schleife noch ein AdoTable1.First eingefügt hatte, da er sonst nach einem Barcodescan nur die Dateien nach dem ausgewählten Datensatz zurücksetzte. Vielen Dank für die Lösung:thumb: Hättest du (oder jemand anderes) noch eine Idee für das Drucken? Ich dachte daran, einen Filter mit Menge = 1 draufzusetzten und dann ?direkt? zu drucken oder die gefilterte Auswahl dann Datensatz für Datensatz in eine Tabelle in einem Word-Dokument einzufügen. Gerne auch ein Link zu einem geeigneten Tutorial falls jemand einen findet (Habs auch per Google versucht... Ich frage hier nur weil ichs versucht hab und nicht weiterkomme) Ich hab das hier gefunden und soweit ich das verstanden habe angepasst, könnte mir das weiterhelfen? War mal als ein Mail-Verteiler geplant...
Delphi-Quellcode:
bzw einen Code, der eine Tabelle aus Word exportieren soll - lässt sich das umkehren und auf Access anwenden?
word.ActiveDocument.MailMerge.OpenDataSource(dbquelle,
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, PasswordDocument:='', PasswordTemplate:='', WritePasswordDocument:='', WritePasswordTemplate:='', Revert:=False, Format:=wdOpenFormatAuto, Connection:= 'Provider=Microsoft.Jet.OLEDB.4.0;Password='''';User ID=Admin;Data Source=c:\NeueBank.mdb;Mode=Read;Extended Properties='''';Jet OLEDB:System database='''';Jet OLEDB:Registry Path='''';Jet OLEDB:Database Password=''' , SQLStatement:='SELECT 1 FROM `Menge`', SQLStatement1:='');
Delphi-Quellcode:
Das wäre das zweite und letzte Problem, für das ich Hilfe bräuchte - Das Programm außenrum bekomm ich mit etwas Ausdauer und Hirnschmalz hin8-)
uses
ComObj; procedure TForm1.Button1Click(Sender: TObject); const AWordDoc = 'C:\xyz\testTable.doc'; var MSWord, Table: OLEVariant; iRows, iCols, iGridRows, jGridCols, iNumTables, iTableChosen: Integer; CellText: string; InputString: string; begin try MSWord := CreateOleObject('Word.Application'); except // Error.... Exit; end; try MSWord.Visible := False; MSWord.Documents.Open(AWordDoc); // Get number of tables in document iNumTables := MSWord.ActiveDocument.Tables.Count; InputString := InputBox(IntToStr(iNumTables) + ' Tables in Word Document', 'Please Enter Table Number', '1'); // Todo: Validate string for integer, range... iTableChosen := StrToInt(InputString); // access table Table := MSWord.ActiveDocument.Tables.Item(iTableChosen); // get dimensions of table iCols := Table.Rows.Count; iRows := Table.Columns.Count; // adjust stringgrid columns StringGrid1.RowCount := iCols; StringGrid1.ColCount := iRows + 1; // loop through cells for iGridRows := 1 to iRows do for jGridCols := 1 to iCols do begin CellText := Table.Cell(jGridCols, iGridRows).Range.FormattedText; if not VarisEmpty(CellText) then begin // Remove Tabs CellText := StringReplace(CellText, #$D, '', [rfReplaceAll]); // Remove linebreaks CellText := StringReplace(CellText, #$7, '', [rfReplaceAll]); // fill Stringgrid Stringgrid1.Cells[iGridRows, jGridCols] := CellText; end; end; //.. finally MSWord.Quit; end; Danke nochmal |
AW: Access mit Delphi 6 per ADO - Tipps?
Habs mit einer Quickreport-Komponente hinbekommen für die, die mal vor dem gleichen Problem stehen:)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz